[clang] [CIR] Upstream minimal support for structure types (PR #135105)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 10 12:17:44 PDT 2025


================
@@ -400,13 +400,126 @@ def VoidPtr : Type<
       "cir::VoidType::get($_builder.getContext()))"> {
 }
 
+//===----------------------------------------------------------------------===//
+// StructType
+//
+// The base type for all RecordDecls.
+//===----------------------------------------------------------------------===//
+
+def CIR_StructType : CIR_Type<"Struct", "struct",
+    [
+      DeclareTypeInterfaceMethods<DataLayoutTypeInterface>,
+      MutableType,
+    ]> {
+  let summary = "CIR struct type";
+  let description = [{
+    Each unique clang::RecordDecl is mapped to a `cir.struct` and any object in
----------------
andykaylor wrote:

Yeah. It's not a great. The same thing sort of happens in LLVM IR, but there it makes a little bit more sense because unions, while represented as a structure, only contain the elements necessary to account for the memory, but that's also bad because to access any other member you end up treating it as something else.

I just looked at the incubator handling of unions, and it does represent each member of the union as a unique member of the `cir.struct`. That is consistent with CIR's goal of representing the logical intent of the code. I understand why it's being done the way it is, but there is definitely potential for confusion.

What would you think of renaming this to `cir.record`? That would introduce a clear distinction between this and `llvm.struct` in the LLVM dialect, which directly corresponds to llvm::StructType.

https://github.com/llvm/llvm-project/pull/135105


More information about the cfe-commits mailing list