Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 18 additions & 21 deletions clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
Original file line number Diff line number Diff line change
Expand Up @@ -918,42 +918,39 @@ def CIR_DynamicCastInfoAttr : CIR_Attr<"DynamicCastInfo", "dyn_cast_info"> {
let description = [{
Provide ABI specific information about a dynamic cast operation.

The `srcRtti` and the `destRtti` parameters give the RTTI of the source
The `src_rtti` and the `dest_rtti` parameters give the RTTI of the source
record type and the destination record type, respectively.

The `runtimeFunc` parameter gives the `__dynamic_cast` function which is
provided by the runtime. The `badCastFunc` parameter gives the
The `runtime_func` parameter gives the `__dynamic_cast` function which is
provided by the runtime. The `bad_cast_func` parameter gives the
`__cxa_bad_cast` function which is also provided by the runtime.

The `offsetHint` parameter gives the hint value that should be passed to the
`__dynamic_cast` runtime function.
The `offset_hint` parameter gives the hint value that should be passed to
the `__dynamic_cast` runtime function.
}];

let parameters = (ins
CIR_GlobalViewAttr:$srcRtti,
CIR_GlobalViewAttr:$destRtti,
"mlir::FlatSymbolRefAttr":$runtimeFunc,
"mlir::FlatSymbolRefAttr":$badCastFunc,
CIR_IntAttr:$offsetHint
CIR_GlobalViewAttr:$src_rtti,
CIR_GlobalViewAttr:$dest_rtti,
"mlir::FlatSymbolRefAttr":$runtime_func,
"mlir::FlatSymbolRefAttr":$bad_cast_func,
CIR_IntAttr:$offset_hint
);

let builders = [
AttrBuilderWithInferredContext<(ins "GlobalViewAttr":$srcRtti,
"GlobalViewAttr":$destRtti,
"mlir::FlatSymbolRefAttr":$runtimeFunc,
"mlir::FlatSymbolRefAttr":$badCastFunc,
"IntAttr":$offsetHint), [{
return $_get(srcRtti.getContext(), srcRtti, destRtti, runtimeFunc,
badCastFunc, offsetHint);
AttrBuilderWithInferredContext<(ins "GlobalViewAttr":$src_rtti,
"GlobalViewAttr":$dest_rtti,
"mlir::FlatSymbolRefAttr":$runtime_func,
"mlir::FlatSymbolRefAttr":$bad_cast_func,
"IntAttr":$offset_hint), [{
return $_get(src_rtti.getContext(), src_rtti, dest_rtti, runtime_func,
bad_cast_func, offset_hint);
}]>,
];

let genVerifyDecl = 1;
let assemblyFormat = [{
`<`
qualified($srcRtti) `,` qualified($destRtti) `,`
$runtimeFunc `,` $badCastFunc `,` qualified($offsetHint)
`>`
`<` struct(qualified($src_rtti), qualified($dest_rtti), $runtime_func, $bad_cast_func, qualified($offset_hint)) `>`
}];

let extraClassDeclaration = [{
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CIR/CodeGen/dynamic-cast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct Base {

struct Derived : Base {};

// BEFORE-DAG: #dyn_cast_info__ZTI4Base__ZTI7Derived = #cir.dyn_cast_info<#cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, @__dynamic_cast, @__cxa_bad_cast, #cir.int<0> : !s64i>
// BEFORE-DAG: #dyn_cast_info__ZTI4Base__ZTI7Derived = #cir.dyn_cast_info<src_rtti = #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, dest_rtti = #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, runtime_func = @__dynamic_cast, bad_cast_func = @__cxa_bad_cast, offset_hint = #cir.int<0> : !s64i>
// BEFORE-DAG: !rec_Base = !cir.record
// BEFORE-DAG: !rec_Derived = !cir.record

Expand Down
59 changes: 59 additions & 0 deletions clang/test/CIR/IR/dynamic-cast.cir
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// RUN: cir-opt --verify-roundtrip %s | FileCheck %s

!s64i = !cir.int<s, 64>
!u8i = !cir.int<u, 8>
!void = !cir.void

!rec_Base = !cir.record<struct "Base" {!cir.vptr}>
!rec_Derived = !cir.record<struct "Derived" {!rec_Base}>

#dyn_cast_info__ZTI4Base__ZTI7Derived = #cir.dyn_cast_info<src_rtti = #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, dest_rtti = #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, runtime_func = @__dynamic_cast, bad_cast_func = @__cxa_bad_cast, offset_hint = #cir.int<0> : !s64i>

// CHECK: #dyn_cast_info__ZTI4Base__ZTI7Derived = #cir.dyn_cast_info<src_rtti = #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, dest_rtti = #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, runtime_func = @__dynamic_cast, bad_cast_func = @__cxa_bad_cast, offset_hint = #cir.int<0> : !s64i>

module {
cir.global "private" constant external @_ZTI4Base : !cir.ptr<!u8i>
cir.global "private" constant external @_ZTI7Derived : !cir.ptr<!u8i>
cir.func private @__dynamic_cast(!cir.ptr<!void>, !cir.ptr<!u8i>, !cir.ptr<!u8i>, !s64i) -> !cir.ptr<!void>
cir.func private @__cxa_bad_cast()

cir.func @test_ptr_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!rec_Derived> {
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!rec_Derived> #dyn_cast_info__ZTI4Base__ZTI7Derived
cir.return %0 : !cir.ptr<!rec_Derived>
}

// CHECK: cir.func @test_ptr_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!rec_Derived> {
// CHECK: %0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!rec_Derived> #dyn_cast_info__ZTI4Base__ZTI7Derived
// CHECK: cir.return %0 : !cir.ptr<!rec_Derived>
// CHECK: }

cir.func @test_ref_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!rec_Derived> {
%0 = cir.dyn_cast ref %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!rec_Derived> #dyn_cast_info__ZTI4Base__ZTI7Derived
cir.return %0 : !cir.ptr<!rec_Derived>
}

// CHECK: cir.func @test_ref_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!rec_Derived> {
// CHECK: %0 = cir.dyn_cast ref %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!rec_Derived> #dyn_cast_info__ZTI4Base__ZTI7Derived
// CHECK: cir.return %0 : !cir.ptr<!rec_Derived>
// CHECK: }

cir.func dso_local @test_cast_to_void(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!void> {
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!void>
cir.return %0 : !cir.ptr<!void>
}

// CHECK: cir.func dso_local @test_cast_to_void(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!void> {
// CHECK: %0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!void>
// CHECK: cir.return %0 : !cir.ptr<!void>
// CHECK: }

cir.func dso_local @test_relative_layout_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!void> {
%0 = cir.dyn_cast ptr relative_layout %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!void>
cir.return %0 : !cir.ptr<!void>
}

// CHECK: cir.func dso_local @test_relative_layout_cast(%arg0: !cir.ptr<!rec_Base>) -> !cir.ptr<!void> {
// CHECK: %0 = cir.dyn_cast ptr relative_layout %arg0 : !cir.ptr<!rec_Base> -> !cir.ptr<!void>
// CHECK: cir.return %0 : !cir.ptr<!void>
// CHECK: }
}
4 changes: 2 additions & 2 deletions clang/test/CIR/IR/invalid.cir
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,7 @@ module {
cir.func private @__cxa_bad_cast()
cir.func @test(%arg0 : !cir.ptr<!Base>) {
// expected-error@+1 {{srcRtti must be an RTTI pointer}}
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!Base> -> !cir.ptr<!Derived> #cir.dyn_cast_info<#cir.global_view<@_ZTI4Base> : !cir.ptr<!u32i>, #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, @__dynamic_cast, @__cxa_bad_cast, #cir.int<0> : !s64i>
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!Base> -> !cir.ptr<!Derived> #cir.dyn_cast_info<src_rtti = #cir.global_view<@_ZTI4Base> : !cir.ptr<!u32i>, dest_rtti = #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u8i>, runtime_func = @__dynamic_cast, bad_cast_func = @__cxa_bad_cast, offset_hint = #cir.int<0> : !s64i>
}
}

Expand All @@ -1214,7 +1214,7 @@ module {
cir.func private @__cxa_bad_cast()
cir.func @test(%arg0 : !cir.ptr<!Base>) {
// expected-error@+1 {{destRtti must be an RTTI pointer}}
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!Base> -> !cir.ptr<!Derived> #cir.dyn_cast_info<#cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u32i>, @__dynamic_cast, @__cxa_bad_cast, #cir.int<0> : !s64i>
%0 = cir.dyn_cast ptr %arg0 : !cir.ptr<!Base> -> !cir.ptr<!Derived> #cir.dyn_cast_info<src_rtti = #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>, dest_rtti = #cir.global_view<@_ZTI7Derived> : !cir.ptr<!u32i>, runtime_func = @__dynamic_cast, bad_cast_func = @__cxa_bad_cast, offset_hint = #cir.int<0> : !s64i>
}
}

Expand Down
Loading