diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index dd11cd4f5d6f1..9a6dc8af7ae59 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,12 +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) || (Inputs.size() == 1)) && @@ -10144,19 +10146,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 \