[clang] 8763d29 - [CIR] Add support for bitfields in unions (#145096)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 24 10:18:01 PDT 2025
Author: Andres-Salamanca
Date: 2025-06-24T10:17:58-07:00
New Revision: 8763d2968d47f03679eef234d99905ee63077f59
URL: https://github.com/llvm/llvm-project/commit/8763d2968d47f03679eef234d99905ee63077f59
DIFF: https://github.com/llvm/llvm-project/commit/8763d2968d47f03679eef234d99905ee63077f59.diff
LOG: [CIR] Add support for bitfields in unions (#145096)
This PR introduces support for bitfields inside unions in CIR.
Added:
clang/test/CIR/CodeGen/bitfield-union.c
Modified:
clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
Removed:
################################################################################
diff --git a/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp b/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
index 349c6e75ce36c..31e0370da78ee 100644
--- a/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp
@@ -704,11 +704,14 @@ void CIRRecordLowering::lowerUnion() {
// locate the "most appropriate" storage type.
for (const FieldDecl *field : recordDecl->fields()) {
mlir::Type fieldType;
- if (field->isBitField())
- cirGenTypes.getCGModule().errorNYI(recordDecl->getSourceRange(),
- "bitfields in lowerUnion");
- else
+ if (field->isBitField()) {
+ if (field->isZeroLengthBitField())
+ continue;
+ fieldType = getBitfieldStorageType(field->getBitWidthValue());
+ setBitFieldInfo(field, CharUnits::Zero(), fieldType);
+ } else {
fieldType = getStorageType(field);
+ }
// This maps a field to its index. For unions, the index is always 0.
fieldIdxMap[field->getCanonicalDecl()] = 0;
diff --git a/clang/test/CIR/CodeGen/bitfield-union.c b/clang/test/CIR/CodeGen/bitfield-union.c
new file mode 100644
index 0000000000000..b5d14540f488f
--- /dev/null
+++ b/clang/test/CIR/CodeGen/bitfield-union.c
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
+// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR
+// RUN: %clang_cc1 -triple x86_64-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 x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll
+// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG
+
+typedef union {
+ int x;
+ int y : 4;
+ int z : 8;
+} demo;
+
+// CIR: !rec_demo = !cir.record<union "demo" {!s32i, !u8i, !u8i}>
+// LLVM: %union.demo = type { i32 }
+// OGCG: %union.demo = type { i32 }
+
+typedef union {
+ int x;
+ int y : 3;
+ int : 0;
+ int z : 2;
+} zero_bit;
+
+// CIR: !rec_zero_bit = !cir.record<union "zero_bit" {!s32i, !u8i, !u8i}>
+// LLVM: %union.zero_bit = type { i32 }
+// OGCG: %union.zero_bit = type { i32 }
+
+demo d;
+zero_bit z;
More information about the cfe-commits
mailing list