|
| 1 | +// RUN: cir-translate %s -cir-to-llvmir --target x86_64-unknown-linux-gnu -o %t.ll |
| 2 | +// RUN: FileCheck %s --input-file=%t.ll |
| 3 | + |
| 4 | +// Test the lowering of the two forms of vtt.address_point op, as they will |
| 5 | +// appear in constructors. |
| 6 | + |
| 7 | +!u8i = !cir.int<u, 8> |
| 8 | +!void = !cir.void |
| 9 | +!rec_A = !cir.record<struct "A" {!u8i}> |
| 10 | +!rec_B = !cir.record<struct "B" {!cir.vptr}> |
| 11 | +!rec_C = !cir.record<struct "C" {!rec_B}> |
| 12 | +!rec_anon_struct = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 3>}> |
| 13 | +module { |
| 14 | + cir.func private @_ZN1AC2Ev(!cir.ptr<!rec_A>) |
| 15 | + cir.func private @_ZN1BC2Ev(!cir.ptr<!rec_B>, !cir.ptr<!cir.ptr<!void>>) |
| 16 | + cir.func dso_local @_ZN1CC2Ev(%arg0: !cir.ptr<!rec_C>, %arg1: !cir.ptr<!cir.ptr<!void>>) { |
| 17 | + %0 = cir.alloca !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>>, ["this", init] {alignment = 8 : i64} |
| 18 | + %1 = cir.alloca !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!cir.ptr<!cir.ptr<!void>>>, ["vtt", init] {alignment = 8 : i64} |
| 19 | + cir.store %arg0, %0 : !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>> |
| 20 | + cir.store %arg1, %1 : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!cir.ptr<!cir.ptr<!void>>> |
| 21 | + %2 = cir.load %0 : !cir.ptr<!cir.ptr<!rec_C>>, !cir.ptr<!rec_C> |
| 22 | + %3 = cir.load align(8) %1 : !cir.ptr<!cir.ptr<!cir.ptr<!void>>>, !cir.ptr<!cir.ptr<!void>> |
| 23 | + %4 = cir.base_class_addr %2 : !cir.ptr<!rec_C> nonnull [0] -> !cir.ptr<!rec_B> |
| 24 | + %5 = cir.vtt.address_point %3 : !cir.ptr<!cir.ptr<!void>>, offset = 1 -> !cir.ptr<!cir.ptr<!void>> |
| 25 | + cir.call @_ZN1BC2Ev(%4, %5) : (!cir.ptr<!rec_B>, !cir.ptr<!cir.ptr<!void>>) -> () |
| 26 | + %6 = cir.vtt.address_point %3 : !cir.ptr<!cir.ptr<!void>>, offset = 0 -> !cir.ptr<!cir.ptr<!void>> |
| 27 | + %7 = cir.cast(bitcast, %6 : !cir.ptr<!cir.ptr<!void>>), !cir.ptr<!cir.vptr> |
| 28 | + %8 = cir.load align(8) %7 : !cir.ptr<!cir.vptr>, !cir.vptr |
| 29 | + %9 = cir.vtable.get_vptr %2 : !cir.ptr<!rec_C> -> !cir.ptr<!cir.vptr> |
| 30 | + cir.store align(8) %8, %9 : !cir.vptr, !cir.ptr<!cir.vptr> |
| 31 | + cir.return |
| 32 | + } |
| 33 | + |
| 34 | +// CHECK: define{{.*}} void @_ZN1CC2Ev |
| 35 | +// CHECK: %[[VTT:.*]] = getelementptr inbounds i8, ptr %{{.*}}, i32 1 |
| 36 | +// CHECK: call void @_ZN1BC2Ev(ptr %{{.*}}, ptr %[[VTT]]) |
| 37 | + |
| 38 | + cir.global linkonce_odr dso_local @_ZTV1C = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !rec_anon_struct {alignment = 8 : i64} |
| 39 | + cir.global linkonce_odr @_ZTT1C = #cir.const_array<[#cir.global_view<@_ZTV1C, [0 : i32, 3 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTC1C0_1B, [0 : i32, 3 : i32]> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2> {alignment = 8 : i64} |
| 40 | + cir.func dso_local @_ZN1CC1Ev(%arg0: !cir.ptr<!rec_C>) { |
| 41 | + %0 = cir.alloca !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>>, ["this", init] {alignment = 8 : i64} |
| 42 | + cir.store %arg0, %0 : !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>> |
| 43 | + %1 = cir.load %0 : !cir.ptr<!cir.ptr<!rec_C>>, !cir.ptr<!rec_C> |
| 44 | + %2 = cir.base_class_addr %1 : !cir.ptr<!rec_C> nonnull [0] -> !cir.ptr<!rec_A> |
| 45 | + cir.call @_ZN1AC2Ev(%2) : (!cir.ptr<!rec_A>) -> () |
| 46 | + %3 = cir.base_class_addr %1 : !cir.ptr<!rec_C> nonnull [0] -> !cir.ptr<!rec_B> |
| 47 | + %4 = cir.vtt.address_point @_ZTT1C, offset = 1 -> !cir.ptr<!cir.ptr<!void>> |
| 48 | + cir.call @_ZN1BC2Ev(%3, %4) : (!cir.ptr<!rec_B>, !cir.ptr<!cir.ptr<!void>>) -> () |
| 49 | + %5 = cir.vtable.address_point(@_ZTV1C, address_point = <index = 0, offset = 3>) : !cir.vptr |
| 50 | + %6 = cir.vtable.get_vptr %1 : !cir.ptr<!rec_C> -> !cir.ptr<!cir.vptr> |
| 51 | + cir.store align(8) %5, %6 : !cir.vptr, !cir.ptr<!cir.vptr> |
| 52 | + cir.return |
| 53 | + } |
| 54 | + |
| 55 | +// CHECK: define{{.*}} void @_ZN1CC1Ev |
| 56 | +// CHECK: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV1C, i64 24), ptr %{{.*}} |
| 57 | + |
| 58 | + cir.global linkonce_odr dso_local @_ZTC1C0_1B = #cir.const_record<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !rec_anon_struct {alignment = 8 : i64} |
| 59 | +} |
0 commit comments