diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6424e58c9df28..532909e8a0354 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6258,6 +6258,19 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasFlag(options::OPT_fsycl_esimd, options::OPT_fno_sycl_esimd, false)) CmdArgs.push_back("-fsycl-explicit-simd"); + + if (!D.IsCLMode()) { + // SYCL library is guaranteed to work correctly only with dynamic + // MSVC runtime. + llvm::Triple AuxT = C.getDefaultToolChain().getTriple(); + if (Args.hasFlag(options::OPT_fsycl_device_only, OptSpecifier(), false)) + AuxT = llvm::Triple(llvm::sys::getProcessTriple()); + if (AuxT.isWindowsMSVCEnvironment()) { + CmdArgs.push_back("-D_MT"); + CmdArgs.push_back("-D_DLL"); + CmdArgs.push_back("--dependent-lib=msvcrt"); + } + } } if (IsSYCLOffloadDevice && JA.getType() == types::TY_SYCL_Header) { // Generating a SYCL Header @@ -6836,8 +6849,7 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, // Add SYCL dependent library if (Args.hasArg(options::OPT_fsycl) && !Args.hasArg(options::OPT_nolibsycl)) { - if (RTOptionID == options::OPT__SLASH_MDd || - RTOptionID == options::OPT__SLASH_MTd) + if (RTOptionID == options::OPT__SLASH_MDd) CmdArgs.push_back("--dependent-lib=sycld"); else CmdArgs.push_back("--dependent-lib=sycl"); diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 01f68e38d65b6..447b4a9e87912 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -370,8 +370,12 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, Args.MakeArgString(std::string("-out:") + Output.getFilename())); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) && - !C.getDriver().IsCLMode()) - CmdArgs.push_back("-defaultlib:libcmt"); + !C.getDriver().IsCLMode()) { + if (Args.hasArg(options::OPT_fsycl) && !Args.hasArg(options::OPT_nolibsycl)) + CmdArgs.push_back("-defaultlib:msvcrt"); + else + CmdArgs.push_back("-defaultlib:libcmt"); + } if (!C.getDriver().IsCLMode() && !Args.hasArg(options::OPT_nostdlib) && Args.hasArg(options::OPT_fsycl) && !Args.hasArg(options::OPT_nolibsycl)) { diff --git a/clang/test/Driver/sycl-MD-default.cpp b/clang/test/Driver/sycl-MD-default.cpp index b7ffd42f6a274..5e88a48c76f54 100644 --- a/clang/test/Driver/sycl-MD-default.cpp +++ b/clang/test/Driver/sycl-MD-default.cpp @@ -1,5 +1,9 @@ // REQUIRES: clang-driver +// RUN: %clang -### -fsycl -c -target x86_64-unknown-windows-msvc %s 2>&1 \ +// 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 // RUN: %clang_cl -### -fsycl -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-DEFAULT %s // RUN: %clang_cl -### -MD -fsycl -c %s 2>&1 \