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

David Truby via flang-commits flang-commits at lists.llvm.org
Thu Nov 16 06:41:45 PST 2023


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 <david at truby.dev>
Date: Thu, 16 Nov 2023 14:32:27 +0000
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 &CmdArgs, const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
+void tools::addFortranRuntimeLibs(const ToolChain &TC,
                                   llvm::opt::ArgStringList &CmdArgs) {
-  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<unsigned>(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 &CmdArgs, const ToolChain &TC,
                       bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void addFortranRuntimeLibs(const ToolChain &TC,
                            llvm::opt::ArgStringList &CmdArgs);
 
 /// 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
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -678,7 +678,7 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   // to generate executables.
   if (getToolChain().getDriver().IsFlangMode()) {
     addFortranRuntimeLibraryPath(getToolChain(), Args, CmdArgs);
-    addFortranRuntimeLibs(getToolChain(), Args, CmdArgs);
+    addFortranRuntimeLibs(getToolChain(), CmdArgs);
   }
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
diff --git a/clang/lib/Driver/ToolChains/DragonFly.cpp b/clang/lib/Driver/ToolChains/DragonFly.cpp
index b13449bf778fa9f1..cced977bf0292561 100644
--- a/clang/lib/Driver/ToolChains/DragonFly.cpp
+++ b/clang/lib/Driver/ToolChains/DragonFly.cpp
@@ -153,7 +153,7 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // AddRunTimeLibs).
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-      addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+      addFortranRuntimeLibs(ToolChain, CmdArgs);
       CmdArgs.push_back("-lm");
     }
 
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 8bdd920c3dcbb796..84659b20eb535148 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -204,6 +204,60 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
   }
 }
 
+static void processVSRuntimeLibrary(const ToolChain &TC,
+                                    const ArgList &Args,
+                                    ArgStringList &CmdArgs) {
+  assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
+         "can only add VS runtime library on Windows!");
+  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
+    CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + 
+                      TC.getCompilerRTBasename(Args, "builtins")));
+  }
+  unsigned RTOptionID = options::OPT__SLASH_MT;
+  if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+    RTOptionID = llvm::StringSwitch<unsigned>(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("-D_MT");
+      CmdArgs.push_back("--dependent-lib=libcmt");
+      CmdArgs.push_back("--dependent-lib=Fortran_main.static.lib");
+      CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
+      CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
+      break;
+    case options::OPT__SLASH_MTd:
+      CmdArgs.push_back("-D_MT");
+      CmdArgs.push_back("-D_DEBUG");
+      CmdArgs.push_back("--dependent-lib=libcmtd");
+      CmdArgs.push_back("--dependent-lib=Fortran_main.static_dbg.lib");
+      CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
+      CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
+      break;
+    case options::OPT__SLASH_MD:
+      CmdArgs.push_back("-D_MT");
+      CmdArgs.push_back("-D_DLL");
+      CmdArgs.push_back("--dependent-lib=msvcrt");
+      CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic.lib");
+      CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
+      CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
+      break;
+    case options::OPT__SLASH_MDd:
+      CmdArgs.push_back("-D_MT");
+      CmdArgs.push_back("-D_DEBUG");
+      CmdArgs.push_back("-D_DLL");
+      CmdArgs.push_back("--dependent-lib=msvcrtd");
+      CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic_dbg.lib");
+      CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
+      CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
+      break;
+    }
+  }
+
 void Flang::addTargetOptions(const ArgList &Args,
                              ArgStringList &CmdArgs) const {
   const ToolChain &TC = getToolChain();
@@ -267,6 +321,10 @@ void Flang::addTargetOptions(const ArgList &Args,
     }
   }
 
+  if (Triple.isKnownWindowsMSVCEnvironment()) {
+    processVSRuntimeLibrary(TC, Args, CmdArgs);
+  }
+
   // TODO: Add target specific flags, ABI, mtune option etc.
 }
 
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index d46feb3459a6344d..d08764aeef77539e 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -310,7 +310,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // AddRunTimeLibs).
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-      addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+      addFortranRuntimeLibs(ToolChain, CmdArgs);
       if (Profiling)
         CmdArgs.push_back("-lm_p");
       else
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index 76986481686adc6e..5d6386b40cddf4c7 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -579,7 +579,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   // AddRunTimeLibs).
   if (D.IsFlangMode()) {
     addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-    addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+    addFortranRuntimeLibs(ToolChain, CmdArgs);
     CmdArgs.push_back("-lm");
   }
 
diff --git a/clang/lib/Driver/ToolChains/Haiku.cpp b/clang/lib/Driver/ToolChains/Haiku.cpp
index e0d94035823fd37f..3fe92054ac53e15d 100644
--- a/clang/lib/Driver/ToolChains/Haiku.cpp
+++ b/clang/lib/Driver/ToolChains/Haiku.cpp
@@ -118,7 +118,7 @@ void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // AddRunTimeLibs).
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-      addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+      addFortranRuntimeLibs(ToolChain, CmdArgs);
     }
 
     CmdArgs.push_back("-lgcc");
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp
index 8a4a174c90ea8557..4966d102c51f1aca 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -131,7 +131,7 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
 
   if (C.getDriver().IsFlangMode()) {
     addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
-    addFortranRuntimeLibs(TC, Args, CmdArgs);
+    addFortranRuntimeLibs(TC, CmdArgs);
 
     // Inform the MSVC linker that we're generating a console application, i.e.
     // one with `main` as the "user-defined" entry point. The `main` function is
diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp
index 5d7f8675daf8d28c..39d767795445dbe0 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -249,7 +249,7 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
 
   if (C.getDriver().IsFlangMode()) {
     addFortranRuntimeLibraryPath(TC, Args, CmdArgs);
-    addFortranRuntimeLibs(TC, Args, CmdArgs);
+    addFortranRuntimeLibs(TC, CmdArgs);
   }
 
   // TODO: Add profile stuff here
diff --git a/clang/lib/Driver/ToolChains/NetBSD.cpp b/clang/lib/Driver/ToolChains/NetBSD.cpp
index 240bf5764b9cce29..90b195a007caa781 100644
--- a/clang/lib/Driver/ToolChains/NetBSD.cpp
+++ b/clang/lib/Driver/ToolChains/NetBSD.cpp
@@ -325,7 +325,7 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // AddRunTimeLibs).
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-      addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+      addFortranRuntimeLibs(ToolChain, CmdArgs);
       CmdArgs.push_back("-lm");
     }
 
diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp
index 5d06cd8ab0bad165..b27a0129e2d4c7ac 100644
--- a/clang/lib/Driver/ToolChains/OpenBSD.cpp
+++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp
@@ -237,7 +237,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // AddRunTimeLibs).
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);
-      addFortranRuntimeLibs(ToolChain, Args, CmdArgs);
+      addFortranRuntimeLibs(ToolChain, CmdArgs);
       if (Profiling)
         CmdArgs.push_back("-lm_p");
       else
diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp
index 96757f07a54974f4..badfc33a74f29583 100644
--- a/clang/lib/Driver/ToolChains/Solaris.cpp
+++ b/clang/lib/Driver/ToolChains/Solaris.cpp
@@ -229,7 +229,7 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     // these dependencies need to be listed before the C runtime below.
     if (D.IsFlangMode()) {
       addFortranRuntimeLibraryPath(getToolChain(), Args, CmdArgs);
-      addFortranRuntimeLibs(getToolChain(), Args, CmdArgs);
+      addFortranRuntimeLibs(getToolChain(), CmdArgs);
       CmdArgs.push_back("-lm");
     }
     if (Args.hasArg(options::OPT_fstack_protector) ||
diff --git a/flang/test/Driver/linker-flags.f90 b/flang/test/Driver/linker-flags.f90
index a1417057d4da0688..85c4d60b3f098621 100644
--- a/flang/test/Driver/linker-flags.f90
+++ b/flang/test/Driver/linker-flags.f90
@@ -16,9 +16,6 @@
 !       but it is not needed when compiling Fortran code and they might bring in
 !       additional dependencies. Make sure its not added.
 ! RUN: %flang -### --target=aarch64-windows-msvc -fuse-ld= %S/Inputs/hello.f90 2>&1 | FileCheck %s --check-prefixes=CHECK,MSVC --implicit-check-not oldnames
-! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=static_dbg -fuse-ld= %S/Inputs/hello.f90 2>&1 | FileCheck %s --check-prefixes=CHECK,MSVC-DEBUG --implicit-check-not oldnames
-! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=dll -fuse-ld= %S/Inputs/hello.f90 2>&1 | FileCheck %s --check-prefixes=CHECK,MSVC-DLL --implicit-check-not oldnames
-! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=dll_dbg -fuse-ld= %S/Inputs/hello.f90 2>&1 | FileCheck %s --check-prefixes=CHECK,MSVC-DLL-DEBUG --implicit-check-not oldnames
 
 ! Compiler invocation to generate the object file
 ! CHECK-LABEL: {{.*}} "-emit-obj"
@@ -54,37 +51,5 @@
 !       (lld-)link.exe on Windows platforms. The suffix may not be added
 !       when the executable is not found or on non-Windows platforms.
 ! MSVC-LABEL: link
-! MSVC-SAME: /DEFAULTLIB:clang_rt.builtins-aarch64.lib
-! MSVC-SAME: /DEFAULTLIB:libcmt
-! MSVC-SAME: Fortran_main.static.lib
-! MSVC-SAME: FortranRuntime.static.lib
-! MSVC-SAME: FortranDecimal.static.lib
 ! MSVC-SAME: /subsystem:console
 ! MSVC-SAME: "[[object_file]]"
-
-! MSVC-DEBUG-LABEL: link
-! MSVC-DEBUG-SAME: /DEFAULTLIB:clang_rt.builtins-aarch64.lib
-! MSVC-DEBUG-SAME: /DEFAULTLIB:libcmtd
-! MSVC-DEBUG-SAME: Fortran_main.static_dbg.lib
-! MSVC-DEBUG-SAME: FortranRuntime.static_dbg.lib
-! MSVC-DEBUG-SAME: FortranDecimal.static_dbg.lib
-! MSVC-DEBUG-SAME: /subsystem:console
-! MSVC-DEBUG-SAME: "[[object_file]]"
-
-! MSVC-DLL-LABEL: link
-! MSVC-DLL-SAME: /DEFAULTLIB:clang_rt.builtins-aarch64.lib
-! MSVC-DLL-SAME: /DEFAULTLIB:msvcrt
-! MSVC-DLL-SAME: Fortran_main.dynamic.lib
-! MSVC-DLL-SAME: FortranRuntime.dynamic.lib
-! MSVC-DLL-SAME: FortranDecimal.dynamic.lib
-! MSVC-DLL-SAME: /subsystem:console
-! MSVC-DLL-SAME: "[[object_file]]"
-
-! MSVC-DLL-DEBUG-LABEL: link
-! MSVC-DLL-DEBUG-SAME: /DEFAULTLIB:clang_rt.builtins-aarch64.lib
-! MSVC-DLL-DEBUG-SAME: /DEFAULTLIB:msvcrtd
-! MSVC-DLL-DEBUG-SAME: Fortran_main.dynamic_dbg.lib
-! MSVC-DLL-DEBUG-SAME: FortranRuntime.dynamic_dbg.lib
-! MSVC-DLL-DEBUG-SAME: FortranDecimal.dynamic_dbg.lib
-! MSVC-DLL-DEBUG-SAME: /subsystem:console
-! MSVC-DLL-DEBUG-SAME: "[[object_file]]"
diff --git a/flang/test/Driver/msvc-dependent-lib-flags.f90 b/flang/test/Driver/msvc-dependent-lib-flags.f90
new file mode 100644
index 0000000000000000..9d971d5b1ec66fa0
--- /dev/null
+++ b/flang/test/Driver/msvc-dependent-lib-flags.f90
@@ -0,0 +1,36 @@
+! RUN: %flang -### --target=aarch64-windows-msvc -fuse-ld= %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC
+! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=static_dbg -fuse-ld= %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC-DEBUG
+! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=dll -fuse-ld= %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC-DLL
+! RUN: %flang -### --target=aarch64-windows-msvc -fms-runtime-lib=dll_dbg -fuse-ld= %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC-DLL-DEBUG
+
+! MSVC: --dependent-lib=clang_rt.builtins-aarch64.lib
+! MSVC-SAME: -D_MT
+! MSVC-SAME: --dependent-lib=libcmt
+! MSVC-SAME: --dependent-lib=Fortran_main.static.lib
+! MSVC-SAME: --dependent-lib=FortranRuntime.static.lib
+! MSVC-SAME: --dependent-lib=FortranDecimal.static.lib
+
+! MSVC-DEBUG: --dependent-lib=clang_rt.builtins-aarch64.lib
+! MSVC-DEBUG-SAME: -D_MT
+! MSVC-DEBUG-SAME: -D_DEBUG
+! MSVC-DEBUG-SAME: --dependent-lib=libcmtd
+! MSVC-DEBUG-SAME: --dependent-lib=Fortran_main.static_dbg.lib
+! MSVC-DEBUG-SAME: --dependent-lib=FortranRuntime.static_dbg.lib
+! MSVC-DEBUG-SAME: --dependent-lib=FortranDecimal.static_dbg.lib
+
+! MSVC-DLL: --dependent-lib=clang_rt.builtins-aarch64.lib
+! MSVC-DLL-SAME: -D_MT
+! MSVC-DLL-SAME: -D_DLL
+! MSVC-DLL-SAME: --dependent-lib=msvcrt
+! MSVC-DLL-SAME: --dependent-lib=Fortran_main.dynamic.lib
+! MSVC-DLL-SAME: --dependent-lib=FortranRuntime.dynamic.lib
+! MSVC-DLL-SAME: --dependent-lib=FortranDecimal.dynamic.lib
+
+! MSVC-DLL-DEBUG: --dependent-lib=clang_rt.builtins-aarch64.lib
+! MSVC-DLL-DEBUG-SAME: -D_MT
+! MSVC-DLL-DEBUG-SAME: -D_DEBUG
+! MSVC-DLL-DEBUG-SAME: -D_DLL
+! MSVC-DLL-DEBUG-SAME: --dependent-lib=msvcrtd
+! MSVC-DLL-DEBUG-SAME: --dependent-lib=Fortran_main.dynamic_dbg.lib
+! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranRuntime.dynamic_dbg.lib
+! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranDecimal.dynamic_dbg.lib

>From 1abc91d0561e22215baf44a198f2c9c105f8106b Mon Sep 17 00:00:00 2001
From: David Truby <david at truby.dev>
Date: Thu, 16 Nov 2023 14:41:22 +0000
Subject: [PATCH 2/2] clang-format

---
 clang/lib/Driver/ToolChains/Flang.cpp | 73 +++++++++++++--------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 84659b20eb535148..01f07b9228256cf8 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -204,14 +204,13 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
   }
 }
 
-static void processVSRuntimeLibrary(const ToolChain &TC,
-                                    const ArgList &Args,
+static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
                                     ArgStringList &CmdArgs) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
          "can only add VS runtime library on Windows!");
   if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-    CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + 
-                      TC.getCompilerRTBasename(Args, "builtins")));
+    CmdArgs.push_back(Args.MakeArgString(
+        "--dependent-lib=" + TC.getCompilerRTBasename(Args, "builtins")));
   }
   unsigned RTOptionID = options::OPT__SLASH_MT;
   if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
@@ -223,40 +222,40 @@ static void processVSRuntimeLibrary(const ToolChain &TC,
                      .Default(options::OPT__SLASH_MT);
   }
   switch (RTOptionID) {
-    case options::OPT__SLASH_MT:
-      CmdArgs.push_back("-D_MT");
-      CmdArgs.push_back("--dependent-lib=libcmt");
-      CmdArgs.push_back("--dependent-lib=Fortran_main.static.lib");
-      CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
-      CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
-      break;
-    case options::OPT__SLASH_MTd:
-      CmdArgs.push_back("-D_MT");
-      CmdArgs.push_back("-D_DEBUG");
-      CmdArgs.push_back("--dependent-lib=libcmtd");
-      CmdArgs.push_back("--dependent-lib=Fortran_main.static_dbg.lib");
-      CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
-      CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
-      break;
-    case options::OPT__SLASH_MD:
-      CmdArgs.push_back("-D_MT");
-      CmdArgs.push_back("-D_DLL");
-      CmdArgs.push_back("--dependent-lib=msvcrt");
-      CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic.lib");
-      CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
-      CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
-      break;
-    case options::OPT__SLASH_MDd:
-      CmdArgs.push_back("-D_MT");
-      CmdArgs.push_back("-D_DEBUG");
-      CmdArgs.push_back("-D_DLL");
-      CmdArgs.push_back("--dependent-lib=msvcrtd");
-      CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic_dbg.lib");
-      CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
-      CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
-      break;
-    }
+  case options::OPT__SLASH_MT:
+    CmdArgs.push_back("-D_MT");
+    CmdArgs.push_back("--dependent-lib=libcmt");
+    CmdArgs.push_back("--dependent-lib=Fortran_main.static.lib");
+    CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
+    CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
+    break;
+  case options::OPT__SLASH_MTd:
+    CmdArgs.push_back("-D_MT");
+    CmdArgs.push_back("-D_DEBUG");
+    CmdArgs.push_back("--dependent-lib=libcmtd");
+    CmdArgs.push_back("--dependent-lib=Fortran_main.static_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
+    break;
+  case options::OPT__SLASH_MD:
+    CmdArgs.push_back("-D_MT");
+    CmdArgs.push_back("-D_DLL");
+    CmdArgs.push_back("--dependent-lib=msvcrt");
+    CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic.lib");
+    CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
+    CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
+    break;
+  case options::OPT__SLASH_MDd:
+    CmdArgs.push_back("-D_MT");
+    CmdArgs.push_back("-D_DEBUG");
+    CmdArgs.push_back("-D_DLL");
+    CmdArgs.push_back("--dependent-lib=msvcrtd");
+    CmdArgs.push_back("--dependent-lib=Fortran_main.dynamic_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
+    CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
+    break;
   }
+}
 
 void Flang::addTargetOptions(const ArgList &Args,
                              ArgStringList &CmdArgs) const {



More information about the flang-commits mailing list