[clang] [Clang][AArch64][SVE] Allow write to SVE vector elements using the subscript operator (PR #91965)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
@@ -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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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