[clang] [CIR] Upstream initial support for union type (PR #137501)
Andy Kaylor via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 28 10:53:12 PDT 2025
================
@@ -306,3 +320,71 @@ CIRGenTypes::computeRecordLayout(const RecordDecl *rd, cir::RecordType *ty) {
// TODO: implement verification
return rl;
}
+
+void CIRRecordLowering::lowerUnion() {
+ CharUnits layoutSize = astRecordLayout.getSize();
+ mlir::Type storageType = nullptr;
+ bool seenNamedMember = false;
+
+ // Iterate through the fields setting bitFieldInfo and the Fields array. Also
+ // locate the "most appropriate" storage type. The heuristic for finding the
+ // storage type isn't necessary, the first (non-0-length-bitfield) field's
+ // type would work fine and be simpler but would be different than what we've
+ // been doing and cause lit tests to change.
+ for (const FieldDecl *field : recordDecl->fields()) {
+ mlir::Type fieldType;
+ if (field->isBitField())
+ cirGenTypes.getCGModule().errorNYI(recordDecl->getSourceRange(),
+ "bitfields in lowerUnion");
+ else
+ fieldType = getStorageType(field);
+
+ fields[field->getCanonicalDecl()] = 0;
----------------
andykaylor wrote:
A comment explaining what this is doing would be helpful. It's storing the index of the field, for purposes of finding the offset of that field, which is why it's always zero for union fields.
The `fields` variable is terribly named, given that this is all it does. Perhaps we should rename it something like `declIdxMap`? The corresponding member in CIRGenRecordLayout is also poorly named.
https://github.com/llvm/llvm-project/pull/137501
More information about the cfe-commits
mailing list