llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: None (Andres-Salamanca) <details> <summary>Changes</summary> This PR updates the bitfield offset calculation to correctly handle big-endian architectures. --- Full diff: https://github.com/llvm/llvm-project/pull/145067.diff 3 Files Affected: - (modified) clang/include/clang/CIR/MissingFeatures.h (-1) - (modified) clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp (+2-1) - (added) clang/test/CIR/CodeGen/bitfields_be.c (+17) ``````````diff diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h index e0b2959f374f8..d8e45d02cd2a0 100644 --- a/clang/include/clang/CIR/MissingFeatures.h +++ b/clang/include/clang/CIR/MissingFeatures.h @@ -150,7 +150,6 @@ struct MissingFeatures { static bool cxxabiAppleARM64CXXABI() { return false; } static bool cxxabiStructorImplicitParam() { return false; } static bool isDiscreteBitFieldABI() { return false; } - static bool isBigEndian() { return false; } // Address class static bool addressOffset() { return false; } diff --git a/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp b/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp index 8dbf1b36a93b2..d2fb4b711b0c2 100644 --- a/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp @@ -228,7 +228,8 @@ void CIRRecordLowering::setBitFieldInfo(const FieldDecl *fd, // out as packed bits within an integer-sized unit, we can imagine the bits // counting from the most-significant-bit instead of the // least-significant-bit. - assert(!cir::MissingFeatures::isBigEndian()); + if (dataLayout.isBigEndian()) + info.offset = info.storageSize - (info.offset + info.size); info.volatileStorageSize = 0; info.volatileOffset = 0; diff --git a/clang/test/CIR/CodeGen/bitfields_be.c b/clang/test/CIR/CodeGen/bitfields_be.c new file mode 100644 index 0000000000000..149e9c9ac33ff --- /dev/null +++ b/clang/test/CIR/CodeGen/bitfields_be.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple aarch64_be-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR +// RUN: %clang_cc1 -triple aarch64_be-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM +// RUN: %clang_cc1 -triple aarch64_be-unknown-linux-gnu -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG + +typedef struct { + int a : 4; + int b : 11; + int c : 17; +} S; +S s; + +// CIR: !rec_S = !cir.record<struct "S" {!u32i}> +// LLVM: %struct.S = type { i32 } +// OGCG: %struct.S = type { i32 } `````````` </details> https://github.com/llvm/llvm-project/pull/145067 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits