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