Skip to content

Commit 6f7a56d

Browse files
committed
[Driver] Handle -Mnomain and -fno-fortran-main correctly
-Mnomain and -fno-fortran-main were ineffective unless they were both used at the same time. This patch fixes the bug, formats needFortranMain and needFortranLibs, and adds some test cases for the logic.
1 parent 37b4e63 commit 6f7a56d

File tree

2 files changed

+44
-18
lines changed

2 files changed

+44
-18
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -340,19 +340,14 @@ static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg,
340340
#ifdef ENABLE_CLASSIC_FLANG
341341
/// \brief Determine if Fortran "main" object is needed
342342
bool tools::needFortranMain(const Driver &D, const ArgList &Args) {
343-
return (needFortranLibs(D, Args)
344-
&& (!Args.hasArg(options::OPT_Mnomain) ||
345-
!Args.hasArg(options::OPT_no_fortran_main)));
343+
return (needFortranLibs(D, Args) && !Args.hasArg(options::OPT_Mnomain) &&
344+
!Args.hasArg(options::OPT_no_fortran_main));
346345
}
347346

348347
/// \brief Determine if Fortran link libraies are needed
349348
bool tools::needFortranLibs(const Driver &D, const ArgList &Args) {
350-
if (D.IsFlangMode() && !Args.hasArg(options::OPT_nostdlib) &&
351-
!Args.hasArg(options::OPT_noFlangLibs)) {
352-
return true;
353-
}
354-
355-
return false;
349+
return (D.IsFlangMode() && !Args.hasArg(options::OPT_nostdlib) &&
350+
!Args.hasArg(options::OPT_noFlangLibs));
356351
}
357352
#endif
358353

clang/test/Driver/flang/classic-flang.f95

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,29 @@
4545
! Check that the linker job is given the correct libraries and library paths.
4646

4747
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -mp \
48-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-DYNAMIC-FLANG,CHECK-DYNAMIC-OMP %s
48+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-DYNAMIC-FLANG,CHECK-DYNAMIC-OMP %s
4949
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -mp -nomp \
50-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-DYNAMIC-FLANG,CHECK-NO-OMP %s
50+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-DYNAMIC-FLANG,CHECK-NO-OMP %s
5151
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -fopenmp \
52-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-DYNAMIC-FLANG,CHECK-DYNAMIC-OMP %s
52+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-DYNAMIC-FLANG,CHECK-DYNAMIC-OMP %s
5353
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -fopenmp -fno-openmp \
54-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-DYNAMIC-FLANG,CHECK-NO-OMP %s
54+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-DYNAMIC-FLANG,CHECK-NO-OMP %s
5555
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -fopenmp -static-openmp \
56-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-DYNAMIC-FLANG,CHECK-STATIC-OMP %s
56+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-DYNAMIC-FLANG,CHECK-STATIC-OMP %s
5757
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -fopenmp -static-flang-libs \
58-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-STATIC-FLANG,CHECK-DYNAMIC-OMP %s
58+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-STATIC-FLANG,CHECK-DYNAMIC-OMP %s
5959
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -static-flang-libs \
60-
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-STATIC-FLANG,CHECK-NO-OMP %s
61-
60+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-MAIN,CHECK-STATIC-FLANG,CHECK-NO-OMP %s
61+
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -Mnomain \
62+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-NOMAIN,CHECK-DYNAMIC-FLANG %s
63+
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -fno-fortran-main \
64+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-LD,CHECK-NOMAIN,CHECK-DYNAMIC-FLANG %s
6265
! CHECK-LD: "{{.*}}ld{{(.exe)?}}"
6366
! CHECK-LD-NOT: "-static"
64-
! CHECK-LD: "{{[^"]*}}classic-flang-{{[^ ]*}}.o" "-lflangmain" "-lfoo" "-L{{[^ ]*[/\\]+}}basic_linux_tree{{[/\\]+}}usr{{[/\\]+}}lib"
67+
! CHECK-LD-SAME: "{{[^"]*}}classic-flang-{{[^ ]*}}.o"
68+
! CHECK-MAIN-SAME: "-lflangmain"
69+
! CHECK-NOMAIN-NOT: "-lflangmain"
70+
! CHECK-LD-SAME: "-lfoo" "-L{{[^ ]*[/\\]+}}basic_linux_tree{{[/\\]+}}usr{{[/\\]+}}lib"
6571
! CHECK-DYNAMIC-FLANG-NOT: "-Bstatic"
6672
! CHECK-DYNAMIC-FLANG: "-lflang" "-lflangrti" "-lpgmath" "-lpthread" "-lrt" "-lm"
6773
! CHECK-DYNAMIC-FLANG-NOT: "-Bdynamic"
@@ -87,3 +93,28 @@
8793
! CHECK-STATIC-BOTH-NOT: "-Bstatic"
8894
! CHECK-STATIC-BOTH: "-lomp"
8995
! CHECK-STATIC-BOTH-NOT: "-Bdynamic"
96+
97+
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -no-flang-libs \
98+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-NOFLANGLIBS %s
99+
! CHECK-NOFLANGLIBS: "{{.*}}ld{{(.exe)?}}"
100+
! CHECK-NOFLANGLIBS-SAME: "{{[^"]*}}classic-flang-{{[^ ]*}}.o"
101+
! CHECK-NOFLANGLIBS-NOT: "-lflangmain"
102+
! CHECK-NOFLANGLIBS-SAME: "-lfoo" "-L{{[^ ]*[/\\]+}}basic_linux_tree{{[/\\]+}}usr{{[/\\]+}}lib"
103+
! CHECK-NOFLANGLIBS-NOT: "-lflang" "-lflangrti" "-lpgmath"
104+
! CHECK-NOFLANGLIBS: "-lm" "-lgcc"
105+
! CHECK-NOFLANGLIBS: "-lgcc_s"
106+
! CHECK-NOFLANGLIBS: "-lc"
107+
108+
! In Flang mode, we always link with libm, even with -nostdlib.
109+
! RUN: %flang -target x86_64-linux-gnu -ccc-install-dir %S/../Inputs/basic_linux_tree/usr/bin -nostdlib \
110+
! RUN: %s -lfoo -### 2>&1 | FileCheck --check-prefixes=CHECK-NOSTDLIB %s
111+
! CHECK-NOSTDLIB: "{{.*}}ld{{(.exe)?}}"
112+
! CHECK-NOSTDLIB-SAME: "{{[^"]*}}classic-flang-{{[^ ]*}}.o"
113+
! CHECK-NOSTDLIB-NOT: "-lflangmain"
114+
! CHECK-NOSTDLIB-SAME: "-lfoo" "-L{{[^ ]*[/\\]+}}basic_linux_tree{{[/\\]+}}usr{{[/\\]+}}lib"
115+
! CHECK-NOSTDLIB-NOT: "-lflang" "-lflangrti" "-lpgmath"
116+
! CHECK-NOSTDLIB-NOT: "-lpthread" "-lrt"
117+
! CHECK-NOSTDLIB: "-lm"
118+
! CHECK-NOSTDLIB-NOT: "-lgcc"
119+
! CHECK-NOSTDLIB-NOT: "-lgcc_s"
120+
! CHECK-NOSTDLIB-NOT: "-lc"

0 commit comments

Comments
 (0)