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 <[email protected]> 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) <[email protected]> --- 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" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
