Skip to content

Commit 086af26

Browse files
sitio-coutolanza
authored andcommitted
[CIR] Add record kind enum in StructType
Serves as a way to identify the kind of record type (union, class, struct, etc.), which is useful for codegen and lowering. ghstack-source-id: a642fe8 Pull Request resolved: #227
1 parent 5fe40b9 commit 086af26

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+463
-385
lines changed

clang/include/clang/CIR/Dialect/IR/CIRTypes.td

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,19 @@ def CIR_StructType : CIR_Type<"Struct", "struct",
110110
"mlir::StringAttr":$typeName,
111111
"bool":$body,
112112
"bool":$packed,
113+
"mlir::cir::StructType::RecordKind":$kind,
113114
"std::optional<::mlir::cir::ASTRecordDeclAttr>":$ast
114115
);
115116

116117
let hasCustomAssemblyFormat = 1;
117118

118119
let extraClassDeclaration = [{
120+
enum RecordKind : uint32_t {
121+
Class,
122+
Union,
123+
Struct
124+
};
125+
119126
private:
120127
// All these support lazily computation and storage
121128
// for the struct size and alignment.
@@ -127,6 +134,27 @@ def CIR_StructType : CIR_Type<"Struct", "struct",
127134
size_t getNumElements() const { return getMembers().size(); }
128135
bool isOpaque() const { return !getBody(); }
129136
bool isPadded(const ::mlir::DataLayout &dataLayout) const;
137+
138+
std::string getPrefixedName() {
139+
const auto name = getTypeName().getValue().str();
140+
switch (getKind()) {
141+
case RecordKind::Class:
142+
return "class." + name;
143+
case RecordKind::Union:
144+
return "union "+ name;
145+
case RecordKind::Struct:
146+
return "struct." + name;
147+
}
148+
}
149+
150+
/// Return whether this is a class declaration.
151+
bool isClass() const { return getKind() == RecordKind::Class; }
152+
153+
/// Return whether this is a union declaration.
154+
bool isUnion() const { return getKind() == RecordKind::Union; }
155+
156+
/// Return whether this is a struct declaration.
157+
bool isStruct() const { return getKind() == RecordKind::Struct; }
130158
}];
131159

132160
let extraClassDefinition = [{

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include "CIRGenTypeCache.h"
1414
#include "UnimplementedFeatureGuarding.h"
1515

16+
#include "clang/AST/Decl.h"
17+
#include "clang/AST/Type.h"
1618
#include "clang/CIR/Dialect/IR/CIRAttrs.h"
1719
#include "clang/CIR/Dialect/IR/CIRDialect.h"
1820
#include "clang/CIR/Dialect/IR/CIROpsEnums.h"
@@ -168,7 +170,7 @@ class CIRGenBuilderTy : public mlir::OpBuilder {
168170
if (!structTy)
169171
structTy = getType<mlir::cir::StructType>(
170172
members, mlir::StringAttr::get(getContext()),
171-
/*body=*/true, packed,
173+
/*body=*/true, packed, mlir::cir::StructType::Struct,
172174
/*ast=*/std::nullopt);
173175

174176
// Return zero or anonymous constant struct.
@@ -384,16 +386,36 @@ class CIRGenBuilderTy : public mlir::OpBuilder {
384386
return getStructTy(members, "", body, packed, ast);
385387
}
386388

389+
/// Get a CIR record kind from a AST declaration tag.
390+
mlir::cir::StructType::RecordKind
391+
getRecordKind(const clang::TagTypeKind kind) {
392+
switch (kind) {
393+
case clang::TTK_Struct:
394+
return mlir::cir::StructType::Struct;
395+
case clang::TTK_Union:
396+
return mlir::cir::StructType::Union;
397+
case clang::TTK_Class:
398+
return mlir::cir::StructType::Class;
399+
case clang::TTK_Interface:
400+
llvm_unreachable("interface records are NYI");
401+
case clang::TTK_Enum:
402+
llvm_unreachable("enum records are NYI");
403+
}
404+
}
405+
387406
/// Get a CIR named struct type.
388407
mlir::cir::StructType getStructTy(llvm::ArrayRef<mlir::Type> members,
389408
llvm::StringRef name, bool body,
390409
bool packed, const clang::RecordDecl *ast) {
391410
const auto nameAttr = getStringAttr(name);
392411
std::optional<mlir::cir::ASTRecordDeclAttr> astAttr = std::nullopt;
393-
if (ast)
412+
auto kind = mlir::cir::StructType::RecordKind::Struct;
413+
if (ast) {
394414
astAttr = getAttr<mlir::cir::ASTRecordDeclAttr>(ast);
415+
kind = getRecordKind(ast->getTagKind());
416+
}
395417
return mlir::cir::StructType::get(getContext(), members, nameAttr, body,
396-
packed, astAttr);
418+
packed, kind, astAttr);
397419
}
398420

399421
//

clang/lib/CIR/CodeGen/CIRGenTypes.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ std::string CIRGenTypes::getRecordTypeName(const clang::RecordDecl *recordDecl,
4646
llvm::SmallString<256> typeName;
4747
llvm::raw_svector_ostream outStream(typeName);
4848

49-
outStream << recordDecl->getKindName() << '.';
50-
5149
PrintingPolicy policy = recordDecl->getASTContext().getPrintingPolicy();
5250
policy.SuppressInlineNamespace = false;
5351

@@ -169,8 +167,7 @@ mlir::Type CIRGenTypes::convertRecordDeclType(const clang::RecordDecl *RD) {
169167
// Handle forward decl / incomplete types.
170168
if (!entry) {
171169
auto name = getRecordTypeName(RD, "");
172-
entry = Builder.getStructTy({}, name, /*body=*/false,
173-
/*packed=*/false, RD);
170+
entry = Builder.getStructTy({}, name, /*body=*/false, /*packed=*/false, RD);
174171
recordDeclTypes[key] = entry;
175172
}
176173

clang/lib/CIR/CodeGen/CIRGenVTables.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "clang/AST/CXXInheritance.h"
1818
#include "clang/AST/RecordLayout.h"
1919
#include "clang/Basic/CodeGenOptions.h"
20+
#include "clang/CIR/Dialect/IR/CIRTypes.h"
2021
#include "clang/CodeGen/CGFunctionInfo.h"
2122
#include "clang/CodeGen/ConstantInitBuilder.h"
2223
#include "llvm/Support/Format.h"

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,30 @@ void BoolType::print(mlir::AsmPrinter &printer) const {}
9595
//===----------------------------------------------------------------------===//
9696

9797
Type StructType::parse(mlir::AsmParser &parser) {
98+
const auto loc = parser.getCurrentLocation();
9899
llvm::SmallVector<mlir::Type> members;
99100
mlir::StringAttr id;
100101
bool body = false;
101102
bool packed = false;
102103
mlir::cir::ASTRecordDeclAttr ast = nullptr;
104+
RecordKind kind;
103105

104106
if (parser.parseLess())
105107
return {};
106108

109+
// TODO(cir): in the future we should probably separate types for different
110+
// source language declarations such as cir.class, cir.union, and cir.struct
111+
if (parser.parseOptionalKeyword("struct").succeeded())
112+
kind = RecordKind::Struct;
113+
else if (parser.parseOptionalKeyword("union").succeeded())
114+
kind = RecordKind::Union;
115+
else if (parser.parseOptionalKeyword("class").succeeded())
116+
kind = RecordKind::Class;
117+
else {
118+
parser.emitError(loc, "unknown struct type");
119+
return {};
120+
}
121+
107122
if (parser.parseAttribute(id))
108123
return {};
109124

@@ -130,12 +145,26 @@ Type StructType::parse(mlir::AsmParser &parser) {
130145
if (parser.parseGreater())
131146
return {};
132147

133-
return StructType::get(parser.getContext(), members, id, body, packed,
148+
return StructType::get(parser.getContext(), members, id, body, packed, kind,
134149
std::nullopt);
135150
}
136151

137152
void StructType::print(mlir::AsmPrinter &printer) const {
138-
printer << '<' << getTypeName() << " ";
153+
printer << '<';
154+
155+
switch (getKind()) {
156+
case RecordKind::Struct:
157+
printer << "struct ";
158+
break;
159+
case RecordKind::Union:
160+
printer << "union ";
161+
break;
162+
case RecordKind::Class:
163+
printer << "class ";
164+
break;
165+
}
166+
167+
printer << getTypeName() << " ";
139168

140169
if (getPacked())
141170
printer << "packed ";

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1812,7 +1812,7 @@ mlir::LLVMTypeConverter prepareTypeConverter(mlir::MLIRContext *ctx) {
18121812
mlir::LLVM::LLVMStructType llvmStruct;
18131813
if (type.getTypeName().size() != 0) {
18141814
llvmStruct = mlir::LLVM::LLVMStructType::getIdentified(
1815-
type.getContext(), type.getTypeName());
1815+
type.getContext(), type.getPrefixedName());
18161816
if (llvmStruct.setBody(llvmMembers, /*isPacked=*/type.getPacked())
18171817
.failed())
18181818
llvm_unreachable("Failed to set body of struct");

clang/test/CIR/CodeGen/String.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,56 +18,56 @@ void test() {
1818
}
1919

2020
// CHECK: cir.func linkonce_odr @_ZN6StringC2Ev
21-
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22class2EString22>
21+
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22String22>
2222
// CHECK-NEXT: cir.store %arg0, %0
2323
// CHECK-NEXT: %1 = cir.load %0
2424
// CHECK-NEXT: %2 = "cir.struct_element_addr"(%1) {member_index = 0 : index, member_name = "storage"}
2525
// CHECK-NEXT: %3 = cir.const(#cir.null : !cir.ptr<!s8i>) : !cir.ptr<!s8i>
2626
// CHECK-NEXT: cir.store %3, %2 : !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>
27-
// CHECK-NEXT: %4 = "cir.struct_element_addr"(%1) {member_index = 1 : index, member_name = "size"} : (!cir.ptr<!ty_22class2EString22>) -> !cir.ptr<!s64i>
27+
// CHECK-NEXT: %4 = "cir.struct_element_addr"(%1) {member_index = 1 : index, member_name = "size"} : (!cir.ptr<!ty_22String22>) -> !cir.ptr<!s64i>
2828
// CHECK-NEXT: %5 = cir.const(#cir.int<0> : !s32i) : !s32i
2929
// CHECK-NEXT: %6 = cir.cast(integral, %5 : !s32i), !s64i
3030
// CHECK-NEXT: cir.store %6, %4 : !s64i, cir.ptr <!s64i>
3131
// CHECK-NEXT: cir.return
3232
// CHECK-NEXT: }
3333
// CHECK: cir.func linkonce_odr @_ZN6StringC2Ei
34-
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22class2EString22>
34+
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22String22>
3535
// CHECK-NEXT: %1 = cir.alloca !s32i, cir.ptr <!s32i>, ["size", init]
3636
// CHECK-NEXT: cir.store %arg0, %0
3737
// CHECK-NEXT: cir.store %arg1, %1
3838
// CHECK-NEXT: %2 = cir.load %0
3939
// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) {member_index = 0 : index, member_name = "storage"}
4040
// CHECK-NEXT: %4 = cir.const(#cir.null : !cir.ptr<!s8i>)
4141
// CHECK-NEXT: cir.store %4, %3
42-
// CHECK-NEXT: %5 = "cir.struct_element_addr"(%2) {member_index = 1 : index, member_name = "size"} : (!cir.ptr<!ty_22class2EString22>) -> !cir.ptr<!s64i>
42+
// CHECK-NEXT: %5 = "cir.struct_element_addr"(%2) {member_index = 1 : index, member_name = "size"} : (!cir.ptr<!ty_22String22>) -> !cir.ptr<!s64i>
4343
// CHECK-NEXT: %6 = cir.load %1 : cir.ptr <!s32i>, !s32i
4444
// CHECK-NEXT: %7 = cir.cast(integral, %6 : !s32i), !s64i
4545
// CHECK-NEXT: cir.store %7, %5 : !s64i, cir.ptr <!s64i>
4646
// CHECK-NEXT: cir.return
4747
// CHECK-NEXT: }
4848

4949
// CHECK: cir.func linkonce_odr @_ZN6StringC2EPKc
50-
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22class2EString22>, cir.ptr <!cir.ptr<!ty_22class2EString22>>, ["this", init] {alignment = 8 : i64}
50+
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22String22>, cir.ptr <!cir.ptr<!ty_22String22>>, ["this", init] {alignment = 8 : i64}
5151
// CHECK-NEXT: %1 = cir.alloca !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>, ["s", init] {alignment = 8 : i64}
52-
// CHECK-NEXT: cir.store %arg0, %0 : !cir.ptr<!ty_22class2EString22>, cir.ptr <!cir.ptr<!ty_22class2EString22>>
52+
// CHECK-NEXT: cir.store %arg0, %0 : !cir.ptr<!ty_22String22>, cir.ptr <!cir.ptr<!ty_22String22>>
5353
// CHECK-NEXT: cir.store %arg1, %1 : !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>
54-
// CHECK-NEXT: %2 = cir.load %0 : cir.ptr <!cir.ptr<!ty_22class2EString22>>, !cir.ptr<!ty_22class2EString22>
55-
// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) {member_index = 0 : index, member_name = "storage"} : (!cir.ptr<!ty_22class2EString22>) -> !cir.ptr<!cir.ptr<!s8i>>
54+
// CHECK-NEXT: %2 = cir.load %0 : cir.ptr <!cir.ptr<!ty_22String22>>, !cir.ptr<!ty_22String22>
55+
// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) {member_index = 0 : index, member_name = "storage"} : (!cir.ptr<!ty_22String22>) -> !cir.ptr<!cir.ptr<!s8i>>
5656
// CHECK-NEXT: %4 = cir.const(#cir.null : !cir.ptr<!s8i>) : !cir.ptr<!s8i>
5757
// CHECK-NEXT: cir.store %4, %3 : !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>
5858
// CHECK-NEXT: cir.return
5959

6060
// CHECK: cir.func linkonce_odr @_ZN6StringC1EPKc
61-
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22class2EString22>, cir.ptr <!cir.ptr<!ty_22class2EString22>>, ["this", init] {alignment = 8 : i64}
61+
// CHECK-NEXT: %0 = cir.alloca !cir.ptr<!ty_22String22>, cir.ptr <!cir.ptr<!ty_22String22>>, ["this", init] {alignment = 8 : i64}
6262
// CHECK-NEXT: %1 = cir.alloca !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>, ["s", init] {alignment = 8 : i64}
63-
// CHECK-NEXT: cir.store %arg0, %0 : !cir.ptr<!ty_22class2EString22>, cir.ptr <!cir.ptr<!ty_22class2EString22>>
63+
// CHECK-NEXT: cir.store %arg0, %0 : !cir.ptr<!ty_22String22>, cir.ptr <!cir.ptr<!ty_22String22>>
6464
// CHECK-NEXT: cir.store %arg1, %1 : !cir.ptr<!s8i>, cir.ptr <!cir.ptr<!s8i>>
65-
// CHECK-NEXT: %2 = cir.load %0 : cir.ptr <!cir.ptr<!ty_22class2EString22>>, !cir.ptr<!ty_22class2EString22>
65+
// CHECK-NEXT: %2 = cir.load %0 : cir.ptr <!cir.ptr<!ty_22String22>>, !cir.ptr<!ty_22String22>
6666
// CHECK-NEXT: %3 = cir.load %1 : cir.ptr <!cir.ptr<!s8i>>, !cir.ptr<!s8i>
67-
// CHECK-NEXT: cir.call @_ZN6StringC2EPKc(%2, %3) : (!cir.ptr<!ty_22class2EString22>, !cir.ptr<!s8i>) -> ()
67+
// CHECK-NEXT: cir.call @_ZN6StringC2EPKc(%2, %3) : (!cir.ptr<!ty_22String22>, !cir.ptr<!s8i>) -> ()
6868
// CHECK-NEXT: cir.return
6969

7070
// CHECK: cir.func @_Z4testv()
71-
// CHECK: cir.call @_ZN6StringC1Ev(%0) : (!cir.ptr<!ty_22class2EString22>) -> ()
72-
// CHECK: cir.call @_ZN6StringC1Ei(%1, %3) : (!cir.ptr<!ty_22class2EString22>, !s32i) -> ()
73-
// CHECK: cir.call @_ZN6StringC1EPKc(%2, %5) : (!cir.ptr<!ty_22class2EString22>, !cir.ptr<!s8i>) -> ()
71+
// CHECK: cir.call @_ZN6StringC1Ev(%0) : (!cir.ptr<!ty_22String22>) -> ()
72+
// CHECK: cir.call @_ZN6StringC1Ei(%1, %3) : (!cir.ptr<!ty_22String22>, !s32i) -> ()
73+
// CHECK: cir.call @_ZN6StringC1EPKc(%2, %5) : (!cir.ptr<!ty_22String22>, !cir.ptr<!s8i>) -> ()

clang/test/CIR/CodeGen/agg-init.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++17 -fclangir-enable -Wno-unused-value -emit-cir %s -o %t.cir
22
// RUN: FileCheck --input-file=%t.cir %s
33

4-
// CHECK: !ty_22struct2EZero22 = !cir.struct<"struct.Zero" {!u8i}>
5-
// CHECK: !ty_22struct2Eyep_22 = !cir.struct<"struct.yep_" {!u32i, !u32i}>
4+
// CHECK: !ty_22Zero22 = !cir.struct<struct "Zero" {!u8i}>
5+
// CHECK: !ty_22yep_22 = !cir.struct<struct "yep_" {!u32i, !u32i}>
66

77
struct Zero {
88
void yolo();
@@ -15,9 +15,9 @@ void f() {
1515
}
1616

1717
// CHECK: cir.func @_Z1fv()
18-
// CHECK: %0 = cir.alloca !ty_22struct2EZero22, cir.ptr <!ty_22struct2EZero22>, ["z0", init]
19-
// CHECK: %1 = cir.alloca !ty_22struct2EZero22, cir.ptr <!ty_22struct2EZero22>, ["z1"]
20-
// CHECK: cir.call @_ZN4ZeroC1Ev(%0) : (!cir.ptr<!ty_22struct2EZero22>) -> ()
18+
// CHECK: %0 = cir.alloca !ty_22Zero22, cir.ptr <!ty_22Zero22>, ["z0", init]
19+
// CHECK: %1 = cir.alloca !ty_22Zero22, cir.ptr <!ty_22Zero22>, ["z1"]
20+
// CHECK: cir.call @_ZN4ZeroC1Ev(%0) : (!cir.ptr<!ty_22Zero22>) -> ()
2121
// CHECK: cir.return
2222

2323
typedef enum xxy_ {
@@ -34,11 +34,11 @@ typedef struct yep_ {
3434
void use() { yop{}; }
3535

3636
// CHECK: cir.func @_Z3usev()
37-
// CHECK: %0 = cir.alloca !ty_22struct2Eyep_22, cir.ptr <!ty_22struct2Eyep_22>, ["agg.tmp0"] {alignment = 4 : i64}
38-
// CHECK: %1 = "cir.struct_element_addr"(%0) {member_index = 0 : index, member_name = "Status"} : (!cir.ptr<!ty_22struct2Eyep_22>) -> !cir.ptr<!u32i>
37+
// CHECK: %0 = cir.alloca !ty_22yep_22, cir.ptr <!ty_22yep_22>, ["agg.tmp0"] {alignment = 4 : i64}
38+
// CHECK: %1 = "cir.struct_element_addr"(%0) {member_index = 0 : index, member_name = "Status"} : (!cir.ptr<!ty_22yep_22>) -> !cir.ptr<!u32i>
3939
// CHECK: %2 = cir.const(#cir.int<0> : !u32i) : !u32i
4040
// CHECK: cir.store %2, %1 : !u32i, cir.ptr <!u32i>
41-
// CHECK: %3 = "cir.struct_element_addr"(%0) {member_index = 1 : index, member_name = "HC"} : (!cir.ptr<!ty_22struct2Eyep_22>) -> !cir.ptr<!u32i>
41+
// CHECK: %3 = "cir.struct_element_addr"(%0) {member_index = 1 : index, member_name = "HC"} : (!cir.ptr<!ty_22yep_22>) -> !cir.ptr<!u32i>
4242
// CHECK: %4 = cir.const(#cir.int<0> : !u32i) : !u32i
4343
// CHECK: cir.store %4, %3 : !u32i, cir.ptr <!u32i>
4444
// CHECK: cir.return
@@ -64,16 +64,16 @@ void yo() {
6464
}
6565

6666
// CHECK: cir.func @_Z2yov()
67-
// CHECK: %0 = cir.alloca !ty_22struct2EYo22, cir.ptr <!ty_22struct2EYo22>, ["ext"] {alignment = 8 : i64}
68-
// CHECK: %1 = cir.alloca !ty_22struct2EYo22, cir.ptr <!ty_22struct2EYo22>, ["ext2", init] {alignment = 8 : i64}
69-
// CHECK: %2 = cir.const(#cir.const_struct<{#cir.int<1000070000> : !u32i, #cir.null : !cir.ptr<!void>, #cir.int<0> : !u64i}> : !ty_22struct2EYo22) : !ty_22struct2EYo22
70-
// CHECK: cir.store %2, %0 : !ty_22struct2EYo22, cir.ptr <!ty_22struct2EYo22>
71-
// CHECK: %3 = "cir.struct_element_addr"(%1) {member_index = 0 : index, member_name = "type"} : (!cir.ptr<!ty_22struct2EYo22>) -> !cir.ptr<!u32i>
67+
// CHECK: %0 = cir.alloca !ty_22Yo22, cir.ptr <!ty_22Yo22>, ["ext"] {alignment = 8 : i64}
68+
// CHECK: %1 = cir.alloca !ty_22Yo22, cir.ptr <!ty_22Yo22>, ["ext2", init] {alignment = 8 : i64}
69+
// CHECK: %2 = cir.const(#cir.const_struct<{#cir.int<1000070000> : !u32i, #cir.null : !cir.ptr<!void>, #cir.int<0> : !u64i}> : !ty_22Yo22) : !ty_22Yo22
70+
// CHECK: cir.store %2, %0 : !ty_22Yo22, cir.ptr <!ty_22Yo22>
71+
// CHECK: %3 = "cir.struct_element_addr"(%1) {member_index = 0 : index, member_name = "type"} : (!cir.ptr<!ty_22Yo22>) -> !cir.ptr<!u32i>
7272
// CHECK: %4 = cir.const(#cir.int<1000066001> : !u32i) : !u32i
7373
// CHECK: cir.store %4, %3 : !u32i, cir.ptr <!u32i>
74-
// CHECK: %5 = "cir.struct_element_addr"(%1) {member_index = 1 : index, member_name = "next"} : (!cir.ptr<!ty_22struct2EYo22>) -> !cir.ptr<!cir.ptr<!void>>
75-
// CHECK: %6 = cir.cast(bitcast, %0 : !cir.ptr<!ty_22struct2EYo22>), !cir.ptr<!void>
74+
// CHECK: %5 = "cir.struct_element_addr"(%1) {member_index = 1 : index, member_name = "next"} : (!cir.ptr<!ty_22Yo22>) -> !cir.ptr<!cir.ptr<!void>>
75+
// CHECK: %6 = cir.cast(bitcast, %0 : !cir.ptr<!ty_22Yo22>), !cir.ptr<!void>
7676
// CHECK: cir.store %6, %5 : !cir.ptr<!void>, cir.ptr <!cir.ptr<!void>>
77-
// CHECK: %7 = "cir.struct_element_addr"(%1) {member_index = 2 : index, member_name = "createFlags"} : (!cir.ptr<!ty_22struct2EYo22>) -> !cir.ptr<!u64i>
77+
// CHECK: %7 = "cir.struct_element_addr"(%1) {member_index = 2 : index, member_name = "createFlags"} : (!cir.ptr<!ty_22Yo22>) -> !cir.ptr<!u64i>
7878
// CHECK: %8 = cir.const(#cir.int<0> : !u64i) : !u64i
7979
// CHECK: cir.store %8, %7 : !u64i, cir.ptr <!u64i>

clang/test/CIR/CodeGen/array.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
struct S {
66
int i;
77
} arr[3] = {{1}};
8-
// CHECK: cir.global external @arr = #cir.const_array<[#cir.const_struct<{#cir.int<1> : !s32i}> : !ty_22struct2ES22, #cir.zero : !ty_22struct2ES22, #cir.zero : !ty_22struct2ES22]> : !cir.array<!ty_22struct2ES22 x 3>
8+
// CHECK: cir.global external @arr = #cir.const_array<[#cir.const_struct<{#cir.int<1> : !s32i}> : !ty_22S22, #cir.zero : !ty_22S22, #cir.zero : !ty_22S22]> : !cir.array<!ty_22S22 x 3>

clang/test/CIR/CodeGen/array.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ int globalNullArr[] = {0, 0};
7070
struct S {
7171
int i;
7272
} arr[3] = {{1}};
73-
// CHECK: cir.global external @arr = #cir.const_array<[#cir.const_struct<{#cir.int<1> : !s32i}> : !ty_22struct2ES22, #cir.zero : !ty_22struct2ES22, #cir.zero : !ty_22struct2ES22]> : !cir.array<!ty_22struct2ES22 x 3>
73+
// CHECK: cir.global external @arr = #cir.const_array<[#cir.const_struct<{#cir.int<1> : !s32i}> : !ty_22S22, #cir.zero : !ty_22S22, #cir.zero : !ty_22S22]> : !cir.array<!ty_22S22 x 3>
7474

7575
void testPointerDecaySubscriptAccess(int arr[]) {
7676
// CHECK: cir.func @{{.+}}testPointerDecaySubscriptAccess

0 commit comments

Comments
 (0)