[clang-tools-extra] 35bee35 - [clang-tidy] prevent generated checks from triggering assertions on anonymous functions

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

Author: Bogdan Serea
Date: 2020-08-12T12:43:40+01:00
New Revision: 35bee3503f4c33d92434a314e49e3e6f4f7419bc

URL: 
https://github.com/llvm/llvm-project/commit/35bee3503f4c33d92434a314e49e3e6f4f7419bc
DIFF: 
https://github.com/llvm/llvm-project/commit/35bee3503f4c33d92434a314e49e3e6f4f7419bc.diff

LOG: [clang-tidy] prevent generated checks from triggering assertions on 
anonymous functions

Skeleton checks generated by clang-tidy add_check.py cause assertions to fail 
when run over anonymous functions(lambda functions). This patch introduces an 
additional check to verify that the target function is not anonymous before 
calling getName().
The code snippet from the [[ 
https://clang.llvm.org/extra/clang-tidy/Contributing.html | clang-tidy tutorial 
 ]]is also updated.

Reviewed By: alexfh, DavidTruby

Differential Revision: https://reviews.llvm.org/D85218

Added: 


Modified: 
clang-tools-extra/clang-tidy/add_new_check.py
clang-tools-extra/docs/clang-tidy/Contributing.rst

Removed: 




diff  --git a/clang-tools-extra/clang-tidy/add_new_check.py 
b/clang-tools-extra/clang-tidy/add_new_check.py
index 231f43c0b8f3..14fcfe8d49ff 100755
--- a/clang-tools-extra/clang-tidy/add_new_check.py
+++ b/clang-tools-extra/clang-tidy/add_new_check.py
@@ -136,7 +136,7 @@ def write_implementation(module_path, module, namespace, 
check_name_camel):
 void %(check_name)s::check(const MatchFinder::MatchResult &Result) {
   // FIXME: Add callback implementation.
   const auto *MatchedDecl = Result.Nodes.getNodeAs("x");
-  if (MatchedDecl->getName().startswith("awesome_"))
+  if (!MatchedDecl->getIdentifier() || 
MatchedDecl->getName().startswith("awesome_"))
 return;
   diag(MatchedDecl->getLocation(), "function %%0 is insufficiently awesome")
   << MatchedDecl;

diff  --git a/clang-tools-extra/docs/clang-tidy/Contributing.rst 
b/clang-tools-extra/docs/clang-tidy/Contributing.rst
index 3ed6dadb5e8b..6b7af479804d 100644
--- a/clang-tools-extra/docs/clang-tidy/Contributing.rst
+++ b/clang-tools-extra/docs/clang-tidy/Contributing.rst
@@ -202,7 +202,7 @@ can further inspect them and report diagnostics.
 
   void AwesomeFunctionNamesCheck::check(const MatchFinder::MatchResult 
&Result) {
 const auto *MatchedDecl = Result.Nodes.getNodeAs("x");
-if (MatchedDecl->getName().startswith("awesome_"))
+if (!MatchedDecl->getIdentifier() || 
MatchedDecl->getName().startswith("awesome_"))
   return;
 diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome")
 << MatchedDecl



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


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

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

DavidTruby wrote:

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

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


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

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

DavidTruby wrote:

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

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

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


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

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

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 &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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

DavidTruby wrote:

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

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


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

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

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

>From 46057145d229e5b6ee7e6891f34d47b0d2aa818d Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH] [flang][windows] Add option to link against specific MSVC CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  4 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 40 +++---
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 169 insertions(+), 31 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 3409ce29ac56302..dacc4442b338a29 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2858,7 +2858,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index e19f1829c9fa82b..a81c9b6201f8158 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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 
b/clan

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

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

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


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

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

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

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

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

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

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, 
llvm::opt::ArgList &args,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
+   llvm::opt::ArgList &args,
+   clang::DiagnosticsEngine &diags) {
+  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 &res, llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine &diags, 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,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName

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

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


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

DavidTruby wrote:

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

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


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

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

https://github.com/DavidTruby 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] [clang-tools-extra] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

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

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

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

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


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

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


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

DavidTruby wrote:

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

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


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

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


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

DavidTruby wrote:

`cstdlib` instead of `stdlib.h`

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


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

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


@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, &value, 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


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

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


@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, &value, 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-tools-extra] [flang] [clang] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)

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

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


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

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

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

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

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


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

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

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

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

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

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, 
llvm::opt::ArgList &args,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
+   llvm::opt::ArgList &args,
+   clang::DiagnosticsEngine &diags) {
+  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 &res, llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine &diags, 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,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
 }
 
+static void addDepdendentLibs(mlir::ModuleOp &mlirModule,
+  CompilerInstance &ci) {
+  const std::vector &libs =
+  ci.getInvocation

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

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

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


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

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


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

DavidTruby wrote:

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

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


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

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

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

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

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


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

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


@@ -37,5 +77,30 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
   (void)RTNAME(GetCommandArgument)(
   n, &value, 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


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

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


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

DavidTruby wrote:

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

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


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

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

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


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

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

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

LGTM

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


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

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


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

DavidTruby wrote:

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

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


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

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

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

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

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

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index d1b67a448b2a59b..c7eb52145f614b4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">,
 def vectorize_slp : Flag<["-"], "vectorize-slp">,
   HelpText<"Run the SLP vectorization passes">,
   MarshallingInfoFlag>;
-def dependent_lib : Joined<["--"], "dependent-lib=">,
-  HelpText<"Add dependent library">,
-  MarshallingInfoStringVector>;
 def linker_option : Joined<["--"], "linker-option=">,
   HelpText<"Add linker option">,
   MarshallingInfoStringVector>;
@@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">,
   HelpText<"File is for a position independent executable">,
   MarshallingInfoFlag>;
 
+
+def dependent_lib : Joined<["--"], "dependent-lib=">,
+  HelpText<"Add dependent library">,
+  MarshallingInfoStringVector>;
+
 } // let Visibility = [CC1Option, FC1Option]
 
 let Visibility = [CC1Option] in {
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index a3c39bda10667be..b86bb88610a9a4a 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
   /// The format used for serializing remarks (default: YAML)
   std::string OptRecordFormat;
 
+  /// Options to add to the linker for the object file
+  std::vector DependentLibs;
+
   // The RemarkKind enum class and OptRemark struct are identical to what Clang
   // has
   // TODO: Share with clang instead of re-implementing here
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 334da3ac287e3bf..cb4f2d6a6225205 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, 
llvm::opt::ArgList &args,
   return true;
 }
 
+static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
+   llvm::opt::ArgList &args,
+   clang::DiagnosticsEngine &diags) {
+  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 &res, llvm::ArrayRef commandLineArgs,
 clang::DiagnosticsEngine &diags, 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,
   mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
 }
 
+static void addDepdendentLibs(mlir::ModuleOp &mlirModule,
+  CompilerInstance &ci) {
+  const std::vector &libs =
+  ci.getInvocation

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

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

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


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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
+void tools::addFortranRuntimeLibs(const ToolChain &TC,
   llvm::opt::ArgStringList &CmdArgs) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(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 &CmdArgs, 
const ToolChain &TC,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void addFortranRuntimeLibs(const ToolChain &TC,

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

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

DavidTruby wrote:

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

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


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

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

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

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

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

DavidTruby wrote:

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

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

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


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

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

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

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

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

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
+void tools::addFortranRuntimeLibs(const ToolChain &TC,
   llvm::opt::ArgStringList &CmdArgs) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(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 &CmdArgs, 
const ToolChain &TC,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void addFortranRuntimeLibs(const ToolChain &TC,
llvm::opt::ArgStringList &CmdArgs);
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a8c..1

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

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

DavidTruby wrote:

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

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


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

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

DavidTruby wrote:

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

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

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


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

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


@@ -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


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

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


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

DavidTruby wrote:

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

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


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

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




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


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

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

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


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

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

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


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

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




DavidTruby wrote:

Yes, these are checking the invocation of the frontend driver

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


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

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

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

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

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

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
+void tools::addFortranRuntimeLibs(const ToolChain &TC,
   llvm::opt::ArgStringList &CmdArgs) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(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 &CmdArgs, 
const ToolChain &TC,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void addFortranRuntimeLibs(const ToolChain &TC,
llvm::opt::ArgStringList &CmdArgs);
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a

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

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

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


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

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

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


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

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

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

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.


>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH] [flang][windows] Add option to link against specific MSVC CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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("Fortra

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

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

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


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

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

DavidTruby wrote:

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

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


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

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

https://github.com/DavidTruby 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 &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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

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


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

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


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

DavidTruby wrote:

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

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


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

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

https://github.com/DavidTruby 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 &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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


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

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


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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


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

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


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

DavidTruby wrote:

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

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


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

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

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


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

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

DavidTruby wrote:

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

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

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


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

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

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


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

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


@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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


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

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

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

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/5] [flang][windows] Add option to link against specific MSVC
 CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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

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

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/4] [flang][windows] Add option to link against specific MSVC
 CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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

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

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/6] [flang][windows] Add option to link against specific MSVC
 CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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


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

DavidTruby wrote:

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

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


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

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

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

>From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Tue, 31 Oct 2023 15:07:13 +
Subject: [PATCH 1/7] [flang][windows] Add option to link against specific MSVC
 CRT

Currently flang's runtime libraries are only built for the specific CRT
that LLVM itself was built against. This patch adds the cmake logic for
building a separate runtime for each CRT configuration and adds a flag
for selecting a CRT configuration to link against.
---
 clang/include/clang/Driver/Options.td  |  2 +-
 clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +--
 clang/lib/Driver/ToolChains/CommonArgs.h   |  2 +-
 clang/lib/Driver/ToolChains/Darwin.cpp |  2 +-
 clang/lib/Driver/ToolChains/DragonFly.cpp  |  2 +-
 clang/lib/Driver/ToolChains/FreeBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Gnu.cpp|  2 +-
 clang/lib/Driver/ToolChains/Haiku.cpp  |  2 +-
 clang/lib/Driver/ToolChains/MSVC.cpp   |  2 +-
 clang/lib/Driver/ToolChains/MinGW.cpp  |  2 +-
 clang/lib/Driver/ToolChains/NetBSD.cpp |  2 +-
 clang/lib/Driver/ToolChains/OpenBSD.cpp|  2 +-
 clang/lib/Driver/ToolChains/Solaris.cpp|  2 +-
 flang/lib/Decimal/CMakeLists.txt   | 23 +++
 flang/runtime/CMakeLists.txt   | 23 +++
 flang/runtime/FortranMain/CMakeLists.txt   | 18 +
 flang/test/Driver/driver-help-hidden.f90   |  2 +
 flang/test/Driver/driver-help.f90  |  2 +
 flang/test/Driver/linker-flags.f90 | 47 ++
 19 files changed, 157 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c8b730e0f7ecd84..66d4794714c9529 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2842,7 +2842,7 @@ def fms_compatibility_version
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
 def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
-  Flags<[]>, Visibility<[ClangOption, CLOption]>,
+  Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>,
   Values<"static,static_dbg,dll,dll_dbg">,
   HelpText<"Select Windows run-time library">,
   DocBrief<[{
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ad012d3d0d4b46f..1cac9a179eb960f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC,
+void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
   llvm::opt::ArgStringList &CmdArgs) {
   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.

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

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

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


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

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




DavidTruby wrote:

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

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


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

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

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

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

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

diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 5d2cd1959b06925..55951162df50a75 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, 
const ToolChain &TC,
   return true;
 }
 
-void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
+void tools::addFortranRuntimeLibs(const ToolChain &TC,
   llvm::opt::ArgStringList &CmdArgs) {
-  if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
-CmdArgs.push_back(Args.MakeArgString(
-"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins")));
-unsigned RTOptionID = options::OPT__SLASH_MT;
-if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
-  RTOptionID = llvm::StringSwitch(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 &CmdArgs, 
const ToolChain &TC,
   bool IsOffloadingHost = false, bool GompNeedsRT = false);
 
 /// Adds Fortran runtime libraries to \p CmdArgs.
-void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args,
+void addFortranRuntimeLibs(const ToolChain &TC,
llvm::opt::ArgStringList &CmdArgs);
 
 /// Adds the path for the Fortran runtime libraries to \p CmdArgs.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7c3d4982d8f6a

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

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

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


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

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

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

None

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

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

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 01f07b9228256cf..87aa546e5549423 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
   }
 }
 
+static void addVSDefines(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+
+  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 &TC, const ArgList &Args,
 ArgStringList &CmdArgs) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
@@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList &Args,
 
   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


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

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

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


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

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

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


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

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

DavidTruby wrote:

I think for Windows the easy thing to do here is just to add 
`/WHOLEARCHIVE:...` here anyway, using the same logic as in 
processVSRuntimeLibrary(); E.g
```
void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, 
//need to add args here so we can search it
  llvm::opt::ArgStringList &CmdArgs) {
  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][Driver] Let the linker fail on multiple definitions of main() (PR #73124)

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

DavidTruby wrote:

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

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


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

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


@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
   }
 }
 
+static void addVSDefines(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+
+  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


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

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


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

DavidTruby wrote:

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

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


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

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


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

DavidTruby wrote:

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

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


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

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

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 &Args,
   }
 }
 
+static void addVSDefines(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+
+  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 &TC, const ArgList &Args,
 ArgStringList &CmdArgs) {
   assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
@@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList &Args,
 
   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 &TC, const ArgList 
&Args,
 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 

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

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




DavidTruby wrote:

It wasn't, I think I have replaced this

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


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

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

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


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

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

DavidTruby wrote:

I think this solution is fine, at least in the short term. 

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

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


[clang] 4be1ec9 - [clang][AArc64][SVE] Add support for comparison operators on SVE types

2022-04-05 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-04-05T13:56:27+01:00
New Revision: 4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de

URL: 
https://github.com/llvm/llvm-project/commit/4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de
DIFF: 
https://github.com/llvm/llvm-project/commit/4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de.diff

LOG: [clang][AArc64][SVE] Add support for comparison operators on SVE types

Comparison operators on SVE types return a signed integer vector
of the same width as the incoming SVE type. This matches the existing
behaviour for NEON types.

Differential Revision: https://reviews.llvm.org/D122404

Added: 
clang/test/CodeGen/aarch64-sve-vector-compare-ops.c
clang/test/Sema/aarch64-sve-vector-compare-ops.c

Modified: 
clang/include/clang/Sema/Sema.h
clang/lib/CodeGen/CGExprScalar.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 




diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index c0ad55d52bb31..5ec03391e287b 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11976,9 +11976,13 @@ class Sema final {
bool AllowBothBool, bool AllowBoolConversion,
bool AllowBoolOperation, bool ReportInvalid);
   QualType GetSignedVectorType(QualType V);
+  QualType GetSignedSizelessVectorType(QualType V);
   QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
   SourceLocation Loc,
   BinaryOperatorKind Opc);
+  QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
+  SourceLocation Loc,
+  BinaryOperatorKind Opc);
   QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS,
   SourceLocation Loc);
 

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index ec9da20f0fbf7..0711c993088bc 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1390,8 +1390,8 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value 
*Src, QualType SrcType,
 
   if (isa(SrcTy) || isa(DstTy)) {
 // Allow bitcast from vector to integer/fp of the same size.
-unsigned SrcSize = SrcTy->getPrimitiveSizeInBits();
-unsigned DstSize = DstTy->getPrimitiveSizeInBits();
+llvm::TypeSize SrcSize = SrcTy->getPrimitiveSizeInBits();
+llvm::TypeSize DstSize = DstTy->getPrimitiveSizeInBits();
 if (SrcSize == DstSize)
   return Builder.CreateBitCast(Src, DstTy, "conv");
 

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index c0a1ffcdb1b44..375bd2ec59c26 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -50,8 +50,10 @@
 #include "clang/Sema/Template.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/Casting.h"
 #include "llvm/Support/ConvertUTF.h"
 #include "llvm/Support/SaveAndRestore.h"
+#include "llvm/Support/TypeSize.h"
 
 using namespace clang;
 using namespace sema;
@@ -12153,6 +12155,10 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, 
ExprResult &RHS,
   RHS.get()->getType()->isVectorType())
 return CheckVectorCompareOperands(LHS, RHS, Loc, Opc);
 
+  if (LHS.get()->getType()->isVLSTBuiltinType() ||
+  RHS.get()->getType()->isVLSTBuiltinType())
+return CheckSizelessVectorCompareOperands(LHS, RHS, Loc, Opc);
+
   diagnoseLogicalNotOnLHSofCheck(*this, LHS, RHS, Loc, Opc);
   diagnoseTautologicalComparison(*this, Loc, LHS.get(), RHS.get(), Opc);
 
@@ -12614,6 +12620,18 @@ QualType Sema::GetSignedVectorType(QualType V) {
VectorType::GenericVector);
 }
 
+QualType Sema::GetSignedSizelessVectorType(QualType V) {
+  const BuiltinType *VTy = V->castAs();
+  assert(VTy->isSizelessBuiltinType() && "expected sizeless type");
+
+  const QualType ETy = V->getSveEltType(Context);
+  const auto TypeSize = Context.getTypeSize(ETy);
+
+  const QualType IntTy = Context.getIntTypeForBitwidth(TypeSize, true);
+  const llvm::ElementCount VecSize = Context.getBuiltinVectorTypeInfo(VTy).EC;
+  return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
+}
+
 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
 /// operates on extended vector types.  Instead of producing an IntTy result,
 /// like a scalar comparison, a vector comparison produces a vector of integer
@@ -12680,6 +12698,48 @@ QualType Sema::CheckVectorCompareOperands(ExprResult 
&LHS, ExprResult &RHS,
   return GetSignedVectorType(vType);
 }
 
+QualType Sema::CheckSizelessVectorCompareOperands(ExprResult &LHS,
+  ExprResult &RHS,
+   

[clang] 286d59e - [clang][AArch64][SVE] Add unary +/- operators for SVE types

2022-08-10 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-08-10T10:32:43Z
New Revision: 286d59ef6f7118c8a0600f3d281593700528a5d3

URL: 
https://github.com/llvm/llvm-project/commit/286d59ef6f7118c8a0600f3d281593700528a5d3
DIFF: 
https://github.com/llvm/llvm-project/commit/286d59ef6f7118c8a0600f3d281593700528a5d3.diff

LOG: [clang][AArch64][SVE] Add unary +/- operators for SVE types

This patch enables the unary promotion and negation operators on
SVE types.

Differential Revision: https://reviews.llvm.org/D130984

Added: 


Modified: 
clang/lib/Sema/SemaExpr.cpp
clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 




diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 9b686b8ff2a30..03f5ec9848e1f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -15596,6 +15596,8 @@ ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation 
OpLoc,
   resultType->castAs()->getVectorKind() !=
   VectorType::AltiVecBool))
   break;
+else if (resultType->isVLSTBuiltinType()) // SVE vectors allow + and -
+  break;
 else if (getLangOpts().CPlusPlus && // C++ [expr.unary.op]p6
  Opc == UO_Plus &&
  resultType->isPointerType())

diff  --git a/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c 
b/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
index c57c476032025..d7c79d7a44220 100644
--- a/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
+++ b/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
@@ -1650,3 +1650,143 @@ svuint32_t rem_scalar_u32(svuint32_t a, uint32_t b) {
 svuint64_t rem_scalar_u64(svuint64_t a, uint64_t b) {
   return a % b;
 }
+
+// UNARY PROMOTION
+
+// CHECK-LABEL: @prom_i8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svint8_t prom_i8(svint8_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_i16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svint16_t prom_i16(svint16_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_i32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svint32_t prom_i32(svint32_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_i64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svint64_t prom_i64(svint64_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_u8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svuint8_t prom_u8(svuint8_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_u16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svuint16_t prom_u16(svuint16_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_u32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svuint32_t prom_u32(svuint32_t a) {
+  return +a;
+}
+
+// CHECK-LABEL: @prom_u64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:ret  [[A:%.*]]
+//
+svuint64_t prom_u64(svuint64_t a) {
+  return +a;
+}
+
+// UNARY NEGATION
+
+// CHECK-LABEL: @neg_i8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svint8_t neg_i8(svint8_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_i16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svint16_t neg_i16(svint16_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_i32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svint32_t neg_i32(svint32_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_i64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svint64_t neg_i64(svint64_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_u8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svuint8_t neg_u8(svuint8_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_u16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svuint16_t neg_u16(svuint16_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_u32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svuint32_t neg_u32(svuint32_t a) {
+  return -a;
+}
+
+// CHECK-LABEL: @neg_u64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[SUB:%.*]] = sub  zeroinitializer, 
[[A:%.*]]
+// CHECK-NEXT:ret  [[SUB]]
+//
+svuint64_t neg_u64(svuint64_t a) {
+  return -a;
+}

diff  --git a/clang/test/Sema/sizeless-1.c b/clang/test/Sema/sizeless-1.c
index 5e7e3be772e8c..64af214d206b9 100644
--- a/clang/test/Sema/sizeless-1.c
+++ b/clang/test/Sema/sizeless-1.c
@@ -187,10 +187,8 @@ void func(int sel) {
   global_int8_ptr -= 1;  // expected-error {{arithmetic on a 
pointer to sizeless type}}
   global_int8_pt

[clang] e4642d7 - [clang] Correct documentation for NEON and SVE operator support

2022-08-10 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-08-10T15:16:38+01:00
New Revision: e4642d78a89930720bc84a4775614c45327bc0dc

URL: 
https://github.com/llvm/llvm-project/commit/e4642d78a89930720bc84a4775614c45327bc0dc
DIFF: 
https://github.com/llvm/llvm-project/commit/e4642d78a89930720bc84a4775614c45327bc0dc.diff

LOG: [clang] Correct documentation for NEON and SVE operator support

Previously the language extension documentation didn't mention SVE and
was incomplete in listing the C/C++ operators supported on NEON. This
corrects the documentation to be in line with the implementation.

Added: 


Modified: 
clang/docs/LanguageExtensions.rst

Removed: 




diff  --git a/clang/docs/LanguageExtensions.rst 
b/clang/docs/LanguageExtensions.rst
index a6d02b2e02c15..3b80289fd5fe9 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -400,7 +400,7 @@ Builtin Macros
 Vectors and Extended Vectors
 
 
-Supports the GCC, OpenCL, AltiVec and NEON vector extensions.
+Supports the GCC, OpenCL, AltiVec, NEON and SVE vector extensions.
 
 OpenCL vector types are created using the ``ext_vector_type`` attribute.  It
 supports the ``V.xyzw`` syntax and other tidbits as seen in OpenCL.  An example
@@ -539,32 +539,33 @@ The table below shows the support for each operation by 
vector extension.  A
 dash indicates that an operation is not accepted according to a corresponding
 specification.
 
-== === === = ===
- Operator  OpenCL  AltiVec GCCNEON
-== === === = ===
-[]   yes yes   yes --
-unary operators +, --yes yes   yes --
-++, -- --yes yes   yes --
-+,--,*,/,%   yes yes   yes --
-bitwise operators &,|,^,~yes yes   yes --
->>,<, <, >=, <= yes yes   yes --
-=yes yes   yes yes
-?: [#]_  yes --yes --
-sizeof   yes yes   yes yes
-C-style cast yes yes   yes no
-reinterpret_cast yes noyes no
-static_cast  yes noyes no
-const_cast   no  nono  no
-address &v[i]no  nono [#]_ no
-== === === = ===
+== === === = === =
+ Operator  OpenCL  AltiVec GCCNEONSVE
+== === === = === =
+[]   yes yes   yes yesyes
+unary operators +, --yes yes   yes yesyes
+++, -- --yes yes   yes no no
++,--,*,/,%   yes yes   yes yesyes
+bitwise operators &,|,^,~yes yes   yes yesyes
+>>,<, <, >=, <= yes yes   yes yesyes
+=yes yes   yes yesyes
+?: [#]_  yes --yes yesyes
+sizeof   yes yes   yes yesyes
+C-style cast yes yes   yes no no
+reinterpret_cast yes noyes no no
+static_cast  yes noyes no no
+const_cast   no  nono  no no
+address &v[i]no  nono [#]_ no no
+== === === = === =
 
 See also :ref:`langext-__builtin_shufflevector`, 
:ref:`langext-__builtin_convertvector`.
 
 .. [#] ternary operator(?:) has 
diff erent behaviors depending on condition
   operand's vector type. If the condition is a GNU vector (i.e. 
__vector_size__),
-  it's only available in C++ and uses normal bool conversions (that is, != 0).
+  a NEON vector or an SVE vector, it's only available in C++ and uses normal 
bool
+  conversions (that is, != 0).
   If it's an extension (OpenCL) vector, it's only available in C and OpenCL C.
   And it selects base on signedness of the condition operands (OpenCL v1.1 
s6.3.9).

[clang] 3aca0ff - [clang][SVE] Add support for arithmetic operators on SVE types

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

Author: David Truby
Date: 2022-03-11T15:39:44Z
New Revision: 3aca0ffd5092e37590bbee7e0fcd2b1b5780024c

URL: 
https://github.com/llvm/llvm-project/commit/3aca0ffd5092e37590bbee7e0fcd2b1b5780024c
DIFF: 
https://github.com/llvm/llvm-project/commit/3aca0ffd5092e37590bbee7e0fcd2b1b5780024c.diff

LOG: [clang][SVE] Add support for arithmetic operators on SVE types

This patch implements support for the +, -, *, / and % operators on sizeless SVE
types. Support for these operators on svbool_t is excluded.

Differential Revision: https://reviews.llvm.org/D120323

Added: 
clang/test/CodeGen/aarch64-sve-vector-ops.c
clang/test/Sema/aarch64-sve-vector-ops.c

Modified: 
clang/include/clang/AST/Type.h
clang/include/clang/Sema/Sema.h
clang/lib/AST/Type.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 




diff  --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index 3c71cbbb9c8f3..76e4474b1b303 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -2557,6 +2557,8 @@ class BuiltinType : public Type {
 return getKind() >= Half && getKind() <= Ibm128;
   }
 
+  bool isSVEBool() const { return getKind() == Kind::SveBool; }
+
   /// Determines whether the given kind corresponds to a placeholder type.
   static bool isPlaceholderTypeKind(Kind K) {
 return K >= Overload;

diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index d072cf9223f7d..4c5666f290141 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11940,6 +11940,10 @@ class Sema final {
   QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS,
   SourceLocation Loc);
 
+  // type checking for sizeless vector binary operators.
+  QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
+   SourceLocation Loc);
+
   /// Type checking for matrix binary operators.
   QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS,
   SourceLocation Loc,

diff  --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 1c7499c3c237e..8579d697868fd 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -2105,6 +2105,11 @@ bool Type::hasUnsignedIntegerRepresentation() const {
 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
   if (const auto *VT = dyn_cast(CanonicalType))
 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
+  if (CanonicalType->isVLSTBuiltinType()) {
+const auto *VT = cast(CanonicalType);
+return VT->getKind() >= BuiltinType::SveUint8 &&
+   VT->getKind() <= BuiltinType::SveUint64;
+  }
   return isUnsignedIntegerOrEnumerationType();
 }
 

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ca5e206f8933d..96471f6c5fb1f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10403,6 +10403,29 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, 
ExprResult &RHS,
   return QualType();
 }
 
+QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
+   SourceLocation Loc) {
+  QualType LHSType = LHS.get()->getType().getUnqualifiedType();
+  QualType RHSType = RHS.get()->getType().getUnqualifiedType();
+
+  const BuiltinType *LHSVecType = LHSType->getAs();
+  const BuiltinType *RHSVecType = RHSType->getAs();
+
+  unsigned DiagID = diag::err_typecheck_invalid_operands;
+  if (LHSVecType->isSVEBool() || RHSVecType->isSVEBool()) {
+Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange()
+  << RHS.get()->getSourceRange();
+return QualType();
+  }
+
+  if (Context.hasSameType(LHSType, RHSType))
+return LHSType;
+
+  Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange()
+<< RHS.get()->getSourceRange();
+  return QualType();
+}
+
 // checkArithmeticNull - Detect when a NULL constant is used improperly in an
 // expression.  These are mainly cases where the null pointer is used as an
 // integer instead of a pointer.
@@ -10512,8 +10535,10 @@ QualType Sema::CheckMultiplyDivideOperands(ExprResult 
&LHS, ExprResult &RHS,
   QualType RHSTy = RHS.get()->getType();
   if (LHSTy->isVectorType() || RHSTy->isVectorType())
 return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign,
-   /*AllowBothBool*/getLangOpts().AltiVec,
-   /*AllowBoolConversions*/false);
+   /*AllowBothBool*/ getLangOpts().AltiVec,
+   /*AllowBoolConversions*/ false);
+  if (LHSTy->isVLSTBuiltinType() || RHSTy->isVLSTBuiltinType())
+return CheckSizelessVectorOperands(LHS, RHS, Loc);
   if (!

[clang] 058c92f - [clang][SVE] Add aarch64-registered-target to sve vector op tests

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

Author: David Truby
Date: 2022-03-11T16:01:00Z
New Revision: 058c92f2a4e865d478b29035c207ec0744229d6a

URL: 
https://github.com/llvm/llvm-project/commit/058c92f2a4e865d478b29035c207ec0744229d6a
DIFF: 
https://github.com/llvm/llvm-project/commit/058c92f2a4e865d478b29035c207ec0744229d6a.diff

LOG: [clang][SVE] Add aarch64-registered-target to sve vector op tests

This fixes failing tests where aarch64 isn't available.

Added: 


Modified: 
clang/test/CodeGen/aarch64-sve-vector-ops.c

Removed: 




diff  --git a/clang/test/CodeGen/aarch64-sve-vector-ops.c 
b/clang/test/CodeGen/aarch64-sve-vector-ops.c
index 15a05e940d981..7fb307cb497b0 100644
--- a/clang/test/CodeGen/aarch64-sve-vector-ops.c
+++ b/clang/test/CodeGen/aarch64-sve-vector-ops.c
@@ -2,6 +2,8 @@
 // RUN: -fallow-half-arguments-and-returns \
 // RUN:  -O1 -emit-llvm -o - %s 2>&1 | FileCheck %s
 
+// REQUIRES: aarch64-registered-target
+
 #include 
 
 // ADDITION



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


[clang] d38c9d3 - [NFC][clang][SVE] Auto-generate SVE operator tests.

2022-03-16 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-03-16T16:39:27Z
New Revision: d38c9d38348fa84042e272803a91c098483a3132

URL: 
https://github.com/llvm/llvm-project/commit/d38c9d38348fa84042e272803a91c098483a3132
DIFF: 
https://github.com/llvm/llvm-project/commit/d38c9d38348fa84042e272803a91c098483a3132.diff

LOG: [NFC][clang][SVE] Auto-generate SVE operator tests.

Added: 


Modified: 
clang/test/CodeGen/aarch64-sve-vector-ops.c

Removed: 




diff  --git a/clang/test/CodeGen/aarch64-sve-vector-ops.c 
b/clang/test/CodeGen/aarch64-sve-vector-ops.c
index 7fb307cb497b0..57d943ec7891d 100644
--- a/clang/test/CodeGen/aarch64-sve-vector-ops.c
+++ b/clang/test/CodeGen/aarch64-sve-vector-ops.c
@@ -1,6 +1,7 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
-// RUN: -fallow-half-arguments-and-returns \
-// RUN:  -O1 -emit-llvm -o - %s 2>&1 | FileCheck %s
+// RUN: -fallow-half-arguments-and-returns -disable-O0-optnone \
+// RUN:  -emit-llvm -o - %s | opt -S -sroa | FileCheck %s
 
 // REQUIRES: aarch64-registered-target
 
@@ -8,738 +9,946 @@
 
 // ADDITION
 
+// CHECK-LABEL: @add_i8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svint8_t add_i8(svint8_t a, svint8_t b) {
-  // CHECK-LABEL: add_i8
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_i16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svint16_t add_i16(svint16_t a, svint16_t b) {
-  // CHECK-LABEL: add_i16
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_i32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svint32_t add_i32(svint32_t a, svint32_t b) {
-  // CHECK-LABEL: add_i32
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_i64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svint64_t add_i64(svint64_t a, svint64_t b) {
-  // CHECK-LABEL: add_i64
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_u8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svuint8_t add_u8(svuint8_t a, svuint8_t b) {
-  // CHECK-LABEL: add_u8
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_u16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svuint16_t add_u16(svuint16_t a, svuint16_t b) {
-  // CHECK-LABEL: add_u16
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_u32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svuint32_t add_u32(svuint32_t a, svuint32_t b) {
-  // CHECK-LABEL: add_u32
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_u64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svuint64_t add_u64(svuint64_t a, svuint64_t b) {
-  // CHECK-LABEL: add_u64
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_f16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = fadd  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svfloat16_t add_f16(svfloat16_t a, svfloat16_t b) {
-  // CHECK-LABEL: add_f16
-  // CHECK: %add = fadd  %a, %b
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_f32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = fadd  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svfloat32_t add_f32(svfloat32_t a, svfloat32_t b) {
-  // CHECK-LABEL: add_f32
-  // CHECK: %add = fadd  %a, %b
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_f64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = fadd  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svfloat64_t add_f64(svfloat64_t a, svfloat64_t b) {
-  // CHECK-LABEL: add_f64
-  // CHECK: %add = fadd  %a, %b
-  // CHECK-NEXT: ret  %add
   return a + b;
 }
 
+// CHECK-LABEL: @add_inplace_i8(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]] = add  [[A:%.*]], [[B:%.*]]
+// CHECK-NEXT:ret  [[ADD]]
+//
 svint8_t add_inplace_i8(svint8_t a, svint8_t b) {
-  // CHECK-LABEL: add_inplace_i8
-  // CHECK: %add = add  %b, %a
-  // CHECK-NEXT: ret  %add
   return a += b;
 }
 
+// CHECK-LABEL: @add_inplace_i16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ADD:%.*]

[clang] f47e7e4 - [clang][SVE] Add support for bitwise operators on SVE types

2022-03-18 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-03-18T14:06:47Z
New Revision: f47e7e4a3480707f124db9622001d3a05a777d5d

URL: 
https://github.com/llvm/llvm-project/commit/f47e7e4a3480707f124db9622001d3a05a777d5d
DIFF: 
https://github.com/llvm/llvm-project/commit/f47e7e4a3480707f124db9622001d3a05a777d5d.diff

LOG: [clang][SVE] Add support for bitwise operators on SVE types

This patch implements support for the &, |, ^, and ~ operators on sizeless SVE
types.

Differential Revision: https://reviews.llvm.org/D121119

Added: 
clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
clang/test/CodeGen/aarch64-sve-vector-bitwise-ops.c
clang/test/Sema/aarch64-sve-vector-arith-ops.c
clang/test/Sema/aarch64-sve-vector-bitwise-ops.c

Modified: 
clang/include/clang/Sema/Sema.h
clang/lib/AST/Type.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/attr-arm-sve-vector-bits.c
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 
clang/test/CodeGen/aarch64-sve-vector-ops.c
clang/test/Sema/aarch64-sve-vector-ops.c



diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index fe8a1f371fe74..32a8ffdc8df92 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11948,7 +11948,8 @@ class Sema final {
 
   // type checking for sizeless vector binary operators.
   QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
-   SourceLocation Loc);
+   SourceLocation Loc,
+   ArithConvKind OperationKind);
 
   /// Type checking for matrix binary operators.
   QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS,

diff  --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 08a95669ac9fd..1803fe12d69c8 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -1899,8 +1899,14 @@ bool Type::hasAutoForTrailingReturnType() const {
 bool Type::hasIntegerRepresentation() const {
   if (const auto *VT = dyn_cast(CanonicalType))
 return VT->getElementType()->isIntegerType();
-  else
-return isIntegerType();
+  if (CanonicalType->isVLSTBuiltinType()) {
+const auto *VT = cast(CanonicalType);
+return VT->getKind() == BuiltinType::SveBool ||
+   (VT->getKind() >= BuiltinType::SveInt8 &&
+VT->getKind() <= BuiltinType::SveUint64);
+  }
+
+  return isIntegerType();
 }
 
 /// Determine whether this type is an integral type.

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 635721b4cc3b3..be90c58e066d8 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10464,7 +10464,8 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, 
ExprResult &RHS,
 }
 
 QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
-   SourceLocation Loc) {
+   SourceLocation Loc,
+   ArithConvKind OperationKind) {
   QualType LHSType = LHS.get()->getType().getUnqualifiedType();
   QualType RHSType = RHS.get()->getType().getUnqualifiedType();
 
@@ -10472,7 +10473,8 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult 
&LHS, ExprResult &RHS,
   const BuiltinType *RHSVecType = RHSType->getAs();
 
   unsigned DiagID = diag::err_typecheck_invalid_operands;
-  if (LHSVecType->isSVEBool() || RHSVecType->isSVEBool()) {
+  if ((OperationKind == ACK_Arithmetic) &&
+  (LHSVecType->isSVEBool() || RHSVecType->isSVEBool())) {
 Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange()
   << RHS.get()->getSourceRange();
 return QualType();
@@ -10600,7 +10602,7 @@ QualType Sema::CheckMultiplyDivideOperands(ExprResult 
&LHS, ExprResult &RHS,
/*AllowBooleanOperation*/ false,
/*ReportInvalid*/ true);
   if (LHSTy->isVLSTBuiltinType() || RHSTy->isVLSTBuiltinType())
-return CheckSizelessVectorOperands(LHS, RHS, Loc);
+return CheckSizelessVectorOperands(LHS, RHS, Loc, ACK_Arithmetic);
   if (!IsDiv &&
   (LHSTy->isConstantMatrixType() || RHSTy->isConstantMatrixType()))
 return CheckMatrixMultiplyOperands(LHS, RHS, Loc, IsCompAssign);
@@ -10650,7 +10652,7 @@ QualType Sema::CheckRemainderOperands(
 ->getType()
 ->getSveEltType(Context)
 ->hasIntegerRepresentation())
-  return CheckSizelessVectorOperands(LHS, RHS, Loc);
+  return CheckSizelessVectorOperands(LHS, RHS, Loc, ACK_Arithmetic);
 
 return InvalidOperands(Loc, LHS, RHS);
   }
@@ -10964,7 +10966,8 @@ QualType Sema::CheckAdditionOperands(ExprResult &LHS, 
ExprResult &RHS,
 
   if (LHS.get()->getType()->isVLSTBuiltinType() ||
   RHS.get()->getType()->isVLSTBuiltinType()) {
-QualType compType = CheckSizeles

[clang] 683fc62 - [clang][AArc64][SVE] Implement vector-scalar operators

2022-03-23 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-03-23T14:20:48Z
New Revision: 683fc6203cfa3f604df5f59cef714568cba2daac

URL: 
https://github.com/llvm/llvm-project/commit/683fc6203cfa3f604df5f59cef714568cba2daac
DIFF: 
https://github.com/llvm/llvm-project/commit/683fc6203cfa3f604df5f59cef714568cba2daac.diff

LOG: [clang][AArc64][SVE] Implement vector-scalar operators

This patch extends the support for C/C++ operators for SVE
types to allow one of the arguments to be a scalar, in which
case a vector splat is performed.

Differential Revision: https://reviews.llvm.org/D121829

Added: 


Modified: 
clang/include/clang/Sema/Sema.h
clang/lib/CodeGen/CGExprScalar.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
clang/test/Sema/aarch64-sve-vector-arith-ops.c

Removed: 




diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index f0e33f8b1b728..25cd747cbec96 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11958,7 +11958,7 @@ class Sema final {
 
   // type checking for sizeless vector binary operators.
   QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
-   SourceLocation Loc,
+   SourceLocation Loc, bool IsCompAssign,
ArithConvKind OperationKind);
 
   /// Type checking for matrix binary operators.

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index cdd4302dc9711..ec9da20f0fbf7 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -32,6 +32,7 @@
 #include "llvm/IR/CFG.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/FixedPointBuilder.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/GetElementPtrTypeIterator.h"
@@ -40,6 +41,7 @@
 #include "llvm/IR/IntrinsicsPowerPC.h"
 #include "llvm/IR/MatrixBuilder.h"
 #include "llvm/IR/Module.h"
+#include "llvm/Support/TypeSize.h"
 #include 
 
 using namespace clang;
@@ -2330,9 +2332,10 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
   }
   case CK_VectorSplat: {
 llvm::Type *DstTy = ConvertType(DestTy);
-Value *Elt = Visit(const_cast(E));
+Value *Elt = Visit(const_cast(E));
 // Splat the element across to all elements
-unsigned NumElements = 
cast(DstTy)->getNumElements();
+llvm::ElementCount NumElements =
+cast(DstTy)->getElementCount();
 return Builder.CreateVectorSplat(NumElements, Elt, "splat");
   }
 

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 7fdeb7a8e30be..23f7625f1c969 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10465,7 +10465,17 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, 
ExprResult &RHS,
 
 QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
SourceLocation Loc,
+   bool IsCompAssign,
ArithConvKind OperationKind) {
+  if (!IsCompAssign) {
+LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
+if (LHS.isInvalid())
+  return QualType();
+  }
+  RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
+  if (RHS.isInvalid())
+return QualType();
+
   QualType LHSType = LHS.get()->getType().getUnqualifiedType();
   QualType RHSType = RHS.get()->getType().getUnqualifiedType();
 
@@ -10483,6 +10493,34 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult 
&LHS, ExprResult &RHS,
   if (Context.hasSameType(LHSType, RHSType))
 return LHSType;
 
+  auto tryScalableVectorConvert = [this](ExprResult *Src, QualType SrcType,
+ QualType DestType) {
+const QualType DestBaseType = DestType->getSveEltType(Context);
+if (DestBaseType->getUnqualifiedDesugaredType() ==
+SrcType->getUnqualifiedDesugaredType()) {
+  unsigned DiagID = diag::err_typecheck_invalid_operands;
+  if (!tryVectorConvertAndSplat(*this, Src, SrcType, DestBaseType, 
DestType,
+DiagID))
+return DestType;
+}
+return QualType();
+  };
+
+  if (LHSType->isVLSTBuiltinType() && !RHSType->isVLSTBuiltinType()) {
+auto DestType = tryScalableVectorConvert(&RHS, RHSType, LHSType);
+if (DestType == QualType())
+  return InvalidOperands(Loc, LHS, RHS);
+return DestType;
+  }
+
+  if (RHSType->isVLSTBuiltinType() && !LHSType->isVLSTBuiltinType()) {
+auto DestType = tryScalableVectorConvert((IsCompAssign ? nullptr : &LHS),
+ LHSType, RHSType);
+if (DestType == QualType())
+  return InvalidOperands(Loc, LHS, RHS);
+return DestType;
+  }
+
   Diag(Loc, DiagID) << LHSType 

[clang] 53fd8db - [Clang][AArch64][SVE] Allow subscript operator for SVE types

2022-04-14 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-04-14T13:20:50+01:00
New Revision: 53fd8db79192f38feaec11c761e0d0fbdf1516b0

URL: 
https://github.com/llvm/llvm-project/commit/53fd8db79192f38feaec11c761e0d0fbdf1516b0
DIFF: 
https://github.com/llvm/llvm-project/commit/53fd8db79192f38feaec11c761e0d0fbdf1516b0.diff

LOG: [Clang][AArch64][SVE] Allow subscript operator for SVE types

Undefined behaviour is just passed on to extract_element when the
index is out of bounds. Subscript on svbool_t is not allowed as
this doesn't really have meaningful semantics.

Differential Revision: https://reviews.llvm.org/D122732

Added: 
clang/test/CodeGen/aarch64-sve-vector-subscript-ops.c
clang/test/Sema/aarch64-sve-vector-subscript-ops.c

Modified: 
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/AST/ExprConstant.cpp
clang/lib/CodeGen/CGExprScalar.cpp
clang/lib/Sema/SemaExpr.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 3213163ee7876..ea3db40aad571 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6638,6 +6638,8 @@ def err_subscript_function_type : Error<
   "subscript of pointer to function type %0">;
 def err_subscript_incomplete_or_sizeless_type : Error<
   "subscript of pointer to %select{incomplete|sizeless}0 type %1">;
+def err_subscript_svbool_t : Error<
+  "subscript of svbool_t is not allowed">;
 def err_dereference_incomplete_type : Error<
   "dereference of pointer to incomplete type %0">;
 def ext_gnu_subscript_void_type : Extension<

diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 93950ac5341ba..50d6340ed31f7 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -8423,7 +8423,8 @@ bool LValueExprEvaluator::VisitMemberExpr(const 
MemberExpr *E) {
 
 bool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) 
{
   // FIXME: Deal with vectors as array subscript bases.
-  if (E->getBase()->getType()->isVectorType())
+  if (E->getBase()->getType()->isVectorType() ||
+  E->getBase()->getType()->isVLSTBuiltinType())
 return Error(E);
 
   APSInt Index;

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 0711c993088bc..d3fe04d5a7915 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1767,7 +1767,8 @@ Value 
*ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
   // loads the lvalue formed by the subscript expr.  However, we have to be
   // careful, because the base of a vector subscript is occasionally an rvalue,
   // so we can't get it as an lvalue.
-  if (!E->getBase()->getType()->isVectorType())
+  if (!E->getBase()->getType()->isVectorType() &&
+  !E->getBase()->getType()->isVLSTBuiltinType())
 return EmitLoadOfLValue(E);
 
   // Handle the vector case.  The base must be a vector, the index must be an

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index da1fed4d72aec..faff375314e92 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -27,11 +27,13 @@
 #include "clang/AST/OperationKinds.h"
 #include "clang/AST/ParentMapContext.h"
 #include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/Type.h"
 #include "clang/AST/TypeLoc.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "clang/Basic/PartialDiagnostic.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Specifiers.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Lex/LiteralSupport.h"
 #include "clang/Lex/Preprocessor.h"
@@ -5683,6 +5685,33 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, 
SourceLocation LLoc,
   OK = OK_VectorComponent;
 
 ResultType = VTy->getElementType();
+QualType BaseType = BaseExpr->getType();
+Qualifiers BaseQuals = BaseType.getQualifiers();
+Qualifiers MemberQuals = ResultType.getQualifiers();
+Qualifiers Combined = BaseQuals + MemberQuals;
+if (Combined != MemberQuals)
+  ResultType = Context.getQualifiedType(ResultType, Combined);
+  } else if (LHSTy->isBuiltinType() &&
+ LHSTy->getAs()->isVLSTBuiltinType()) {
+const BuiltinType *BTy = LHSTy->getAs();
+if (BTy->isSVEBool())
+  return ExprError(Diag(LLoc, diag::err_subscript_svbool_t)
+   << LHSExp->getSourceRange() << 
RHSExp->getSourceRange());
+
+BaseExpr = LHSExp;
+IndexExpr = RHSExp;
+if (getLangOpts().CPlusPlus11 && LHSExp->isPRValue()) {
+  ExprResult Materialized = TemporaryMaterializationConversion(LHSExp);
+  if (Materialized.isInvalid())
+return ExprError();
+  LHSExp = Materialized.get();
+}
+VK = LHSExp->getValueKind();
+if (VK != VK_PRValue)
+  OK = OK_VectorComponent;
+
+

[clang] 66c44b2 - [Clang][AArch64][SVE] Add shift operators for SVE vector types

2022-04-14 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-04-14T13:20:50+01:00
New Revision: 66c44b20b4a538fbb1bae8bc9533c25f5a006bd5

URL: 
https://github.com/llvm/llvm-project/commit/66c44b20b4a538fbb1bae8bc9533c25f5a006bd5
DIFF: 
https://github.com/llvm/llvm-project/commit/66c44b20b4a538fbb1bae8bc9533c25f5a006bd5.diff

LOG: [Clang][AArch64][SVE] Add shift operators for SVE vector types

This patch enables shift operators on SVE vector types, as well as
supporting vector-scalar shift operations.
Shifts by a scalar that is wider than the contained type in the
vector are permitted but as in the C standard if the value is larger
than the width of the type the behavior is undefined.

Differential Revision: https://reviews.llvm.org/D123303

Added: 
clang/test/CodeGen/aarch64-sve-vector-shift-ops.c
clang/test/Sema/aarch64-sve-vector-shift-ops.c

Modified: 
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 




diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index faff375314e92..f210a8ba7aac2 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -11476,6 +11476,97 @@ static QualType checkVectorShift(Sema &S, ExprResult 
&LHS, ExprResult &RHS,
   return LHSType;
 }
 
+static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS,
+ ExprResult &RHS, SourceLocation Loc,
+ bool IsCompAssign) {
+  if (!IsCompAssign) {
+LHS = S.UsualUnaryConversions(LHS.get());
+if (LHS.isInvalid())
+  return QualType();
+  }
+
+  RHS = S.UsualUnaryConversions(RHS.get());
+  if (RHS.isInvalid())
+return QualType();
+
+  QualType LHSType = LHS.get()->getType();
+  const BuiltinType *LHSBuiltinTy = LHSType->getAs();
+  QualType LHSEleType = LHSType->isVLSTBuiltinType()
+? LHSBuiltinTy->getSveEltType(S.getASTContext())
+: LHSType;
+
+  // Note that RHS might not be a vector
+  QualType RHSType = RHS.get()->getType();
+  const BuiltinType *RHSBuiltinTy = RHSType->getAs();
+  QualType RHSEleType = RHSType->isVLSTBuiltinType()
+? RHSBuiltinTy->getSveEltType(S.getASTContext())
+: RHSType;
+
+  if ((LHSBuiltinTy && LHSBuiltinTy->isSVEBool()) ||
+  (RHSBuiltinTy && RHSBuiltinTy->isSVEBool())) {
+S.Diag(Loc, diag::err_typecheck_invalid_operands)
+<< LHSType << RHSType << LHS.get()->getSourceRange();
+return QualType();
+  }
+
+  if (!LHSEleType->isIntegerType()) {
+S.Diag(Loc, diag::err_typecheck_expect_int)
+<< LHS.get()->getType() << LHS.get()->getSourceRange();
+return QualType();
+  }
+
+  if (!RHSEleType->isIntegerType()) {
+S.Diag(Loc, diag::err_typecheck_expect_int)
+<< RHS.get()->getType() << RHS.get()->getSourceRange();
+return QualType();
+  }
+
+  if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() &&
+  (S.Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
+   S.Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC)) {
+S.Diag(Loc, diag::err_typecheck_invalid_operands)
+<< LHSType << RHSType << LHS.get()->getSourceRange()
+<< RHS.get()->getSourceRange();
+return QualType();
+  }
+
+  if (!LHSType->isVLSTBuiltinType()) {
+assert(RHSType->isVLSTBuiltinType());
+if (IsCompAssign)
+  return RHSType;
+if (LHSEleType != RHSEleType) {
+  LHS = S.ImpCastExprToType(LHS.get(), RHSEleType, clang::CK_IntegralCast);
+  LHSEleType = RHSEleType;
+}
+const llvm::ElementCount VecSize =
+S.Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC;
+QualType VecTy =
+S.Context.getScalableVectorType(LHSEleType, 
VecSize.getKnownMinValue());
+LHS = S.ImpCastExprToType(LHS.get(), VecTy, clang::CK_VectorSplat);
+LHSType = VecTy;
+  } else if (RHSBuiltinTy && RHSBuiltinTy->isVLSTBuiltinType()) {
+if (S.Context.getTypeSize(RHSBuiltinTy) !=
+S.Context.getTypeSize(LHSBuiltinTy)) {
+  S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
+  << LHSType << RHSType << LHS.get()->getSourceRange()
+  << RHS.get()->getSourceRange();
+  return QualType();
+}
+  } else {
+const llvm::ElementCount VecSize =
+S.Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC;
+if (LHSEleType != RHSEleType) {
+  RHS = S.ImpCastExprToType(RHS.get(), LHSEleType, clang::CK_IntegralCast);
+  RHSEleType = LHSEleType;
+}
+QualType VecTy =
+S.Context.getScalableVectorType(RHSEleType, 
VecSize.getKnownMinValue());
+RHS = S.ImpCastExprToType(RHS.get(), VecTy, CK_VectorSplat);
+  }
+
+  return LHSType;
+}
+
 // C99 6.5.7
 QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS,
   SourceLocation Loc, BinaryOperatorKind Opc,
@@ -11501,7 +115

[clang] 8bc29d1 - [clang][AArch64][SVE] Implement conditional operator for SVE vectors

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

Author: David Truby
Date: 2022-05-03T13:10:32Z
New Revision: 8bc29d14273b05b05d5a56e34c07948dc2c770d3

URL: 
https://github.com/llvm/llvm-project/commit/8bc29d14273b05b05d5a56e34c07948dc2c770d3
DIFF: 
https://github.com/llvm/llvm-project/commit/8bc29d14273b05b05d5a56e34c07948dc2c770d3.diff

LOG: [clang][AArch64][SVE] Implement conditional operator for SVE vectors

This patch adds support for the conditional (ternary) operator on SVE
scalable vector types in C++, matching the behaviour for NEON vector
types. Like the conditional operator for NEON types, this is disabled in
C mode.

Differential Revision: https://reviews.llvm.org/D124091

Added: 
clang/test/CodeGenCXX/aarch64-sve-vector-conditional-op.cpp
clang/test/SemaCXX/aarch64-sve-vector-conditional-op.cpp

Modified: 
clang/include/clang/Sema/Sema.h
clang/lib/CodeGen/CGExprScalar.cpp
clang/lib/Sema/SemaExprCXX.cpp

Removed: 




diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 114725498c982..7d33b5047a677 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -11974,6 +11974,10 @@ class Sema final {
   QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS,
ExprResult &RHS,
SourceLocation QuestionLoc);
+
+  QualType CheckSizelessVectorConditionalTypes(ExprResult &Cond,
+   ExprResult &LHS, ExprResult 
&RHS,
+   SourceLocation QuestionLoc);
   QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2,
 bool ConvertArgs = true);
   QualType FindCompositePointerType(SourceLocation Loc,

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index d3fe04d5a7915..2343c7e4afbbe 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -4642,7 +4642,8 @@ VisitAbstractConditionalOperator(const 
AbstractConditionalOperator *E) {
 return tmp5;
   }
 
-  if (condExpr->getType()->isVectorType()) {
+  if (condExpr->getType()->isVectorType() ||
+  condExpr->getType()->isVLSTBuiltinType()) {
 CGF.incrementProfileCounter(E);
 
 llvm::Value *CondV = CGF.EmitScalarExpr(condExpr);

diff  --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 2af4a85c91c21..27ec863e7a35e 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -23,6 +23,7 @@
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/AST/TypeLoc.h"
 #include "clang/Basic/AlignedAllocation.h"
+#include "clang/Basic/DiagnosticSema.h"
 #include "clang/Basic/PartialDiagnostic.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/TypeTraits.h"
@@ -40,6 +41,7 @@
 #include "llvm/ADT/APInt.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/TypeSize.h"
 using namespace clang;
 using namespace sema;
 
@@ -6108,6 +6110,16 @@ static bool 
isValidVectorForConditionalCondition(ASTContext &Ctx,
   return EltTy->isIntegralType(Ctx);
 }
 
+static bool isValidSizelessVectorForConditionalCondition(ASTContext &Ctx,
+ QualType CondTy) {
+  if (!CondTy->isVLSTBuiltinType())
+return false;
+  const QualType EltTy =
+  cast(CondTy.getCanonicalType())->getSveEltType(Ctx);
+  assert(!EltTy->isEnumeralType() && "Vectors cant be enum types");
+  return EltTy->isIntegralType(Ctx);
+}
+
 QualType Sema::CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS,
ExprResult &RHS,
SourceLocation QuestionLoc) {
@@ -6199,6 +6211,89 @@ QualType Sema::CheckVectorConditionalTypes(ExprResult 
&Cond, ExprResult &LHS,
   return ResultType;
 }
 
+QualType Sema::CheckSizelessVectorConditionalTypes(ExprResult &Cond,
+   ExprResult &LHS,
+   ExprResult &RHS,
+   SourceLocation QuestionLoc) 
{
+  LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
+  RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
+
+  QualType CondType = Cond.get()->getType();
+  const auto *CondBT = CondType->castAs();
+  QualType CondElementTy = CondBT->getSveEltType(Context);
+  llvm::ElementCount CondElementCount =
+  Context.getBuiltinVectorTypeInfo(CondBT).EC;
+
+  QualType LHSType = LHS.get()->getType();
+  const auto *LHSBT =
+  LHSType->isVLSTBuiltinType() ? LHSType->getAs() : nullptr;
+  QualType RHSType = RHS.get()->getType();
+  const auto *RHSBT =
+  RHSType->isVLSTBuiltinType() ? RHSType->getAs() : nullptr;
+
+  QualType ResultType;
+
+  if (LHSBT && RHSBT) {
+

[clang] bbb30bd - [clang][AArch64][SVE] Clarify documentation for sizeof operator on SVE

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

Author: David Truby
Date: 2022-08-11T13:22:23Z
New Revision: bbb30bd54a6447702f9f59a2ae4c478eb7133ae0

URL: 
https://github.com/llvm/llvm-project/commit/bbb30bd54a6447702f9f59a2ae4c478eb7133ae0
DIFF: 
https://github.com/llvm/llvm-project/commit/bbb30bd54a6447702f9f59a2ae4c478eb7133ae0.diff

LOG: [clang][AArch64][SVE] Clarify documentation for sizeof operator on SVE

Previously the table in LanguageExtensions said that sizeof worked on
SVE types but this is only correct for fixed-length vectors so a
clarification has been added.

Added: 


Modified: 
clang/docs/LanguageExtensions.rst

Removed: 




diff  --git a/clang/docs/LanguageExtensions.rst 
b/clang/docs/LanguageExtensions.rst
index 3b80289fd5fe..3adf0a12fc4c 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -552,7 +552,7 @@ bitwise operators &,|,^,~yes yes   yes  
   yesyes
 ==, !=, >, <, >=, <= yes yes   yes yesyes
 =yes yes   yes yesyes
 ?: [#]_  yes --yes yesyes
-sizeof   yes yes   yes yesyes
+sizeof   yes yes   yes yesyes [#]_
 C-style cast yes yes   yes no no
 reinterpret_cast yes noyes no no
 static_cast  yes noyes no no
@@ -568,6 +568,7 @@ See also :ref:`langext-__builtin_shufflevector`, 
:ref:`langext-__builtin_convert
   conversions (that is, != 0).
   If it's an extension (OpenCL) vector, it's only available in C and OpenCL C.
   And it selects base on signedness of the condition operands (OpenCL v1.1 
s6.3.9).
+.. [#] sizeof can only be used on vector length specific SVE types.
 .. [#] Clang does not allow the address of an element to be taken while GCC
allows this. This is intentional for vectors with a boolean element type and
not implemented otherwise.



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


[clang] 13a784f - [clang][AArch64][SVE] Change SVE_VECTOR_OPERATORS macro for VLA vectors

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

Author: David Truby
Date: 2022-08-11T13:23:52Z
New Revision: 13a784f368ef062a7bd652829bcf8bbdd94dc659

URL: 
https://github.com/llvm/llvm-project/commit/13a784f368ef062a7bd652829bcf8bbdd94dc659
DIFF: 
https://github.com/llvm/llvm-project/commit/13a784f368ef062a7bd652829bcf8bbdd94dc659.diff

LOG: [clang][AArch64][SVE] Change SVE_VECTOR_OPERATORS macro for VLA vectors

The __ARM_FEATURE_SVE_VECTOR_OPERATORS macro should be changed to
indicate that this feature is now supported on VLA vectors as well as
VLS vectors. There is a complementary PR to the ACLE spec here
https://github.com/ARM-software/acle/pull/213

Reviewed By: peterwaller-arm

Differential Revision: https://reviews.llvm.org/D131573

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/test/Preprocessor/aarch64-target-features.c

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 8612138c3194f..85346ebf92ab6 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -489,9 +489,12 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
   Builder.defineMacro("__FP_FAST_FMA", "1");
   Builder.defineMacro("__FP_FAST_FMAF", "1");
 
+  // C/C++ operators work on both VLS and VLA SVE types
+  if (FPU & SveMode)
+Builder.defineMacro("__ARM_FEATURE_SVE_VECTOR_OPERATORS", "2");
+
   if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
 Builder.defineMacro("__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
-Builder.defineMacro("__ARM_FEATURE_SVE_VECTOR_OPERATORS");
   }
 }
 

diff  --git a/clang/test/Preprocessor/aarch64-target-features.c 
b/clang/test/Preprocessor/aarch64-target-features.c
index 6e495a0ae96e7..2d4ec2bbcae92 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -150,6 +150,7 @@
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve -x c -E -dM 
%s -o - | FileCheck --check-prefix=CHECK-SVE %s
 // CHECK-SVE: __ARM_FEATURE_SVE 1
+// CHECK-SVE: __ARM_FEATURE_SVE_VECTOR_OPERATORS 2
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve+bf16 -x c -E 
-dM %s -o - | FileCheck --check-prefix=CHECK-SVE-BF16 %s
 // CHECK-SVE-BF16: __ARM_FEATURE_BF16_SCALAR_ARITHMETIC 1
@@ -512,9 +513,7 @@
 // RUN: %clang -target aarch64-arm-none-eabi -march=armv8-a+sve 
-msve-vector-bits=2048 -x c -E -dM %s -o - 2>&1 | FileCheck 
-check-prefix=CHECK-SVE-VECTOR-BITS -D#VBITS=2048 %s
 // RUN: %clang -target aarch64-arm-none-eabi -march=armv8-a+sve 
-msve-vector-bits=512+ -x c -E -dM %s -o - 2>&1 | FileCheck 
-check-prefix=CHECK-NO-SVE-VECTOR-BITS %s
 // CHECK-SVE-VECTOR-BITS: __ARM_FEATURE_SVE_BITS [[#VBITS:]]
-// CHECK-SVE-VECTOR-BITS: __ARM_FEATURE_SVE_VECTOR_OPERATORS 1
 // CHECK-NO-SVE-VECTOR-BITS-NOT: __ARM_FEATURE_SVE_BITS
-// CHECK-NO-SVE-VECTOR-BITS-NOT: __ARM_FEATURE_SVE_VECTOR_OPERATORS
 
 // == Check Large System Extensions (LSE)
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+lse -x c -E -dM 
%s -o - | FileCheck --check-prefix=CHECK-LSE %s



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


[clang] b4f2f7b - [clang][AArch64][SVE] Implicit conversions for vector-scalar operations

2022-06-13 Thread David Truby via cfe-commits

Author: David Truby
Date: 2022-06-13T10:22:10Z
New Revision: b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05

URL: 
https://github.com/llvm/llvm-project/commit/b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05
DIFF: 
https://github.com/llvm/llvm-project/commit/b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05.diff

LOG: [clang][AArch64][SVE] Implicit conversions for vector-scalar operations

This patch allows the same implicit conversions for vector-scalar
operations in SVE that are allowed for NEON.

Depends on D126377

Reviewed By: c-rhodes

Differential Revision: https://reviews.llvm.org/D126380

Added: 


Modified: 
clang/lib/Sema/SemaChecking.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/CodeGen/aarch64-sve-vector-arith-ops.c
clang/test/Sema/aarch64-sve-vector-arith-ops.c
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp

Removed: 




diff  --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 57a034d3c61e9..9cb031b87f3a8 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -13574,6 +13574,29 @@ static void CheckImplicitConversion(Sema &S, Expr *E, 
QualType T,
   const BuiltinType *SourceBT = dyn_cast(Source);
   const BuiltinType *TargetBT = dyn_cast(Target);
 
+  // Strip SVE vector types
+  if (SourceBT && SourceBT->isVLSTBuiltinType()) {
+// Need the original target type for vector type checks
+const Type *OriginalTarget = S.Context.getCanonicalType(T).getTypePtr();
+// Handle conversion from scalable to fixed when msve-vector-bits is
+// specified
+if (S.Context.areCompatibleSveTypes(QualType(OriginalTarget, 0),
+QualType(Source, 0)) ||
+S.Context.areLaxCompatibleSveTypes(QualType(OriginalTarget, 0),
+   QualType(Source, 0)))
+  return;
+
+// If the vector cast is cast between two vectors of the same size, it is
+// a bitcast, not a conversion.
+if (S.Context.getTypeSize(Source) == S.Context.getTypeSize(Target))
+  return;
+
+Source = SourceBT->getSveEltType(S.Context).getTypePtr();
+  }
+
+  if (TargetBT && TargetBT->isVLSTBuiltinType())
+Target = TargetBT->getSveEltType(S.Context).getTypePtr();
+
   // If the source is floating point...
   if (SourceBT && SourceBT->isFloatingPoint()) {
 // ...and the target is floating point...

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index e44172c399639..7e6618bd2d11d 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10261,12 +10261,18 @@ static bool tryGCCVectorConvertAndSplat(Sema &S, 
ExprResult *Scalar,
 ExprResult *Vector) {
   QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
   QualType VectorTy = Vector->get()->getType().getUnqualifiedType();
-  const auto *VT = VectorTy->castAs();
-
-  assert(!isa(VT) &&
- "ExtVectorTypes should not be handled here!");
-
-  QualType VectorEltTy = VT->getElementType();
+  QualType VectorEltTy;
+
+  if (const auto *VT = VectorTy->getAs()) {
+assert(!isa(VT) &&
+   "ExtVectorTypes should not be handled here!");
+VectorEltTy = VT->getElementType();
+  } else if (VectorTy->isVLSTBuiltinType()) {
+VectorEltTy =
+VectorTy->castAs()->getSveEltType(S.getASTContext());
+  } else {
+llvm_unreachable("Only Fixed-Length and SVE Vector types are handled 
here");
+  }
 
   // Reject cases where the vector element type or the scalar element type are
   // not integral or floating point types.
@@ -10593,24 +10599,14 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult 
&LHS, ExprResult &RHS,
   if (Context.hasSameType(LHSType, RHSType))
 return LHSType;
 
-  auto tryScalableVectorConvert = [this](ExprResult *Src, QualType SrcType,
- QualType DestType) {
-const QualType DestBaseType = DestType->getSveEltType(Context);
-if (DestBaseType->getUnqualifiedDesugaredType() ==
-SrcType->getUnqualifiedDesugaredType()) {
-  unsigned DiagID = diag::err_typecheck_invalid_operands;
-  if (!tryVectorConvertAndSplat(*this, Src, SrcType, DestBaseType, 
DestType,
-DiagID))
-return DestType;
-}
-return QualType();
-  };
-
   if (LHSType->isVLSTBuiltinType() && !RHSType->isVLSTBuiltinType()) {
-auto DestType = tryScalableVectorConvert(&RHS, RHSType, LHSType);
-if (DestType == QualType())
-  return InvalidOperands(Loc, LHS, RHS);
-return DestType;
+if (!tryGCCVectorConvertAndSplat(*this, &RHS, &LHS))
+  return LHSType;
+  }
+  if (RHSType->isVLSTBuiltinType() && !LHSType->isVLSTBuiltinType()) {
+if (LHS.get()->isLValue() ||
+!tryGCCVectorConvertAndSplat(*this, &LHS, &RHS))
+  return RHSType;
   }
 
   if ((!LHSType->isVLSTBuiltinType() && !LHSTyp

[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)

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

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

This patch adds a LLVM_FORCE_VC_REVISION option to force a custom
VC revision to be included instead of trying to fetch one from a
git command. This is helpful in environments where git is not
available or is non-functional but the vc revision is available
through some other means.


>From 0690521dd83e8fae81f65bce173ed7189ff9307b Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Fri, 22 Sep 2023 12:22:49 +
Subject: [PATCH] [cmake] Add LLVM_FORCE_VC_REVISION option

This patch adds a LLVM_FORCE_VC_REVISION option to force a custom
VC revision to be included instead of trying to fetch one from a
git command. This is helpful in environments where git is not
available or is non-functional but the vc revision is available
through some other means.
---
 clang/lib/Basic/CMakeLists.txt  | 2 ++
 flang/lib/Common/CMakeLists.txt | 4 +++-
 lld/Common/CMakeLists.txt   | 2 ++
 lldb/source/Version/CMakeLists.txt  | 2 ++
 llvm/CMakeLists.txt | 6 ++
 llvm/cmake/modules/GenerateVersionFromVCS.cmake | 9 -
 llvm/include/llvm/Support/CMakeLists.txt| 4 
 7 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt
index db59d7dd96da0a4..36ccf7d0809453e 100644
--- a/clang/lib/Basic/CMakeLists.txt
+++ b/clang/lib/Basic/CMakeLists.txt
@@ -39,6 +39,8 @@ add_custom_command(OUTPUT "${version_inc}"
"-DHEADER_FILE=${version_inc}"
"-DLLVM_VC_REPOSITORY=${llvm_vc_repository}"
"-DLLVM_VC_REVISION=${llvm_vc_revision}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index 81cee82e04b88ae..c6f818ad27cd19a 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -12,7 +12,7 @@ endif()
 if(flang_vc AND LLVM_APPEND_VC_REV)
   set(flang_source_dir ${FLANG_SOURCE_DIR})
 endif()
-
+ 
 # Create custom target to generate the VC revision include.
 add_custom_command(OUTPUT "${version_inc}"
   DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}"
@@ -20,6 +20,8 @@ add_custom_command(OUTPUT "${version_inc}"
"-DLLVM_SOURCE_DIR=${llvm_source_dir}"
"-DFLANG_SOURCE_DIR=${flang_source_dir}"
"-DHEADER_FILE=${version_inc}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/lld/Common/CMakeLists.txt b/lld/Common/CMakeLists.txt
index c975da2a49b6bda..4f503d04f7844f7 100644
--- a/lld/Common/CMakeLists.txt
+++ b/lld/Common/CMakeLists.txt
@@ -13,6 +13,8 @@ add_custom_command(OUTPUT "${version_inc}"
   COMMAND ${CMAKE_COMMAND} "-DNAMES=LLD"
   "-DLLD_SOURCE_DIR=${lld_source_dir}"
   "-DHEADER_FILE=${version_inc}"
+  "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+  "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
   -P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/lldb/source/Version/CMakeLists.txt 
b/lldb/source/Version/CMakeLists.txt
index c1393b5dd6e6b62..90fe53d52cc5d05 100644
--- a/lldb/source/Version/CMakeLists.txt
+++ b/lldb/source/Version/CMakeLists.txt
@@ -17,6 +17,8 @@ add_custom_command(OUTPUT "${vcs_version_inc}"
   COMMAND ${CMAKE_COMMAND} "-DNAMES=LLDB"
"-DLLDB_SOURCE_DIR=${lldb_source_dir}"
"-DHEADER_FILE=${vcs_version_inc}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 set_source_files_properties("${vcs_version_inc}"
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index fa39c7554de1f61..5985256498dcbb2 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -325,6 +325,12 @@ include(VersionFromVCS)
 option(LLVM_APPEND_VC_REV
   "Embed the version control system revision in LLVM" ON)
 
+set(LLVM_FORCE_VC_REVISION
+  "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV")
+
+set(LLVM_FORCE_VC_REPOSITORY
+  "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV")
+
 option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" 
OFF)
 
 set(PACKAGE_NAME LLVM)
diff --git a

[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)

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

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

>From 0690521dd83e8fae81f65bce173ed7189ff9307b Mon Sep 17 00:00:00 2001
From: David Truby 
Date: Fri, 22 Sep 2023 12:22:49 +
Subject: [PATCH 1/2] [cmake] Add LLVM_FORCE_VC_REVISION option

This patch adds a LLVM_FORCE_VC_REVISION option to force a custom
VC revision to be included instead of trying to fetch one from a
git command. This is helpful in environments where git is not
available or is non-functional but the vc revision is available
through some other means.
---
 clang/lib/Basic/CMakeLists.txt  | 2 ++
 flang/lib/Common/CMakeLists.txt | 4 +++-
 lld/Common/CMakeLists.txt   | 2 ++
 lldb/source/Version/CMakeLists.txt  | 2 ++
 llvm/CMakeLists.txt | 6 ++
 llvm/cmake/modules/GenerateVersionFromVCS.cmake | 9 -
 llvm/include/llvm/Support/CMakeLists.txt| 4 
 7 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt
index db59d7dd96da0a4..36ccf7d0809453e 100644
--- a/clang/lib/Basic/CMakeLists.txt
+++ b/clang/lib/Basic/CMakeLists.txt
@@ -39,6 +39,8 @@ add_custom_command(OUTPUT "${version_inc}"
"-DHEADER_FILE=${version_inc}"
"-DLLVM_VC_REPOSITORY=${llvm_vc_repository}"
"-DLLVM_VC_REVISION=${llvm_vc_revision}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt
index 81cee82e04b88ae..c6f818ad27cd19a 100644
--- a/flang/lib/Common/CMakeLists.txt
+++ b/flang/lib/Common/CMakeLists.txt
@@ -12,7 +12,7 @@ endif()
 if(flang_vc AND LLVM_APPEND_VC_REV)
   set(flang_source_dir ${FLANG_SOURCE_DIR})
 endif()
-
+ 
 # Create custom target to generate the VC revision include.
 add_custom_command(OUTPUT "${version_inc}"
   DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}"
@@ -20,6 +20,8 @@ add_custom_command(OUTPUT "${version_inc}"
"-DLLVM_SOURCE_DIR=${llvm_source_dir}"
"-DFLANG_SOURCE_DIR=${flang_source_dir}"
"-DHEADER_FILE=${version_inc}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/lld/Common/CMakeLists.txt b/lld/Common/CMakeLists.txt
index c975da2a49b6bda..4f503d04f7844f7 100644
--- a/lld/Common/CMakeLists.txt
+++ b/lld/Common/CMakeLists.txt
@@ -13,6 +13,8 @@ add_custom_command(OUTPUT "${version_inc}"
   COMMAND ${CMAKE_COMMAND} "-DNAMES=LLD"
   "-DLLD_SOURCE_DIR=${lld_source_dir}"
   "-DHEADER_FILE=${version_inc}"
+  "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+  "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
   -P "${generate_vcs_version_script}")
 
 # Mark the generated header as being generated.
diff --git a/lldb/source/Version/CMakeLists.txt 
b/lldb/source/Version/CMakeLists.txt
index c1393b5dd6e6b62..90fe53d52cc5d05 100644
--- a/lldb/source/Version/CMakeLists.txt
+++ b/lldb/source/Version/CMakeLists.txt
@@ -17,6 +17,8 @@ add_custom_command(OUTPUT "${vcs_version_inc}"
   COMMAND ${CMAKE_COMMAND} "-DNAMES=LLDB"
"-DLLDB_SOURCE_DIR=${lldb_source_dir}"
"-DHEADER_FILE=${vcs_version_inc}"
+   "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}"
+   
"-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}"
-P "${generate_vcs_version_script}")
 
 set_source_files_properties("${vcs_version_inc}"
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index fa39c7554de1f61..5985256498dcbb2 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -325,6 +325,12 @@ include(VersionFromVCS)
 option(LLVM_APPEND_VC_REV
   "Embed the version control system revision in LLVM" ON)
 
+set(LLVM_FORCE_VC_REVISION
+  "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV")
+
+set(LLVM_FORCE_VC_REPOSITORY
+  "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV")
+
 option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" 
OFF)
 
 set(PACKAGE_NAME LLVM)
diff --git a/llvm/cmake/modules/GenerateVersionFromVCS.cmake 
b/llvm/cmake/modules/GenerateVersionFromVCS.cmake
index 9cd780e5aa162c0..1b3b2946e62b25c 100644
--- a/llvm/cmake/modules/GenerateVersionFromVCS.cmake
+++ b/llvm/cmake/modules/GenerateVersionFromVCS.cmake
@@ -36,7 +36,14 @@ function

[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)

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

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


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

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

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

LGTM :)

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


  1   2   3   >