================
@@ -802,8 +766,144 @@ def CIR_RecordType : CIR_Type<"Record", "record", [
let hasCustomAssemblyFormat = 1;
}
-// Note CIRRecordType is used instead of CIR_RecordType
-// because of tablegen conflicts.
+//===----------------------------------------------------------------------===//
+// UnionType
+//
+// The CIR type for C/C++ union declarations.
+//===----------------------------------------------------------------------===//
+
+def CIR_UnionType : CIR_Type<"Union", "union", [
+ DeclareTypeInterfaceMethods<DataLayoutTypeInterface>,
+ DeclareTypeInterfaceMethods<CIR_SizedTypeInterface>,
+ MutableType,
+]> {
+ let summary = "CIR union type";
+ let description = [{
+ Each unique clang::RecordDecl with union kind is mapped to a `cir.union`
+ type. Any object in C/C++ that has a union type will have a `!cir.union`
+ in CIR.
+
+ There are three possible formats:
+
+ - Identified and complete: unique name and a known body.
+ - Identified and incomplete: unique name and unknown body.
+ - Anonymous: no name and a known body.
+
+ Padded unions carry an explicit tail-padding type to ensure the LLVM struct
+ that models the union has the correct byte size.
+
+ Examples:
+
+ ```
+ !u_complete = !cir.union<"U" {!s32i, !u8i}>
+ !u_incomplete = !cir.union<"U" incomplete>
+ !u_anonymous = !cir.union<{!s32i, !u8i}>
+ !u_padded = !cir.union<"U" padded {!s32i, !u8i}, padding = {!u8i}>
+ ```
+ }];
+
+ let parameters = (ins
+ OptionalArrayRefParameter<"mlir::Type">:$members,
+ OptionalParameter<"mlir::StringAttr">:$name,
+ "bool":$incomplete,
+ "bool":$packed,
+ OptionalParameter<"mlir::Type">:$padding
+ );
+
+ // StorageClass is defined in C++ for mutability.
+ let storageClass = "RecordTypeStorage";
+ let genStorageClass = 0;
+
+ let skipDefaultBuilders = 1;
+ let genVerifyDecl = 1;
+
+ let builders = [
+ // Create an identified and complete union type.
+ TypeBuilder<(ins
+ "llvm::ArrayRef<mlir::Type>":$members,
+ "mlir::StringAttr":$name,
+ "bool":$packed,
+ CArg<"mlir::Type", "{}">:$padding
+ ), [{
+ return $_get($_ctxt, members, name, /*incomplete=*/false, packed,
+ /*padded=*/!!padding, /*is_class=*/false, padding);
----------------
erichkeane wrote:
just remove `padded`.
https://github.com/llvm/llvm-project/pull/199790
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits