@@ -4437,6 +4437,71 @@ static void renderDebugOptions(const ToolChain &TC, const Driver &D,
4437
4437
RenderDebugInfoCompressionArgs (Args, CmdArgs, D, TC);
4438
4438
}
4439
4439
4440
+ static void ProcessVSRuntimeLibrary (const ArgList &Args,
4441
+ ArgStringList &CmdArgs) {
4442
+ unsigned RTOptionID = options::OPT__SLASH_MT;
4443
+
4444
+ if (Args.hasArg (options::OPT__SLASH_LDd))
4445
+ // The /LDd option implies /MTd. The dependent lib part can be overridden,
4446
+ // but defining _DEBUG is sticky.
4447
+ RTOptionID = options::OPT__SLASH_MTd;
4448
+
4449
+ if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group))
4450
+ RTOptionID = A->getOption ().getID ();
4451
+
4452
+ if (Arg *A = Args.getLastArg (options::OPT_fms_runtime_lib_EQ)) {
4453
+ RTOptionID = llvm::StringSwitch<unsigned >(A->getValue ())
4454
+ .Case (" static" , options::OPT__SLASH_MT)
4455
+ .Case (" static_dbg" , options::OPT__SLASH_MTd)
4456
+ .Case (" dll" , options::OPT__SLASH_MD)
4457
+ .Case (" dll_dbg" , options::OPT__SLASH_MDd)
4458
+ .Default (options::OPT__SLASH_MT);
4459
+ }
4460
+
4461
+ StringRef FlagForCRT;
4462
+ switch (RTOptionID) {
4463
+ case options::OPT__SLASH_MD:
4464
+ if (Args.hasArg (options::OPT__SLASH_LDd))
4465
+ CmdArgs.push_back (" -D_DEBUG" );
4466
+ CmdArgs.push_back (" -D_MT" );
4467
+ CmdArgs.push_back (" -D_DLL" );
4468
+ FlagForCRT = " --dependent-lib=msvcrt" ;
4469
+ break ;
4470
+ case options::OPT__SLASH_MDd:
4471
+ CmdArgs.push_back (" -D_DEBUG" );
4472
+ CmdArgs.push_back (" -D_MT" );
4473
+ CmdArgs.push_back (" -D_DLL" );
4474
+ FlagForCRT = " --dependent-lib=msvcrtd" ;
4475
+ break ;
4476
+ case options::OPT__SLASH_MT:
4477
+ if (Args.hasArg (options::OPT__SLASH_LDd))
4478
+ CmdArgs.push_back (" -D_DEBUG" );
4479
+ CmdArgs.push_back (" -D_MT" );
4480
+ CmdArgs.push_back (" -flto-visibility-public-std" );
4481
+ FlagForCRT = " --dependent-lib=libcmt" ;
4482
+ break ;
4483
+ case options::OPT__SLASH_MTd:
4484
+ CmdArgs.push_back (" -D_DEBUG" );
4485
+ CmdArgs.push_back (" -D_MT" );
4486
+ CmdArgs.push_back (" -flto-visibility-public-std" );
4487
+ FlagForCRT = " --dependent-lib=libcmtd" ;
4488
+ break ;
4489
+ default :
4490
+ llvm_unreachable (" Unexpected option ID." );
4491
+ }
4492
+
4493
+ if (Args.hasArg (options::OPT__SLASH_Zl)) {
4494
+ CmdArgs.push_back (" -D_VC_NODEFAULTLIB" );
4495
+ } else {
4496
+ CmdArgs.push_back (FlagForCRT.data ());
4497
+
4498
+ // This provides POSIX compatibility (maps 'open' to '_open'), which most
4499
+ // users want. The /Za flag to cl.exe turns this off, but it's not
4500
+ // implemented in clang.
4501
+ CmdArgs.push_back (" --dependent-lib=oldnames" );
4502
+ }
4503
+ }
4504
+
4440
4505
void Clang::ConstructJob (Compilation &C, const JobAction &JA,
4441
4506
const InputInfo &Output, const InputInfoList &Inputs,
4442
4507
const ArgList &Args, const char *LinkingOutput) const {
@@ -6478,6 +6543,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
6478
6543
if (IsMSVCCompat)
6479
6544
CmdArgs.push_back (" -fms-compatibility" );
6480
6545
6546
+ if (Triple.isWindowsMSVCEnvironment () && !D.IsCLMode ())
6547
+ ProcessVSRuntimeLibrary (Args, CmdArgs);
6548
+
6481
6549
// Handle -fgcc-version, if present.
6482
6550
VersionTuple GNUCVer;
6483
6551
if (Arg *A = Args.getLastArg (options::OPT_fgnuc_version_EQ)) {
@@ -7528,59 +7596,9 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
7528
7596
ArgStringList &CmdArgs,
7529
7597
codegenoptions::DebugInfoKind *DebugInfoKind,
7530
7598
bool *EmitCodeView) const {
7531
- unsigned RTOptionID = options::OPT__SLASH_MT;
7532
7599
bool isNVPTX = getToolChain ().getTriple ().isNVPTX ();
7533
7600
7534
- if (Args.hasArg (options::OPT__SLASH_LDd))
7535
- // The /LDd option implies /MTd. The dependent lib part can be overridden,
7536
- // but defining _DEBUG is sticky.
7537
- RTOptionID = options::OPT__SLASH_MTd;
7538
-
7539
- if (Arg *A = Args.getLastArg (options::OPT__SLASH_M_Group))
7540
- RTOptionID = A->getOption ().getID ();
7541
-
7542
- StringRef FlagForCRT;
7543
- switch (RTOptionID) {
7544
- case options::OPT__SLASH_MD:
7545
- if (Args.hasArg (options::OPT__SLASH_LDd))
7546
- CmdArgs.push_back (" -D_DEBUG" );
7547
- CmdArgs.push_back (" -D_MT" );
7548
- CmdArgs.push_back (" -D_DLL" );
7549
- FlagForCRT = " --dependent-lib=msvcrt" ;
7550
- break ;
7551
- case options::OPT__SLASH_MDd:
7552
- CmdArgs.push_back (" -D_DEBUG" );
7553
- CmdArgs.push_back (" -D_MT" );
7554
- CmdArgs.push_back (" -D_DLL" );
7555
- FlagForCRT = " --dependent-lib=msvcrtd" ;
7556
- break ;
7557
- case options::OPT__SLASH_MT:
7558
- if (Args.hasArg (options::OPT__SLASH_LDd))
7559
- CmdArgs.push_back (" -D_DEBUG" );
7560
- CmdArgs.push_back (" -D_MT" );
7561
- CmdArgs.push_back (" -flto-visibility-public-std" );
7562
- FlagForCRT = " --dependent-lib=libcmt" ;
7563
- break ;
7564
- case options::OPT__SLASH_MTd:
7565
- CmdArgs.push_back (" -D_DEBUG" );
7566
- CmdArgs.push_back (" -D_MT" );
7567
- CmdArgs.push_back (" -flto-visibility-public-std" );
7568
- FlagForCRT = " --dependent-lib=libcmtd" ;
7569
- break ;
7570
- default :
7571
- llvm_unreachable (" Unexpected option ID." );
7572
- }
7573
-
7574
- if (Args.hasArg (options::OPT__SLASH_Zl)) {
7575
- CmdArgs.push_back (" -D_VC_NODEFAULTLIB" );
7576
- } else {
7577
- CmdArgs.push_back (FlagForCRT.data ());
7578
-
7579
- // This provides POSIX compatibility (maps 'open' to '_open'), which most
7580
- // users want. The /Za flag to cl.exe turns this off, but it's not
7581
- // implemented in clang.
7582
- CmdArgs.push_back (" --dependent-lib=oldnames" );
7583
- }
7601
+ ProcessVSRuntimeLibrary (Args, CmdArgs);
7584
7602
7585
7603
if (Arg *ShowIncludes =
7586
7604
Args.getLastArg (options::OPT__SLASH_showIncludes,
0 commit comments