From 4d1b01981db047254264b6a5227feb7041b69029 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Thu, 20 Nov 2025 06:54:31 -0800 Subject: [PATCH 1/3] [Driver] Fix preview breaking changes option passing to offload-wrapper When passing options to the clang-offload-wrapper, the -fpreview-breaking-changes option needs to be passed accordingly to the tool when -fpreview-breaking-changes is used on the command line. This was happening for typical SYCL enabled compilations, but when using -fsycl-link, the usage of clang-offload-wrapper modifies the offloading kind encountered, causing the option to not be passed. Fixup the ability to pass -fpreview-breaking-changes for all needed uses as well as factoring in the offload-compress options which are in the same bucket of behaviors. --- clang/lib/Driver/ToolChains/Clang.cpp | 52 +++++++++------------- clang/test/Driver/sycl-offload-old-model.c | 10 +++++ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index dd11cd4f5d6f1..cc7c546381c74 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -9994,6 +9994,25 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, // object that is fed to the linker from the wrapper generated bc file assert(isa(JA) && "Expecting wrapping job!"); + // Validate and propogate CLI options related to device image compression + // and enabling preview breaking changes. + auto addCLIOptions = [&](ArgStringList &Args) -> void { + // -offload-compress + if (C.getInputArgs().getLastArg(options::OPT_offload_compress)) { + Args.push_back(C.getArgs().MakeArgString(Twine("-offload-compress"))); + // -offload-compression-level=<> + if (Arg *A = C.getInputArgs().getLastArg( + options::OPT_offload_compression_level_EQ)) + Args.push_back(C.getArgs().MakeArgString( + Twine("-offload-compression-level=") + A->getValue())); + } + // Enable preview breaking changes in clang-offload-wrapper, + // in case it needs to introduce any ABI breaking changes. + // For example, changes in offload binary descriptor format. + if (C.getArgs().hasArg(options::OPT_fpreview_breaking_changes)) + Args.push_back("-fpreview-breaking-changes"); + }; + Action::OffloadKind OffloadingKind = JA.getOffloadingDeviceKind(); if (OffloadingKind == Action::OFK_SYCL) { // The wrapper command looks like this: @@ -10030,18 +10049,7 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, llvm::Triple TT = getToolChain().getTriple(); SmallString<128> TargetTripleOpt = TT.getArchName(); - // Validate and propogate CLI options related to device image compression. - // -offload-compress - if (C.getInputArgs().getLastArg(options::OPT_offload_compress)) { - WrapperArgs.push_back( - C.getArgs().MakeArgString(Twine("-offload-compress"))); - // -offload-compression-level=<> - if (Arg *A = C.getInputArgs().getLastArg( - options::OPT_offload_compression_level_EQ)) - WrapperArgs.push_back(C.getArgs().MakeArgString( - Twine("-offload-compression-level=") + A->getValue())); - } - + addCLIOptions(WrapperArgs); addRunTimeWrapperOpts(C, OffloadingKind, TCArgs, WrapperArgs, getToolChain(), JA); @@ -10071,11 +10079,6 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, WrapperArgs.push_back( C.getArgs().MakeArgString(Twine("-kind=") + Twine(Kind))); - // Enable preview breaking changes in clang-offload-wrapper, - // in case it needs to introduce any ABI breaking changes. - // For example, changes in offload binary descriptor format. - if (C.getArgs().hasArg(options::OPT_fpreview_breaking_changes)) - WrapperArgs.push_back("-fpreview-breaking-changes"); assert((Inputs.size() > 0) && "no inputs for clang-offload-wrapper"); assert(((Inputs[0].getType() != types::TY_Tempfiletable) || @@ -10144,19 +10147,8 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, "Not have inputs for all dependence actions??"); if (OffloadingKind == Action::OFK_None && - C.getArgs().hasArg(options::OPT_fsycl_link_EQ)) { - - // When compiling and linking separately, we need to propagate the - // compression related CLI options to offload-wrapper. - if (C.getInputArgs().getLastArg(options::OPT_offload_compress)) { - CmdArgs.push_back(C.getArgs().MakeArgString(Twine("-offload-compress"))); - // -offload-compression-level=<> - if (Arg *A = C.getInputArgs().getLastArg( - options::OPT_offload_compression_level_EQ)) - CmdArgs.push_back(C.getArgs().MakeArgString( - Twine("-offload-compression-level=") + A->getValue())); - } - } + C.getArgs().hasArg(options::OPT_fsycl_link_EQ)) + addCLIOptions(CmdArgs); // Add offload targets and inputs. for (unsigned I = 0; I < Inputs.size(); ++I) { diff --git a/clang/test/Driver/sycl-offload-old-model.c b/clang/test/Driver/sycl-offload-old-model.c index c19e909452ddf..5400bc0783662 100644 --- a/clang/test/Driver/sycl-offload-old-model.c +++ b/clang/test/Driver/sycl-offload-old-model.c @@ -898,6 +898,16 @@ // FSYCL-PREVIEW-BREAKING-CHANGES-DEBUG-CHECK-NOT: -defaultlib:sycl{{[0-9]*}}.lib // FSYCL-PREVIEW-BREAKING-CHANGES-DEBUG-CHECK-NOT: -defaultlib:sycl{{[0-9]*}}-preview.lib +/// Check for -fpreview-breaking-changes output during the clang-offload-wrapper +/// step of the offload compilation. +// RUN: %clang -### -fsycl --no-offload-new-driver -fpreview-breaking-changes \ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefix PREVIEW-WRAPPER %s +// RUN: %clang -### -fsycl --no-offload-new-driver -fpreview-breaking-changes \ +// RUN: -fsycl-link %s 2>&1 \ +// RUN: | FileCheck -check-prefix PREVIEW-WRAPPER %s +// PREVIEW-WRAPPER: clang-offload-wrapper{{.*}} "-fpreview-breaking-changes" + // Check if fsycl-targets correctly processes multiple NVidia // and AMD GPU targets. // RUN: %clang -### -fsycl -fsycl-targets=nvidia_gpu_sm_60,nvidia_gpu_sm_70 -fno-sycl-libspirv -nocudalib --no-offload-new-driver %s 2>&1 \ From 53314cd06c49bf3b2e6026544b8fd7b4de81ee30 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Thu, 20 Nov 2025 07:13:28 -0800 Subject: [PATCH 2/3] Clang format --- clang/lib/Driver/ToolChains/Clang.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index cc7c546381c74..9a6dc8af7ae59 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10079,7 +10079,6 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, WrapperArgs.push_back( C.getArgs().MakeArgString(Twine("-kind=") + Twine(Kind))); - assert((Inputs.size() > 0) && "no inputs for clang-offload-wrapper"); assert(((Inputs[0].getType() != types::TY_Tempfiletable) || (Inputs.size() == 1)) && From f58ec88a443cc19ea2947ccdbc71bb57449c425e Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 1 Dec 2025 08:42:17 -0800 Subject: [PATCH 3/3] Update logic for --offload-compress check Update the logic for the --offload-compress recognition on the command line and update tests to check the proper behavior with -fsycl-link. --- clang/lib/Driver/ToolChains/Clang.cpp | 3 ++- clang/test/Driver/sycl-offload-wrapper-compression.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d8544ee0b666d..2b6590f2ede33 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10027,7 +10027,8 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, // and enabling preview breaking changes. auto addCLIOptions = [&](ArgStringList &Args) -> void { // -offload-compress - if (C.getInputArgs().getLastArg(options::OPT_offload_compress)) { + if (C.getInputArgs().hasFlag(options::OPT_offload_compress, + options::OPT_no_offload_compress, false)) { Args.push_back(C.getArgs().MakeArgString(Twine("-offload-compress"))); // -offload-compression-level=<> if (Arg *A = C.getInputArgs().getLastArg( diff --git a/clang/test/Driver/sycl-offload-wrapper-compression.cpp b/clang/test/Driver/sycl-offload-wrapper-compression.cpp index 9e9aa437047d4..36c7fbf0deb48 100644 --- a/clang/test/Driver/sycl-offload-wrapper-compression.cpp +++ b/clang/test/Driver/sycl-offload-wrapper-compression.cpp @@ -4,6 +4,7 @@ /// // RUN: %clangxx -### -fsycl --offload-compress --offload-compression-level=3 %s 2>&1 | FileCheck %s --check-prefix=CHECK-COMPRESS +// RUN: %clangxx -### -fsycl -fsycl-link --offload-compress --offload-compression-level=3 %s 2>&1 | FileCheck %s --check-prefix=CHECK-COMPRESS // CHECK-COMPRESS: {{.*}}clang-offload-wrapper{{.*}}"-offload-compress"{{.*}}"-offload-compression-level=3"{{.*}} // Make sure that the compression options are not passed when --offload-compress is not set.