@@ -6783,9 +6783,9 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
67836783 bool *EmitCodeView) const {
67846784 unsigned RTOptionID = options::OPT__SLASH_MT;
67856785 bool isNVPTX = getToolChain ().getTriple ().isNVPTX ();
6786- bool isSYCL =
6787- Args.hasArg (options::OPT_fsycl) ||
6786+ bool isSYCLDevice =
67886787 getToolChain ().getTriple ().getEnvironment () == llvm::Triple::SYCLDevice;
6788+ bool isSYCL = Args.hasArg (options::OPT_fsycl) || isSYCLDevice;
67896789 // For SYCL Windows, /MD is the default.
67906790 if (isSYCL)
67916791 RTOptionID = options::OPT__SLASH_MD;
@@ -6797,38 +6797,42 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
67976797
67986798 if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group)) {
67996799 RTOptionID = A->getOption ().getID ();
6800- if (isSYCL && (RTOptionID == options::OPT__SLASH_MT ||
6801- RTOptionID == options::OPT__SLASH_MTd))
6800+ if (isSYCL && !isSYCLDevice &&
6801+ (RTOptionID == options::OPT__SLASH_MT ||
6802+ RTOptionID == options::OPT__SLASH_MTd))
68026803 // Use of /MT or /MTd is not supported for SYCL.
68036804 getToolChain ().getDriver ().Diag (diag::err_drv_unsupported_opt_dpcpp)
68046805 << A->getOption ().getName ();
68056806 }
68066807
6808+ enum { addDEBUG = 0x1 , addMT = 0x2 , addDLL = 0x4 };
6809+ auto addPreDefines = [&](unsigned Defines) {
6810+ if (Defines & addDEBUG)
6811+ CmdArgs.push_back (" -D_DEBUG" );
6812+ if (Defines & addMT && !isSYCLDevice)
6813+ CmdArgs.push_back (" -D_MT" );
6814+ if (Defines & addDLL && !isSYCLDevice)
6815+ CmdArgs.push_back (" -D_DLL" );
6816+ };
68076817 StringRef FlagForCRT;
68086818 switch (RTOptionID) {
68096819 case options::OPT__SLASH_MD:
6810- if (Args.hasArg (options::OPT__SLASH_LDd))
6811- CmdArgs.push_back (" -D_DEBUG" );
6812- CmdArgs.push_back (" -D_MT" );
6813- CmdArgs.push_back (" -D_DLL" );
6820+ addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
6821+ addMT | addDLL);
68146822 FlagForCRT = " --dependent-lib=msvcrt" ;
68156823 break ;
68166824 case options::OPT__SLASH_MDd:
6817- CmdArgs.push_back (" -D_DEBUG" );
6818- CmdArgs.push_back (" -D_MT" );
6819- CmdArgs.push_back (" -D_DLL" );
6825+ addPreDefines (addDEBUG | addMT | addDLL);
68206826 FlagForCRT = " --dependent-lib=msvcrtd" ;
68216827 break ;
68226828 case options::OPT__SLASH_MT:
6823- if (Args.hasArg (options::OPT__SLASH_LDd))
6824- CmdArgs.push_back (" -D_DEBUG" );
6825- CmdArgs.push_back (" -D_MT" );
6829+ addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
6830+ addMT);
68266831 CmdArgs.push_back (" -flto-visibility-public-std" );
68276832 FlagForCRT = " --dependent-lib=libcmt" ;
68286833 break ;
68296834 case options::OPT__SLASH_MTd:
6830- CmdArgs.push_back (" -D_DEBUG" );
6831- CmdArgs.push_back (" -D_MT" );
6835+ addPreDefines (addDEBUG | addMT);
68326836 CmdArgs.push_back (" -flto-visibility-public-std" );
68336837 FlagForCRT = " --dependent-lib=libcmtd" ;
68346838 break ;
0 commit comments