[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-11 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm closed 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-11 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm updated 
https://github.com/llvm/llvm-project/pull/74139

>From e0784bd3a6103fe6852ecc67fb01a4a8da1cf59a Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:41:44 +0100
Subject: [PATCH 1/9] Add -fno-fortran-main driver option

---
 clang/include/clang/Driver/Options.td | 4 
 1 file changed, 4 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index b959fd20fe413..057f1f4b90955 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6354,6 +6354,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+
 
//===--===//
 // FC1 Options
 
//===--===//

>From 5c2f898be0d16fdecd44fbcf94cb0513e9a75bb2 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:42:09 +0100
Subject: [PATCH 2/9] Skip linking Fortran_main.a if -fno-fortran-main is
 present

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 46 --
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 51b336216c565..82ed3e53d9960 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1116,33 +1116,37 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
+// TODO: add -fno-fortran-main option and check it in this function.
 void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   // These are handled earlier on Windows by telling the frontend driver to add
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-// The --whole-archive option needs to be part of the link line to
-// make sure that the main() function from Fortran_main.a is pulled
-// in by the linker.  Determine if --whole-archive is active when
-// flang will try to link Fortran_main.a.  If it is, don't add the
-// --whole-archive flag to the link line.  If it's not, add a proper
-// --whole-archive/--no-whole-archive bracket to the link line.
-bool WholeArchiveActive = false;
-for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
-  if (Arg)
-for (StringRef ArgValue : Arg->getValues()) {
-  if (ArgValue == "--whole-archive")
-WholeArchiveActive = true;
-  if (ArgValue == "--no-whole-archive")
-WholeArchiveActive = false;
-}
-
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--whole-archive");
-CmdArgs.push_back("-lFortran_main");
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--no-whole-archive");
+// if -fno-fortran-main has been passed, skip linking Fortran_main.a
+bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+if (!DontLinkFortranMain) {
+  // The --whole-archive option needs to be part of the link line to
+  // make sure that the main() function from Fortran_main.a is pulled
+  // in by the linker.  Determine if --whole-archive is active when
+  // flang will try to link Fortran_main.a.  If it is, don't add the
+  // --whole-archive flag to the link line.  If it's not, add a proper
+  // --whole-archive/--no-whole-archive bracket to the link line.
+  bool WholeArchiveActive = false;
+  for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
+if (Arg)
+  for (StringRef ArgValue : Arg->getValues()) {
+if (ArgValue == "--whole-archive")
+  WholeArchiveActive = true;
+if (ArgValue == "--no-whole-archive")
+  WholeArchiveActive = false;
+  }
 
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--whole-archive");
+  CmdArgs.push_back("-lFortran_main");
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--no-whole-archive");
+}
 // Perform regular linkage of the remaining runtime libraries.
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");

>From a87bdd40e2f4e707a47a185b49a93ae84c809bda Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 15:10:29 -0600
Subject: [PATCH 3/9] Cleanup and simplify the code a bit

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 82ed3e53d9960..93877b75beaf7 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ 

[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-11 Thread Michael Klemm via cfe-commits


@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;

mjklemm wrote:

Done, with a slightly different wording

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-10 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm edited 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-08 Thread Andrzej Warzyński via cfe-commits

https://github.com/banach-space approved this pull request.

I'm making two more small suggestions, but these are nits. Fell free to ignore.

LGTM, thank you!

[nit] "legacy flang" --> "Classic Flang" (in summary)

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-08 Thread Andrzej Warzyński via cfe-commits

https://github.com/banach-space edited 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-08 Thread David Truby via cfe-commits

https://github.com/DavidTruby approved this pull request.

LGTM sorry sometimes reviews get lost in the noise on GitHub...

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-07 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm edited 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-07 Thread Andrzej Warzyński via cfe-commits


@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+

banach-space wrote:

```suggestion
def J : JoinedOrSeparate<["-"], "J">,
  Flags<[RenderJoined]>, Visibility<[FlangOption, FC1Option]>,
  Group,
  Alias;
  
} // let Visibility = [FC1Option, FlangOption]
//===--===//
// FLang Options
//===--===//
let Visibility = [FlangOption] in {
def no_fortran_main : Flag<["-"], "fno-fortran-main">,
  Visibility<[FlangOption]>, Group,
  HelpText<"Don't link in Fortran main">;
}
} // let Visibility = [ FlangOption]
```

I hope this suggestion is clear - sadly GitHub is not allowing me to make a 
proper suggestion for the code above of what you added. 

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-07 Thread Andrzej Warzyński via cfe-commits

https://github.com/banach-space edited 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-05 Thread Michael Klemm via cfe-commits

mjklemm wrote:

@DavidTruby If you are OK with the way I handled MSVC, please approve and I 
will merge the PR (or change it if you want some changes to be made).

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-05 Thread Tom Eccles via cfe-commits

https://github.com/tblah approved this pull request.

Thanks for the fix. LGTM

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-04 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm updated 
https://github.com/llvm/llvm-project/pull/74139

>From 2e41335a7de3d2efa88eacee659172a3b9525e45 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:41:44 +0100
Subject: [PATCH 1/5] Add -fno-fortran-main driver option

---
 clang/include/clang/Driver/Options.td | 4 
 1 file changed, 4 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 19d04e82aed4d..aa26344f67b31 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+
 
//===--===//
 // FC1 Options
 
//===--===//

>From 44b684ae43a6da37bb56c5b699628c6807257ad9 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:42:09 +0100
Subject: [PATCH 2/5] Skip linking Fortran_main.a if -fno-fortran-main is
 present

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 46 --
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 0ae8e2dce32e9..2899f07cb7490 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1116,33 +1116,37 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
+// TODO: add -fno-fortran-main option and check it in this function.
 void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   // These are handled earlier on Windows by telling the frontend driver to add
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-// The --whole-archive option needs to be part of the link line to
-// make sure that the main() function from Fortran_main.a is pulled
-// in by the linker.  Determine if --whole-archive is active when
-// flang will try to link Fortran_main.a.  If it is, don't add the
-// --whole-archive flag to the link line.  If it's not, add a proper
-// --whole-archive/--no-whole-archive bracket to the link line.
-bool WholeArchiveActive = false;
-for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
-  if (Arg)
-for (StringRef ArgValue : Arg->getValues()) {
-  if (ArgValue == "--whole-archive")
-WholeArchiveActive = true;
-  if (ArgValue == "--no-whole-archive")
-WholeArchiveActive = false;
-}
-
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--whole-archive");
-CmdArgs.push_back("-lFortran_main");
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--no-whole-archive");
+// if -fno-fortran-main has been passed, skip linking Fortran_main.a
+bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+if (!DontLinkFortranMain) {
+  // The --whole-archive option needs to be part of the link line to
+  // make sure that the main() function from Fortran_main.a is pulled
+  // in by the linker.  Determine if --whole-archive is active when
+  // flang will try to link Fortran_main.a.  If it is, don't add the
+  // --whole-archive flag to the link line.  If it's not, add a proper
+  // --whole-archive/--no-whole-archive bracket to the link line.
+  bool WholeArchiveActive = false;
+  for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
+if (Arg)
+  for (StringRef ArgValue : Arg->getValues()) {
+if (ArgValue == "--whole-archive")
+  WholeArchiveActive = true;
+if (ArgValue == "--no-whole-archive")
+  WholeArchiveActive = false;
+  }
 
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--whole-archive");
+  CmdArgs.push_back("-lFortran_main");
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--no-whole-archive");
+}
 // Perform regular linkage of the remaining runtime libraries.
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");

>From e1a472fa914ea9405be6589e89fbe8201448600f Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 15:10:29 -0600
Subject: [PATCH 3/5] Cleanup and simplify the code a bit

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 2899f07cb7490..f0e3df2a63ae9 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ 

[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-04 Thread Michael Klemm via cfe-commits

mjklemm wrote:

> I think this solution is fine, at least in the short term.
> 
> I had a think after reviewing the initial patch and looking at the failure 
> that @tblah showed in #73124; my thoughts are that the “correct” way of doing 
> this would be instead of linking Fortran_main all the time, we could insert a 
> linker directive in the object file containing the program statement. That 
> way we would only link Fortran_main when there is actually a program 
> statement in the Fortran. However that’s more work and would need a bit more 
> thought anyway so we at least need something like this or the revert in the 
> interim.

That sounds good!  For now, the code should effectively avoid linking 
Fortran_main on Linux and Windows if -fno-fortran-main is present.

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-04 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm updated 
https://github.com/llvm/llvm-project/pull/74139

>From 2e41335a7de3d2efa88eacee659172a3b9525e45 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:41:44 +0100
Subject: [PATCH 1/5] Add -fno-fortran-main driver option

---
 clang/include/clang/Driver/Options.td | 4 
 1 file changed, 4 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 19d04e82aed4d..aa26344f67b31 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+
 
//===--===//
 // FC1 Options
 
//===--===//

>From 44b684ae43a6da37bb56c5b699628c6807257ad9 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:42:09 +0100
Subject: [PATCH 2/5] Skip linking Fortran_main.a if -fno-fortran-main is
 present

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 46 --
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 0ae8e2dce32e9..2899f07cb7490 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1116,33 +1116,37 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
+// TODO: add -fno-fortran-main option and check it in this function.
 void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   // These are handled earlier on Windows by telling the frontend driver to add
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-// The --whole-archive option needs to be part of the link line to
-// make sure that the main() function from Fortran_main.a is pulled
-// in by the linker.  Determine if --whole-archive is active when
-// flang will try to link Fortran_main.a.  If it is, don't add the
-// --whole-archive flag to the link line.  If it's not, add a proper
-// --whole-archive/--no-whole-archive bracket to the link line.
-bool WholeArchiveActive = false;
-for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
-  if (Arg)
-for (StringRef ArgValue : Arg->getValues()) {
-  if (ArgValue == "--whole-archive")
-WholeArchiveActive = true;
-  if (ArgValue == "--no-whole-archive")
-WholeArchiveActive = false;
-}
-
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--whole-archive");
-CmdArgs.push_back("-lFortran_main");
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--no-whole-archive");
+// if -fno-fortran-main has been passed, skip linking Fortran_main.a
+bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+if (!DontLinkFortranMain) {
+  // The --whole-archive option needs to be part of the link line to
+  // make sure that the main() function from Fortran_main.a is pulled
+  // in by the linker.  Determine if --whole-archive is active when
+  // flang will try to link Fortran_main.a.  If it is, don't add the
+  // --whole-archive flag to the link line.  If it's not, add a proper
+  // --whole-archive/--no-whole-archive bracket to the link line.
+  bool WholeArchiveActive = false;
+  for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
+if (Arg)
+  for (StringRef ArgValue : Arg->getValues()) {
+if (ArgValue == "--whole-archive")
+  WholeArchiveActive = true;
+if (ArgValue == "--no-whole-archive")
+  WholeArchiveActive = false;
+  }
 
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--whole-archive");
+  CmdArgs.push_back("-lFortran_main");
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--no-whole-archive");
+}
 // Perform regular linkage of the remaining runtime libraries.
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");

>From e1a472fa914ea9405be6589e89fbe8201448600f Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 15:10:29 -0600
Subject: [PATCH 3/5] Cleanup and simplify the code a bit

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 2899f07cb7490..f0e3df2a63ae9 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ 

[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-03 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm edited 
https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-01 Thread Michael Klemm via cfe-commits

mjklemm wrote:

This WIP for now, as I still have to make the changes for MSVC.  But it's good 
enough to discuss if this is a viable solution.

https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-01 Thread via cfe-commits

github-actions[bot] wrote:




:warning: C/C++ code formatter, clang-format found issues in your code. 
:warning:



You can test this locally with the following command:


``bash
git-clang-format --diff 1f8f9e3163f6367258281f50b9d0492855c996e8 
44b684ae43a6da37bb56c5b699628c6807257ad9 -- 
clang/lib/Driver/ToolChains/CommonArgs.cpp
``





View the diff from clang-format here.


``diff
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 2899f07cb7..a72e256825 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1123,7 +1123,8 @@ void tools::addFortranRuntimeLibs(const ToolChain , 
const ArgList ,
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 // if -fno-fortran-main has been passed, skip linking Fortran_main.a
-bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+bool DontLinkFortranMain =
+Args.getLastArg(options::OPT_no_fortran_main) != nullptr;
 if (!DontLinkFortranMain) {
   // The --whole-archive option needs to be part of the link line to
   // make sure that the main() function from Fortran_main.a is pulled

``




https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-01 Thread via cfe-commits

llvmbot wrote:



@llvm/pr-subscribers-clang

@llvm/pr-subscribers-clang-driver

Author: Michael Klemm (mjklemm)


Changes

This is related to PR #74120 and (merged) PR #73124.

This PR adds the `-fno-fortran-main` command line option to remove 
`Fortran_main.a` from the link and to allow for linking Fortran code w/o 
program unit with C/C++ translation units that provide the `main()` entrypoint.

---
Full diff: https://github.com/llvm/llvm-project/pull/74139.diff


2 Files Affected:

- (modified) clang/include/clang/Driver/Options.td (+4) 
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+25-21) 


``diff
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 19d04e82aed4d68..aa26344f67b3132 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+
 
//===--===//
 // FC1 Options
 
//===--===//
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 0ae8e2dce32e94a..2899f07cb7490ca 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1116,33 +1116,37 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
+// TODO: add -fno-fortran-main option and check it in this function.
 void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   // These are handled earlier on Windows by telling the frontend driver to add
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-// The --whole-archive option needs to be part of the link line to
-// make sure that the main() function from Fortran_main.a is pulled
-// in by the linker.  Determine if --whole-archive is active when
-// flang will try to link Fortran_main.a.  If it is, don't add the
-// --whole-archive flag to the link line.  If it's not, add a proper
-// --whole-archive/--no-whole-archive bracket to the link line.
-bool WholeArchiveActive = false;
-for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
-  if (Arg)
-for (StringRef ArgValue : Arg->getValues()) {
-  if (ArgValue == "--whole-archive")
-WholeArchiveActive = true;
-  if (ArgValue == "--no-whole-archive")
-WholeArchiveActive = false;
-}
-
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--whole-archive");
-CmdArgs.push_back("-lFortran_main");
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--no-whole-archive");
+// if -fno-fortran-main has been passed, skip linking Fortran_main.a
+bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+if (!DontLinkFortranMain) {
+  // The --whole-archive option needs to be part of the link line to
+  // make sure that the main() function from Fortran_main.a is pulled
+  // in by the linker.  Determine if --whole-archive is active when
+  // flang will try to link Fortran_main.a.  If it is, don't add the
+  // --whole-archive flag to the link line.  If it's not, add a proper
+  // --whole-archive/--no-whole-archive bracket to the link line.
+  bool WholeArchiveActive = false;
+  for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
+if (Arg)
+  for (StringRef ArgValue : Arg->getValues()) {
+if (ArgValue == "--whole-archive")
+  WholeArchiveActive = true;
+if (ArgValue == "--no-whole-archive")
+  WholeArchiveActive = false;
+  }
 
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--whole-archive");
+  CmdArgs.push_back("-lFortran_main");
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--no-whole-archive");
+}
 // Perform regular linkage of the remaining runtime libraries.
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");

``




https://github.com/llvm/llvm-project/pull/74139
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)

2023-12-01 Thread Michael Klemm via cfe-commits

https://github.com/mjklemm created 
https://github.com/llvm/llvm-project/pull/74139

This is related to PR #74120 and (merged) PR #73124.

This PR adds the `-fno-fortran-main` command line option to remove 
`Fortran_main.a` from the link and to allow for linking Fortran code w/o 
program unit with C/C++ translation units that provide the `main()` entrypoint.

>From 2e41335a7de3d2efa88eacee659172a3b9525e45 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:41:44 +0100
Subject: [PATCH 1/2] Add -fno-fortran-main driver option

---
 clang/include/clang/Driver/Options.td | 4 
 1 file changed, 4 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 19d04e82aed4d68..aa26344f67b3132 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6345,6 +6345,10 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
+def no_fortran_main : Flag<["-"], "fno-fortran-main">,
+  Visibility<[FlangOption]>, Group,
+  HelpText<"Don't link in Fortran main">;
+
 
//===--===//
 // FC1 Options
 
//===--===//

>From 44b684ae43a6da37bb56c5b699628c6807257ad9 Mon Sep 17 00:00:00 2001
From: Michael Klemm 
Date: Fri, 1 Dec 2023 21:42:09 +0100
Subject: [PATCH 2/2] Skip linking Fortran_main.a if -fno-fortran-main is
 present

---
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 46 --
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 0ae8e2dce32e94a..2899f07cb7490ca 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1116,33 +1116,37 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
+// TODO: add -fno-fortran-main option and check it in this function.
 void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   // These are handled earlier on Windows by telling the frontend driver to add
   // the correct libraries to link against as dependents in the object file.
   if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-// The --whole-archive option needs to be part of the link line to
-// make sure that the main() function from Fortran_main.a is pulled
-// in by the linker.  Determine if --whole-archive is active when
-// flang will try to link Fortran_main.a.  If it is, don't add the
-// --whole-archive flag to the link line.  If it's not, add a proper
-// --whole-archive/--no-whole-archive bracket to the link line.
-bool WholeArchiveActive = false;
-for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
-  if (Arg)
-for (StringRef ArgValue : Arg->getValues()) {
-  if (ArgValue == "--whole-archive")
-WholeArchiveActive = true;
-  if (ArgValue == "--no-whole-archive")
-WholeArchiveActive = false;
-}
-
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--whole-archive");
-CmdArgs.push_back("-lFortran_main");
-if (!WholeArchiveActive)
-  CmdArgs.push_back("--no-whole-archive");
+// if -fno-fortran-main has been passed, skip linking Fortran_main.a
+bool DontLinkFortranMain = Args.getLastArg(options::OPT_no_fortran_main) 
!= nullptr;
+if (!DontLinkFortranMain) {
+  // The --whole-archive option needs to be part of the link line to
+  // make sure that the main() function from Fortran_main.a is pulled
+  // in by the linker.  Determine if --whole-archive is active when
+  // flang will try to link Fortran_main.a.  If it is, don't add the
+  // --whole-archive flag to the link line.  If it's not, add a proper
+  // --whole-archive/--no-whole-archive bracket to the link line.
+  bool WholeArchiveActive = false;
+  for (auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
+if (Arg)
+  for (StringRef ArgValue : Arg->getValues()) {
+if (ArgValue == "--whole-archive")
+  WholeArchiveActive = true;
+if (ArgValue == "--no-whole-archive")
+  WholeArchiveActive = false;
+  }
 
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--whole-archive");
+  CmdArgs.push_back("-lFortran_main");
+  if (!WholeArchiveActive)
+CmdArgs.push_back("--no-whole-archive");
+}
 // Perform regular linkage of the remaining runtime libraries.
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits