https://github.com/Lukacma created https://github.com/llvm/llvm-project/pull/90602
This patch makes determining alignment and width of BitInt to be target ABI specific and makes it consistent with [Procedure Call Standard for the ArmĀ® 64-bit Architecture (AArch64)](https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst) for AArch64 targets. >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac <marian.lu...@arm.com> Date: Tue, 30 Apr 2024 12:46:48 +0000 Subject: [PATCH] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 ++++ clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp | 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +++++++++++++++++++++++++- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a754..1b5efa488b6ded 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { + return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { + return std::clamp<unsigned>(llvm::PowerOf2Ceil(NumBits), getCharWidth(), + getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6b..f440af50e08a49 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast<BitIntType>(T); - Align = std::clamp<unsigned>(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); - Width = llvm::alignTo(EIT->getNumBits(), Align); + Align = Target->getBitIntAlign(EIT->getNumBits()); + Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7aea..9a6c197ff77b58 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ + return std::clamp<unsigned>(llvm::PowerOf2Ceil(NumBits), getCharWidth(), + getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f7511..d8cdc814b2a9ae 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b975..7a8151022852ea 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { + char ch; + unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +struct BITINT127 { + char ch; + _BitInt(127) v; +}; + +int test_bitint127(){ + return __builtin_offsetof(struct BITINT127, v); +} +// CHECK: ret i32 16 + +struct BITINT63 { + char ch; + _BitInt(63) v; +}; + +int test_bitint63(){ + return __builtin_offsetof(struct BITINT63, v); +} +// CHECK: ret i32 8 + +struct BITINT32 { + char ch; + unsigned _BitInt(32) v; +}; + +int test_bitint32(){ + return __builtin_offsetof(struct BITINT32, v); +} +// CHECK: ret i32 4 + +struct BITINT9 { + char ch; + unsigned _BitInt(9) v; +}; + +int test_bitint9(){ + return __builtin_offsetof(struct BITINT9, v); +} +// CHECK: ret i32 2 + +struct BITINT8 { + char ch; + unsigned _BitInt(8) v; +}; + +int test_bitint8(){ + return __builtin_offsetof(struct BITINT8, v); +} +// CHECK: ret i32 1 + +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits