diff options
author | Justin Lebar <jlebar@google.com> | 2017-02-19 19:05:32 +0000 |
---|---|---|
committer | Justin Lebar <jlebar@google.com> | 2017-02-19 19:05:32 +0000 |
commit | 63152d10c9fc88c9d9e942b46ef2cd3d254ff452 (patch) | |
tree | f10fff3d32a580a9d8f3222663ef44ec74382bec | |
parent | 4271186f9ce80be777e9b84fe0bc02798df65663 (diff) | |
download | bcm5719-llvm-63152d10c9fc88c9d9e942b46ef2cd3d254ff452.tar.gz bcm5719-llvm-63152d10c9fc88c9d9e942b46ef2cd3d254ff452.zip |
[CUDA] Don't pass -stack-protector to NVPTX compilations.
We can't support stack-protector on NVPTX because NVPTX doesn't expose a
stack to the compiler!
Fixes PR32009.
llvm-svn: 295609
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 42 | ||||
-rw-r--r-- | clang/test/Driver/cuda-no-stack-protector.cu | 23 |
2 files changed, 46 insertions, 19 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index bc0796ff2a7..9a8eebcc9ae 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -5544,25 +5544,29 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // -stack-protector=0 is default. unsigned StackProtectorLevel = 0; - if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, - options::OPT_fstack_protector_all, - options::OPT_fstack_protector_strong, - options::OPT_fstack_protector)) { - if (A->getOption().matches(options::OPT_fstack_protector)) { - StackProtectorLevel = std::max<unsigned>( - LangOptions::SSPOn, - getToolChain().GetDefaultStackProtectorLevel(KernelOrKext)); - } else if (A->getOption().matches(options::OPT_fstack_protector_strong)) - StackProtectorLevel = LangOptions::SSPStrong; - else if (A->getOption().matches(options::OPT_fstack_protector_all)) - StackProtectorLevel = LangOptions::SSPReq; - } else { - StackProtectorLevel = - getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); - // Only use a default stack protector on Darwin in case -ffreestanding - // is not specified. - if (Triple.isOSDarwin() && !IsHosted) - StackProtectorLevel = 0; + // NVPTX doesn't support stack protectors; from the compiler's perspective, it + // doesn't even have a stack! + if (!Triple.isNVPTX()) { + if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, + options::OPT_fstack_protector_all, + options::OPT_fstack_protector_strong, + options::OPT_fstack_protector)) { + if (A->getOption().matches(options::OPT_fstack_protector)) { + StackProtectorLevel = std::max<unsigned>( + LangOptions::SSPOn, + getToolChain().GetDefaultStackProtectorLevel(KernelOrKext)); + } else if (A->getOption().matches(options::OPT_fstack_protector_strong)) + StackProtectorLevel = LangOptions::SSPStrong; + else if (A->getOption().matches(options::OPT_fstack_protector_all)) + StackProtectorLevel = LangOptions::SSPReq; + } else { + StackProtectorLevel = + getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); + // Only use a default stack protector on Darwin in case -ffreestanding + // is not specified. + if (Triple.isOSDarwin() && !IsHosted) + StackProtectorLevel = 0; + } } if (StackProtectorLevel) { CmdArgs.push_back("-stack-protector"); diff --git a/clang/test/Driver/cuda-no-stack-protector.cu b/clang/test/Driver/cuda-no-stack-protector.cu new file mode 100644 index 00000000000..f94cc188fac --- /dev/null +++ b/clang/test/Driver/cuda-no-stack-protector.cu @@ -0,0 +1,23 @@ +// Check that -stack-protector doesn't get passed down to device-side +// compilation. +// +// REQUIRES: clang-driver +// +// RUN: %clang -### -target x86_64-linux-gnu -c --cuda-gpu-arch=sm_20 \ +// RUN: -fstack-protector-all %s 2>&1 | \ +// RUN: FileCheck %s +// +// RUN: %clang -### -target x86_64-linux-gnu -c --cuda-gpu-arch=sm_20 \ +// RUN: -fstack-protector-strong %s 2>&1 | \ +// RUN: FileCheck %s +// +// RUN: %clang -### -target x86_64-linux-gnu -c --cuda-gpu-arch=sm_20 \ +// RUN: -fstack-protector %s 2>&1 | \ +// RUN: FileCheck %s +// +// CHECK-NOT: error: unsupported option '-fstack-protector +// CHECK-DAG: "-fcuda-is-device" +// CHECK-NOT: "-stack-protector" +// CHECK-NOT: "-stack-protector-buffer-size" +// CHECK-DAG: "-triple" "x86_64--linux-gnu" +// CHECK: "-stack-protector" |