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
