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