Skip to content

Commit d6c0f3a

Browse files
committed
update printing/parsing
1 parent ffe23ba commit d6c0f3a

File tree

9 files changed

+38
-83
lines changed

9 files changed

+38
-83
lines changed

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,9 +1370,7 @@ def CIR_CXXCtorAttr
13701370
let parameters = (ins "mlir::Type":$type,
13711371
EnumParameter<CIR_CtorKind>:$ctorKind);
13721372
let assemblyFormat = [{
1373-
`<`
1374-
$type `,` $ctorKind
1375-
`>`
1373+
`<` $type `,` $ctorKind `>`
13761374
}];
13771375
let builders =
13781376
[AttrBuilderWithInferredContext<(ins "mlir::Type":$type,
@@ -1389,9 +1387,7 @@ def CIR_CXXDtorAttr
13891387
}];
13901388
let parameters = (ins "mlir::Type":$type);
13911389
let assemblyFormat = [{
1392-
`<`
1393-
$type
1394-
`>`
1390+
`<` $type `>`
13951391
}];
13961392
let builders =
13971393
[AttrBuilderWithInferredContext<(ins "mlir::Type":$type), [{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3661,8 +3661,8 @@ def FuncOp : CIR_Op<"func", [
36613661
OptionalAttr<GlobalCtorAttr>:$global_ctor,
36623662
OptionalAttr<GlobalDtorAttr>:$global_dtor,
36633663
OptionalAttr<ArrayAttr>:$annotations,
3664-
OptionalAttr<AnyASTFunctionDeclAttr>:$ast,
3665-
OptionalAttr<CIR_CXXSpecialMemberAttr>:$cxx_special_member
3664+
OptionalAttr<CIR_CXXSpecialMemberAttr>:$cxx_special_member,
3665+
OptionalAttr<AnyASTFunctionDeclAttr>:$ast
36663666
);
36673667

36683668
let regions = (region AnyRegion:$body);

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

Lines changed: 14 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,53 +2619,18 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
26192619
state.addAttribute(annotationsNameAttr, annotations);
26202620
}
26212621

2622-
// Add CXXSpecialMember attributes.
2623-
if (mlir::succeeded(parser.parseOptionalKeyword("ctor"))) {
2622+
// Add CXXSpecialMember attribute.
2623+
if (mlir::succeeded(parser.parseOptionalKeyword("cxx_special_member"))) {
26242624
if (parser.parseLess().failed())
26252625
return failure();
2626-
2627-
mlir::Type type;
2628-
if (parser.parseType(type).failed())
2629-
return failure();
2630-
2631-
bool defaultCtor = false, copyCtor = false;
2632-
if (mlir::succeeded(parser.parseOptionalComma())) {
2633-
if (parser
2634-
.parseCommaSeparatedList([&]() {
2635-
if (mlir::succeeded(parser.parseOptionalKeyword("default")))
2636-
defaultCtor = true;
2637-
else if (mlir::succeeded(parser.parseOptionalKeyword("copy")))
2638-
copyCtor = true;
2639-
else
2640-
return failure();
2641-
return success();
2642-
})
2643-
.failed())
2644-
return failure();
2645-
}
2646-
2626+
cir::CXXCtorAttr ctor;
2627+
if (auto oa = parser.parseOptionalAttribute(ctor); oa.has_value())
2628+
state.addAttribute(cxxSpecialMemberAttr, ctor);
2629+
cir::CXXDtorAttr dtor;
2630+
if (auto oa = parser.parseOptionalAttribute(dtor); oa.has_value())
2631+
state.addAttribute(cxxSpecialMemberAttr, dtor);
26472632
if (parser.parseGreater().failed())
26482633
return failure();
2649-
2650-
cir::CtorKind ctorKind = cir::CtorKind::None;
2651-
if (defaultCtor)
2652-
ctorKind = cir::CtorKind::Default;
2653-
if (copyCtor)
2654-
ctorKind = cir::CtorKind::Copy;
2655-
state.addAttribute(cxxSpecialMemberAttr, CXXCtorAttr::get(type, ctorKind));
2656-
}
2657-
2658-
if (mlir::succeeded(parser.parseOptionalKeyword("dtor"))) {
2659-
if (parser.parseLess().failed())
2660-
return failure();
2661-
2662-
mlir::Type type;
2663-
if (parser.parseType(type).failed())
2664-
return failure();
2665-
if (parser.parseGreater().failed())
2666-
return failure();
2667-
2668-
state.addAttribute(cxxSpecialMemberAttr, CXXDtorAttr::get(type));
26692634
}
26702635

26712636
// If additional attributes are present, parse them.
@@ -2849,18 +2814,12 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
28492814
}
28502815

28512816
if (getCxxSpecialMember()) {
2852-
if (auto cxxCtor = dyn_cast<cir::CXXCtorAttr>(*getCxxSpecialMember())) {
2853-
p << " ctor<" << cxxCtor.getType();
2854-
if (cxxCtor.getCtorKind() == cir::CtorKind::Default)
2855-
p << ", default";
2856-
if (cxxCtor.getCtorKind() == cir::CtorKind::Copy)
2857-
p << ", copy";
2858-
p << '>';
2859-
}
2860-
2861-
if (auto cxxDtor = dyn_cast<cir::CXXDtorAttr>(*getCxxSpecialMember())) {
2862-
p << " dtor<" << cxxDtor.getType() << ">";
2863-
}
2817+
p << " cxx_special_member<";
2818+
if (auto cxxCtor = dyn_cast<cir::CXXCtorAttr>(*getCxxSpecialMember()))
2819+
p.printAttribute(cxxCtor);
2820+
if (auto cxxDtor = dyn_cast<cir::CXXDtorAttr>(*getCxxSpecialMember()))
2821+
p.printAttribute(cxxDtor);
2822+
p << '>';
28642823
}
28652824

28662825
function_interface_impl::printFunctionAttributes(

clang/test/CIR/CodeGen/ctor-alias.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ B::B() {
3737
// CHECK: %1 = cir.load %0 : !cir.ptr<!cir.ptr<!rec_B>>, !cir.ptr<!rec_B>
3838
// CHECK: cir.return
3939
// CHECK: }
40-
// CHECK: cir.func private dso_local @_ZN1BC1Ev(!cir.ptr<!rec_B>) ctor<!rec_B, default> alias(@_ZN1BC2Ev)
40+
// CHECK: cir.func private dso_local @_ZN1BC1Ev(!cir.ptr<!rec_B>) cxx_special_member<#cir.cxx_ctor<!rec_B, default>> alias(@_ZN1BC2Ev)

clang/test/CIR/CodeGen/static.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ static Init __ioinit(true);
1717
static Init __ioinit2(false);
1818

1919
// BEFORE: module {{.*}} {
20-
// BEFORE-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!rec_Init>, !cir.bool) ctor<!rec_Init>
21-
// BEFORE-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!rec_Init>) dtor<!rec_Init>
20+
// BEFORE-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!rec_Init>, !cir.bool) cxx_special_member<#cir.cxx_ctor<!rec_Init, none>
21+
// BEFORE-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!rec_Init>) cxx_special_member<#cir.cxx_dtor<!rec_Init>
2222
// BEFORE-NEXT: cir.global "private" internal dso_local @_ZL8__ioinit = ctor : !rec_Init {
2323
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!rec_Init>
2424
// BEFORE-NEXT: %1 = cir.const #true
@@ -41,8 +41,8 @@ static Init __ioinit2(false);
4141
// AFTER: module {{.*}} attributes {{.*}}cir.global_ctors = [#cir.global_ctor<"__cxx_global_var_init", 65536>, #cir.global_ctor<"__cxx_global_var_init.1", 65536>]
4242
// AFTER-NEXT: cir.global "private" external @__dso_handle : i8
4343
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
44-
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!rec_Init>, !cir.bool) ctor<!rec_Init>
45-
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!rec_Init>) dtor<!rec_Init>
44+
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!rec_Init>, !cir.bool) cxx_special_member<#cir.cxx_ctor<!rec_Init, none>
45+
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!rec_Init>) cxx_special_member<#cir.cxx_dtor<!rec_Init>
4646
// AFTER-NEXT: cir.global "private" internal dso_local @_ZL8__ioinit = #cir.zero : !rec_Init {alignment = 1 : i64, ast = #cir.var.decl.ast}
4747
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init()
4848
// AFTER-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!rec_Init>

clang/test/CIR/CodeGen/temporaries.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ void f() {
1414
!E();
1515
}
1616

17-
// CIR: cir.func private @_ZN1EC1Ev(!cir.ptr<!rec_E>) ctor<!rec_E, default> extra(#fn_attr)
17+
// CIR: cir.func private @_ZN1EC1Ev(!cir.ptr<!rec_E>) cxx_special_member<#cir.cxx_ctor<!rec_E, default>> extra(#fn_attr)
1818
// CIR-NEXT: cir.func private @_ZN1EntEv(!cir.ptr<!rec_E>) -> !rec_E
19-
// CIR-NEXT: cir.func private @_ZN1ED1Ev(!cir.ptr<!rec_E>) dtor<!rec_E> extra(#fn_attr)
19+
// CIR-NEXT: cir.func private @_ZN1ED1Ev(!cir.ptr<!rec_E>) cxx_special_member<#cir.cxx_dtor<!rec_E>> extra(#fn_attr)
2020
// CIR-NEXT: cir.func dso_local @_Z1fv() extra(#fn_attr1) {
2121
// CIR-NEXT: cir.scope {
2222
// CIR-NEXT: %[[ONE:[0-9]+]] = cir.alloca !rec_E, !cir.ptr<!rec_E>, ["agg.tmp.ensured"] {alignment = 1 : i64}

clang/test/CIR/CodeGen/tempref.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
struct A { ~A(); };
77
A &&a = dynamic_cast<A&&>(A{});
88

9-
// CHECK: cir.func private @_ZN1AD1Ev(!cir.ptr<!rec_A>) dtor<!rec_A> extra(#fn_attr)
9+
// CHECK: cir.func private @_ZN1AD1Ev(!cir.ptr<!rec_A>) cxx_special_member<#cir.cxx_dtor<!rec_A>> extra(#fn_attr)
1010
// CHECK-NEXT: cir.global external @a = #cir.ptr<null> : !cir.ptr<!rec_A> {alignment = 8 : i64, ast = #cir.var.decl.ast}
1111
// CHECK-NEXT: cir.func internal private @__cxx_global_var_init() {
1212
// CHECK-NEXT: cir.scope {

clang/test/CIR/CodeGen/virtual-destructor-calls.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct B : A {
3232
// LLVM: call void @_ZN1AD2Ev
3333

3434
// Complete dtor: just an alias because there are no virtual bases.
35-
// CIR: cir.func private dso_local @_ZN1BD1Ev(!cir.ptr<!rec_B>) dtor<!rec_B> alias(@_ZN1BD2Ev)
35+
// CIR: cir.func private dso_local @_ZN1BD1Ev(!cir.ptr<!rec_B>) cxx_special_member<#cir.cxx_dtor<!rec_B>> alias(@_ZN1BD2Ev)
3636
// FIXME: LLVM output should be: @_ZN1BD1Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN1BD2Ev
3737
// LLVM: declare dso_local void @_ZN1BD1Ev(ptr)
3838

@@ -43,11 +43,11 @@ struct B : A {
4343

4444
// (aliases from C)
4545
// CIR: cir.func dso_local @_ZN1CD2Ev(%arg0: !cir.ptr<!rec_C>{{.*}})) {{.*}} {
46-
// CIR: cir.func private dso_local @_ZN1CD1Ev(!cir.ptr<!rec_C>) dtor<!rec_C> alias(@_ZN1CD2Ev)
46+
// CIR: cir.func private dso_local @_ZN1CD1Ev(!cir.ptr<!rec_C>) cxx_special_member<#cir.cxx_dtor<!rec_C>> alias(@_ZN1CD2Ev)
4747

4848
// CIR_O1-NOT: cir.func dso_local @_ZN1CD2Ev(%arg0: !cir.ptr<!rec_C>{{.*}})) {{.*}} {
49-
// CIR_O1: cir.func private dso_local @_ZN1CD2Ev(!cir.ptr<!rec_C>) dtor<!rec_C> alias(@_ZN1BD2Ev)
50-
// CIR_O1: cir.func private dso_local @_ZN1CD1Ev(!cir.ptr<!rec_C>) dtor<!rec_C> alias(@_ZN1CD2Ev)
49+
// CIR_O1: cir.func private dso_local @_ZN1CD2Ev(!cir.ptr<!rec_C>) cxx_special_member<#cir.cxx_dtor<!rec_C>> alias(@_ZN1BD2Ev)
50+
// CIR_O1: cir.func private dso_local @_ZN1CD1Ev(!cir.ptr<!rec_C>) cxx_special_member<#cir.cxx_dtor<!rec_C>> alias(@_ZN1CD2Ev)
5151

5252
// FIXME: LLVM output should be: @_ZN1CD2Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN1BD2Ev
5353
// LLVM: define dso_local void @_ZN1CD2Ev(ptr

clang/test/CIR/IR/cxx-special-member.cir

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
!s32i = !cir.int<s, 32>
55
!rec_S = !cir.record<struct "S" {!s32i}>
66
module {
7-
cir.func private @_ZN1SC1ERKS_(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) ctor<!rec_S, copy>
8-
cir.func private @_ZN1SC2Ei(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) ctor<!rec_S>
9-
cir.func private @_ZN1SC2Ev(!cir.ptr<!rec_S>) ctor<!rec_S, default>
10-
cir.func private @_ZN1SD2Ev(!cir.ptr<!rec_S>) dtor<!rec_S>
7+
cir.func private @_ZN1SC1ERKS_(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, copy>>
8+
cir.func private @_ZN1SC2Ei(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, none>>
9+
cir.func private @_ZN1SC2Ev(!cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, default>>
10+
cir.func private @_ZN1SD2Ev(!cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_dtor<!rec_S>>
1111
}
1212

1313
// CHECK: !s32i = !cir.int<s, 32>
1414
// CHECK: !rec_S = !cir.record<struct "S" {!s32i}>
1515
// CHECK: module {
16-
// CHECK: cir.func private @_ZN1SC1ERKS_(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) ctor<!rec_S, copy>
17-
// CHECK: cir.func private @_ZN1SC2Ei(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) ctor<!rec_S>
18-
// CHECK: cir.func private @_ZN1SC2Ev(!cir.ptr<!rec_S>) ctor<!rec_S, default>
19-
// CHECK: cir.func private @_ZN1SD2Ev(!cir.ptr<!rec_S>) dtor<!rec_S>
16+
// CHECK: cir.func private @_ZN1SC1ERKS_(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, copy>>
17+
// CHECK: cir.func private @_ZN1SC2Ei(!cir.ptr<!rec_S>, !cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, none>>
18+
// CHECK: cir.func private @_ZN1SC2Ev(!cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_ctor<!rec_S, default>>
19+
// CHECK: cir.func private @_ZN1SD2Ev(!cir.ptr<!rec_S>) cxx_special_member<#cir.cxx_dtor<!rec_S>>
2020
// CHECK: }

0 commit comments

Comments
 (0)