diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6395,6 +6395,7 @@ codegenoptions::DebugInfoKind *DebugInfoKind, bool *EmitCodeView) const { unsigned RTOptionID = options::OPT__SLASH_MT; + bool isNVPTX = getToolChain().getTriple().isNVPTX(); if (Args.hasArg(options::OPT__SLASH_LDd)) // The /LDd option implies /MTd. The dependent lib part can be overridden, @@ -6462,8 +6463,8 @@ // This controls whether or not we emit stack-protector instrumentation. // In MSVC, Buffer Security Check (/GS) is on by default. - if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_, - /*Default=*/true)) { + if (!isNVPTX && Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_, + /*Default=*/true)) { CmdArgs.push_back("-stack-protector"); CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong))); } @@ -6483,7 +6484,7 @@ const Driver &D = getToolChain().getDriver(); EHFlags EH = parseClangCLEHFlags(D, Args); - if (EH.Synch || EH.Asynch) { + if (!isNVPTX && (EH.Synch || EH.Asynch)) { if (types::isCXX(InputType)) CmdArgs.push_back("-fcxx-exceptions"); CmdArgs.push_back("-fexceptions"); @@ -6552,7 +6553,7 @@ options::OPT__SLASH_Gregcall)) { unsigned DCCOptId = CCArg->getOption().getID(); const char *DCCFlag = nullptr; - bool ArchSupported = true; + bool ArchSupported = !isNVPTX; llvm::Triple::ArchType Arch = getToolChain().getArch(); switch (DCCOptId) { case options::OPT__SLASH_Gd: diff --git a/clang/test/Driver/cl-options.cu b/clang/test/Driver/cl-options.cu new file mode 100644 --- /dev/null +++ b/clang/test/Driver/cl-options.cu @@ -0,0 +1,27 @@ +// Verify that we don't pass unwanted options to device-side compilation when +// clang-cl is used for CUDA compilation. +// Note: %s must be preceded by --, otherwise it may be interpreted as a +// command-line option, e.g. on Mac where %s is commonly under /Users. + +// -stack-protector should not be passed to device-side CUDA compilation +// RUN: %clang_cl -### -nocudalib -nocudainc -- %s 2>&1 | FileCheck -check-prefix=GS-default %s +// GS-default: "-cc1" "-triple" "nvptx64-nvidia-cuda" +// GS-default-NOT: "-stack-protector" +// GS-default: "-cc1" "-triple" +// GS-default: "-stack-protector" "2" + +// -exceptions should be passed to device-side compilation. +// RUN: %clang_cl /c /GX -### -nocudalib -nocudainc -- %s 2>&1 | FileCheck -check-prefix=GX %s +// GX: "-cc1" "-triple" "nvptx64-nvidia-cuda" +// GX-NOT: "-fcxx-exceptions" +// GX-NOT: "-fexceptions" +// GX: "-cc1" "-triple" +// GX: "-fcxx-exceptions" "-fexceptions" + +// /Gd should not override default calling convention on device side. +// RUN: %clang_cl /c /Gd -### -nocudalib -nocudainc -- %s 2>&1 | FileCheck -check-prefix=Gd %s +// Gd: "-cc1" "-triple" "nvptx64-nvidia-cuda" +// Gd-NOT: "-fcxx-exceptions" +// Gd-NOT: "-fdefault-calling-conv=cdecl" +// Gd: "-cc1" "-triple" +// Gd: "-fdefault-calling-conv=cdecl"