diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 6fb781d6bfb62..53ec1460fbedb 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3549,12 +3549,21 @@ class OffloadingActionBuilder final { for (auto SDA : SYCLDeviceActions) SYCLLinkBinaryList.push_back(SDA); if (WrapDeviceOnlyBinary) { - auto *DeviceLinkAction = - C.MakeAction(SYCLLinkBinaryList, types::TY_Image); - // Wrap the binary when -fsycl-link is given - SYCLLinkBinary = - C.MakeAction(DeviceLinkAction, - types::TY_Object); + // -fsycl-link behavior does the following to the unbundled device + // binaries: + // 1) Link them together using llvm-link + // 2) Pass the linked binary through sycl-post-link + // 3) Translate final .bc file to .spv + // 4) Wrap the binary with the offload wrapper which can be used + // by any compilation link step. + auto *DeviceLinkAction = C.MakeAction( + SYCLLinkBinaryList, types::TY_Image); + auto *PostLinkAction = C.MakeAction( + DeviceLinkAction, types::TY_LLVM_BC); + auto *TranslateAction = C.MakeAction( + PostLinkAction, types::TY_Image); + SYCLLinkBinary = C.MakeAction( + TranslateAction, types::TY_Object); } else { auto *Link = C.MakeAction(SYCLLinkBinaryList, types::TY_Image); diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 2806410e523a3..4fbc14cfb5cda 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -423,8 +423,10 @@ // CHK-LINK-UB: 0: input, "[[INPUT:.+\.o]]", object // CHK-LINK-UB: 1: clang-offload-unbundler, {0}, object // CHK-LINK-UB: 2: linker, {1}, image, (device-sycl) -// CHK-LINK-UB: 3: clang-offload-wrapper, {2}, object, (device-sycl) -// CHK-LINK-UB: 4: offload, "device-sycl (spir64-unknown-unknown-sycldevice{{.*}})" {3}, object +// CHK-LINK-UB: 3: sycl-post-link, {2}, ir, (device-sycl) +// CHK-LINK-UB: 4: llvm-spirv, {3}, image, (device-sycl) +// CHK-LINK-UB: 5: clang-offload-wrapper, {4}, object, (device-sycl) +// CHK-LINK-UB: 6: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {5}, object /// ########################################################################### @@ -437,8 +439,10 @@ // CHK-LINK: 1: preprocessor, {0}, cpp-output, (device-sycl) // CHK-LINK: 2: compiler, {1}, ir, (device-sycl) // CHK-LINK: 3: linker, {2}, image, (device-sycl) -// CHK-LINK: 4: clang-offload-wrapper, {3}, object, (device-sycl) -// CHK-LINK: 5: offload, "device-sycl (spir64-unknown-unknown-sycldevice{{.*}})" {4}, object +// CHK-LINK: 4: sycl-post-link, {3}, ir, (device-sycl) +// CHK-LINK: 5: llvm-spirv, {4}, image, (device-sycl) +// CHK-LINK: 6: clang-offload-wrapper, {5}, object, (device-sycl) +// CHK-LINK: 7: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {6}, object /// ###########################################################################