Skip to content

Commit cf1e342

Browse files
authored
[flang][windows] Add option to link against specific MSVC CRT (llvm#70833)
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 18a0313 commit cf1e342

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)