[clang] clang: Emit "long-double-type" module flag generically (PR #210819)
Matt Arsenault via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 14:05:20 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/210819
>From f1116ccb60a095db9d56840f2e3a7b12fd74c213 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 20 Jul 2026 23:25:15 +0200
Subject: [PATCH] clang: Emit "long-double-type" module flag generically
Move emission of the "long-double-type" module flag out of PowerPC
and into generic code, so it describes the long double format for all
targets.
Co-authored-by: Claude (Claude-Opus-4.8) <noreply at anthropic.com>
---
clang/lib/CodeGen/CodeGenModule.cpp | 24 ++++++++++++++++++
clang/lib/CodeGen/Targets/PPC.cpp | 25 -------------------
.../CodeGen/long-double-type-module-flag.c | 23 +++++++++++++++++
.../CodeGen/ppc64-long-double-type-attr.c | 17 -------------
4 files changed, 47 insertions(+), 42 deletions(-)
create mode 100644 clang/test/CodeGen/long-double-type-module-flag.c
delete mode 100644 clang/test/CodeGen/ppc64-long-double-type-attr.c
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index c284852c05790..e975f1488430a 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -51,6 +51,7 @@
#include "clang/Lex/Preprocessor.h"
#include "llvm/ABI/IRTypeMapper.h"
#include "llvm/ABI/TargetInfo.h"
+#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
@@ -1395,6 +1396,29 @@ void CodeGenModule::Release() {
llvm::FloatABI::getABITypeName(FloatABI)));
}
+ if (getTypes().isLongDoubleReferenced()) {
+ const llvm::fltSemantics *flt = &getTarget().getLongDoubleFormat();
+
+ std::optional<llvm::LongDoubleFormat> Format;
+ if (flt == &llvm::APFloat::IEEEquad())
+ Format = llvm::LongDoubleFormat::IEEEquad;
+ else if (flt == &llvm::APFloat::IEEEdouble())
+ Format = llvm::LongDoubleFormat::IEEEdouble;
+ else if (flt == &llvm::APFloat::PPCDoubleDouble())
+ Format = llvm::LongDoubleFormat::PPCDoubleDouble;
+ else if (flt == &llvm::APFloat::x87DoubleExtended())
+ Format = llvm::LongDoubleFormat::X87DoubleExtended;
+ 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 (getTriple().isOSzOS()) {
getModule().addModuleFlag(llvm::Module::Warning,
"zos_product_major_version",
diff --git a/clang/lib/CodeGen/Targets/PPC.cpp b/clang/lib/CodeGen/Targets/PPC.cpp
index 5109567212adb..a87f841063650 100644
--- a/clang/lib/CodeGen/Targets/PPC.cpp
+++ b/clang/lib/CodeGen/Targets/PPC.cpp
@@ -711,9 +711,6 @@ class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
llvm::Value *Address) const override;
- void emitTargetMetadata(CodeGen::CodeGenModule &CGM,
- const llvm::MapVector<GlobalDecl, StringRef>
- &MangledDeclNames) const override;
};
class PPC64TargetCodeGenInfo : public TargetCodeGenInfo {
@@ -1041,28 +1038,6 @@ PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
/*IsAIX*/ false);
}
-void PPC64_SVR4_TargetCodeGenInfo::emitTargetMetadata(
- CodeGen::CodeGenModule &CGM,
- const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames) const {
- if (CGM.getTypes().isLongDoubleReferenced()) {
- llvm::LLVMContext &Ctx = CGM.getLLVMContext();
- const auto *flt = &CGM.getTarget().getLongDoubleFormat();
- std::optional<llvm::LongDoubleFormat> Format;
- if (flt == &llvm::APFloat::PPCDoubleDouble())
- Format = llvm::LongDoubleFormat::PPCDoubleDouble;
- else if (flt == &llvm::APFloat::IEEEquad())
- Format = llvm::LongDoubleFormat::IEEEquad;
- else if (flt == &llvm::APFloat::IEEEdouble())
- Format = llvm::LongDoubleFormat::IEEEdouble;
-
- if (Format) {
- CGM.getModule().addModuleFlag(
- llvm::Module::Error, "long-double-type",
- llvm::MDString::get(Ctx, llvm::getLongDoubleFormatName(*Format)));
- }
- }
-}
-
bool
PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
llvm::Value *Address) const {
diff --git a/clang/test/CodeGen/long-double-type-module-flag.c b/clang/test/CodeGen/long-double-type-module-flag.c
new file mode 100644
index 0000000000000..0266ca93ca5cf
--- /dev/null
+++ b/clang/test/CodeGen/long-double-type-module-flag.c
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s --check-prefix=X86FP80
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s --check-prefix=FP128
+// RUN: %clang_cc1 -triple arm-none-eabi %s -emit-llvm -o - | FileCheck %s --check-prefix=DOUBLE
+// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s --check-prefix=PPCFP128
+// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mabi=ieeelongdouble -o - | FileCheck %s --check-prefix=FP128
+// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mlong-double-64 -o - | FileCheck %s --check-prefix=DOUBLE
+
+// The flag is only emitted when long double is actually used.
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -DNOLDBL %s -emit-llvm -o - | FileCheck %s --check-prefix=NOLDBL
+
+#ifndef NOLDBL
+long double foo(long double a, long double b) {
+ return a + b;
+}
+#endif
+
+int bar() { return 1; }
+
+// X86FP80: ![[#]] = !{i32 1, !"long-double-type", !"x86_fp80"}
+// FP128: ![[#]] = !{i32 1, !"long-double-type", !"fp128"}
+// DOUBLE: ![[#]] = !{i32 1, !"long-double-type", !"double"}
+// PPCFP128: ![[#]] = !{i32 1, !"long-double-type", !"ppc_fp128"}
+// NOLDBL-NOT: !"long-double-type"
diff --git a/clang/test/CodeGen/ppc64-long-double-type-attr.c b/clang/test/CodeGen/ppc64-long-double-type-attr.c
deleted file mode 100644
index b6f3baab28f7d..0000000000000
--- a/clang/test/CodeGen/ppc64-long-double-type-attr.c
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s
-// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mabi=ieeelongdouble -o - | FileCheck %s --check-prefix=IEEE
-// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mlong-double-64 -o - | FileCheck %s --check-prefix=LDBL64
-// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -DNOLDBL -o - | FileCheck %s --check-prefix=NOLDBL
-
-#ifndef NOLDBL
-long double foo(long double a, long double b) {
- return a + b;
-}
-#endif
-
-int bar() { return 1; }
-
-// CHECK: ![[#]] = !{i32 1, !"long-double-type", !"ppc_fp128"}
-// IEEE: ![[#]] = !{i32 1, !"long-double-type", !"fp128"}
-// LDBL64: ![[#]] = !{i32 1, !"long-double-type", !"double"}
-// NOLDBL-NOT: ![[#]] = !{i32 1, !"long-double-type"
More information about the cfe-commits
mailing list