@@ -4676,13 +4676,22 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
4676
4676
const ToolChain &TC) {
4677
4677
unsigned RTOptionID = options::OPT__SLASH_MT;
4678
4678
4679
+ bool isSPIR = TC.getTriple ().isSPIR ();
4680
+ bool isSYCL = Args.hasArg (options::OPT_fsycl);
4681
+ // For SYCL Windows, /MD is the default.
4682
+ if (isSYCL)
4683
+ RTOptionID = options::OPT__SLASH_MD;
4684
+
4679
4685
if (Args.hasArg (options::OPT__SLASH_LDd))
4680
- // The /LDd option implies /MTd. The dependent lib part can be overridden,
4681
- // but defining _DEBUG is sticky.
4682
- RTOptionID = options::OPT__SLASH_MTd;
4686
+ // The /LDd option implies /MTd (/MDd for SYCL) . The dependent lib part
4687
+ // can be overridden, but defining _DEBUG is sticky.
4688
+ RTOptionID = isSYCL ? options::OPT__SLASH_MDd : options::OPT__SLASH_MTd;
4683
4689
4684
- if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group))
4690
+ Arg *SetArg = nullptr ;
4691
+ if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group)) {
4685
4692
RTOptionID = A->getOption ().getID ();
4693
+ SetArg = A;
4694
+ }
4686
4695
4687
4696
if (Arg *A = Args.getLastArg (options::OPT_fms_runtime_lib_EQ)) {
4688
4697
RTOptionID = llvm::StringSwitch<unsigned >(A->getValue ())
@@ -4691,40 +4700,43 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
4691
4700
.Case (" dll" , options::OPT__SLASH_MD)
4692
4701
.Case (" dll_dbg" , options::OPT__SLASH_MDd)
4693
4702
.Default (options::OPT__SLASH_MT);
4703
+ SetArg = A;
4694
4704
}
4705
+ if (isSYCL && !isSPIR && SetArg &&
4706
+ (RTOptionID == options::OPT__SLASH_MT ||
4707
+ RTOptionID == options::OPT__SLASH_MTd))
4708
+ // Use of /MT or /MTd is not supported for SYCL.
4709
+ TC.getDriver ().Diag (diag::err_drv_unsupported_opt_dpcpp)
4710
+ << SetArg->getOption ().getName ();
4695
4711
4696
- bool isSPIR = TC.getTriple ().isSPIR ();
4697
- StringRef FlagForCRT;
4698
- switch (RTOptionID) {
4699
- case options::OPT__SLASH_MD:
4700
- if (Args.hasArg (options::OPT__SLASH_LDd))
4712
+ enum { addDEBUG = 0x1 , addMT = 0x2 , addDLL = 0x4 };
4713
+ auto addPreDefines = [&](unsigned Defines) {
4714
+ if (Defines & addDEBUG)
4701
4715
CmdArgs.push_back (" -D_DEBUG" );
4702
- if (!isSPIR) {
4716
+ if (Defines & addMT && !isSPIR)
4703
4717
CmdArgs.push_back (" -D_MT" );
4718
+ if (Defines & addDLL && !isSPIR)
4704
4719
CmdArgs.push_back (" -D_DLL" );
4705
- }
4720
+ };
4721
+ StringRef FlagForCRT;
4722
+ switch (RTOptionID) {
4723
+ case options::OPT__SLASH_MD:
4724
+ addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
4725
+ addMT | addDLL);
4706
4726
FlagForCRT = " --dependent-lib=msvcrt" ;
4707
4727
break ;
4708
4728
case options::OPT__SLASH_MDd:
4709
- CmdArgs.push_back (" -D_DEBUG" );
4710
- if (!isSPIR) {
4711
- CmdArgs.push_back (" -D_MT" );
4712
- CmdArgs.push_back (" -D_DLL" );
4713
- }
4729
+ addPreDefines (addDEBUG | addMT | addDLL);
4714
4730
FlagForCRT = " --dependent-lib=msvcrtd" ;
4715
4731
break ;
4716
4732
case options::OPT__SLASH_MT:
4717
- if (Args.hasArg (options::OPT__SLASH_LDd))
4718
- CmdArgs.push_back (" -D_DEBUG" );
4719
- if (!isSPIR)
4720
- CmdArgs.push_back (" -D_MT" );
4733
+ addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
4734
+ addMT);
4721
4735
CmdArgs.push_back (" -flto-visibility-public-std" );
4722
4736
FlagForCRT = " --dependent-lib=libcmt" ;
4723
4737
break ;
4724
4738
case options::OPT__SLASH_MTd:
4725
- CmdArgs.push_back (" -D_DEBUG" );
4726
- if (!isSPIR)
4727
- CmdArgs.push_back (" -D_MT" );
4739
+ addPreDefines (addDEBUG | addMT);
4728
4740
CmdArgs.push_back (" -flto-visibility-public-std" );
4729
4741
FlagForCRT = " --dependent-lib=libcmtd" ;
4730
4742
break ;
@@ -4741,6 +4753,15 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
4741
4753
// users want. The /Za flag to cl.exe turns this off, but it's not
4742
4754
// implemented in clang.
4743
4755
CmdArgs.push_back (" --dependent-lib=oldnames" );
4756
+ // Add SYCL dependent library
4757
+ if (Args.hasArg (options::OPT_fsycl) &&
4758
+ !Args.hasArg (options::OPT_nolibsycl)) {
4759
+ if (RTOptionID == options::OPT__SLASH_MDd)
4760
+ CmdArgs.push_back (" --dependent-lib=sycl" SYCL_MAJOR_VERSION " d" );
4761
+ else
4762
+ CmdArgs.push_back (" --dependent-lib=sycl" SYCL_MAJOR_VERSION);
4763
+ CmdArgs.push_back (" --dependent-lib=sycl-devicelib-host" );
4764
+ }
4744
4765
}
4745
4766
}
4746
4767
@@ -8165,85 +8186,8 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
8165
8186
ArgStringList &CmdArgs,
8166
8187
codegenoptions::DebugInfoKind *DebugInfoKind,
8167
8188
bool *EmitCodeView) const {
8168
- unsigned RTOptionID = options::OPT__SLASH_MT;
8169
8189
bool isNVPTX = getToolChain ().getTriple ().isNVPTX ();
8170
- bool isSPIR = getToolChain ().getTriple ().isSPIR ();
8171
- // FIXME: isSYCL should not be enabled by "isSPIR"
8172
- bool isSYCL = Args.hasArg (options::OPT_fsycl) || isSPIR;
8173
- // For SYCL Windows, /MD is the default.
8174
- if (isSYCL)
8175
- RTOptionID = options::OPT__SLASH_MD;
8176
-
8177
- if (Args.hasArg (options::OPT__SLASH_LDd))
8178
- // The /LDd option implies /MTd (/MDd for SYCL). The dependent lib part
8179
- // can be overridden but defining _DEBUG is sticky.
8180
- RTOptionID = isSYCL ? options::OPT__SLASH_MDd : options::OPT__SLASH_MTd;
8181
-
8182
- if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group)) {
8183
- RTOptionID = A->getOption ().getID ();
8184
- if (isSYCL && !isSPIR &&
8185
- (RTOptionID == options::OPT__SLASH_MT ||
8186
- RTOptionID == options::OPT__SLASH_MTd))
8187
- // Use of /MT or /MTd is not supported for SYCL.
8188
- getToolChain ().getDriver ().Diag (diag::err_drv_unsupported_opt_dpcpp)
8189
- << A->getOption ().getName ();
8190
- }
8191
-
8192
- enum { addDEBUG = 0x1 , addMT = 0x2 , addDLL = 0x4 };
8193
- auto addPreDefines = [&](unsigned Defines) {
8194
- if (Defines & addDEBUG)
8195
- CmdArgs.push_back (" -D_DEBUG" );
8196
- if (Defines & addMT && !isSPIR)
8197
- CmdArgs.push_back (" -D_MT" );
8198
- if (Defines & addDLL && !isSPIR)
8199
- CmdArgs.push_back (" -D_DLL" );
8200
- };
8201
- StringRef FlagForCRT;
8202
- switch (RTOptionID) {
8203
- case options::OPT__SLASH_MD:
8204
- addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
8205
- addMT | addDLL);
8206
- FlagForCRT = " --dependent-lib=msvcrt" ;
8207
- break ;
8208
- case options::OPT__SLASH_MDd:
8209
- addPreDefines (addDEBUG | addMT | addDLL);
8210
- FlagForCRT = " --dependent-lib=msvcrtd" ;
8211
- break ;
8212
- case options::OPT__SLASH_MT:
8213
- addPreDefines ((Args.hasArg (options::OPT__SLASH_LDd) ? addDEBUG : 0x0 ) |
8214
- addMT);
8215
- CmdArgs.push_back (" -flto-visibility-public-std" );
8216
- FlagForCRT = " --dependent-lib=libcmt" ;
8217
- break ;
8218
- case options::OPT__SLASH_MTd:
8219
- addPreDefines (addDEBUG | addMT);
8220
- CmdArgs.push_back (" -flto-visibility-public-std" );
8221
- FlagForCRT = " --dependent-lib=libcmtd" ;
8222
- break ;
8223
- default :
8224
- llvm_unreachable (" Unexpected option ID." );
8225
- }
8226
-
8227
- if (Args.hasArg (options::OPT__SLASH_Zl)) {
8228
- CmdArgs.push_back (" -D_VC_NODEFAULTLIB" );
8229
- } else {
8230
- CmdArgs.push_back (FlagForCRT.data ());
8231
-
8232
- // This provides POSIX compatibility (maps 'open' to '_open'), which most
8233
- // users want. The /Za flag to cl.exe turns this off, but it's not
8234
- // implemented in clang.
8235
- CmdArgs.push_back (" --dependent-lib=oldnames" );
8236
8190
8237
- // Add SYCL dependent library
8238
- if (Args.hasArg (options::OPT_fsycl) &&
8239
- !Args.hasArg (options::OPT_nolibsycl)) {
8240
- if (RTOptionID == options::OPT__SLASH_MDd)
8241
- CmdArgs.push_back (" --dependent-lib=sycl" SYCL_MAJOR_VERSION " d" );
8242
- else
8243
- CmdArgs.push_back (" --dependent-lib=sycl" SYCL_MAJOR_VERSION);
8244
- CmdArgs.push_back (" --dependent-lib=sycl-devicelib-host" );
8245
- }
8246
- }
8247
8191
ProcessVSRuntimeLibrary (Args, CmdArgs, getToolChain ());
8248
8192
8249
8193
if (Arg *ShowIncludes =
0 commit comments