[clang] [Clang][AArch64][SVE] Allow write to SVE vector elements using the subscript operator (PR #91965)

2024-05-16 Thread David Truby via cfe-commits

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

LGTM

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


[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-16 Thread David Truby via cfe-commits

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


[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-13 Thread David Truby via cfe-commits

DavidTruby wrote:

I've left the flang test as the flang directory doesn't change with 
`LLVM_ENABLE_PER_TARGET_RUNTIME_DIR` and removed the other test. I hope this is 
what you meant @MaskRay  

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


[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-13 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/90758

>From 9763281019c1fb27714243450d7a6879e91dcb28 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 1 May 2024 19:41:47 +0100
Subject: [PATCH 1/3] [clang][flang][windows] Prefer user-provided library
 paths (-L)

Currently the paths to compiler-rt and the Flang runtimes from the LLVM
build/install directory are preferred over any user-provided library
paths. This means a user can't override compiler-rt or the Flang
runtimes with custom versions.

This patch changes the link order to prefer library paths specified
with -L over the LLVM paths. This matches the behaviour of clang
and flang on Linux.
---
 clang/lib/Driver/ToolChains/MSVC.cpp | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index fbf2f45b54384..b7021d4b996dd 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -134,6 +134,10 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath));
   }
 
+  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
+for (const auto  : Args.getAllArgValues(options::OPT_L))
+  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
+
   if (C.getDriver().IsFlangMode()) {
 addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
 addFortranRuntimeLibs(TC, Args, CmdArgs);
@@ -154,10 +158,6 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   if (TC.getVFS().exists(CRTPath))
 CmdArgs.push_back(Args.MakeArgString("-libpath:" + CRTPath));
 
-  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
-for (const auto  : Args.getAllArgValues(options::OPT_L))
-  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
-
   CmdArgs.push_back("-nologo");
 
   if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))

>From 30d175dff6b88ab4e74f73358c2074bb3354b345 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Fri, 3 May 2024 14:29:45 +0100
Subject: [PATCH 2/3] Add tests

---
 clang/test/Driver/flang/msvc-link.f90 | 8 
 clang/test/Driver/msvc-link.cpp   | 7 +++
 2 files changed, 15 insertions(+)
 create mode 100644 clang/test/Driver/flang/msvc-link.f90
 create mode 100644 clang/test/Driver/msvc-link.cpp

diff --git a/clang/test/Driver/flang/msvc-link.f90 
b/clang/test/Driver/flang/msvc-link.f90
new file mode 100644
index 0..6a1af043e9d2b
--- /dev/null
+++ b/clang/test/Driver/flang/msvc-link.f90
@@ -0,0 +1,8 @@
+! REQUIRES: system-windows
+!
+! RUN: %clang --driver-mode=flang -### %s -Ltest 2>&1 | FileCheck %s
+!
+! Test that user provided paths come before the Flang runtimes and compiler-rt
+! CHECK: "-libpath:test"
+! CHECK: "-libpath:{{.*}}\\lib"
+! CHECK: "-libpath:{{.*}}\\lib\\clang\\{{[0-9]+}}\\lib\\windows"
diff --git a/clang/test/Driver/msvc-link.cpp b/clang/test/Driver/msvc-link.cpp
new file mode 100644
index 0..4d53fe49782e5
--- /dev/null
+++ b/clang/test/Driver/msvc-link.cpp
@@ -0,0 +1,7 @@
+// REQUIRES: system-windows
+//
+// RUN: %clang -### %s -Ltest 2>&1 | FileCheck %s
+//
+// Test that user provided paths come before compiler-rt
+// CHECK: "-libpath:test"
+// CHECK: "-libpath:{{.*}}\\lib\\clang\\{{[0-9]+}}\\lib\\windows"

>From f5f13766b19e3aba61a84bc72d85707e52976e00 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Mon, 13 May 2024 13:46:07 +
Subject: [PATCH 3/3] Remove c test and make Fortran test not require windows

---
 clang/test/Driver/flang/msvc-link.f90 | 9 +++--
 clang/test/Driver/msvc-link.cpp   | 7 ---
 2 files changed, 3 insertions(+), 13 deletions(-)
 delete mode 100644 clang/test/Driver/msvc-link.cpp

diff --git a/clang/test/Driver/flang/msvc-link.f90 
b/clang/test/Driver/flang/msvc-link.f90
index 6a1af043e9d2b..536da2599431f 100644
--- a/clang/test/Driver/flang/msvc-link.f90
+++ b/clang/test/Driver/flang/msvc-link.f90
@@ -1,8 +1,5 @@
-! REQUIRES: system-windows
+! RUN: %clang --driver-mode=flang -target x86_64-pc-windows-msvc -### %s 
-Ltest 2>&1 | FileCheck %s
 !
-! RUN: %clang --driver-mode=flang -### %s -Ltest 2>&1 | FileCheck %s
-!
-! Test that user provided paths come before the Flang runtimes and compiler-rt
+! Test that user provided paths come before the Flang runtimes
 ! CHECK: "-libpath:test"
-! CHECK: "-libpath:{{.*}}\\lib"
-! CHECK: "-libpath:{{.*}}\\lib\\clang\\{{[0-9]+}}\\lib\\windows"
+! CHECK: "-libpath:{{.*(\\|/)}}lib"
diff --git a/clang/test/Driver/msvc-link.cpp b/clang/test/Driver/msvc-link.cpp
deleted file mode 100644
index 4d53fe49782e5..0
--- a/clang/test/Driver/msvc-link.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-// REQUIRES: system-windows
-//
-// RUN: %clang -### %s -Ltest 2>&1 | FileCheck %s
-//
-// Test that user provided paths come before compiler-rt
-// CHECK: "-libpath:test"
-// CHECK: 

[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-07 Thread David Truby via cfe-commits

DavidTruby wrote:

> The code checks whether the directory is present `auto CRTPath = 
> TC.getCompilerRTPath();` and only adds the libpath when it is present. This 
> is related to the `LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=off` file hierarchy we 
> are migrating way from.
> 
> With `LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on`, TC.getCompilerRTPath() will not 
> be needed.
> 
> Since there is no good way to test this, I'm fine with the patch without a 
> test.

Hi, I'm not sure I understand exactly what you mean by without a test; do you 
mean I should just remove the tests I tried to add or is there some extra 
behaviour that you're talking about that can't be tested?

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


[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-03 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/90758

>From 0afdbb7dac3a3a051661d5747c8c6470a13f1e0c Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 1 May 2024 19:41:47 +0100
Subject: [PATCH 1/2] [clang][flang][windows] Prefer user-provided library
 paths (-L)

Currently the paths to compiler-rt and the Flang runtimes from the LLVM
build/install directory are preferred over any user-provided library
paths. This means a user can't override compiler-rt or the Flang
runtimes with custom versions.

This patch changes the link order to prefer library paths specified
with -L over the LLVM paths. This matches the behaviour of clang
and flang on Linux.
---
 clang/lib/Driver/ToolChains/MSVC.cpp | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index fbf2f45b543844..b7021d4b996ddd 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -134,6 +134,10 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath));
   }
 
+  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
+for (const auto  : Args.getAllArgValues(options::OPT_L))
+  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
+
   if (C.getDriver().IsFlangMode()) {
 addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
 addFortranRuntimeLibs(TC, Args, CmdArgs);
@@ -154,10 +158,6 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   if (TC.getVFS().exists(CRTPath))
 CmdArgs.push_back(Args.MakeArgString("-libpath:" + CRTPath));
 
-  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
-for (const auto  : Args.getAllArgValues(options::OPT_L))
-  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
-
   CmdArgs.push_back("-nologo");
 
   if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))

>From 5cf9a46d2b67520a33740de1e12a665a1665d932 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Fri, 3 May 2024 14:29:45 +0100
Subject: [PATCH 2/2] Add tests

---
 clang/test/Driver/flang/msvc-link.f90 | 8 
 clang/test/Driver/msvc-link.cpp   | 7 +++
 2 files changed, 15 insertions(+)
 create mode 100644 clang/test/Driver/flang/msvc-link.f90
 create mode 100644 clang/test/Driver/msvc-link.cpp

diff --git a/clang/test/Driver/flang/msvc-link.f90 
b/clang/test/Driver/flang/msvc-link.f90
new file mode 100644
index 00..6a1af043e9d2b6
--- /dev/null
+++ b/clang/test/Driver/flang/msvc-link.f90
@@ -0,0 +1,8 @@
+! REQUIRES: system-windows
+!
+! RUN: %clang --driver-mode=flang -### %s -Ltest 2>&1 | FileCheck %s
+!
+! Test that user provided paths come before the Flang runtimes and compiler-rt
+! CHECK: "-libpath:test"
+! CHECK: "-libpath:{{.*}}\\lib"
+! CHECK: "-libpath:{{.*}}\\lib\\clang\\{{[0-9]+}}\\lib\\windows"
diff --git a/clang/test/Driver/msvc-link.cpp b/clang/test/Driver/msvc-link.cpp
new file mode 100644
index 00..4d53fe49782e52
--- /dev/null
+++ b/clang/test/Driver/msvc-link.cpp
@@ -0,0 +1,7 @@
+// REQUIRES: system-windows
+//
+// RUN: %clang -### %s -Ltest 2>&1 | FileCheck %s
+//
+// Test that user provided paths come before compiler-rt
+// CHECK: "-libpath:test"
+// CHECK: "-libpath:{{.*}}\\lib\\clang\\{{[0-9]+}}\\lib\\windows"

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


[clang] [clang][flang][windows] Prefer user-provided library paths (-L) (PR #90758)

2024-05-01 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/90758

Currently the paths to compiler-rt and the Flang runtimes from the LLVM 
build/install directory are preferred over any user-provided library paths. 
This means a user can't override compiler-rt or the Flang runtimes with custom 
versions.

This patch changes the link order to prefer library paths specified with -L 
over the LLVM paths. This matches the behaviour of clang and flang on Linux.

>From 0afdbb7dac3a3a051661d5747c8c6470a13f1e0c Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 1 May 2024 19:41:47 +0100
Subject: [PATCH] [clang][flang][windows] Prefer user-provided library paths
 (-L)

Currently the paths to compiler-rt and the Flang runtimes from the LLVM
build/install directory are preferred over any user-provided library
paths. This means a user can't override compiler-rt or the Flang
runtimes with custom versions.

This patch changes the link order to prefer library paths specified
with -L over the LLVM paths. This matches the behaviour of clang
and flang on Linux.
---
 clang/lib/Driver/ToolChains/MSVC.cpp | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index fbf2f45b543844..b7021d4b996ddd 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -134,6 +134,10 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   Args.MakeArgString(std::string("-libpath:") + WindowsSdkLibPath));
   }
 
+  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
+for (const auto  : Args.getAllArgValues(options::OPT_L))
+  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
+
   if (C.getDriver().IsFlangMode()) {
 addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
 addFortranRuntimeLibs(TC, Args, CmdArgs);
@@ -154,10 +158,6 @@ void visualstudio::Linker::ConstructJob(Compilation , 
const JobAction ,
   if (TC.getVFS().exists(CRTPath))
 CmdArgs.push_back(Args.MakeArgString("-libpath:" + CRTPath));
 
-  if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
-for (const auto  : Args.getAllArgValues(options::OPT_L))
-  CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
-
   CmdArgs.push_back("-nologo");
 
   if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))

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


[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-29 Thread David Truby via cfe-commits

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


[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-29 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/89938

>From 2b7ee836b985ee6fa8f7d57ccdee733f261a1de1 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 24 Apr 2024 14:35:23 +
Subject: [PATCH 1/3] [flang] Generate main only when a Fortran program
 statement is present

This patch changes the behaviour for flang to only create and link to a
`main` entry point when the Fortran code has a program statement in it.

This means that flang-new can be used to link even when the program is
a mixed C/Fortran code with `main` present in C and no entry point
present in Fortran.
---
 clang/include/clang/Driver/Options.td |   6 -
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 110 +--
 clang/lib/Driver/ToolChains/Flang.cpp |   9 -
 flang/docs/FlangDriver.md |  32 +---
 .../Builder/Runtime/EnvironmentDefaults.h |   3 +-
 .../flang/Optimizer/Builder/Runtime/Main.h|  28 +++
 flang/lib/Lower/Bridge.cpp|   5 +-
 flang/lib/Optimizer/Builder/CMakeLists.txt|   1 +
 .../Builder/Runtime/EnvironmentDefaults.cpp   |   7 +-
 flang/lib/Optimizer/Builder/Runtime/Main.cpp  |  62 +++
 flang/runtime/CMakeLists.txt  |   1 -
 flang/runtime/FortranMain/CMakeLists.txt  |  23 ---
 flang/runtime/FortranMain/Fortran_main.c  |  23 ---
 flang/test/CMakeLists.txt |   1 -
 flang/test/Driver/driver-help-hidden.f90  | 172 ++
 flang/test/Driver/dynamic-linker.f90  |   2 -
 flang/test/Driver/emit-mlir.f90   |  10 +
 flang/test/Driver/linker-flags.f90|   8 -
 .../test/Driver/msvc-dependent-lib-flags.f90  |   4 -
 flang/test/Driver/no-duplicate-main.f90   |   2 -
 flang/tools/flang-driver/CMakeLists.txt   |   1 -
 lld/COFF/MinGW.cpp|   1 -
 22 files changed, 286 insertions(+), 225 deletions(-)
 create mode 100644 flang/include/flang/Optimizer/Builder/Runtime/Main.h
 create mode 100644 flang/lib/Optimizer/Builder/Runtime/Main.cpp
 delete mode 100644 flang/runtime/FortranMain/CMakeLists.txt
 delete mode 100644 flang/runtime/FortranMain/Fortran_main.c
 create mode 100644 flang/test/Driver/driver-help-hidden.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 086aedefc11878..263d1edf141a0b 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6589,12 +6589,6 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
-let Visibility = [FlangOption] in {
-def no_fortran_main : Flag<["-"], "fno-fortran-main">,
-  Visibility<[FlangOption]>, Group,
-  HelpText<"Do not include Fortran_main.a (provided by Flang) when linking">;
-} // let Visibility = [ FlangOption ]
-
 
//===--===//
 // FC1 Options
 
//===--===//
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index b65b96db16bd79..fec11c7e716fdf 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1191,118 +1191,10 @@ bool tools::addOpenMPRuntime(const Compilation , 
ArgStringList ,
   return true;
 }
 
-/// Determines if --whole-archive is active in the list of arguments.
-static bool isWholeArchivePresent(const ArgList ) {
-  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;
-  }
-}
-  }
-
-  return WholeArchiveActive;
-}
-
-/// Determine if driver is invoked to create a shared object library (-static)
-static bool isSharedLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_shared);
-}
-
-/// Determine if driver is invoked to create a static object library (-shared)
-static bool isStaticLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_static);
-}
-
-/// Add Fortran runtime libs for MSVC
-static void addFortranRuntimeLibsMSVC(const ArgList ,
-  llvm::opt::ArgStringList ) {
-  unsigned RTOptionID = options::OPT__SLASH_MT;
-  if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-RTOptionID = llvm::StringSwitch(rtl->getValue())
- .Case("static", options::OPT__SLASH_MT)
- .Case("static_dbg", options::OPT__SLASH_MTd)
- .Case("dll", options::OPT__SLASH_MD)
- .Case("dll_dbg", options::OPT__SLASH_MDd)
- .Default(options::OPT__SLASH_MT);
-  }
-  switch (RTOptionID) {
-  case options::OPT__SLASH_MT:
-CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib");
-break;
-  

[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-25 Thread David Truby via cfe-commits

DavidTruby wrote:

As regards the backwards compatibility break here, I guess my take is that this 
change needs to happen some time and sooner is always going to be better than 
later. While we are still called flang-new and marked experimental I'm inclined 
to think we should just rip the band aid.

We could leave `-fno-fortran-main` in as deprecated but it won't actually do 
anything anymore, so that might just be confusing for users.

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


[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-25 Thread David Truby via cfe-commits

DavidTruby wrote:

> Great work David, thanks! Could you add some documentation explaining _where_ 
> `main` would be coming from in the case of mixed-source compilation? In fact, 
> is that tested anywhere?
> 
> Also, IMHO it would be good to advertise this on Discourse (thinking 
> specifically about `-fno-fortran-main`).

In mixed-source compilation where there's no `program` statement in Fortran 
then main should be provided by whatever other language you're linking to. In 
the example of C/C++ that would just mean defining `main` yourself. In the case 
where there's a `program` statement in the Fortran we're now defining `main` by 
declaring it through MLIR.

I've already posted about this on discourse, you can see the discussion here: 
https://discourse.llvm.org/t/rfc-link-to-fortran-main-using-embedded-linker-flags/77596.
 I should have put that in the PR comment!

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


[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-24 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/89938

>From 88db34e906f6eb104f8d84fa9ad4f0aa49607c68 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 24 Apr 2024 14:35:23 +
Subject: [PATCH 1/2] [flang] Generate main only when a Fortran program
 statement is present

This patch changes the behaviour for flang to only create and link to a
`main` entry point when the Fortran code has a program statement in it.

This means that flang-new can be used to link even when the program is
a mixed C/Fortran code with `main` present in C and no entry point
present in Fortran.
---
 clang/include/clang/Driver/Options.td |   6 -
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 110 +-
 clang/lib/Driver/ToolChains/Flang.cpp |   9 --
 flang/docs/FlangDriver.md |  32 +
 .../Builder/Runtime/EnvironmentDefaults.h |   3 +-
 .../flang/Optimizer/Builder/Runtime/Main.h|  28 +
 flang/lib/Lower/Bridge.cpp|   5 +-
 flang/lib/Optimizer/Builder/CMakeLists.txt|   1 +
 .../Builder/Runtime/EnvironmentDefaults.cpp   |   7 +-
 flang/lib/Optimizer/Builder/Runtime/Main.cpp  |  62 ++
 flang/runtime/CMakeLists.txt  |   1 -
 flang/runtime/FortranMain/CMakeLists.txt  |  23 
 flang/runtime/FortranMain/Fortran_main.c  |  23 
 flang/test/CMakeLists.txt |   1 -
 flang/test/Driver/driver-help-hidden.f90  |   1 -
 flang/test/Driver/driver-help.f90 |   1 -
 flang/test/Driver/dynamic-linker.f90  |   2 -
 flang/test/Driver/emit-mlir.f90   |  10 ++
 flang/test/Driver/linker-flags.f90|   8 --
 .../test/Driver/msvc-dependent-lib-flags.f90  |   4 -
 flang/test/Driver/no-duplicate-main.f90   |   2 -
 flang/tools/flang-driver/CMakeLists.txt   |   1 -
 lld/COFF/MinGW.cpp|   1 -
 23 files changed, 114 insertions(+), 227 deletions(-)
 create mode 100644 flang/include/flang/Optimizer/Builder/Runtime/Main.h
 create mode 100644 flang/lib/Optimizer/Builder/Runtime/Main.cpp
 delete mode 100644 flang/runtime/FortranMain/CMakeLists.txt
 delete mode 100644 flang/runtime/FortranMain/Fortran_main.c

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 922bda721dc780..4b852b297a6b99 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6582,12 +6582,6 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
-let Visibility = [FlangOption] in {
-def no_fortran_main : Flag<["-"], "fno-fortran-main">,
-  Visibility<[FlangOption]>, Group,
-  HelpText<"Do not include Fortran_main.a (provided by Flang) when linking">;
-} // let Visibility = [ FlangOption ]
-
 
//===--===//
 // FC1 Options
 
//===--===//
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index b65b96db16bd79..fec11c7e716fdf 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1191,118 +1191,10 @@ bool tools::addOpenMPRuntime(const Compilation , 
ArgStringList ,
   return true;
 }
 
-/// Determines if --whole-archive is active in the list of arguments.
-static bool isWholeArchivePresent(const ArgList ) {
-  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;
-  }
-}
-  }
-
-  return WholeArchiveActive;
-}
-
-/// Determine if driver is invoked to create a shared object library (-static)
-static bool isSharedLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_shared);
-}
-
-/// Determine if driver is invoked to create a static object library (-shared)
-static bool isStaticLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_static);
-}
-
-/// Add Fortran runtime libs for MSVC
-static void addFortranRuntimeLibsMSVC(const ArgList ,
-  llvm::opt::ArgStringList ) {
-  unsigned RTOptionID = options::OPT__SLASH_MT;
-  if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-RTOptionID = llvm::StringSwitch(rtl->getValue())
- .Case("static", options::OPT__SLASH_MT)
- .Case("static_dbg", options::OPT__SLASH_MTd)
- .Case("dll", options::OPT__SLASH_MD)
- .Case("dll_dbg", options::OPT__SLASH_MDd)
- .Default(options::OPT__SLASH_MT);
-  }
-  switch (RTOptionID) {
-  case options::OPT__SLASH_MT:
-CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib");
-break;
-  case 

[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-24 Thread David Truby via cfe-commits

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


[clang] [flang] [lld] [flang] Generate main only when a Fortran program statement is present (PR #89938)

2024-04-24 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/89938

This patch changes the behaviour for flang to only create and link to a
`main` entry point when the Fortran code has a program statement in it.

This means that flang-new can be used to link even when the program is
a mixed C/Fortran code with `main` present in C and no entry point
present in Fortran.


>From 88db34e906f6eb104f8d84fa9ad4f0aa49607c68 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Wed, 24 Apr 2024 14:35:23 +
Subject: [PATCH] [flang] Generate main only when a Fortran program statement
 is present

This patch changes the behaviour for flang to only create and link to a
`main` entry point when the Fortran code has a program statement in it.

This means that flang-new can be used to link even when the program is
a mixed C/Fortran code with `main` present in C and no entry point
present in Fortran.
---
 clang/include/clang/Driver/Options.td |   6 -
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 110 +-
 clang/lib/Driver/ToolChains/Flang.cpp |   9 --
 flang/docs/FlangDriver.md |  32 +
 .../Builder/Runtime/EnvironmentDefaults.h |   3 +-
 .../flang/Optimizer/Builder/Runtime/Main.h|  28 +
 flang/lib/Lower/Bridge.cpp|   5 +-
 flang/lib/Optimizer/Builder/CMakeLists.txt|   1 +
 .../Builder/Runtime/EnvironmentDefaults.cpp   |   7 +-
 flang/lib/Optimizer/Builder/Runtime/Main.cpp  |  62 ++
 flang/runtime/CMakeLists.txt  |   1 -
 flang/runtime/FortranMain/CMakeLists.txt  |  23 
 flang/runtime/FortranMain/Fortran_main.c  |  23 
 flang/test/CMakeLists.txt |   1 -
 flang/test/Driver/driver-help-hidden.f90  |   1 -
 flang/test/Driver/driver-help.f90 |   1 -
 flang/test/Driver/dynamic-linker.f90  |   2 -
 flang/test/Driver/emit-mlir.f90   |  10 ++
 flang/test/Driver/linker-flags.f90|   8 --
 .../test/Driver/msvc-dependent-lib-flags.f90  |   4 -
 flang/test/Driver/no-duplicate-main.f90   |   2 -
 flang/tools/flang-driver/CMakeLists.txt   |   1 -
 lld/COFF/MinGW.cpp|   1 -
 23 files changed, 114 insertions(+), 227 deletions(-)
 create mode 100644 flang/include/flang/Optimizer/Builder/Runtime/Main.h
 create mode 100644 flang/lib/Optimizer/Builder/Runtime/Main.cpp
 delete mode 100644 flang/runtime/FortranMain/CMakeLists.txt
 delete mode 100644 flang/runtime/FortranMain/Fortran_main.c

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 922bda721dc780..4b852b297a6b99 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6582,12 +6582,6 @@ def J : JoinedOrSeparate<["-"], "J">,
   Group,
   Alias;
 
-let Visibility = [FlangOption] in {
-def no_fortran_main : Flag<["-"], "fno-fortran-main">,
-  Visibility<[FlangOption]>, Group,
-  HelpText<"Do not include Fortran_main.a (provided by Flang) when linking">;
-} // let Visibility = [ FlangOption ]
-
 
//===--===//
 // FC1 Options
 
//===--===//
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index b65b96db16bd79..fec11c7e716fdf 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1191,118 +1191,10 @@ bool tools::addOpenMPRuntime(const Compilation , 
ArgStringList ,
   return true;
 }
 
-/// Determines if --whole-archive is active in the list of arguments.
-static bool isWholeArchivePresent(const ArgList ) {
-  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;
-  }
-}
-  }
-
-  return WholeArchiveActive;
-}
-
-/// Determine if driver is invoked to create a shared object library (-static)
-static bool isSharedLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_shared);
-}
-
-/// Determine if driver is invoked to create a static object library (-shared)
-static bool isStaticLinkage(const ArgList ) {
-  return Args.hasArg(options::OPT_static);
-}
-
-/// Add Fortran runtime libs for MSVC
-static void addFortranRuntimeLibsMSVC(const ArgList ,
-  llvm::opt::ArgStringList ) {
-  unsigned RTOptionID = options::OPT__SLASH_MT;
-  if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-RTOptionID = llvm::StringSwitch(rtl->getValue())
- .Case("static", options::OPT__SLASH_MT)
- .Case("static_dbg", options::OPT__SLASH_MTd)
- 

[clang] [llvm] [clang-tools-extra] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)

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


@@ -10,10 +10,50 @@
 // extensions that will eventually be implemented in Fortran.
 
 #include "flang/Runtime/extensions.h"
+#include "flang/Runtime/character.h"
 #include "flang/Runtime/command.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
 
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include 
+
+#include  // wcstombs_s
+#include  // UNLEN=256
+#include  // wchar_t cast to LPWSTR
+#pragma comment(lib, "Advapi32.lib") // Link Advapi32.lib for GetUserName

DavidTruby wrote:

This library will always be there on Windows so I don't know how much of an 
issue this is. We could avoid it by only getting from the environment variable 
on Windows?

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


[clang] [llvm] [clang-tools-extra] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)

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

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

LGTM

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


[llvm] [flang] [clang] [clang-tools-extra] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)

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

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


[llvm] [clang-tools-extra] [flang] [clang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)

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


@@ -6,6 +6,37 @@
 //
 
//===--===//
 
+// character.h

DavidTruby wrote:

nit: `string.h` instead? This is really dealing with c-style strings rather 
than characters

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


[clang-tools-extra] [flang] [llvm] [clang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)

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


@@ -37,5 +77,30 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, , nullptr, nullptr, __FILE__, __LINE__);
 }
+
+// CALL GETLOG(USRNAME)
+void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) {

DavidTruby wrote:

nit: I think we should use `std::byte` instead of `std::int8_t`, while they're 
functionally going to be the same here since you're just casting it around it 
would be more clear that that's the intention for the type

https://github.com/llvm/llvm-project/pull/74628
___
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


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

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

DavidTruby 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.

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] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

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

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


[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-30 Thread David Truby via cfe-commits




DavidTruby wrote:

It wasn't, I think I have replaced this

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


[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-30 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/73250

>From 656463c6298b981cbd43d1d5042438eab700143b Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 23 Nov 2023 15:32:57 +
Subject: [PATCH 1/2] [flang] Add MSC_VER and target arch defines when
 targeting the MSVC ABI

---
 clang/lib/Driver/ToolChains/Flang.cpp | 24 
 flang/test/Driver/msvc-defines.f90| 10 ++
 2 files changed, 34 insertions(+)
 create mode 100644 flang/test/Driver/msvc-defines.f90

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 01f07b9228256cf..87aa546e5549423 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList ,
   }
 }
 
+static void addVSDefines(const ToolChain , const ArgList ,
+ ArgStringList ) {
+
+  unsigned ver = 0;
+  const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args);
+  ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 +
+vt.getSubminor().value_or(0);
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10)));
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
+
+  llvm::Triple triple = TC.getTriple();
+  if (triple.isAArch64()) {
+CmdArgs.push_back("-D_M_ARM64=1");
+  } else if (triple.isX86() && triple.isArch32Bit()) {
+CmdArgs.push_back("-D_M_IX86=600");
+  } else if (triple.isX86() && triple.isArch64Bit()) {
+CmdArgs.push_back("-D_M_X64=100");
+  } else {
+llvm_unreachable(
+"Flang on Windows only supports X86_32, X86_64 and AArch64");
+  }
+}
+
 static void processVSRuntimeLibrary(const ToolChain , const ArgList ,
 ArgStringList ) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
@@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList ,
 
   if (Triple.isKnownWindowsMSVCEnvironment()) {
 processVSRuntimeLibrary(TC, Args, CmdArgs);
+addVSDefines(TC, Args, CmdArgs);
   }
 
   // TODO: Add target specific flags, ABI, mtune option etc.
diff --git a/flang/test/Driver/msvc-defines.f90 
b/flang/test/Driver/msvc-defines.f90
new file mode 100644
index 000..97a6ce888d7f579
--- /dev/null
+++ b/flang/test/Driver/msvc-defines.f90
@@ -0,0 +1,10 @@
+! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64
+! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_32
+! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_64
+
+! MSVC: -fc1
+! MSVC-SAME: -D_MSC_VER={{[0-9]*}}
+! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}}
+! MSVC-AARCH64-SAME: -D_M_ARM64=1
+! MSVC-X86_32-SAME: -D_M_IX86=600
+! MSVC-X86_64-SAME: -D_M_X64=100

>From 50833e29971704db234fc8a88ba4032517b4cfdb Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 30 Nov 2023 16:24:58 +
Subject: [PATCH 2/2] Changes for review

---
 clang/lib/Driver/ToolChains/Flang.cpp |  1 +
 flang/test/Driver/msvc-defines.f90| 20 ++--
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 87aa546e5549423..1b199704a372083 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -213,6 +213,7 @@ static void addVSDefines(const ToolChain , const ArgList 
,
 vt.getSubminor().value_or(0);
   CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10)));
   CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
+  CmdArgs.push_back(Args.MakeArgString("-D_WIN32"));
 
   llvm::Triple triple = TC.getTriple();
   if (triple.isAArch64()) {
diff --git a/flang/test/Driver/msvc-defines.f90 
b/flang/test/Driver/msvc-defines.f90
index 97a6ce888d7f579..a05df666ac09a6a 100644
--- a/flang/test/Driver/msvc-defines.f90
+++ b/flang/test/Driver/msvc-defines.f90
@@ -1,10 +1,10 @@
-! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64
-! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_32
-! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_64
-
-! MSVC: -fc1
-! MSVC-SAME: -D_MSC_VER={{[0-9]*}}
-! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}}
-! MSVC-AARCH64-SAME: -D_M_ARM64=1
-! MSVC-X86_32-SAME: -D_M_IX86=600
-! MSVC-X86_64-SAME: -D_M_X64=100
+! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64
+! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_32

[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-30 Thread David Truby via cfe-commits


@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList ,
   }
 }
 
+static void addVSDefines(const ToolChain , const ArgList ,

DavidTruby wrote:

I named it this way to match processVSRuntimeLibs which I stole from clang :)

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


[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-30 Thread David Truby via cfe-commits


@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList ,
   }
 }
 
+static void addVSDefines(const ToolChain , const ArgList ,
+ ArgStringList ) {
+
+  unsigned ver = 0;
+  const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args);
+  ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 +
+vt.getSubminor().value_or(0);
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10)));
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
+
+  llvm::Triple triple = TC.getTriple();
+  if (triple.isAArch64()) {
+CmdArgs.push_back("-D_M_ARM64=1");

DavidTruby wrote:

I don't believe so. It's not tested at all if it does as far as I can tell!

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


[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-30 Thread David Truby via cfe-commits


@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList ,
   }
 }
 
+static void addVSDefines(const ToolChain , const ArgList ,
+ ArgStringList ) {
+
+  unsigned ver = 0;
+  const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args);
+  ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 +
+vt.getSubminor().value_or(0);
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10)));
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
+
+  llvm::Triple triple = TC.getTriple();
+  if (triple.isAArch64()) {
+CmdArgs.push_back("-D_M_ARM64=1");
+  } else if (triple.isX86() && triple.isArch32Bit()) {
+CmdArgs.push_back("-D_M_IX86=600");
+  } else if (triple.isX86() && triple.isArch64Bit()) {
+CmdArgs.push_back("-D_M_X64=100");
+  } else {
+llvm_unreachable(
+"Flang on Windows only supports X86_32, X86_64 and AArch64");
+  }

DavidTruby wrote:

We don't support 32 bit _hosts_ but I think we do support 32 bit _targets_

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


[flang] [clang] [flang][Driver] Let the linker fail on multiple definitions of main() (PR #73124)

2023-11-27 Thread David Truby via cfe-commits

DavidTruby wrote:

I think so yes. The issue is that Windows really wants these things to be in 
the object files rather than passed on the link line, which is what the patch 
you're referencing changed for linking the runtimes at least. Doing that for 
this as well is a little more complex though, so I suggest just passing the 
`/WHOLEARCHIVE` on the link line as the runtimes were also being passed before 
(you won't need to pass Fortran_main like it was before though, as the 
directive to link that is now in every object file).

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


[clang] [flang] [flang][Driver] Let the linker fail on multiple definitions of main() (PR #73124)

2023-11-27 Thread David Truby via cfe-commits

DavidTruby wrote:

I think for Windows the easy thing to do here is just to add 
`/WHOLEARCHIVE:...` here anyway, using the same logic as in 
processVSRuntimeLibrary(); E.g
```
void tools::addFortranRuntimeLibs(const ToolChain , const ArgList , 
//need to add args here so we can search it
  llvm::opt::ArgStringList ) {
  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
  // non-windows stuff
  } else {
  if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
  RTOptionID = llvm::StringSwitch(rtl->getValue())
   .Case("static", options::OPT__SLASH_MT)
   .Case("static_dbg", options::OPT__SLASH_MTd)
   .Case("dll", options::OPT__SLASH_MD)
   .Case("dll_dbg", options::OPT__SLASH_MDd)
   .Default(options::OPT__SLASH_MT);
 switch (RTOptionID) {
 case options::OPT__SLASH_MT:
   CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib");
///etc
  }
  ```
I haven't actually tested this code but it maybe gives an idea of what needs 
doing?

The "correct" thing to do would probably be to add the /WHOLEARCHIVE directive 
as a linker directive in the object file (like we do for 
/DEFAULTLIB:Fortran_main) but that would require a bit more hooking up to pass 
that all the way through to creating an `llvm.linker_options` MLIR operation. I 
think the above should probably suffice at least for now.

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


[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-23 Thread David Truby via cfe-commits

DavidTruby wrote:

@pbo-linaro @bradking I think this fixes the linked issue, could someone 
confirm that for me? Thanks!

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


[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-23 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)

2023-11-23 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/73250

None

>From 656463c6298b981cbd43d1d5042438eab700143b Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 23 Nov 2023 15:32:57 +
Subject: [PATCH] [flang] Add MSC_VER and target arch defines when targeting
 the MSVC ABI

---
 clang/lib/Driver/ToolChains/Flang.cpp | 24 
 flang/test/Driver/msvc-defines.f90| 10 ++
 2 files changed, 34 insertions(+)
 create mode 100644 flang/test/Driver/msvc-defines.f90

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 01f07b9228256cf..87aa546e5549423 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList ,
   }
 }
 
+static void addVSDefines(const ToolChain , const ArgList ,
+ ArgStringList ) {
+
+  unsigned ver = 0;
+  const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args);
+  ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 +
+vt.getSubminor().value_or(0);
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10)));
+  CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
+
+  llvm::Triple triple = TC.getTriple();
+  if (triple.isAArch64()) {
+CmdArgs.push_back("-D_M_ARM64=1");
+  } else if (triple.isX86() && triple.isArch32Bit()) {
+CmdArgs.push_back("-D_M_IX86=600");
+  } else if (triple.isX86() && triple.isArch64Bit()) {
+CmdArgs.push_back("-D_M_X64=100");
+  } else {
+llvm_unreachable(
+"Flang on Windows only supports X86_32, X86_64 and AArch64");
+  }
+}
+
 static void processVSRuntimeLibrary(const ToolChain , const ArgList ,
 ArgStringList ) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
@@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList ,
 
   if (Triple.isKnownWindowsMSVCEnvironment()) {
 processVSRuntimeLibrary(TC, Args, CmdArgs);
+addVSDefines(TC, Args, CmdArgs);
   }
 
   // TODO: Add target specific flags, ABI, mtune option etc.
diff --git a/flang/test/Driver/msvc-defines.f90 
b/flang/test/Driver/msvc-defines.f90
new file mode 100644
index 000..97a6ce888d7f579
--- /dev/null
+++ b/flang/test/Driver/msvc-defines.f90
@@ -0,0 +1,10 @@
+! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64
+! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_32
+! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | 
FileCheck %s --check-prefixes=MSVC,MSVC-X86_64
+
+! MSVC: -fc1
+! MSVC-SAME: -D_MSC_VER={{[0-9]*}}
+! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}}
+! MSVC-AARCH64-SAME: -D_M_ARM64=1
+! MSVC-X86_32-SAME: -D_M_IX86=600
+! MSVC-X86_64-SAME: -D_M_X64=100

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-23 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-23 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72519

>From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 16 Nov 2023 14:32:27 +
Subject: [PATCH 1/3] [flang] Add runtimes using --dependent-lib on MSVC
 targets

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +-
 clang/lib/Driver/ToolChains/CommonArgs.h  |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp|  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp | 57 +++
 clang/lib/Driver/ToolChains/FreeBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp   |  2 +-
 flang/test/Driver/linker-flags.f90| 35 
 .../test/Driver/msvc-dependent-lib-flags.f90  | 36 
 15 files changed, 107 insertions(+), 86 deletions(-)
 create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/lib/Driver/ToolChains/CommonArgs.h
index 0a0951c5386e601..f364c9793c9be62 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/lib/Driver/ToolChains/CommonArgs.h
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList , 
const ToolChain ,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain , const llvm::opt::ArgList ,
+void addFortranRuntimeLibs(const ToolChain ,
llvm::opt::ArgStringList );
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a8c..1f61bb02c6ae226 100644
--- 

[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-23 Thread David Truby via cfe-commits




DavidTruby wrote:

I've had to add it as just `-fc1` because of the way lit does argument passing 
on Windows (it puts the "flang-new" and "-fc1" in quotes, but only sometimes :))

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


[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-22 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-22 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-21 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72519

>From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 16 Nov 2023 14:32:27 +
Subject: [PATCH 1/2] [flang] Add runtimes using --dependent-lib on MSVC
 targets

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +-
 clang/lib/Driver/ToolChains/CommonArgs.h  |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp|  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp | 57 +++
 clang/lib/Driver/ToolChains/FreeBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp   |  2 +-
 flang/test/Driver/linker-flags.f90| 35 
 .../test/Driver/msvc-dependent-lib-flags.f90  | 36 
 15 files changed, 107 insertions(+), 86 deletions(-)
 create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/lib/Driver/ToolChains/CommonArgs.h
index 0a0951c5386e601..f364c9793c9be62 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/lib/Driver/ToolChains/CommonArgs.h
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList , 
const ToolChain ,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain , const llvm::opt::ArgList ,
+void addFortranRuntimeLibs(const ToolChain ,
llvm::opt::ArgStringList );
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a8c..1f61bb02c6ae226 100644
--- 

[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-21 Thread David Truby via cfe-commits




DavidTruby wrote:

Yes, these are checking the invocation of the frontend driver

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits




DavidTruby wrote:

the new file (msvc-dependent-lib-flags) just tests this specific feature; I can 
probably just put that in the other linker flags file but that's getting rather 
big anyway and doesn't necessarily need yet more run lines added to it!

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


[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits


@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {

DavidTruby wrote:

No, these are added automatically. They're just added at a different place, 
because they aren't added to the link line but rather added as link directives 
in the object file, matching what cl.exe and clang do and therefore what 
link.exe expects.

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits


@@ -0,0 +1,36 @@
+! RUN: %flang -### --target=aarch64-windows-msvc -fuse-ld= %S/Inputs/hello.f90 
-v 2>&1 | FileCheck %s --check-prefixes=MSVC

DavidTruby wrote:

I don't know that there is one honestly, I copied these build lines from 
another file! Happy to remove it

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

DavidTruby wrote:

> Could you remind the rationale behind an empty `-fuse-ld=`? 

I don't know that there is one honestly, I copied these build lines from 
another file! Happy to remove it

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

DavidTruby wrote:

@bradking this now works for me at least locally, sorry for the confusion

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72519

>From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 16 Nov 2023 14:32:27 +
Subject: [PATCH] [flang] Add runtimes using --dependent-lib on MSVC targets

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +-
 clang/lib/Driver/ToolChains/CommonArgs.h  |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp|  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp | 57 +++
 clang/lib/Driver/ToolChains/FreeBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp   |  2 +-
 flang/test/Driver/linker-flags.f90| 35 
 .../test/Driver/msvc-dependent-lib-flags.f90  | 36 
 15 files changed, 107 insertions(+), 86 deletions(-)
 create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/lib/Driver/ToolChains/CommonArgs.h
index 0a0951c5386e601..f364c9793c9be62 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/lib/Driver/ToolChains/CommonArgs.h
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList , 
const ToolChain ,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain , const llvm::opt::ArgList ,
+void addFortranRuntimeLibs(const ToolChain ,
llvm::opt::ArgStringList );
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a8c..1f61bb02c6ae226 100644
--- 

[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-20 Thread David Truby via cfe-commits

DavidTruby wrote:

> I tried this locally, but it doesn't quite work:
> 
> ```
> >flang-new foo.f90
> ... fatal error LNK1276: invalid directive 'clang_rt.builtins-x86_64.lib' 
> found; does not start with '/'
> ```
> 
> The directives appear in the object file with an extra space:
> 
> ```
> >flang-new -c foo.f90
> >grep -ai defaultlib foo.o
>  /DEFAULTLIB: clang_rt.builtins-x86_64.lib /DEFAULTLIB: libcmt /DEFAULTLIB: 
> Fortran_main.static.lib /DEFAULTLIB: FortranRuntime.static.lib /DEFAULTLIB: 
> FortranDecimal.static.lib.text
> ```
> 
> There should not be a space after `/DEFAULTLIB:` before the library name.

This looks like a small bug in the previous patch in this series due to a 
misunderstanding by me of how `llvm.linker.options` works. I'll push a quick 
fix for that and then rebase this patch on that which should fix the issue

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-16 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72519

>From b58c339f7e8fb4cefbe3bad36bb40518beecf864 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 16 Nov 2023 14:32:27 +
Subject: [PATCH 1/2] [flang] Add runtimes using --dependent-lib on MSVC
 targets

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +-
 clang/lib/Driver/ToolChains/CommonArgs.h  |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp|  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp | 58 +++
 clang/lib/Driver/ToolChains/FreeBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp   |  2 +-
 flang/test/Driver/linker-flags.f90| 35 ---
 .../test/Driver/msvc-dependent-lib-flags.f90  | 36 
 15 files changed, 108 insertions(+), 86 deletions(-)
 create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925c..55951162df50a758 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/lib/Driver/ToolChains/CommonArgs.h
index 0a0951c5386e6013..f364c9793c9be62d 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/lib/Driver/ToolChains/CommonArgs.h
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList , 
const ToolChain ,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain , const llvm::opt::ArgList ,
+void addFortranRuntimeLibs(const ToolChain ,
llvm::opt::ArgStringList );
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7481f6cab9a968dc..f28e08d81bf29b48 100644
--- 

[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-16 Thread David Truby via cfe-commits

DavidTruby wrote:

@bradking I'm hoping this finally fixes this issue in a way that is more 
helpful to you, could you confirm that for me? Thanks!

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


[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)

2023-11-16 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/72519

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.

>From b58c339f7e8fb4cefbe3bad36bb40518beecf864 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Thu, 16 Nov 2023 14:32:27 +
Subject: [PATCH] [flang] Add runtimes using --dependent-lib on MSVC targets

This patch uses the added --dependent-lib support to add the relevant
runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file
rather than on the link line. This should help CMake support for flang
on Windows.
---
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +-
 clang/lib/Driver/ToolChains/CommonArgs.h  |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp|  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp |  2 +-
 clang/lib/Driver/ToolChains/Flang.cpp | 58 +++
 clang/lib/Driver/ToolChains/FreeBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp   |  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp   |  2 +-
 flang/test/Driver/linker-flags.f90| 35 ---
 .../test/Driver/msvc-dependent-lib-flags.f90  | 36 
 15 files changed, 108 insertions(+), 86 deletions(-)
 create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
+void tools::addFortranRuntimeLibs(const ToolChain ,
   llvm::opt::ArgStringList ) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(rtl->getValue())
-   .Case("static", options::OPT__SLASH_MT)
-   .Case("static_dbg", options::OPT__SLASH_MTd)
-   .Case("dll", options::OPT__SLASH_MD)
-   .Case("dll_dbg", options::OPT__SLASH_MDd)
-   .Default(options::OPT__SLASH_MT);
-}
-switch (RTOptionID) {
-case options::OPT__SLASH_MT:
-  CmdArgs.push_back("/DEFAULTLIB:libcmt");
-  CmdArgs.push_back("Fortran_main.static.lib");
-  CmdArgs.push_back("FortranRuntime.static.lib");
-  CmdArgs.push_back("FortranDecimal.static.lib");
-  break;
-case options::OPT__SLASH_MTd:
-  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
-  CmdArgs.push_back("Fortran_main.static_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
-  break;
-case options::OPT__SLASH_MD:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
-  CmdArgs.push_back("Fortran_main.dynamic.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic.lib");
-  break;
-case options::OPT__SLASH_MDd:
-  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
-  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
-  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
-  break;
-}
-  } else {
+  // These are handled by adding link options to the object file on Windows
+  if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
 CmdArgs.push_back("-lFortranDecimal");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 
b/clang/lib/Driver/ToolChains/CommonArgs.h
index 0a0951c5386e601..f364c9793c9be62 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.h
+++ b/clang/lib/Driver/ToolChains/CommonArgs.h
@@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList , 
const ToolChain ,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain , const llvm::opt::ArgList ,
+void addFortranRuntimeLibs(const ToolChain ,
llvm::opt::ArgStringList );
 
 /// Adds the path 

[clang] [coroutines] Introduce [[clang::coro_return_type]] and [[clang::coro_wrapper]] (PR #71945)

2023-11-15 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/71945

>From 89a2d60fc012742a74a008fb77213bcd47734503 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Fri, 10 Nov 2023 15:10:44 +0100
Subject: [PATCH 1/7] [coroutines] Introduce [[clang::coro_return_type]] and
 [[clang::co ro_wrapper]]

---
 clang/include/clang/Basic/Attr.td | 16 +
 clang/include/clang/Basic/AttrDocs.td | 67 +++
 .../clang/Basic/DiagnosticSemaKinds.td|  4 ++
 clang/include/clang/Sema/Sema.h   |  1 +
 clang/lib/Sema/SemaDecl.cpp   | 25 ++-
 ...a-attribute-supported-attributes-list.test |  2 +
 .../SemaCXX/coro-return-type-and-wrapper.cpp  | 56 
 7 files changed, 169 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/coro-return-type-and-wrapper.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 31434565becaec6..f7a2b83b15ef5bc 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1094,6 +1094,22 @@ def CoroOnlyDestroyWhenComplete : InheritableAttr {
   let SimpleHandler = 1;
 }
 
+def CoroReturnType : InheritableAttr {
+  let Spellings = [Clang<"coro_return_type">];
+  let Subjects = SubjectList<[CXXRecord]>;
+  let LangOpts = [CPlusPlus];
+  let Documentation = [CoroReturnTypeAndWrapperDoc];
+  let SimpleHandler = 1;
+}
+
+def CoroWrapper : InheritableAttr {
+  let Spellings = [Clang<"coro_wrapper">];
+  let Subjects = SubjectList<[Function]>;
+  let LangOpts = [CPlusPlus];
+  let Documentation = [CoroReturnTypeAndWrapperDoc];
+  let SimpleHandler = 1;
+}
+
 // OSObject-based attributes.
 def OSConsumed : InheritableParamAttr {
   let Spellings = [Clang<"os_consumed">];
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index fa6f6acd0c30e88..66c92bcaa2d4a4a 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -7482,3 +7482,70 @@ generation of the other destruction cases, optimizing 
the above `foo.destroy` to
 
   }];
 }
+
+
+def CoroReturnTypeAndWrapperDoc : Documentation {
+  let Category = DocCatDecl;
+  let Content = [{
+The `coro_only_destroy_when_complete` attribute should be marked on a C++ 
class. The coroutines
+whose return type is marked with the attribute are assumed to be destroyed 
only after the coroutine has
+reached the final suspend point.
+
+This is helpful for the optimizers to reduce the size of the destroy function 
for the coroutines.
+
+For example,
+
+.. code-block:: c++
+
+  A foo() {
+dtor d;
+co_await something();
+dtor d1;
+co_await something();
+dtor d2;
+co_return 43;
+  }
+
+The compiler may generate the following pseudocode:
+
+.. code-block:: c++
+
+  void foo.destroy(foo.Frame *frame) {
+switch(frame->suspend_index()) {
+  case 1:
+frame->d.~dtor();
+break;
+  case 2:
+frame->d.~dtor();
+frame->d1.~dtor();
+break;
+  case 3:
+frame->d.~dtor();
+frame->d1.~dtor();
+frame->d2.~dtor();
+break;
+  default: // coroutine completed or haven't started
+break;
+}
+
+frame->promise.~promise_type();
+delete frame;
+  }
+
+The `foo.destroy()` function's purpose is to release all of the resources
+initialized for the coroutine when it is destroyed in a suspended state.
+However, if the coroutine is only ever destroyed at the final suspend state,
+the rest of the conditions are superfluous.
+
+The user can use the `coro_only_destroy_when_complete` attributo suppress
+generation of the other destruction cases, optimizing the above `foo.destroy` 
to:
+
+.. code-block:: c++
+
+  void foo.destroy(foo.Frame *frame) {
+frame->promise.~promise_type();
+delete frame;
+  }
+
+  }];
+}
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 4614324babb1c91..0200457b39ce5eb 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11591,6 +11591,10 @@ def err_conflicting_aligned_options : Error <
 def err_coro_invalid_addr_of_label : Error<
   "the GNU address of label extension is not allowed in coroutines."
 >;
+def err_coroutine_return_type : Error<
+  "function returns a coroutine return type %0 but is neither a coroutine nor 
a coroutine wrapper; "
+  "non-coroutines should be marked with [[clang::coro_wrapper]] to allow 
returning coroutine return type"
+>;
 } // end of coroutines issue category
 
 let CategoryName = "Documentation Issue" in {
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index f69f366c1750918..4d45698e5786740 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11183,6 +11183,7 @@ class Sema final {
   bool buildCoroutineParameterMoves(SourceLocation Loc);
   

[clang] [flang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-15 Thread David Truby via cfe-commits

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


[clang] [flang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-15 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-15 Thread David Truby via cfe-commits

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


[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-15 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72121

>From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Mon, 13 Nov 2023 14:48:44 +
Subject: [PATCH 1/3] [flang] Add depdendent-lib option to flang -fc1 on
 Windows

This patch adds a --depdendent-lib option to flang -fc1 on Windows to
embed library link options into the object file. This is needed to
properly select the Windows CRT to link against.
---
 clang/include/clang/Driver/Options.td |  8 ---
 flang/include/flang/Frontend/CodeGenOptions.h |  3 +++
 flang/lib/Frontend/CompilerInvocation.cpp | 23 +++
 flang/lib/Frontend/FrontendActions.cpp| 23 +++
 flang/test/Driver/dependent-lib.f90   |  7 ++
 flang/test/Driver/driver-help.f90 |  1 +
 6 files changed, 62 insertions(+), 3 deletions(-)
 create mode 100644 flang/test/Driver/dependent-lib.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation , 
llvm::opt::ArgList ,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation ,
+   llvm::opt::ArgList ,
+   clang::DiagnosticsEngine ) {
+  llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple);
+
+  // TODO: support --dependent-lib on other platforms when MLIR supports
+  //   !llvm.dependent.lib
+  if (args.hasArg(clang::driver::options::OPT_dependent_lib) &&
+  !triple.isOSWindows()) {
+const unsigned diagID =
+diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
+  "--dependent-lib is only supported on Windows");
+diags.Report(diagID);
+return false;
+  }
+
+  invoc.getCodeGenOpts().DependentLibs =
+  args.getAllArgValues(clang::driver::options::OPT_dependent_lib);
+  return true;
+}
+
 bool CompilerInvocation::createFromArgs(
 CompilerInvocation , llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine , const char *argv0) {
@@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs(
 
   success &= parseVScaleArgs(res, args, diags);
 
+  success &= parseLinkerOptionsArgs(res, args, diags);
+
   // Set the string to be used as the return value of the COMPILER_OPTIONS
   // intrinsic of iso_fortran_env. This is either passed in from the parent
   // compiler driver invocation with an environment variable, or failing that
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index d7ca7b66584dd52..8df966571bc39ab 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp ,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
 }
 
+static void addDepdendentLibs(mlir::ModuleOp ,
+  CompilerInstance ) {
+  const std::vector  =
+  ci.getInvocation().getCodeGenOpts().DependentLibs;
+  if (libs.empty()) {
+

[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-14 Thread David Truby via cfe-commits


@@ -0,0 +1,7 @@
+
+! RUN: %flang_fc1 -emit-mlir -triple aarch64-pc-windows-msvc 
--dependent-lib=libtest %s -o - 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -emit-mlir -triple x86_64-pc-windows-msvc 
--dependent-lib=libtest %s -o - 2>&1 | FileCheck %s

DavidTruby wrote:

I changed to use this but I'm not sure it's actually any clearer than just 
listing the run lines. Let me know what you think now that I've put it in  

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


[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-14 Thread David Truby via cfe-commits

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


[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-14 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/72121

>From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Mon, 13 Nov 2023 14:48:44 +
Subject: [PATCH 1/2] [flang] Add depdendent-lib option to flang -fc1 on
 Windows

This patch adds a --depdendent-lib option to flang -fc1 on Windows to
embed library link options into the object file. This is needed to
properly select the Windows CRT to link against.
---
 clang/include/clang/Driver/Options.td |  8 ---
 flang/include/flang/Frontend/CodeGenOptions.h |  3 +++
 flang/lib/Frontend/CompilerInvocation.cpp | 23 +++
 flang/lib/Frontend/FrontendActions.cpp| 23 +++
 flang/test/Driver/dependent-lib.f90   |  7 ++
 flang/test/Driver/driver-help.f90 |  1 +
 6 files changed, 62 insertions(+), 3 deletions(-)
 create mode 100644 flang/test/Driver/dependent-lib.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation , 
llvm::opt::ArgList ,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation ,
+   llvm::opt::ArgList ,
+   clang::DiagnosticsEngine ) {
+  llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple);
+
+  // TODO: support --dependent-lib on other platforms when MLIR supports
+  //   !llvm.dependent.lib
+  if (args.hasArg(clang::driver::options::OPT_dependent_lib) &&
+  !triple.isOSWindows()) {
+const unsigned diagID =
+diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
+  "--dependent-lib is only supported on Windows");
+diags.Report(diagID);
+return false;
+  }
+
+  invoc.getCodeGenOpts().DependentLibs =
+  args.getAllArgValues(clang::driver::options::OPT_dependent_lib);
+  return true;
+}
+
 bool CompilerInvocation::createFromArgs(
 CompilerInvocation , llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine , const char *argv0) {
@@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs(
 
   success &= parseVScaleArgs(res, args, diags);
 
+  success &= parseLinkerOptionsArgs(res, args, diags);
+
   // Set the string to be used as the return value of the COMPILER_OPTIONS
   // intrinsic of iso_fortran_env. This is either passed in from the parent
   // compiler driver invocation with an environment variable, or failing that
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index d7ca7b66584dd52..8df966571bc39ab 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp ,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
 }
 
+static void addDepdendentLibs(mlir::ModuleOp ,
+  CompilerInstance ) {
+  const std::vector  =
+  ci.getInvocation().getCodeGenOpts().DependentLibs;
+  if (libs.empty()) {
+

[clang-tools-extra] [flang] [clang] [llvm] [flang] FDATE extension implementation: get date and time in ctime format (PR #71222)

2023-11-14 Thread David Truby via cfe-commits

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

LGTM, maybe wait for @jeanPerier to check as well though. Thanks!

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


[clang-tools-extra] [flang] [clang] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits

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


[clang-tools-extra] [flang] [clang] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits


@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, , nullptr, nullptr, __FILE__, __LINE__);
 }
+
+void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) {
+  std::array str;
+  int error = getlogin_r(str.data(), str.size());
+  assert(error == 0 && "getlogin_r returned an error");
+
+  // Trim space from right/end
+  int i = str.size();
+  while (' ' == str[--i]) {
+str[i] = 0;
+  }
+  strncpy(reinterpret_cast(arg), str.data(), length);

DavidTruby wrote:

`std::strncpy`

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


[clang] [flang] [llvm] [clang-tools-extra] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits


@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, , nullptr, nullptr, __FILE__, __LINE__);
 }
+
+void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) {
+  std::array str;
+  int error = getlogin_r(str.data(), str.size());
+  assert(error == 0 && "getlogin_r returned an error");
+
+  // Trim space from right/end
+  int i = str.size();
+  while (' ' == str[--i]) {
+str[i] = 0;
+  }

DavidTruby wrote:

`std::replace(str.rbegin(), str.rend(), ' ', '\0');`
would be clearer I think?

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


[flang] [llvm] [clang-tools-extra] [clang] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits


@@ -13,6 +13,44 @@
 #include "flang/Runtime/command.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
+#include 
+
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include 
+
+#include  // UNLEN=256
+#include  // wcstombs_s

DavidTruby wrote:

`cstdlib` instead of `stdlib.h`

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


[llvm] [clang] [flang] [clang-tools-extra] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits


@@ -13,6 +13,44 @@
 #include "flang/Runtime/command.h"
 #include "flang/Runtime/descriptor.h"
 #include "flang/Runtime/io-api.h"
+#include 

DavidTruby wrote:

We should use `cstring` instead of `string.h` and make sure all C standard 
functions are prefixed with `std::` since this is a C++ file

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


[flang] [clang] [clang-tools-extra] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

2023-11-14 Thread David Truby via cfe-commits

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

LGTM with a few small comments. Please wait for @jeanPerier to approve before 
merging.

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


[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-13 Thread David Truby via cfe-commits

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


[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-13 Thread David Truby via cfe-commits


@@ -303,6 +323,9 @@ bool CodeGenAction::beginSourceFileAction() {
   Fortran::parser::Program {*ci.getParsing().parseTree()};
   lb.lower(parseTree, ci.getInvocation().getSemanticsContext());
 
+  // Add dependent libraries
+  addDepdendentLibs(*mlirModule, ci);

DavidTruby wrote:

The consumer is that an LLVMIR dialect operation should be added to the MLIR 
module (in the global module scope) that will eventually get lowered by the 
standard MLIR LLVM dialect to LLVM ir transform. I don’t think it particularly 
matters where in the compilation flow that gets added as it doesn’t affect or 
get affected by any other transformation. I’m happy to add it later if you have 
a suggestion where it should be done, I mostly did it here because you still 
have all the information to construct the list of linker options without 
needing to pass any information further on.

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


[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)

2023-11-13 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/72121

This patch adds a --depdendent-lib option to flang -fc1 on Windows to
embed library link options into the object file. This is needed to
properly select the Windows CRT to link against.

>From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Mon, 13 Nov 2023 14:48:44 +
Subject: [PATCH] [flang] Add depdendent-lib option to flang -fc1 on Windows

This patch adds a --depdendent-lib option to flang -fc1 on Windows to
embed library link options into the object file. This is needed to
properly select the Windows CRT to link against.
---
 clang/include/clang/Driver/Options.td |  8 ---
 flang/include/flang/Frontend/CodeGenOptions.h |  3 +++
 flang/lib/Frontend/CompilerInvocation.cpp | 23 +++
 flang/lib/Frontend/FrontendActions.cpp| 23 +++
 flang/test/Driver/dependent-lib.f90   |  7 ++
 flang/test/Driver/driver-help.f90 |  1 +
 6 files changed, 62 insertions(+), 3 deletions(-)
 create mode 100644 flang/test/Driver/dependent-lib.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation , 
llvm::opt::ArgList ,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation ,
+   llvm::opt::ArgList ,
+   clang::DiagnosticsEngine ) {
+  llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple);
+
+  // TODO: support --dependent-lib on other platforms when MLIR supports
+  //   !llvm.dependent.lib
+  if (args.hasArg(clang::driver::options::OPT_dependent_lib) &&
+  !triple.isOSWindows()) {
+const unsigned diagID =
+diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
+  "--dependent-lib is only supported on Windows");
+diags.Report(diagID);
+return false;
+  }
+
+  invoc.getCodeGenOpts().DependentLibs =
+  args.getAllArgValues(clang::driver::options::OPT_dependent_lib);
+  return true;
+}
+
 bool CompilerInvocation::createFromArgs(
 CompilerInvocation , llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine , const char *argv0) {
@@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs(
 
   success &= parseVScaleArgs(res, args, diags);
 
+  success &= parseLinkerOptionsArgs(res, args, diags);
+
   // Set the string to be used as the return value of the COMPILER_OPTIONS
   // intrinsic of iso_fortran_env. This is either passed in from the parent
   // compiler driver invocation with an environment variable, or failing that
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index d7ca7b66584dd52..8df966571bc39ab 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp ,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
 }
 
+static void 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-10 Thread David Truby via cfe-commits

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


[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-10 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 46057145d229e5b6ee7e6891f34d47b0d2aa818d Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  4 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 40 +++---
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 169 insertions(+), 31 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 3409ce29ac56302..dacc4442b338a29 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2858,7 +2858,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index e19f1829c9fa82b..a81c9b6201f8158 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch (RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_dbg.lib");
+  CmdArgs.push_back("FortranRuntime.static_dbg.lib");
+  CmdArgs.push_back("FortranDecimal.static_dbg.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_dbg.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

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

DavidTruby wrote:

I've also started the work to get linker option directives (like "/DEFAULTLIB") 
added to MLIR's LLVMIR dialect so that we can do this the correct way: see 
#71720. I'd still like to merge this patch first though for the incremental 
improvement it does provide. Then once the MLIR support is merged I can switch 
over to using that and this should be resolved in the way that would help 
CMake's support for flang. 

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

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

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/8] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

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

DavidTruby wrote:

> @DavidTruby please see my above retraction of the suggestion to rename 
> `.dynamic.lib` to `.dll.lib`.

Ah, I missed that, I'll make that change back

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

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

DavidTruby wrote:

@bradking do you think this is ok to merge now?

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-03 Thread David Truby via cfe-commits

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-03 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/7] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-03 Thread David Truby via cfe-commits


@@ -281,3 +281,26 @@ add_flang_library(FortranRuntime
 
   INSTALL_WITH_TOOLCHAIN
 )
+
+if (DEFINED MSVC)
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
+  add_flang_library(FortranRuntime.static ${sources}

DavidTruby wrote:

The plain FortranRuntime library is linked by the Runtime tests, which need to 
be built against whatever the user built LLVM with, which we can't necessarily 
find out that easily I think. It should not have INSTALL_WITH_TOOLCHAIN set 
though, I'll remove that

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


[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-02 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/6] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-02 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/4] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-02 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/5] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;

DavidTruby wrote:

I should be adding the missing compiler-rt libs in this patch too. I don’t see 
any missing symbols in any of the configurations when testing an empty program 
locally. Could you share the error you’re seeing?

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits

DavidTruby wrote:

> > Do we really need to have all 4 variants of the 3 fortran runtime 
> > libraries? That's a lot of complexity. Can we pare it down to just 
> > static/dynamic? It's also sometimes possible to generate code that works in 
> > both the static and dynamic context, depending on what is in those 
> > libraries. We don't create 4 variants of clang_rt.builtins, for examle.
> 
> From glancing at the fortran runtime code, I think the answer is probably 
> "no". There is too much C++ standard library usage. If you wish to avoid this 
> build complexity, you may consider writing code in the STL-less style that is 
> used for C++ code in the sanitizers in compiler-rt.

I don't think we can avoid it if we want to allow anyone to link 
flang-generated object files into a C/C++ application. I don't think we could 
even get it down to static/dynamic reliably without committing to not only not 
using the STL but not using any C/C++ functions that might call into the 
runtime (as compiler-rt builtins does). I don't think that's a route we want to 
go down with the flang runtime; I think we'd generally put build complexity 
secondary to code complexity in here (

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch (RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;

DavidTruby wrote:

Having had a look, I think we can replicate what clang -cc1's 
`--dependent-lib=` setting does possibly

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;

DavidTruby wrote:

I think we should take the opportunity to match what clang's default behaviour 
is here, which is to pass `/MT`. I think having the two do something different 
is surprising at the moment and should be changed.

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


[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch (RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;

DavidTruby wrote:

Is there a way to add defaultlib directives using a CLI tool, or do they _have_ 
to be added when the compiler creates the object file? The main issue is we 
have an MLIR step in between flang and LLVM IR and I don't believe MLIR 
supports the attributes for setting these defaultlib directives yet, so 
implimenting that might be quite a lot of work... It's not so much that we 
would have difficulty adding the specific defaultlib directive we need, as that 
we'd have an issue adding any of them.

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


[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/3] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits


@@ -53,3 +53,26 @@ add_flang_library(FortranDecimal INSTALL_WITH_TOOLCHAIN
   binary-to-decimal.cpp
   decimal-to-binary.cpp
 )
+
+if (DEFINED MSVC)
+  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)

DavidTruby wrote:

Yeah I tried this but inside add_flang_library these are made into custom 
targets (meaning the target property doesn’t do anything) and I’m not entirely 
sure why so I didn’t want to mess with it too much. I’ll give it another try

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


[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-11-01 Thread David Truby via cfe-commits

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-10-31 Thread David Truby via cfe-commits

https://github.com/DavidTruby updated 
https://github.com/llvm/llvm-project/pull/70833

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/2] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic_debug.lib");
+  break;
+}
   } else {
 CmdArgs.push_back("-lFortran_main");
 CmdArgs.push_back("-lFortranRuntime");
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h 

[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-10-31 Thread David Truby via cfe-commits

DavidTruby wrote:

@bradking I don't appear to be able to add you as a reviewer but it might be 
worth you having a look at this too, thanks!

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-10-31 Thread David Truby via cfe-commits

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


[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)

2023-10-31 Thread David Truby via cfe-commits

https://github.com/DavidTruby created 
https://github.com/llvm/llvm-project/pull/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.


>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH] [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.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList , 
const ToolChain ,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain ,
+void tools::addFortranRuntimeLibs(const ToolChain , const ArgList ,
   llvm::opt::ArgStringList ) {
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back("Fortran_main.lib");
-CmdArgs.push_back("FortranRuntime.lib");
-CmdArgs.push_back("FortranDecimal.lib");
+CmdArgs.push_back(Args.MakeArgString(
+"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
+unsigned RTOptionID = options::OPT__SLASH_MT;
+if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  RTOptionID = llvm::StringSwitch(rtl->getValue())
+   .Case("static", options::OPT__SLASH_MT)
+   .Case("static_dbg", options::OPT__SLASH_MTd)
+   .Case("dll", options::OPT__SLASH_MD)
+   .Case("dll_dbg", options::OPT__SLASH_MDd)
+   .Default(options::OPT__SLASH_MT);
+}
+switch(RTOptionID) {
+case options::OPT__SLASH_MT:
+  CmdArgs.push_back("/DEFAULTLIB:libcmt");
+  CmdArgs.push_back("Fortran_main.static.lib");
+  CmdArgs.push_back("FortranRuntime.static.lib");
+  CmdArgs.push_back("FortranDecimal.static.lib");
+  break;
+case options::OPT__SLASH_MTd:
+  CmdArgs.push_back("/DEFAULTLIB:libcmtd");
+  CmdArgs.push_back("Fortran_main.static_debug.lib");
+  CmdArgs.push_back("FortranRuntime.static_debug.lib");
+  CmdArgs.push_back("FortranDecimal.static_debug.lib");
+  break;
+case options::OPT__SLASH_MD:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrt");
+  CmdArgs.push_back("Fortran_main.dynamic.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic.lib");
+  CmdArgs.push_back("FortranDecimal.dynamic.lib");
+  break;
+case options::OPT__SLASH_MDd:
+  CmdArgs.push_back("/DEFAULTLIB:msvcrtd");
+  CmdArgs.push_back("Fortran_main.dynamic_debug.lib");
+  CmdArgs.push_back("FortranRuntime.dynamic_debug.lib");

[clang] [flang] Add flags controlling whether to run the fir alias tags pass (PR #68595)

2023-10-11 Thread David Truby via cfe-commits

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

LGTM

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


[clang] [flang][Driver] Support -rpath, -shared, and -static in the frontend (PR #66702)

2023-10-03 Thread David Truby via cfe-commits

DavidTruby wrote:

Sorry I haven’t had a chance to look at this yet but I can help you resolve the 
Windows issues here. 

Windows does support static libraries and that’s the default for the runtime at 
the moment, I’ve not actually tried linking the flang runtime dynamically on 
Windows so that may be the issue. There’s an additional hurdle on Windows as 
well that libraries statically or dynamically linked against libc are not ABI 
compatible, so I’m not sure how these flags might interact with that without 
taking a look

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


[clang] [flang]Add vscale argument parsing (PR #67676)

2023-09-29 Thread David Truby via cfe-commits


@@ -170,6 +169,38 @@ void Flang::addPicOptions(const ArgList , 
ArgStringList ) const {
   }
 }
 
+void Flang::AddAArch64TargetArgs(const ArgList ,
+ ArgStringList ) const {
+  // Handle -msve_vector_bits=
+  if (Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {
+StringRef Val = A->getValue();
+const Driver  = getToolChain().getDriver();
+if (Val.equals("128") || Val.equals("256") || Val.equals("512") ||
+Val.equals("1024") || Val.equals("2048") || Val.equals("128+") ||
+Val.equals("256+") || Val.equals("512+") || Val.equals("1024+") ||
+Val.equals("2048+")) {
+  unsigned Bits = 0;
+  if (Val.endswith("+"))
+Val = Val.substr(0, Val.size() - 1);

DavidTruby wrote:

very nit: `Val.drop_back()`

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


[clang] [flang]Add vscale argument parsing (PR #67676)

2023-09-29 Thread David Truby via cfe-commits

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


[clang] [flang]Add vscale argument parsing (PR #67676)

2023-09-29 Thread David Truby via cfe-commits

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

LGTM :)

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


  1   2   >