https://github.com/topperc updated 
https://github.com/llvm/llvm-project/pull/126188

>From 6c7034230d4b58bb352548b4b71051fbd058bbbe Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.top...@sifive.com>
Date: Thu, 6 Feb 2025 21:56:20 -0800
Subject: [PATCH 1/3] [flang][RISCV][WIP] Add target-abi ModuleFlag.

This is needed to generate proper ABI flags in the ELF header for LTO builds.
If these flags aren't set correctly, we can't link with objects that
were built with the correct flags.

For non-LTO builds the mcpu/mattr in the TargetMachine will cause
the backend to infer an ABI. For LTO builds the mcpu/mattr aren't set.

Still need testing and validation of the ABI name.
---
 clang/lib/Driver/ToolChains/Flang.cpp        | 4 ++++
 flang/include/flang/Frontend/TargetOptions.h | 3 +++
 flang/lib/Frontend/CompilerInvocation.cpp    | 1 +
 flang/lib/Frontend/FrontendActions.cpp       | 9 ++++++++-
 4 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 1ae865f379110..255775b01d5a1 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -261,6 +261,10 @@ void Flang::AddPPCTargetArgs(const ArgList &Args,
 void Flang::AddRISCVTargetArgs(const ArgList &Args,
                                ArgStringList &CmdArgs) const {
   const llvm::Triple &Triple = getToolChain().getTriple();
+
+  StringRef ABIName = riscv::getRISCVABI(Args, Triple);
+  CmdArgs.push_back(Args.MakeArgString("-mabi=" + ABIName));
+
   // Handle -mrvv-vector-bits=<bits>
   if (Arg *A = Args.getLastArg(options::OPT_mrvv_vector_bits_EQ)) {
     StringRef Val = A->getValue();
diff --git a/flang/include/flang/Frontend/TargetOptions.h 
b/flang/include/flang/Frontend/TargetOptions.h
index 01c878067b921..4a854644e7ff6 100644
--- a/flang/include/flang/Frontend/TargetOptions.h
+++ b/flang/include/flang/Frontend/TargetOptions.h
@@ -35,6 +35,9 @@ class TargetOptions {
   /// If given, the name of the target CPU to tune code for.
   std::string cpuToTuneFor;
 
+  /// If given, the name of the target ABI to use.
+  std::string abi;
+
   /// The list of target specific features to enable or disable, as written on
   /// the command line.
   std::vector<std::string> featuresAsWritten;
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index 68b5950d3a51b..1f6a777dd5a83 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -464,6 +464,7 @@ static void parseTargetArgs(TargetOptions &opts, 
llvm::opt::ArgList &args) {
 
   if (const llvm::opt::Arg *a =
           args.getLastArg(clang::driver::options::OPT_mabi_EQ)) {
+    opts.abi = a->getValue();
     llvm::StringRef V = a->getValue();
     if (V == "vec-extabi") {
       opts.EnableAIXExtendedAltivecABI = true;
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index b0545a7ac2f99..a87d4c2dc08f3 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -920,16 +920,23 @@ void CodeGenAction::generateLLVMIR() {
           static_cast<llvm::PIELevel::Level>(opts.PICLevel));
   }
 
+  const TargetOptions &targetOpts = ci.getInvocation().getTargetOpts();
+  const llvm::Triple triple(targetOpts.triple);
+
   // Set mcmodel level LLVM module flags
   std::optional<llvm::CodeModel::Model> cm = getCodeModel(opts.CodeModel);
   if (cm.has_value()) {
-    const llvm::Triple triple(ci.getInvocation().getTargetOpts().triple);
     llvmModule->setCodeModel(*cm);
     if ((cm == llvm::CodeModel::Medium || cm == llvm::CodeModel::Large) &&
         triple.getArch() == llvm::Triple::x86_64) {
       llvmModule->setLargeDataThreshold(opts.LargeDataThreshold);
     }
   }
+
+  if (triple.isRISCV() && !targetOpts.abi.empty())
+    llvmModule->addModuleFlag(
+        llvm::Module::Error, "target-abi",
+        llvm::MDString::get(llvmModule->getContext(), targetOpts.abi));
 }
 
 static std::unique_ptr<llvm::raw_pwrite_stream>

>From 302fecc2be9cd2c3d275a0404ae01a6585ae53b6 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.top...@sifive.com>
Date: Wed, 12 Feb 2025 12:15:49 -0800
Subject: [PATCH 2/3] fixup! Add tests and check for unsupported ABIs

---
 clang/lib/Driver/ToolChains/Flang.cpp       |  8 ++++++--
 flang/test/Driver/mabi-riscv.f90            | 14 ++++++++++++++
 flang/test/Lower/RISCV/riscv-target-abi.f90 | 10 ++++++++++
 3 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 flang/test/Driver/mabi-riscv.f90
 create mode 100644 flang/test/Lower/RISCV/riscv-target-abi.f90

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 255775b01d5a1..ca6398b49d734 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -260,15 +260,19 @@ void Flang::AddPPCTargetArgs(const ArgList &Args,
 
 void Flang::AddRISCVTargetArgs(const ArgList &Args,
                                ArgStringList &CmdArgs) const {
+  const Driver &D = getToolChain().getDriver();
   const llvm::Triple &Triple = getToolChain().getTriple();
 
   StringRef ABIName = riscv::getRISCVABI(Args, Triple);
-  CmdArgs.push_back(Args.MakeArgString("-mabi=" + ABIName));
+  if (ABIName == "lp64" || ABIName == "lp64f" || ABIName == "lp64d")
+    CmdArgs.push_back(Args.MakeArgString("-mabi=" + ABIName));
+  else
+    D.Diag(diag::err_drv_unsupported_option_argument)
+        << "-mabi=" << ABIName;
 
   // Handle -mrvv-vector-bits=<bits>
   if (Arg *A = Args.getLastArg(options::OPT_mrvv_vector_bits_EQ)) {
     StringRef Val = A->getValue();
-    const Driver &D = getToolChain().getDriver();
 
     // Get minimum VLen from march.
     unsigned MinVLen = 0;
diff --git a/flang/test/Driver/mabi-riscv.f90 b/flang/test/Driver/mabi-riscv.f90
new file mode 100644
index 0000000000000..355ea9fee4524
--- /dev/null
+++ b/flang/test/Driver/mabi-riscv.f90
@@ -0,0 +1,14 @@
+! RUN: not %flang -c --target=riscv64-unknown-linux -mabi=ilp32 %s -### 2>&1 | 
FileCheck --check-prefix=INVALID1 %s
+! RUN: not %flang -c --target=riscv64-unknown-linux -mabi=lp64e %s -### 2>&1 | 
FileCheck --check-prefix=INVALID2 %s
+! RUN: %flang -c --target=riscv64-unknown-linux -mabi=lp64 %s -### 2>&1 | 
FileCheck --check-prefix=ABI1 %s
+! RUN: %flang -c --target=riscv64-unknown-linux -mabi=lp64f %s -### 2>&1 | 
FileCheck --check-prefix=ABI2 %s
+! RUN: %flang -c --target=riscv64-unknown-linux -mabi=lp64d %s -### 2>&1 | 
FileCheck --check-prefix=ABI3 %s
+! RUN: %flang -c --target=riscv64-unknown-linux %s -### 2>&1 | FileCheck 
--check-prefix=ABI3 %s
+
+! INVALID1: error: unsupported argument 'ilp32' to option '-mabi='
+! INVALID2: error: unsupported argument 'lp64e' to option '-mabi='
+
+! ABI1: "-mabi=lp64"
+! ABI2: "-mabi=lp64f"
+! ABI3: "-mabi=lp64d"
+
diff --git a/flang/test/Lower/RISCV/riscv-target-abi.f90 
b/flang/test/Lower/RISCV/riscv-target-abi.f90
new file mode 100644
index 0000000000000..1077655d9272e
--- /dev/null
+++ b/flang/test/Lower/RISCV/riscv-target-abi.f90
@@ -0,0 +1,10 @@
+! REQUIRES: riscv-registered-target
+! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -mabi=lp64  -emit-llvm -o - 
%s | FileCheck %s --check-prefix=LP64
+! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -mabi=lp64f  -emit-llvm -o - 
%s | FileCheck %s --check-prefix=LP64F
+! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -mabi=lp64d  -emit-llvm -o - 
%s | FileCheck %s --check-prefix=LP64D
+
+! LP64: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64"}
+! LP64F: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64f"}
+! LP64D: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64d"}
+subroutine func
+end subroutine func

>From 8186e5472b4ea36ace0adcd1a5df2d977e3e4d1d Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.top...@sifive.com>
Date: Wed, 12 Feb 2025 13:09:03 -0800
Subject: [PATCH 3/3] fixup! clang-format

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

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index ca6398b49d734..31b9e81ab1d91 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -267,8 +267,7 @@ void Flang::AddRISCVTargetArgs(const ArgList &Args,
   if (ABIName == "lp64" || ABIName == "lp64f" || ABIName == "lp64d")
     CmdArgs.push_back(Args.MakeArgString("-mabi=" + ABIName));
   else
-    D.Diag(diag::err_drv_unsupported_option_argument)
-        << "-mabi=" << ABIName;
+    D.Diag(diag::err_drv_unsupported_option_argument) << "-mabi=" << ABIName;
 
   // Handle -mrvv-vector-bits=<bits>
   if (Arg *A = Args.getLastArg(options::OPT_mrvv_vector_bits_EQ)) {

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

Reply via email to