diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 532909e8a0354..68d0211308b70 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6783,9 +6783,9 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, bool *EmitCodeView) const { unsigned RTOptionID = options::OPT__SLASH_MT; bool isNVPTX = getToolChain().getTriple().isNVPTX(); - bool isSYCL = - Args.hasArg(options::OPT_fsycl) || + bool isSYCLDevice = getToolChain().getTriple().getEnvironment() == llvm::Triple::SYCLDevice; + bool isSYCL = Args.hasArg(options::OPT_fsycl) || isSYCLDevice; // For SYCL Windows, /MD is the default. if (isSYCL) RTOptionID = options::OPT__SLASH_MD; @@ -6797,38 +6797,42 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) { RTOptionID = A->getOption().getID(); - if (isSYCL && (RTOptionID == options::OPT__SLASH_MT || - RTOptionID == options::OPT__SLASH_MTd)) + if (isSYCL && !isSYCLDevice && + (RTOptionID == options::OPT__SLASH_MT || + RTOptionID == options::OPT__SLASH_MTd)) // Use of /MT or /MTd is not supported for SYCL. getToolChain().getDriver().Diag(diag::err_drv_unsupported_opt_dpcpp) << A->getOption().getName(); } + enum { addDEBUG = 0x1, addMT = 0x2, addDLL = 0x4 }; + auto addPreDefines = [&](unsigned Defines) { + if (Defines & addDEBUG) + CmdArgs.push_back("-D_DEBUG"); + if (Defines & addMT && !isSYCLDevice) + CmdArgs.push_back("-D_MT"); + if (Defines & addDLL && !isSYCLDevice) + CmdArgs.push_back("-D_DLL"); + }; StringRef FlagForCRT; switch (RTOptionID) { case options::OPT__SLASH_MD: - if (Args.hasArg(options::OPT__SLASH_LDd)) - CmdArgs.push_back("-D_DEBUG"); - CmdArgs.push_back("-D_MT"); - CmdArgs.push_back("-D_DLL"); + addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) | + addMT | addDLL); FlagForCRT = "--dependent-lib=msvcrt"; break; case options::OPT__SLASH_MDd: - CmdArgs.push_back("-D_DEBUG"); - CmdArgs.push_back("-D_MT"); - CmdArgs.push_back("-D_DLL"); + addPreDefines(addDEBUG | addMT | addDLL); FlagForCRT = "--dependent-lib=msvcrtd"; break; case options::OPT__SLASH_MT: - if (Args.hasArg(options::OPT__SLASH_LDd)) - CmdArgs.push_back("-D_DEBUG"); - CmdArgs.push_back("-D_MT"); + addPreDefines((Args.hasArg(options::OPT__SLASH_LDd) ? addDEBUG : 0x0) | + addMT); CmdArgs.push_back("-flto-visibility-public-std"); FlagForCRT = "--dependent-lib=libcmt"; break; case options::OPT__SLASH_MTd: - CmdArgs.push_back("-D_DEBUG"); - CmdArgs.push_back("-D_MT"); + addPreDefines(addDEBUG | addMT); CmdArgs.push_back("-flto-visibility-public-std"); FlagForCRT = "--dependent-lib=libcmtd"; break; diff --git a/clang/test/Driver/sycl-MD-default.cpp b/clang/test/Driver/sycl-MD-default.cpp index 5e88a48c76f54..491745289c13c 100644 --- a/clang/test/Driver/sycl-MD-default.cpp +++ b/clang/test/Driver/sycl-MD-default.cpp @@ -4,14 +4,17 @@ // RUN: | FileCheck -check-prefix=CHK-DEFAULT %s // RUN: %clangxx -### -fsycl -c -target x86_64-unknown-windows-msvc %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-DEFAULT %s +// CHK-DEFAULT-NOT: "-fsycl-is-device" {{.*}} "-D_MT" "-D_DLL" +// CHK-DEFAULT: "-fsycl-is-host" "-D_MT" "-D_DLL" "--dependent-lib=msvcrt{{d*}}" {{.*}} + // RUN: %clang_cl -### -fsycl -c %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s +// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s // RUN: %clang_cl -### -MD -fsycl -c %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s +// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s // RUN: %clang_cl -### -MDd -fsycl -c %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s -// CHK-DEFAULT: "-D_MT" "-D_DLL" -// CHK-DEFAULT: "--dependent-lib=msvcrt{{d*}}" +// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s +// CHK-DEFAULT-CL-NOT: "-fsycl-is-device" {{.*}} "-D_MT" "-D_DLL" +// CHK-DEFAULT-CL: "-D_MT" "-D_DLL" "--dependent-lib=msvcrt{{d*}}" {{.*}} "-fsycl-is-host" // RUN: %clang_cl -### -MT -fsycl -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-ERROR %s