Skip to content

Commit 4605714

Browse files
committed
[flang][windows] Add option to link against specific MSVC CRT
Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against.
1 parent 601e8fd commit 4605714

File tree

19 files changed

+169
-31
lines changed

19 files changed

+169
-31
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2858,7 +2858,7 @@ def fms_compatibility_version
28582858
"version number to report in _MSC_VER (0 = don't define it "
28592859
"(default))">;
28602860
def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group<f_Group>,
2861-
Flags<[]>, Visibility<[ClangOption, CLOption]>,
2861+
Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
28622862
Values<"static,static_dbg,dll,dll_dbg">,
28632863
HelpText<"Select Windows run-time library">,
28642864
DocBrief<[{

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
976976
return true;
977977
}
978978

979-
void tools::addFortranRuntimeLibs(const ToolChain &TC,
979+
void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
980980
llvm::opt::ArgStringList &CmdArgs) {
981981
if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
982-
CmdArgs.push_back("Fortran_main.lib");
983-
CmdArgs.push_back("FortranRuntime.lib");
984-
CmdArgs.push_back("FortranDecimal.lib");
982+
CmdArgs.push_back(Args.MakeArgString(
983+
"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
984+
unsigned RTOptionID = options::OPT__SLASH_MT;
985+
if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
986+
RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
987+
.Case("static", options::OPT__SLASH_MT)
988+
.Case("static_dbg", options::OPT__SLASH_MTd)
989+
.Case("dll", options::OPT__SLASH_MD)
990+
.Case("dll_dbg", options::OPT__SLASH_MDd)
991+
.Default(options::OPT__SLASH_MT);
992+
}
993+
switch (RTOptionID) {
994+
case options::OPT__SLASH_MT:
995+
CmdArgs.push_back("/DEFAULTLIB:libcmt");
996+
CmdArgs.push_back("Fortran_main.static.lib");
997+
CmdArgs.push_back("FortranRuntime.static.lib");
998+
CmdArgs.push_back("FortranDecimal.static.lib");
999+
break;
1000+
case options::OPT__SLASH_MTd:
1001+
CmdArgs.push_back("/DEFAULTLIB:libcmtd");
1002+
CmdArgs.push_back("Fortran_main.static_dbg.lib");
1003+
CmdArgs.push_back("FortranRuntime.static_dbg.lib");
1004+
CmdArgs.push_back("FortranDecimal.static_dbg.lib");
1005+
break;
1006+
case options::OPT__SLASH_MD:
1007+
CmdArgs.push_back("/DEFAULTLIB:msvcrt");
1008+
CmdArgs.push_back("Fortran_main.dynamic.lib");
1009+
CmdArgs.push_back("FortranRuntime.dynamic.lib");
1010+
CmdArgs.push_back("FortranDecimal.dynamic.lib");
1011+
break;
1012+
case options::OPT__SLASH_MDd:
1013+
CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
1014+
CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
1015+
CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
1016+
CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
1017+
break;
1018+
}
9851019
} else {
9861020
CmdArgs.push_back("-lFortran_main");
9871021
CmdArgs.push_back("-lFortranRuntime");

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC,
116116
bool IsOffloadingHost = false, bool GompNeedsRT = false);
117117

118118
/// Adds Fortran runtime libraries to \p CmdArgs.
119-
void addFortranRuntimeLibs(const ToolChain &TC,
119+
void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
120120
llvm::opt::ArgStringList &CmdArgs);
121121

122122
/// Adds the path for the Fortran runtime libraries to \p CmdArgs.

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
678678
// to generate executables.
679679
if (getToolChain().getDriver().IsFlangMode()) {
680680
addFortranRuntimeLibraryPath(getToolChain(), Args, CmdArgs);
681-
addFortranRuntimeLibs(getToolChain(), CmdArgs);
681+
addFortranRuntimeLibs(getToolChain(), Args, CmdArgs);
682682
}
683683

684684
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))

clang/lib/Driver/ToolChains/DragonFly.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
153153
// AddRunTimeLibs).
154154
if (D.IsFlangMode()) {
155155
addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
156-
addFortranRuntimeLibs(ToolChain, CmdArgs);
156+
addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
157157
CmdArgs.push_back("-lm");
158158
}
159159

clang/lib/Driver/ToolChains/FreeBSD.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
308308
// AddRunTimeLibs).
309309
if (D.IsFlangMode()) {
310310
addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
311-
addFortranRuntimeLibs(ToolChain, CmdArgs);
311+
addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
312312
if (Profiling)
313313
CmdArgs.push_back("-lm_p");
314314
else

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
584584
// AddRunTimeLibs).
585585
if (D.IsFlangMode()) {
586586
addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
587-
addFortranRuntimeLibs(ToolChain, CmdArgs);
587+
addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
588588
CmdArgs.push_back("-lm");
589589
}
590590

clang/lib/Driver/ToolChains/Haiku.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA,
104104
// AddRunTimeLibs).
105105
if (D.IsFlangMode()) {
106106
addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
107-
addFortranRuntimeLibs(ToolChain, CmdArgs);
107+
addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
108108
}
109109

110110
CmdArgs.push_back("-lgcc");

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
131131

132132
if (C.getDriver().IsFlangMode()) {
133133
addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
134-
addFortranRuntimeLibs(TC, CmdArgs);
134+
addFortranRuntimeLibs(TC, Args, CmdArgs);
135135

136136
// Inform the MSVC linker that we're generating a console application, i.e.
137137
// one with `main` as the "user-defined" entry point. The `main` function is

clang/lib/Driver/ToolChains/MinGW.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
249249

250250
if (C.getDriver().IsFlangMode()) {
251251
addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
252-
addFortranRuntimeLibs(TC, CmdArgs);
252+
addFortranRuntimeLibs(TC, Args, CmdArgs);
253253
}
254254

255255
// TODO: Add profile stuff here

0 commit comments

Comments
 (0)