forked from OSchip/llvm-project
Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.
This will allow selecting the MS C runtime library without having to use cc1 flags. Differential Revision: https://reviews.llvm.org/D133457
This commit is contained in:
parent
644dfbac64
commit
fda44bedd6
|
@ -2211,6 +2211,14 @@ def fms_compatibility_version
|
||||||
HelpText<"Dot-separated value representing the Microsoft compiler "
|
HelpText<"Dot-separated value representing the Microsoft compiler "
|
||||||
"version number to report in _MSC_VER (0 = don't define it "
|
"version number to report in _MSC_VER (0 = don't define it "
|
||||||
"(default))">;
|
"(default))">;
|
||||||
|
def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group<f_Group>,
|
||||||
|
Flags<[NoXarchOption, CoreOption]>, Values<"static,static_dbg,dll,dll_dbg">,
|
||||||
|
HelpText<"Select Windows run-time library">,
|
||||||
|
DocBrief<[{
|
||||||
|
Specify Visual Studio C runtime library. "static" and "static_dbg" correspond
|
||||||
|
to the cl flags /MT and /MTd which use the multithread, static version. "dll"
|
||||||
|
and "dll_dbg" correspond to the cl flags /MD and /MDd which use the multithread,
|
||||||
|
dll version.}]>;
|
||||||
defm delayed_template_parsing : BoolFOption<"delayed-template-parsing",
|
defm delayed_template_parsing : BoolFOption<"delayed-template-parsing",
|
||||||
LangOpts<"DelayedTemplateParsing">, DefaultFalse,
|
LangOpts<"DelayedTemplateParsing">, DefaultFalse,
|
||||||
PosFlag<SetTrue, [CC1Option], "Parse templated function definitions at the end of the translation unit">,
|
PosFlag<SetTrue, [CC1Option], "Parse templated function definitions at the end of the translation unit">,
|
||||||
|
|
|
@ -4437,6 +4437,71 @@ static void renderDebugOptions(const ToolChain &TC, const Driver &D,
|
||||||
RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
|
RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ProcessVSRuntimeLibrary(const ArgList &Args,
|
||||||
|
ArgStringList &CmdArgs) {
|
||||||
|
unsigned RTOptionID = options::OPT__SLASH_MT;
|
||||||
|
|
||||||
|
if (Args.hasArg(options::OPT__SLASH_LDd))
|
||||||
|
// The /LDd option implies /MTd. The dependent lib part can be overridden,
|
||||||
|
// but defining _DEBUG is sticky.
|
||||||
|
RTOptionID = options::OPT__SLASH_MTd;
|
||||||
|
|
||||||
|
if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
|
||||||
|
RTOptionID = A->getOption().getID();
|
||||||
|
|
||||||
|
if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
|
||||||
|
RTOptionID = llvm::StringSwitch<unsigned>(A->getValue())
|
||||||
|
.Case("static", options::OPT__SLASH_MT)
|
||||||
|
.Case("static_dbg", options::OPT__SLASH_MTd)
|
||||||
|
.Case("dll", options::OPT__SLASH_MD)
|
||||||
|
.Case("dll_dbg", options::OPT__SLASH_MDd)
|
||||||
|
.Default(options::OPT__SLASH_MT);
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
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");
|
||||||
|
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");
|
||||||
|
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");
|
||||||
|
CmdArgs.push_back("-flto-visibility-public-std");
|
||||||
|
FlagForCRT = "--dependent-lib=libcmtd";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
llvm_unreachable("Unexpected option ID.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Args.hasArg(options::OPT__SLASH_Zl)) {
|
||||||
|
CmdArgs.push_back("-D_VC_NODEFAULTLIB");
|
||||||
|
} else {
|
||||||
|
CmdArgs.push_back(FlagForCRT.data());
|
||||||
|
|
||||||
|
// This provides POSIX compatibility (maps 'open' to '_open'), which most
|
||||||
|
// users want. The /Za flag to cl.exe turns this off, but it's not
|
||||||
|
// implemented in clang.
|
||||||
|
CmdArgs.push_back("--dependent-lib=oldnames");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||||||
const InputInfo &Output, const InputInfoList &Inputs,
|
const InputInfo &Output, const InputInfoList &Inputs,
|
||||||
const ArgList &Args, const char *LinkingOutput) const {
|
const ArgList &Args, const char *LinkingOutput) const {
|
||||||
|
@ -6478,6 +6543,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||||||
if (IsMSVCCompat)
|
if (IsMSVCCompat)
|
||||||
CmdArgs.push_back("-fms-compatibility");
|
CmdArgs.push_back("-fms-compatibility");
|
||||||
|
|
||||||
|
if (Triple.isWindowsMSVCEnvironment() && !D.IsCLMode())
|
||||||
|
ProcessVSRuntimeLibrary(Args, CmdArgs);
|
||||||
|
|
||||||
// Handle -fgcc-version, if present.
|
// Handle -fgcc-version, if present.
|
||||||
VersionTuple GNUCVer;
|
VersionTuple GNUCVer;
|
||||||
if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
|
if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
|
||||||
|
@ -7528,59 +7596,9 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
|
||||||
ArgStringList &CmdArgs,
|
ArgStringList &CmdArgs,
|
||||||
codegenoptions::DebugInfoKind *DebugInfoKind,
|
codegenoptions::DebugInfoKind *DebugInfoKind,
|
||||||
bool *EmitCodeView) const {
|
bool *EmitCodeView) const {
|
||||||
unsigned RTOptionID = options::OPT__SLASH_MT;
|
|
||||||
bool isNVPTX = getToolChain().getTriple().isNVPTX();
|
bool isNVPTX = getToolChain().getTriple().isNVPTX();
|
||||||
|
|
||||||
if (Args.hasArg(options::OPT__SLASH_LDd))
|
ProcessVSRuntimeLibrary(Args, CmdArgs);
|
||||||
// The /LDd option implies /MTd. The dependent lib part can be overridden,
|
|
||||||
// but defining _DEBUG is sticky.
|
|
||||||
RTOptionID = options::OPT__SLASH_MTd;
|
|
||||||
|
|
||||||
if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
|
|
||||||
RTOptionID = A->getOption().getID();
|
|
||||||
|
|
||||||
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");
|
|
||||||
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");
|
|
||||||
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");
|
|
||||||
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");
|
|
||||||
CmdArgs.push_back("-flto-visibility-public-std");
|
|
||||||
FlagForCRT = "--dependent-lib=libcmtd";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
llvm_unreachable("Unexpected option ID.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Args.hasArg(options::OPT__SLASH_Zl)) {
|
|
||||||
CmdArgs.push_back("-D_VC_NODEFAULTLIB");
|
|
||||||
} else {
|
|
||||||
CmdArgs.push_back(FlagForCRT.data());
|
|
||||||
|
|
||||||
// This provides POSIX compatibility (maps 'open' to '_open'), which most
|
|
||||||
// users want. The /Za flag to cl.exe turns this off, but it's not
|
|
||||||
// implemented in clang.
|
|
||||||
CmdArgs.push_back("--dependent-lib=oldnames");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Arg *ShowIncludes =
|
if (Arg *ShowIncludes =
|
||||||
Args.getLastArg(options::OPT__SLASH_showIncludes,
|
Args.getLastArg(options::OPT__SLASH_showIncludes,
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
// RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
|
// RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
|
||||||
// RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
|
// RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
|
||||||
|
// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
|
||||||
|
// RUN: 2>&1 | FileCheck -check-prefix=CHECK-MT %s
|
||||||
// CHECK-MT-NOT: "-D_DEBUG"
|
// CHECK-MT-NOT: "-D_DEBUG"
|
||||||
// CHECK-MT: "-D_MT"
|
// CHECK-MT: "-D_MT"
|
||||||
// CHECK-MT-NOT: "-D_DLL"
|
// CHECK-MT-NOT: "-D_DLL"
|
||||||
|
@ -19,6 +21,8 @@
|
||||||
|
|
||||||
// RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
|
// RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
|
||||||
// RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
|
// RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
|
||||||
|
// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
|
||||||
|
// RUN: -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
|
||||||
// CHECK-MTd: "-D_DEBUG"
|
// CHECK-MTd: "-D_DEBUG"
|
||||||
// CHECK-MTd: "-D_MT"
|
// CHECK-MTd: "-D_MT"
|
||||||
// CHECK-MTd-NOT: "-D_DLL"
|
// CHECK-MTd-NOT: "-D_DLL"
|
||||||
|
@ -27,6 +31,8 @@
|
||||||
// CHECK-MTd: "--dependent-lib=oldnames"
|
// CHECK-MTd: "--dependent-lib=oldnames"
|
||||||
|
|
||||||
// RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
|
// RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
|
||||||
|
// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
|
||||||
|
// RUN: 2>&1 | FileCheck -check-prefix=CHECK-MD %s
|
||||||
// CHECK-MD-NOT: "-D_DEBUG"
|
// CHECK-MD-NOT: "-D_DEBUG"
|
||||||
// CHECK-MD: "-D_MT"
|
// CHECK-MD: "-D_MT"
|
||||||
// CHECK-MD: "-D_DLL"
|
// CHECK-MD: "-D_DLL"
|
||||||
|
@ -34,6 +40,8 @@
|
||||||
// CHECK-MD: "--dependent-lib=oldnames"
|
// CHECK-MD: "--dependent-lib=oldnames"
|
||||||
|
|
||||||
// RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
|
// RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
|
||||||
|
// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
|
||||||
|
// RUN: %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
|
||||||
// CHECK-MDd: "-D_DEBUG"
|
// CHECK-MDd: "-D_DEBUG"
|
||||||
// CHECK-MDd: "-D_MT"
|
// CHECK-MDd: "-D_MT"
|
||||||
// CHECK-MDd: "-D_DLL"
|
// CHECK-MDd: "-D_DLL"
|
||||||
|
|
Loading…
Reference in New Issue