https://github.com/arsenm updated 
https://github.com/llvm/llvm-project/pull/214943

>From dd68bacb568ba88c033464363b5bf47894c25e0f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Fri, 7 Aug 2026 08:54:04 +0200
Subject: [PATCH 1/3] IR: Add Module::getLongDoubleFormat helper

Add a helper function to return the effective long double type
for a module, accounting for the "long-double-type" module flag,
and defaulting to the triple's default.

Co-authored-by: Claude (Claude-Opus-4.8) <[email protected]>
---
 llvm/include/llvm/IR/Module.h    | 12 ++++++++++++
 llvm/lib/IR/Module.cpp           | 16 ++++++++++++++++
 llvm/unittests/IR/ModuleTest.cpp | 24 ++++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h
index 16dad6ad446fb..53927e96a232e 100644
--- a/llvm/include/llvm/IR/Module.h
+++ b/llvm/include/llvm/IR/Module.h
@@ -1049,6 +1049,18 @@ class LLVM_ABI Module {
   void setCodeModel(CodeModel::Model CL);
   /// @}
 
+  /// @}
+  /// @name Utility functions for querying the long double format
+  /// @{
+
+  /// Returns the long double format from the "long-double-type" module flag,
+  /// or the triple default when the flag is absent.
+  LongDoubleFormat getLongDoubleFormat() const;
+
+  /// Set the long double format.
+  void setLongDoubleFormat(LongDoubleFormat Format);
+  /// @}
+
   /// @}
   /// @name Utility function for querying the floating-point ABI
   /// @{
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp
index 3dcc9ec5dac3f..2ae76b80ccd57 100644
--- a/llvm/lib/IR/Module.cpp
+++ b/llvm/lib/IR/Module.cpp
@@ -682,6 +682,22 @@ void Module::setCodeModel(CodeModel::Model CL) {
   addModuleFlag(ModFlagBehavior::Error, "Code Model", CL);
 }
 
+LongDoubleFormat Module::getLongDoubleFormat() const {
+  if (auto *Val =
+          dyn_cast_or_null<MDString>(getModuleFlag("long-double-type"))) {
+    if (std::optional<LongDoubleFormat> Format =
+            parseLongDoubleFormat(Val->getString()))
+      return *Format;
+  }
+
+  return getTargetTriple().getDefaultLongDoubleFormat();
+}
+
+void Module::setLongDoubleFormat(LongDoubleFormat Format) {
+  addModuleFlag(ModFlagBehavior::Error, "long-double-type",
+                MDString::get(getContext(), getLongDoubleFormatName(Format)));
+}
+
 FloatABI::ABIType Module::getFloatABI() const {
   if (auto *Val = dyn_cast_or_null<MDString>(getModuleFlag("float-abi")))
     return 
FloatABI::parseABIType(Val->getString()).value_or(FloatABI::Default);
diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp
index e8c2ecfb9f3a8..064157a8e2105 100644
--- a/llvm/unittests/IR/ModuleTest.cpp
+++ b/llvm/unittests/IR/ModuleTest.cpp
@@ -103,6 +103,30 @@ TEST(ModuleTest, setModuleFlagInt) {
   EXPECT_EQ(Val2, A2->getZExtValue());
 }
 
+TEST(ModuleTest, getLongDoubleFormat) {
+  LLVMContext Context;
+
+  // With no module flag, falls back to the triple's default long double 
format.
+  Module MX86("x86", Context);
+  MX86.setTargetTriple(Triple("x86_64-unknown-linux-gnu"));
+  EXPECT_EQ(LongDoubleFormat::X87DoubleExtended, MX86.getLongDoubleFormat());
+
+  Module MPPC("ppc", Context);
+  MPPC.setTargetTriple(Triple("powerpc64-unknown-linux-gnu"));
+  EXPECT_EQ(LongDoubleFormat::PPCDoubleDouble, MPPC.getLongDoubleFormat());
+
+  // An explicit module flag overrides the triple default.
+  MX86.setLongDoubleFormat(LongDoubleFormat::IEEEquad);
+  EXPECT_EQ(LongDoubleFormat::IEEEquad, MX86.getLongDoubleFormat());
+
+  // The flag is the string-valued "long-double-type" flag emitted by clang.
+  Module MFlag("flag", Context);
+  MFlag.setTargetTriple(Triple("x86_64-unknown-linux-gnu"));
+  MFlag.addModuleFlag(Module::Error, "long-double-type",
+                      MDString::get(Context, "fp128"));
+  EXPECT_EQ(LongDoubleFormat::IEEEquad, MFlag.getLongDoubleFormat());
+}
+
 TEST(ModuleTest, setModuleFlagTwoMod) {
   LLVMContext Context;
   Module MA("MA", Context);

>From ecfb6902ebb878a716d61457d62a992414cf0734 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Sat, 8 Aug 2026 11:34:04 +0200
Subject: [PATCH 2/3] Use helper in clang

---
 clang/lib/CodeGen/CodeGenModule.cpp | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 5ed5385c90f26..e17bd72c2f052 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1411,12 +1411,8 @@ void CodeGenModule::Release() {
     else if (flt == &llvm::APFloat::IEEEsingle())
       Format = llvm::LongDoubleFormat::IEEEsingle;
 
-    if (Format) {
-      getModule().addModuleFlag(
-          llvm::Module::Error, "long-double-type",
-          llvm::MDString::get(VMContext,
-                              llvm::getLongDoubleFormatName(*Format)));
-    }
+    if (Format)
+      getModule().setLongDoubleFormat(*Format);
   }
 
   if (getTriple().isOSzOS()) {

>From 9ee9cedaab01cf47756c690e52cbea66182a0169 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Sat, 8 Aug 2026 11:34:25 +0200
Subject: [PATCH 3/3] drop unit test

---
 llvm/unittests/IR/ModuleTest.cpp | 24 ------------------------
 1 file changed, 24 deletions(-)

diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp
index 064157a8e2105..e8c2ecfb9f3a8 100644
--- a/llvm/unittests/IR/ModuleTest.cpp
+++ b/llvm/unittests/IR/ModuleTest.cpp
@@ -103,30 +103,6 @@ TEST(ModuleTest, setModuleFlagInt) {
   EXPECT_EQ(Val2, A2->getZExtValue());
 }
 
-TEST(ModuleTest, getLongDoubleFormat) {
-  LLVMContext Context;
-
-  // With no module flag, falls back to the triple's default long double 
format.
-  Module MX86("x86", Context);
-  MX86.setTargetTriple(Triple("x86_64-unknown-linux-gnu"));
-  EXPECT_EQ(LongDoubleFormat::X87DoubleExtended, MX86.getLongDoubleFormat());
-
-  Module MPPC("ppc", Context);
-  MPPC.setTargetTriple(Triple("powerpc64-unknown-linux-gnu"));
-  EXPECT_EQ(LongDoubleFormat::PPCDoubleDouble, MPPC.getLongDoubleFormat());
-
-  // An explicit module flag overrides the triple default.
-  MX86.setLongDoubleFormat(LongDoubleFormat::IEEEquad);
-  EXPECT_EQ(LongDoubleFormat::IEEEquad, MX86.getLongDoubleFormat());
-
-  // The flag is the string-valued "long-double-type" flag emitted by clang.
-  Module MFlag("flag", Context);
-  MFlag.setTargetTriple(Triple("x86_64-unknown-linux-gnu"));
-  MFlag.addModuleFlag(Module::Error, "long-double-type",
-                      MDString::get(Context, "fp128"));
-  EXPECT_EQ(LongDoubleFormat::IEEEquad, MFlag.getLongDoubleFormat());
-}
-
 TEST(ModuleTest, setModuleFlagTwoMod) {
   LLVMContext Context;
   Module MA("MA", Context);

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to