llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-driver Author: Joseph Huber (jhuber6) <details> <summary>Changes</summary> Summary: This patch prevents the `-fcf-protection=` flag from being passed to the device compilation during offloading. This is not supported on CUDA and AMD devices, but if the user is compiling with fcf protection for the host it will fail to compile. We have a lot of these cases with various hacked together solutions, it would be nice to have a single solution to detect from the driver if a feature like this can be used for offloading, but for now this should resolve the issue. Fixes: https://github.com/llvm/llvm-project/issues/86450 --- Full diff: https://github.com/llvm/llvm-project/pull/88402.diff 2 Files Affected: - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+8-2) - (added) clang/test/Driver/offload-no-fcf-protection.c (+39) ``````````diff diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 766a9b91e3c0ad..1264ffa1ef7c8e 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6867,8 +6867,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-nogpulib"); if (Arg *A = Args.getLastArg(options::OPT_fcf_protection_EQ)) { - CmdArgs.push_back( - Args.MakeArgString(Twine("-fcf-protection=") + A->getValue())); + // Do not pass this argument to the offloading device if the target does not + // support it. + // TODO: We need a better way to detect incompatible options for offloading. + if (JA.getOffloadingDeviceKind() == Action::OFK_None || + (!TC.getTriple().isAMDGPU() && !TC.getTriple().isNVPTX() && + !TC.getTriple().isSPIRV())) + CmdArgs.push_back( + Args.MakeArgString(Twine("-fcf-protection=") + A->getValue())); } if (Arg *A = Args.getLastArg(options::OPT_mfunction_return_EQ)) diff --git a/clang/test/Driver/offload-no-fcf-protection.c b/clang/test/Driver/offload-no-fcf-protection.c new file mode 100644 index 00000000000000..ef275881edbaf1 --- /dev/null +++ b/clang/test/Driver/offload-no-fcf-protection.c @@ -0,0 +1,39 @@ +// Check that -fcf-protection does not get passed to the device-side +// compilation. + +// RUN: %clang -### -x cuda --target=x86_64-unknown-linux-gnu -nogpulib \ +// RUN: -nogpuinc --offload-arch=sm_52 -fcf-protection=full -c %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CUDA + +// CUDA: "-cc1" "-triple" "nvptx64-nvidia-cuda" +// CUDA-NOT: "-fcf-protection=full" +// CUDA: "-cc1" "-triple" "x86_64-unknown-linux-gnu" +// CUDA: "-fcf-protection=full" + +// RUN: %clang -### -x hip --target=x86_64-unknown-linux-gnu -nogpulib \ +// RUN: -nogpuinc --offload-arch=gfx90a -fcf-protection=full -c %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=HIP + +// HIP: "-cc1" "-triple" "amdgcn-amd-amdhsa" +// HIP-NOT: "-fcf-protection=full" +// HIP: "-cc1" "-triple" "x86_64-unknown-linux-gnu" +// HIP: "-fcf-protection=full" + +// RUN: %clang -### -x c --target=x86_64-unknown-linux-gnu -nogpulib -fopenmp=libomp \ +// RUN: -nogpuinc --offload-arch=gfx90a -fcf-protection=full -c %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=OMP + +// OMP: "-cc1" "-triple" "x86_64-unknown-linux-gnu" +// OMP: "-fcf-protection=full" +// OMP: "-cc1" "-triple" "amdgcn-amd-amdhsa" +// OMP-NOT: "-fcf-protection=full" +// OMP: "-cc1" "-triple" "x86_64-unknown-linux-gnu" +// OMP: "-fcf-protection=full" + +// RUN: %clang -### -x c --target=nvptx64-nvidia-cuda -nogpulib -nogpuinc \ +// RUN: -march=sm_52 -fcf-protection=full -c %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=DIRECT +// RUN: %clang -### -x c --target=amdgcn-amd-amdhsa -nogpulib -nogpuinc \ +// RUN: -mcpu=gfx90a -fcf-protection=full -c %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=DIRECT +// DIRECT: "-fcf-protection=full" `````````` </details> https://github.com/llvm/llvm-project/pull/88402 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits