1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -fno-rtti -triple=i386-pc-win32 -emit-llvm -o - | FileCheck %s
258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// For now, just make sure x86_64 doesn't crash.
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -fno-rtti -triple=x86_64-pc-win32 -emit-llvm -o %t
558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct A {
758b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  virtual void f();
858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
958b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
1058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct B {
1158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  virtual void f();
1258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
1358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
1458b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct C : A, B {};
1558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
1658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct D : virtual C {
1758b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  D();
1858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  ~D();
1958b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  virtual void f();
2058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  void g();
2158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  int xxx;
2258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
2358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
2458b6db76adab8dee2e64fbc300360f9b46c561baTimur IskhodzhanovD::D() {}  // Forces vftable emission.
2558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPM@A@AEXXZ"
273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ECX:.*]] = load %struct.D*, %struct.D** %{{.*}}
2858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
3058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
3258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
3458b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
3558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: ret void
3658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPI@3AEXXZ"
383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ECX:.*]] = load %struct.D*, %struct.D** %{{.*}}
3958b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -8
4158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
4358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -4
4658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
4758b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: ret void
4858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
4958b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct E : virtual A {
5058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  virtual void f();
5158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  ~E();
5258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
5358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
5458b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct F {
5558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  virtual void z();
5658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
5758b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
5858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanovstruct G : virtual F, virtual E {
5958b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  int ggg;
6058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  G();
6158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov  ~G();
6258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov};
6358b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
6458b6db76adab8dee2e64fbc300360f9b46c561baTimur IskhodzhanovG::G() {}  // Forces vftable emission.
6558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov
66c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@E@@$R4BA@M@PPPPPPPM@7AEXXZ"(i8*)
673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ECX:.*]] = load %struct.E*, %struct.E** %{{.*}}
6858b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[ECX_i8:.*]] = bitcast %struct.E* %[[ECX]] to i8*
693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
7058b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP:.*]] = load i32, i32* %[[VTORDISP_PTR]]
7258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VBPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -16
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: %[[VBPTR:.*]] = bitcast i8* %[[VBPTR_i8]] to i32**
763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VBTABLE:.*]] = load i32*, i32** %[[VBPTR]]
773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VBOFFSET_PTR:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 3
783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VBASE_OFFSET:.*]] = load i32, i32* %[[VBOFFSET_PTR]]
793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8, i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[ARG_i8:.*]] = getelementptr i8, i8* %[[VBASE]], i32 8
8158b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: call x86_thiscallcc void @"\01?f@E@@UAEXXZ"(i8* %[[ARG_i8]])
8258b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov// CHECK: ret void
83