Skip to content

Commit 3e97db8

Browse files
committed
[PowerPC] Emit IR module flag for current float abi
This is part of the efforts adding .gnu_attribute support for PowerPC. In Clang, an extra metadata field will be added as float-abi to show current long double format. So backend can emit .gnu_attribute section data from this metadata. To avoid breaking existing behavior, the module metadata will only be emitted when this module makes use of long double. Reviewed By: nemanjai Differential Revision: https://reviews.llvm.org/D116016
1 parent c649fd3 commit 3e97db8

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ CodeGenTypes::CodeGenTypes(CodeGenModule &cgm)
3434
Target(cgm.getTarget()), TheCXXABI(cgm.getCXXABI()),
3535
TheABIInfo(cgm.getTargetCodeGenInfo().getABIInfo()) {
3636
SkippedLayout = false;
37+
LongDoubleReferenced = false;
3738
}
3839

3940
CodeGenTypes::~CodeGenTypes() {
@@ -406,10 +407,12 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
406407
Context.getLangOpts().NativeHalfType ||
407408
!Context.getTargetInfo().useFP16ConversionIntrinsics());
408409
break;
410+
case BuiltinType::LongDouble:
411+
LongDoubleReferenced = true;
412+
LLVM_FALLTHROUGH;
409413
case BuiltinType::BFloat16:
410414
case BuiltinType::Float:
411415
case BuiltinType::Double:
412-
case BuiltinType::LongDouble:
413416
case BuiltinType::Float128:
414417
case BuiltinType::Ibm128:
415418
ResultType = getTypeForFormat(getLLVMContext(),

clang/lib/CodeGen/CodeGenTypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ class CodeGenTypes {
8484
/// a recursive struct conversion, set this to true.
8585
bool SkippedLayout;
8686

87+
/// True if any instance of long double types are used.
88+
bool LongDoubleReferenced;
89+
8790
/// This map keeps cache of llvm::Types and maps clang::Type to
8891
/// corresponding llvm::Type.
8992
llvm::DenseMap<const Type *, llvm::Type *> TypeCache;
@@ -289,6 +292,7 @@ class CodeGenTypes {
289292
/// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
290293
bool isZeroInitializable(const RecordDecl *RD);
291294

295+
bool isLongDoubleReferenced() const { return LongDoubleReferenced; }
292296
bool isRecordLayoutComplete(const Type *Ty) const;
293297
unsigned getTargetAddressSpace(QualType T) const;
294298
};

clang/lib/CodeGen/Targets/PPC.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,9 @@ class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
620620

621621
bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
622622
llvm::Value *Address) const override;
623+
void emitTargetMetadata(CodeGen::CodeGenModule &CGM,
624+
const llvm::MapVector<GlobalDecl, StringRef>
625+
&MangledDeclNames) const override;
623626
};
624627

625628
class PPC64TargetCodeGenInfo : public TargetCodeGenInfo {
@@ -940,6 +943,24 @@ PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
940943
/*IsAIX*/ false);
941944
}
942945

946+
void PPC64_SVR4_TargetCodeGenInfo::emitTargetMetadata(
947+
CodeGen::CodeGenModule &CGM,
948+
const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames) const {
949+
if (CGM.getTypes().isLongDoubleReferenced()) {
950+
llvm::LLVMContext &Ctx = CGM.getLLVMContext();
951+
const auto *flt = &CGM.getTarget().getLongDoubleFormat();
952+
if (flt == &llvm::APFloat::PPCDoubleDouble())
953+
CGM.getModule().addModuleFlag(llvm::Module::Error, "float-abi",
954+
llvm::MDString::get(Ctx, "doubledouble"));
955+
else if (flt == &llvm::APFloat::IEEEquad())
956+
CGM.getModule().addModuleFlag(llvm::Module::Error, "float-abi",
957+
llvm::MDString::get(Ctx, "ieeequad"));
958+
else if (flt == &llvm::APFloat::IEEEdouble())
959+
CGM.getModule().addModuleFlag(llvm::Module::Error, "float-abi",
960+
llvm::MDString::get(Ctx, "ieeedouble"));
961+
}
962+
}
963+
943964
bool
944965
PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
945966
llvm::Value *Address) const {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s
2+
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mabi=ieeelongdouble -o - | FileCheck %s --check-prefix=IEEE
3+
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -mlong-double-64 -o - | FileCheck %s --check-prefix=LDBL64
4+
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu %s -emit-llvm -DNOLDBL -o - | FileCheck %s --check-prefix=NOLDBL
5+
6+
#ifndef NOLDBL
7+
long double foo(long double a, long double b) {
8+
return a + b;
9+
}
10+
#endif
11+
12+
int bar() { return 1; }
13+
14+
// CHECK: ![[#]] = !{i32 1, !"float-abi", !"doubledouble"}
15+
// IEEE: ![[#]] = !{i32 1, !"float-abi", !"ieeequad"}
16+
// LDBL64: ![[#]] = !{i32 1, !"float-abi", !"ieeedouble"}
17+
// NOLDBL-NOT: ![[#]] = !{i32 1, !"float-abi"

0 commit comments

Comments
 (0)