tra created this revision. tra added a reviewer: rnk. Herald added subscribers: sanjoy.google, bixia. Herald added a project: clang.
Device-side compilation does not support some features and we need to filter them out when command line options enable them for the host. We're already doing this in various places in the regular clang driver, but clang-cl mode constructs cc1 options independently and needs to implement the filtering, too. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D75310 Files: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/cl-options.cu Index: clang/test/Driver/cl-options.cu =================================================================== --- /dev/null +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ 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:
Index: clang/test/Driver/cl-options.cu =================================================================== --- /dev/null +++ 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" Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ 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:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits