From 63152d10c9fc88c9d9e942b46ef2cd3d254ff452 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Sun, 19 Feb 2017 19:05:32 +0000 Subject: [PATCH] [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 --- clang/lib/Driver/Tools.cpp | 42 +++++++++++--------- clang/test/Driver/cuda-no-stack-protector.cu | 23 +++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 clang/test/Driver/cuda-no-stack-protector.cu diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index bc0796ff2a75..9a8eebcc9aec 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( - 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( + 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 000000000000..f94cc188fac0 --- /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"