Skip to content

Commit 0f5965f

Browse files
authored
[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.
1 parent 385b07b commit 0f5965f

File tree

6 files changed

+45
-38
lines changed

6 files changed

+45
-38
lines changed

clang/lib/CIR/Dialect/IR/CIRDialect.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ struct CIROpAsmDialectInterface : public OpAsmDialectInterface {
3333
using OpAsmDialectInterface::OpAsmDialectInterface;
3434

3535
AliasResult getAlias(Type type, raw_ostream &os) const final {
36+
if (auto recordType = dyn_cast<cir::RecordType>(type)) {
37+
StringAttr nameAttr = recordType.getName();
38+
if (!nameAttr)
39+
os << "rec_anon_" << recordType.getKindAsStr();
40+
else
41+
os << "rec_" << nameAttr.getValue();
42+
return AliasResult::OverridableAlias;
43+
}
3644
if (auto intType = dyn_cast<cir::IntType>(type)) {
3745
// We only provide alias for standard integer types (i.e. integer types
3846
// whose width is a power of 2 and at least 8).

clang/test/CIR/CodeGen/struct.c

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77

88
// For LLVM IR checks, the structs are defined before the variables, so these
99
// checks are at the top.
10+
// CIR-DAG: !rec_IncompleteS = !cir.record<struct "IncompleteS" incomplete>
11+
// CIR-DAG: !rec_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}>
12+
// CIR-DAG: !rec_OuterS = !cir.record<struct "OuterS" {!rec_InnerS, !s32i}>
13+
// CIR-DAG: !rec_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}>
14+
// CIR-DAG: !rec_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}>
15+
// CIR-DAG: !rec_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}>
1016
// LLVM-DAG: %struct.CompleteS = type { i32, i8 }
1117
// LLVM-DAG: %struct.OuterS = type { %struct.InnerS, i32 }
1218
// LLVM-DAG: %struct.InnerS = type { i32, i8 }
@@ -20,8 +26,7 @@
2026

2127
struct IncompleteS *p;
2228

23-
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct
24-
// CIR-SAME: "IncompleteS" incomplete>>
29+
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS>
2530
// LLVM-DAG: @p = dso_local global ptr null
2631
// OGCG-DAG: @p = global ptr null, align 8
2732

@@ -30,10 +35,9 @@ struct CompleteS {
3035
char b;
3136
} cs;
3237

33-
// CIR: cir.global external @cs = #cir.zero : !cir.record<struct
34-
// CIR-SAME: "CompleteS" {!s32i, !s8i}>
35-
// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer
36-
// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4
38+
// CIR: cir.global external @cs = #cir.zero : !rec_CompleteS
39+
// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer
40+
// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4
3741

3842
struct InnerS {
3943
int a;
@@ -47,10 +51,9 @@ struct OuterS {
4751

4852
struct OuterS os;
4953

50-
// CIR: cir.global external @os = #cir.zero : !cir.record<struct
51-
// CIR-SAME: "OuterS" {!cir.record<struct "InnerS" {!s32i, !s8i}>, !s32i}>
52-
// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer
53-
// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4
54+
// CIR: cir.global external @os = #cir.zero : !rec_OuterS
55+
// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer
56+
// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4
5457

5558
#pragma pack(push)
5659
#pragma pack(1)
@@ -60,20 +63,18 @@ struct PackedS {
6063
char a1;
6164
} ps;
6265

63-
// CIR: cir.global external @ps = #cir.zero : !cir.record<struct "PackedS"
64-
// CIR-SAME: packed {!s32i, !s8i}>
65-
// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer
66-
// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1
66+
// CIR: cir.global external @ps = #cir.zero : !rec_PackedS
67+
// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer
68+
// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1
6769

6870
struct PackedAndPaddedS {
6971
int b0;
7072
char b1;
7173
} __attribute__((aligned(2))) pps;
7274

73-
// CIR: cir.global external @pps = #cir.zero : !cir.record<struct
74-
// CIR-SAME: "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}>
75-
// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer
76-
// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2
75+
// CIR: cir.global external @pps = #cir.zero : !rec_PackedAndPaddedS
76+
// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer
77+
// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2
7778

7879
#pragma pack(pop)
7980

@@ -82,9 +83,7 @@ void f(void) {
8283
}
8384

8485
// CIR: cir.func @f()
85-
// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>,
86-
// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct
87-
// CIR-SAME: "IncompleteS" incomplete>>>, ["p"]
86+
// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"] {alignment = 8 : i64}
8887
// CIR-NEXT: cir.return
8988

9089
// LLVM: define void @f()
@@ -101,9 +100,7 @@ void f2(void) {
101100
}
102101

103102
// CIR: cir.func @f2()
104-
// CIR-NEXT: cir.alloca !cir.record<struct "CompleteS" {!s32i, !s8i}>,
105-
// CIR-SAME: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>>,
106-
// CIR-SAME: ["s"] {alignment = 4 : i64}
103+
// CIR-NEXT: cir.alloca !rec_CompleteS, !cir.ptr<!rec_CompleteS>, ["s"] {alignment = 4 : i64}
107104
// CIR-NEXT: cir.return
108105

109106
// LLVM: define void @f2()
@@ -160,7 +157,7 @@ char f4(int a, struct CompleteS *p) {
160157
return p->b;
161158
}
162159

163-
// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>>
160+
// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!rec_CompleteS>
164161
// CIR-NEXT: %[[A_ADDR:.*]] = cir.alloca {{.*}} ["a", init] {alignment = 4 : i64}
165162
// CIR-NEXT: %[[P_ADDR:.*]] = cir.alloca {{.*}} ["p", init] {alignment = 8 : i64}
166163
// CIR-NEXT: %[[RETVAL_ADDR:.*]] = cir.alloca {{.*}} ["__retval"] {alignment = 1 : i64}

clang/test/CIR/CodeGen/struct.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
struct IncompleteS;
99
IncompleteS *p;
1010

11-
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>
11+
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS>
1212
// LLVM: @p = dso_local global ptr null
1313
// OGCG: @p = global ptr null, align 8
1414

@@ -17,8 +17,7 @@ void f(void) {
1717
}
1818

1919
// CIR: cir.func @f()
20-
// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>,
21-
// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct "IncompleteS" incomplete>>>, ["p"]
20+
// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"]
2221
// CIR-NEXT: cir.return
2322

2423
// LLVM: define void @f()

clang/test/CIR/CodeGen/typedef.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ void local_typedef(void) {
1111
}
1212

1313
// CIR: cir.func @local_typedef()
14-
// CIR: cir.alloca !cir.record<struct "Struct" {!s32i}>,
15-
// CIR-SAME: !cir.ptr<!cir.record<struct "Struct" {!s32i}>>, ["s"]
16-
// CIR-SAME: {alignment = 4 : i64}
14+
// CIR: cir.alloca !rec_Struct, !cir.ptr<!rec_Struct>, ["s"] {alignment = 4 : i64}
1715
// CIR: cir.return
1816

1917
// LLVM: %struct.Struct = type { i32 }

clang/test/CIR/CodeGen/union.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
union IncompleteU *p;
99

10-
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<union "IncompleteU" incomplete>>
10+
// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteU>
1111
// LLVM: @p = dso_local global ptr null
1212
// OGCG: @p = global ptr null, align 8
1313

@@ -16,8 +16,7 @@ void f(void) {
1616
}
1717

1818
// CIR: cir.func @f()
19-
// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<union "IncompleteU" incomplete>>,
20-
// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<union "IncompleteU" incomplete>>>, ["p"]
19+
// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteU>, !cir.ptr<!cir.ptr<!rec_IncompleteU>>, ["p"]
2120
// CIR-NEXT: cir.return
2221

2322
// LLVM: define void @f()

clang/test/CIR/IR/struct.cir

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
// RUN: cir-opt %s | FileCheck %s
22

3+
!rec_S = !cir.record<struct "S" incomplete>
4+
!rec_U = !cir.record<union "U" incomplete>
5+
6+
// CHECK: !rec_S = !cir.record<struct "S" incomplete>
7+
// CHECK: !rec_U = !cir.record<union "U" incomplete>
8+
39
module {
4-
cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>>
5-
cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>>
10+
cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
11+
cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
612
}
713

8-
// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>>
9-
// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>>
14+
// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
15+
// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>

0 commit comments

Comments
 (0)