[llvm] IR: Add Module::getLongDoubleFormat helper (PR #214943)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 8 01:43:40 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
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) <noreply@<!-- -->anthropic.com>
---
Full diff: https://github.com/llvm/llvm-project/pull/214943.diff
3 Files Affected:
- (modified) llvm/include/llvm/IR/Module.h (+12)
- (modified) llvm/lib/IR/Module.cpp (+16)
- (modified) llvm/unittests/IR/ModuleTest.cpp (+24)
``````````diff
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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/214943
More information about the llvm-commits
mailing list