Skip to content

Commit 0092d4d

Browse files
authored
[Driver][SYCL] Adjust /MD settings for SYCL device compilations (#2497)
When setting /MD (by default) we do not want to pass the _MT and _DLL predefines to the device compilations, only the host for clang-cl
1 parent 9db44f8 commit 0092d4d

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

+20-16
Original file line numberDiff line numberDiff line change
@@ -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;

clang/test/Driver/sycl-MD-default.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s
55
// RUN: %clangxx -### -fsycl -c -target x86_64-unknown-windows-msvc %s 2>&1 \
66
// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s
7+
// CHK-DEFAULT-NOT: "-fsycl-is-device" {{.*}} "-D_MT" "-D_DLL"
8+
// CHK-DEFAULT: "-fsycl-is-host" "-D_MT" "-D_DLL" "--dependent-lib=msvcrt{{d*}}" {{.*}}
9+
710
// RUN: %clang_cl -### -fsycl -c %s 2>&1 \
8-
// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s
11+
// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s
912
// RUN: %clang_cl -### -MD -fsycl -c %s 2>&1 \
10-
// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s
13+
// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s
1114
// RUN: %clang_cl -### -MDd -fsycl -c %s 2>&1 \
12-
// RUN: | FileCheck -check-prefix=CHK-DEFAULT %s
13-
// CHK-DEFAULT: "-D_MT" "-D_DLL"
14-
// CHK-DEFAULT: "--dependent-lib=msvcrt{{d*}}"
15+
// RUN: | FileCheck -check-prefix=CHK-DEFAULT-CL %s
16+
// CHK-DEFAULT-CL-NOT: "-fsycl-is-device" {{.*}} "-D_MT" "-D_DLL"
17+
// CHK-DEFAULT-CL: "-D_MT" "-D_DLL" "--dependent-lib=msvcrt{{d*}}" {{.*}} "-fsycl-is-host"
1518

1619
// RUN: %clang_cl -### -MT -fsycl -c %s 2>&1 \
1720
// RUN: | FileCheck -check-prefix=CHK-ERROR %s

0 commit comments

Comments
 (0)