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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits