[clang] 0f5965f - [CIR] Introduce type aliases for records (#136387)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 23 10:52:38 PDT 2025
Author: Andy Kaylor
Date: 2025-04-23T10:52:35-07:00
New Revision: 0f5965fa9c67969e4de7374362b6af49bf400b3b
URL: https://github.com/llvm/llvm-project/commit/0f5965fa9c67969e4de7374362b6af49bf400b3b
DIFF: https://github.com/llvm/llvm-project/commit/0f5965fa9c67969e4de7374362b6af49bf400b3b.diff
LOG: [CIR] Introduce type aliases for records (#136387)
This introduces MLIR aliases for ClangIR record types. These are used in
the incubator and having skipped over them upstream is causing the tests
to diverge.
Added:
Modified:
clang/lib/CIR/Dialect/IR/CIRDialect.cpp
clang/test/CIR/CodeGen/struct.c
clang/test/CIR/CodeGen/struct.cpp
clang/test/CIR/CodeGen/typedef.c
clang/test/CIR/CodeGen/union.c
clang/test/CIR/IR/struct.cir
Removed:
################################################################################
diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 146c91b253f39..3cd17053a52ba 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -33,6 +33,14 @@ struct CIROpAsmDialectInterface : public OpAsmDialectInterface {
using OpAsmDialectInterface::OpAsmDialectInterface;
AliasResult getAlias(Type type, raw_ostream &os) const final {
+ if (auto recordType = dyn_cast<cir::RecordType>(type)) {
+ StringAttr nameAttr = recordType.getName();
+ if (!nameAttr)
+ os << "rec_anon_" << recordType.getKindAsStr();
+ else
+ os << "rec_" << nameAttr.getValue();
+ return AliasResult::OverridableAlias;
+ }
if (auto intType = dyn_cast<cir::IntType>(type)) {
// We only provide alias for standard integer types (i.e. integer types
// whose width is a power of 2 and at least 8).
diff --git a/clang/test/CIR/CodeGen/struct.c b/clang/test/CIR/CodeGen/struct.c
index b78a2367bda3a..c91a14e0637c1 100644
--- a/clang/test/CIR/CodeGen/struct.c
+++ b/clang/test/CIR/CodeGen/struct.c
@@ -7,6 +7,12 @@
// For LLVM IR checks, the structs are defined before the variables, so these
// checks are at the top.
+// CIR-DAG: !rec_IncompleteS = !cir.record<struct "IncompleteS" incomplete>
+// CIR-DAG: !rec_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}>
+// CIR-DAG: !rec_OuterS = !cir.record<struct "OuterS" {!rec_InnerS, !s32i}>
+// CIR-DAG: !rec_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}>
+// CIR-DAG: !rec_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}>
+// CIR-DAG: !rec_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}>
// LLVM-DAG: %struct.CompleteS = type { i32, i8 }
// LLVM-DAG: %struct.OuterS = type { %struct.InnerS, i32 }
// LLVM-DAG: %struct.InnerS = type { i32, i8 }
@@ -20,8 +26,7 @@
struct IncompleteS *p;
-// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct
-// CIR-SAME: "IncompleteS" incomplete>>
+// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS>
// LLVM-DAG: @p = dso_local global ptr null
// OGCG-DAG: @p = global ptr null, align 8
@@ -30,10 +35,9 @@ struct CompleteS {
char b;
} cs;
-// CIR: cir.global external @cs = #cir.zero : !cir.record<struct
-// CIR-SAME: "CompleteS" {!s32i, !s8i}>
-// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer
-// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4
+// CIR: cir.global external @cs = #cir.zero : !rec_CompleteS
+// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer
+// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4
struct InnerS {
int a;
@@ -47,10 +51,9 @@ struct OuterS {
struct OuterS os;
-// CIR: cir.global external @os = #cir.zero : !cir.record<struct
-// CIR-SAME: "OuterS" {!cir.record<struct "InnerS" {!s32i, !s8i}>, !s32i}>
-// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer
-// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4
+// CIR: cir.global external @os = #cir.zero : !rec_OuterS
+// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer
+// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4
#pragma pack(push)
#pragma pack(1)
@@ -60,20 +63,18 @@ struct PackedS {
char a1;
} ps;
-// CIR: cir.global external @ps = #cir.zero : !cir.record<struct "PackedS"
-// CIR-SAME: packed {!s32i, !s8i}>
-// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer
-// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1
+// CIR: cir.global external @ps = #cir.zero : !rec_PackedS
+// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer
+// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1
struct PackedAndPaddedS {
int b0;
char b1;
} __attribute__((aligned(2))) pps;
-// CIR: cir.global external @pps = #cir.zero : !cir.record<struct
-// CIR-SAME: "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}>
-// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer
-// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2
+// CIR: cir.global external @pps = #cir.zero : !rec_PackedAndPaddedS
+// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer
+// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2
#pragma pack(pop)
@@ -82,9 +83,7 @@ void f(void) {
}
// CIR: cir.func @f()
-// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>,
-// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct
-// CIR-SAME: "IncompleteS" incomplete>>>, ["p"]
+// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"] {alignment = 8 : i64}
// CIR-NEXT: cir.return
// LLVM: define void @f()
@@ -101,9 +100,7 @@ void f2(void) {
}
// CIR: cir.func @f2()
-// CIR-NEXT: cir.alloca !cir.record<struct "CompleteS" {!s32i, !s8i}>,
-// CIR-SAME: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>>,
-// CIR-SAME: ["s"] {alignment = 4 : i64}
+// CIR-NEXT: cir.alloca !rec_CompleteS, !cir.ptr<!rec_CompleteS>, ["s"] {alignment = 4 : i64}
// CIR-NEXT: cir.return
// LLVM: define void @f2()
@@ -160,7 +157,7 @@ char f4(int a, struct CompleteS *p) {
return p->b;
}
-// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>>
+// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!rec_CompleteS>
// CIR-NEXT: %[[A_ADDR:.*]] = cir.alloca {{.*}} ["a", init] {alignment = 4 : i64}
// CIR-NEXT: %[[P_ADDR:.*]] = cir.alloca {{.*}} ["p", init] {alignment = 8 : i64}
// CIR-NEXT: %[[RETVAL_ADDR:.*]] = cir.alloca {{.*}} ["__retval"] {alignment = 1 : i64}
diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp
index 6197340a7d36b..c54eca20840b5 100644
--- a/clang/test/CIR/CodeGen/struct.cpp
+++ b/clang/test/CIR/CodeGen/struct.cpp
@@ -8,7 +8,7 @@
struct IncompleteS;
IncompleteS *p;
-// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>
+// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS>
// LLVM: @p = dso_local global ptr null
// OGCG: @p = global ptr null, align 8
@@ -17,8 +17,7 @@ void f(void) {
}
// CIR: cir.func @f()
-// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>,
-// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct "IncompleteS" incomplete>>>, ["p"]
+// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"]
// CIR-NEXT: cir.return
// LLVM: define void @f()
diff --git a/clang/test/CIR/CodeGen/typedef.c b/clang/test/CIR/CodeGen/typedef.c
index 17fce13abf38a..a87e6ffb1843a 100644
--- a/clang/test/CIR/CodeGen/typedef.c
+++ b/clang/test/CIR/CodeGen/typedef.c
@@ -11,9 +11,7 @@ void local_typedef(void) {
}
// CIR: cir.func @local_typedef()
-// CIR: cir.alloca !cir.record<struct "Struct" {!s32i}>,
-// CIR-SAME: !cir.ptr<!cir.record<struct "Struct" {!s32i}>>, ["s"]
-// CIR-SAME: {alignment = 4 : i64}
+// CIR: cir.alloca !rec_Struct, !cir.ptr<!rec_Struct>, ["s"] {alignment = 4 : i64}
// CIR: cir.return
// LLVM: %struct.Struct = type { i32 }
diff --git a/clang/test/CIR/CodeGen/union.c b/clang/test/CIR/CodeGen/union.c
index 075d0d2315508..c4db37f835add 100644
--- a/clang/test/CIR/CodeGen/union.c
+++ b/clang/test/CIR/CodeGen/union.c
@@ -7,7 +7,7 @@
union IncompleteU *p;
-// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<union "IncompleteU" incomplete>>
+// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteU>
// LLVM: @p = dso_local global ptr null
// OGCG: @p = global ptr null, align 8
@@ -16,8 +16,7 @@ void f(void) {
}
// CIR: cir.func @f()
-// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<union "IncompleteU" incomplete>>,
-// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<union "IncompleteU" incomplete>>>, ["p"]
+// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteU>, !cir.ptr<!cir.ptr<!rec_IncompleteU>>, ["p"]
// CIR-NEXT: cir.return
// LLVM: define void @f()
diff --git a/clang/test/CIR/IR/struct.cir b/clang/test/CIR/IR/struct.cir
index b6ed1d78b354a..7f0ce07631182 100644
--- a/clang/test/CIR/IR/struct.cir
+++ b/clang/test/CIR/IR/struct.cir
@@ -1,9 +1,15 @@
// RUN: cir-opt %s | FileCheck %s
+!rec_S = !cir.record<struct "S" incomplete>
+!rec_U = !cir.record<union "U" incomplete>
+
+// CHECK: !rec_S = !cir.record<struct "S" incomplete>
+// CHECK: !rec_U = !cir.record<union "U" incomplete>
+
module {
- cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>>
- cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>>
+ cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
+ cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
}
-// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>>
-// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>>
+// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
+// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
More information about the cfe-commits
mailing list