Skip to content

Commit 0f40a51

Browse files
committed
Respect -fno-fortran-main also for MSVC
1 parent 179563c commit 0f40a51

File tree

2 files changed

+38
-29
lines changed

2 files changed

+38
-29
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,10 +1120,11 @@ void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
11201120
llvm::opt::ArgStringList &CmdArgs) {
11211121
// These are handled earlier on Windows by telling the frontend driver to add
11221122
// the correct libraries to link against as dependents in the object file.
1123+
1124+
// if -fno-fortran-main has been passed, skip linking Fortran_main.a
1125+
bool LinkFortranMain = !Args.hasArg(options::OPT_no_fortran_main);
11231126
if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
1124-
// if -fno-fortran-main has been passed, skip linking Fortran_main.a
1125-
bool DontLinkFortranMain = Args.hasArg(options::OPT_no_fortran_main);
1126-
if (!DontLinkFortranMain) {
1127+
if (LinkFortranMain) {
11271128
// The --whole-archive option needs to be part of the link line to
11281129
// make sure that the main() function from Fortran_main.a is pulled
11291130
// in by the linker. Determine if --whole-archive is active when
@@ -1150,28 +1151,30 @@ void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
11501151
CmdArgs.push_back("-lFortranRuntime");
11511152
CmdArgs.push_back("-lFortranDecimal");
11521153
} else {
1153-
unsigned RTOptionID = options::OPT__SLASH_MT;
1154-
if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
1155-
RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
1156-
.Case("static", options::OPT__SLASH_MT)
1157-
.Case("static_dbg", options::OPT__SLASH_MTd)
1158-
.Case("dll", options::OPT__SLASH_MD)
1159-
.Case("dll_dbg", options::OPT__SLASH_MDd)
1160-
.Default(options::OPT__SLASH_MT);
1161-
}
1162-
switch (RTOptionID) {
1163-
case options::OPT__SLASH_MT:
1164-
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib");
1165-
break;
1166-
case options::OPT__SLASH_MTd:
1167-
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static_dbg.lib");
1168-
break;
1169-
case options::OPT__SLASH_MD:
1170-
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.dynamic.lib");
1171-
break;
1172-
case options::OPT__SLASH_MDd:
1173-
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.dynamic_dbg.lib");
1174-
break;
1154+
if (LinkFortranMain) {
1155+
unsigned RTOptionID = options::OPT__SLASH_MT;
1156+
if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
1157+
RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
1158+
.Case("static", options::OPT__SLASH_MT)
1159+
.Case("static_dbg", options::OPT__SLASH_MTd)
1160+
.Case("dll", options::OPT__SLASH_MD)
1161+
.Case("dll_dbg", options::OPT__SLASH_MDd)
1162+
.Default(options::OPT__SLASH_MT);
1163+
}
1164+
switch (RTOptionID) {
1165+
case options::OPT__SLASH_MT:
1166+
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib");
1167+
break;
1168+
case options::OPT__SLASH_MTd:
1169+
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static_dbg.lib");
1170+
break;
1171+
case options::OPT__SLASH_MD:
1172+
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.dynamic.lib");
1173+
break;
1174+
case options::OPT__SLASH_MDd:
1175+
CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.dynamic_dbg.lib");
1176+
break;
1177+
}
11751178
}
11761179
}
11771180
}

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
231231
ArgStringList &CmdArgs) {
232232
assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
233233
"can only add VS runtime library on Windows!");
234+
// if -fno-fortran-main has been passed, skip linking Fortran_main.a
235+
bool LinkFortranMain = !Args.hasArg(options::OPT_no_fortran_main);
234236
if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
235237
CmdArgs.push_back(Args.MakeArgString(
236238
"--dependent-lib=" + TC.getCompilerRTBasename(Args, "builtins")));
@@ -248,23 +250,26 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
248250
case options::OPT__SLASH_MT:
249251
CmdArgs.push_back("-D_MT");
250252
CmdArgs.push_back("--dependent-lib=libcmt");
251-
CmdArgs.push_back("--dependent-lib=Fortran_main.static.lib");
253+
if (LinkFortranMain)
254+
CmdArgs.push_back("--dependent-lib=Fortran_main.static.lib");
252255
CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
253256
CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
254257
break;
255258
case options::OPT__SLASH_MTd:
256259
CmdArgs.push_back("-D_MT");
257260
CmdArgs.push_back("-D_DEBUG");
258261
CmdArgs.push_back("--dependent-lib=libcmtd");
259-
CmdArgs.push_back("--dependent-lib=Fortran_main.static_dbg.lib");
262+
if (LinkFortranMain)
263+
CmdArgs.push_back("--dependent-lib=Fortran_main.static_dbg.lib");
260264
CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
261265
CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
262266
break;
263267
case options::OPT__SLASH_MD:
264268
CmdArgs.push_back("-D_MT");
265269
CmdArgs.push_back("-D_DLL");
266270
CmdArgs.push_back("--dependent-lib=msvcrt");
267-
CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic.lib");
271+
if (LinkFortranMain)
272+
CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic.lib");
268273
CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
269274
CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
270275
break;
@@ -273,7 +278,8 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
273278
CmdArgs.push_back("-D_DEBUG");
274279
CmdArgs.push_back("-D_DLL");
275280
CmdArgs.push_back("--dependent-lib=msvcrtd");
276-
CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic_dbg.lib");
281+
if (LinkFortranMain)
282+
CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic_dbg.lib");
277283
CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
278284
CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
279285
break;

0 commit comments

Comments
 (0)