blob: 204da8db1536ee01d7ca005863fa630b8e9175ee [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// RUN: %clang_cc1 %s -fno-rtti -triple=i386-pc-win32 -emit-llvm -o - | FileCheck %s
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +00002
3// For now, just make sure x86_64 doesn't crash.
Stephen Hines651f13c2014-04-23 16:59:28 -07004// RUN: %clang_cc1 %s -fno-rtti -triple=x86_64-pc-win32 -emit-llvm -o %t
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +00005
6struct A {
7 virtual void f();
8};
9
10struct B {
11 virtual void f();
12};
13
14struct C : A, B {};
15
16struct D : virtual C {
17 D();
18 ~D();
19 virtual void f();
20 void g();
21 int xxx;
22};
23
24D::D() {} // Forces vftable emission.
25
Stephen Hinesc568f1e2014-07-21 00:47:37 -070026// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPM@A@AEXXZ"
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070027// CHECK: %[[ECX:.*]] = load %struct.D*, %struct.D** %{{.*}}
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000028// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070029// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000030// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070031// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000032// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070033// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000034// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
35// CHECK: ret void
36
Stephen Hinesc568f1e2014-07-21 00:47:37 -070037// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPI@3AEXXZ"
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070038// CHECK: %[[ECX:.*]] = load %struct.D*, %struct.D** %{{.*}}
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000039// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070040// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -8
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000041// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070042// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000043// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070044// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
45// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -4
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000046// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
47// CHECK: ret void
48
49struct E : virtual A {
50 virtual void f();
51 ~E();
52};
53
54struct F {
55 virtual void z();
56};
57
58struct G : virtual F, virtual E {
59 int ggg;
60 G();
61 ~G();
62};
63
64G::G() {} // Forces vftable emission.
65
Stephen Hinesc568f1e2014-07-21 00:47:37 -070066// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@E@@$R4BA@M@PPPPPPPM@7AEXXZ"(i8*)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070067// CHECK: %[[ECX:.*]] = load %struct.E*, %struct.E** %{{.*}}
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000068// CHECK: %[[ECX_i8:.*]] = bitcast %struct.E* %[[ECX]] to i8*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070069// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000070// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070071// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000072// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070073// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
74// CHECK: %[[VBPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -16
Stephen Hines176edba2014-12-01 14:53:08 -080075// CHECK: %[[VBPTR:.*]] = bitcast i8* %[[VBPTR_i8]] to i32**
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070076// CHECK: %[[VBTABLE:.*]] = load i32*, i32** %[[VBPTR]]
77// CHECK: %[[VBOFFSET_PTR:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 3
78// CHECK: %[[VBASE_OFFSET:.*]] = load i32, i32* %[[VBOFFSET_PTR]]
79// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8, i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
80// CHECK: %[[ARG_i8:.*]] = getelementptr i8, i8* %[[VBASE]], i32 8
Timur Iskhodzhanov58b6db72013-11-06 06:24:31 +000081// CHECK: call x86_thiscallcc void @"\01?f@E@@UAEXXZ"(i8* %[[ARG_i8]])
82// CHECK: ret void