xref: /aosp_15_r20/external/llvm/test/CodeGen/WebAssembly/vtable.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false | FileCheck %s --check-prefix=TYPEINFONAME
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false | FileCheck %s --check-prefix=VTABLE
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false | FileCheck %s --check-prefix=TYPEINFO
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test that simple vtables assemble as expected.
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker; The class hierarchy is:
8*9880d681SAndroid Build Coastguard Worker;   struct A;
9*9880d681SAndroid Build Coastguard Worker;   struct B : public A;
10*9880d681SAndroid Build Coastguard Worker;   struct C : public A;
11*9880d681SAndroid Build Coastguard Worker;   struct D : public B;
12*9880d681SAndroid Build Coastguard Worker; Each with a virtual dtor and method foo.
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
15*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown"
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker%struct.A = type { i32 (...)** }
18*9880d681SAndroid Build Coastguard Worker%struct.B = type { %struct.A }
19*9880d681SAndroid Build Coastguard Worker%struct.C = type { %struct.A }
20*9880d681SAndroid Build Coastguard Worker%struct.D = type { %struct.B }
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker@_ZTVN10__cxxabiv117__class_type_infoE = external global i8*
23*9880d681SAndroid Build Coastguard Worker@_ZTVN10__cxxabiv120__si_class_type_infoE = external global i8*
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-LABEL: _ZTS1A:
26*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-NEXT: .asciz "1A"
27*9880d681SAndroid Build Coastguard Worker@_ZTS1A = constant [3 x i8] c"1A\00"
28*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-LABEL: _ZTS1B:
29*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-NEXT: .asciz "1B"
30*9880d681SAndroid Build Coastguard Worker@_ZTS1B = constant [3 x i8] c"1B\00"
31*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-LABEL: _ZTS1C:
32*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-NEXT: .asciz "1C"
33*9880d681SAndroid Build Coastguard Worker@_ZTS1C = constant [3 x i8] c"1C\00"
34*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-LABEL: _ZTS1D:
35*9880d681SAndroid Build Coastguard Worker; TYPEINFONAME-NEXT: .asciz "1D"
36*9880d681SAndroid Build Coastguard Worker@_ZTS1D = constant [3 x i8] c"1D\00"
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; VTABLE:       .type _ZTV1A,@object
39*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .section .data.rel.ro,"aw",@progbits
40*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .globl _ZTV1A
41*9880d681SAndroid Build Coastguard Worker; VTABLE-LABEL: _ZTV1A:
42*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 0
43*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZTI1A
44*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1AD2Ev
45*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1AD0Ev
46*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1A3fooEv
47*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .size _ZTV1A, 20
48*9880d681SAndroid Build Coastguard Worker@_ZTV1A = constant [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast (%struct.A* (%struct.A*)* @_ZN1AD2Ev to i8*), i8* bitcast (void (%struct.A*)* @_ZN1AD0Ev to i8*), i8* bitcast (void (%struct.A*)* @_ZN1A3fooEv to i8*)], align 4
49*9880d681SAndroid Build Coastguard Worker; VTABLE:       .type _ZTV1B,@object
50*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .globl _ZTV1B
51*9880d681SAndroid Build Coastguard Worker; VTABLE-LABEL: _ZTV1B:
52*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 0
53*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZTI1B
54*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1AD2Ev
55*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1BD0Ev
56*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1B3fooEv
57*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .size _ZTV1B, 20
58*9880d681SAndroid Build Coastguard Worker@_ZTV1B = constant [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1B to i8*), i8* bitcast (%struct.A* (%struct.A*)* @_ZN1AD2Ev to i8*), i8* bitcast (void (%struct.B*)* @_ZN1BD0Ev to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B3fooEv to i8*)], align 4
59*9880d681SAndroid Build Coastguard Worker; VTABLE:       .type _ZTV1C,@object
60*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .globl _ZTV1C
61*9880d681SAndroid Build Coastguard Worker; VTABLE-LABEL: _ZTV1C:
62*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 0
63*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZTI1C
64*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1AD2Ev
65*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1CD0Ev
66*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1C3fooEv
67*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .size _ZTV1C, 20
68*9880d681SAndroid Build Coastguard Worker@_ZTV1C = constant [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1C to i8*), i8* bitcast (%struct.A* (%struct.A*)* @_ZN1AD2Ev to i8*), i8* bitcast (void (%struct.C*)* @_ZN1CD0Ev to i8*), i8* bitcast (void (%struct.C*)* @_ZN1C3fooEv to i8*)], align 4
69*9880d681SAndroid Build Coastguard Worker; VTABLE:       .type _ZTV1D,@object
70*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .globl _ZTV1D
71*9880d681SAndroid Build Coastguard Worker; VTABLE-LABEL: _ZTV1D:
72*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 0
73*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZTI1D
74*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1AD2Ev
75*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1DD0Ev
76*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .int32 _ZN1D3fooEv
77*9880d681SAndroid Build Coastguard Worker; VTABLE-NEXT:  .size _ZTV1D, 20
78*9880d681SAndroid Build Coastguard Worker@_ZTV1D = constant [5 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1D to i8*), i8* bitcast (%struct.A* (%struct.A*)* @_ZN1AD2Ev to i8*), i8* bitcast (void (%struct.D*)* @_ZN1DD0Ev to i8*), i8* bitcast (void (%struct.D*)* @_ZN1D3fooEv to i8*)], align 4
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .type _ZTI1A,@object
81*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .globl _ZTI1A
82*9880d681SAndroid Build Coastguard Worker; TYPEINFO-LABEL: _ZTI1A:
83*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTVN10__cxxabiv117__class_type_infoE+8
84*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTS1A
85*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .size _ZTI1A, 8
86*9880d681SAndroid Build Coastguard Worker@_ZTI1A = constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv117__class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @_ZTS1A, i32 0, i32 0) }
87*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .type _ZTI1B,@object
88*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .globl _ZTI1B
89*9880d681SAndroid Build Coastguard Worker; TYPEINFO-LABEL: _ZTI1B:
90*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTVN10__cxxabiv120__si_class_type_infoE+8
91*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTS1B
92*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTI1A
93*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .size _ZTI1B, 12
94*9880d681SAndroid Build Coastguard Worker@_ZTI1B = constant { i8*, i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__si_class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @_ZTS1B, i32 0, i32 0), i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*) }
95*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .type _ZTI1C,@object
96*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .globl _ZTI1C
97*9880d681SAndroid Build Coastguard Worker; TYPEINFO-LABEL: _ZTI1C:
98*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTVN10__cxxabiv120__si_class_type_infoE+8
99*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTS1C
100*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTI1A
101*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .size _ZTI1C, 12
102*9880d681SAndroid Build Coastguard Worker@_ZTI1C = constant { i8*, i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__si_class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @_ZTS1C, i32 0, i32 0), i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*) }
103*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .type _ZTI1D,@object
104*9880d681SAndroid Build Coastguard Worker; TYPEINFO:       .globl _ZTI1D
105*9880d681SAndroid Build Coastguard Worker; TYPEINFO-LABEL: _ZTI1D:
106*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTVN10__cxxabiv120__si_class_type_infoE+8
107*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTS1D
108*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .int32 _ZTI1B
109*9880d681SAndroid Build Coastguard Worker; TYPEINFO-NEXT:  .size _ZTI1D, 12
110*9880d681SAndroid Build Coastguard Worker@_ZTI1D = constant { i8*, i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv120__si_class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @_ZTS1D, i32 0, i32 0), i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1B to i8*) }
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker@g = global i32 0, align 4
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1A3fooEv(%struct.A* %this) {
115*9880d681SAndroid Build Coastguard Workerentry:
116*9880d681SAndroid Build Coastguard Worker  store i32 2, i32* @g, align 4
117*9880d681SAndroid Build Coastguard Worker  ret void
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1B3fooEv(%struct.B* %this) {
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker  store i32 4, i32* @g, align 4
123*9880d681SAndroid Build Coastguard Worker  ret void
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1C3fooEv(%struct.C* %this) {
127*9880d681SAndroid Build Coastguard Workerentry:
128*9880d681SAndroid Build Coastguard Worker  store i32 6, i32* @g, align 4
129*9880d681SAndroid Build Coastguard Worker  ret void
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1D3fooEv(%struct.D* %this) {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker  store i32 8, i32* @g, align 4
135*9880d681SAndroid Build Coastguard Worker  ret void
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr void @_ZN1AD0Ev(%struct.A* %this) {
139*9880d681SAndroid Build Coastguard Workerentry:
140*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.A* %this to i8*
141*9880d681SAndroid Build Coastguard Worker  tail call void @_ZdlPv(i8* %0)
142*9880d681SAndroid Build Coastguard Worker  ret void
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr void @_ZN1BD0Ev(%struct.B* %this) {
146*9880d681SAndroid Build Coastguard Workerentry:
147*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.B* %this to i8*
148*9880d681SAndroid Build Coastguard Worker  tail call void @_ZdlPv(i8* %0)
149*9880d681SAndroid Build Coastguard Worker  ret void
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr void @_ZN1CD0Ev(%struct.C* %this) {
153*9880d681SAndroid Build Coastguard Workerentry:
154*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.C* %this to i8*
155*9880d681SAndroid Build Coastguard Worker  tail call void @_ZdlPv(i8* %0)
156*9880d681SAndroid Build Coastguard Worker  ret void
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr %struct.A* @_ZN1AD2Ev(%struct.A* returned %this) {
160*9880d681SAndroid Build Coastguard Workerentry:
161*9880d681SAndroid Build Coastguard Worker  ret %struct.A* %this
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr void @_ZN1DD0Ev(%struct.D* %this) {
165*9880d681SAndroid Build Coastguard Workerentry:
166*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.D* %this to i8*
167*9880d681SAndroid Build Coastguard Worker  tail call void @_ZdlPv(i8* %0)
168*9880d681SAndroid Build Coastguard Worker  ret void
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdlPv(i8*)
172