1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=i386-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK32 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=x86_64-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK64 393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct S { 593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg int x, y, z; 693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg}; 793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// U is not trivially copyable, and requires inalloca to pass by value. 96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct U { 106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int u; 116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines U(); 126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ~U(); 136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines U(const U &); 146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct C { 1793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg virtual void foo(); 1893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg virtual int bar(int, double); 1993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg virtual S baz(int); 206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual S qux(U); 213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar virtual void thud(...); 2293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg}; 2393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 2493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgnamespace { 2593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct D { 2693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg virtual void foo(); 2793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg}; 2893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg} 2993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 3093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgvoid f() { 3193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg void (C::*ptr)(); 3293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg ptr = &C::foo; 3393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg ptr = &C::foo; // Don't crash trying to define the thunk twice :) 3493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 3593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg int (C::*ptr2)(int, double); 3693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg ptr2 = &C::bar; 3793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 3893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg S (C::*ptr3)(int); 3993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg ptr3 = &C::baz; 4093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 4193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg void (D::*ptr4)(); 4293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg ptr4 = &D::foo; 4393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S (C::*ptr5)(U); 456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ptr5 = &C::qux; 466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void (C::*ptr6)(...); 483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ptr6 = &C::thud; 493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32-LABEL: define void @"\01?f@@YAXXZ"() 52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA@AE" to i8*), i8** %ptr 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B3AE" to i8*), i8** %ptr2 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B7AE" to i8*), i8** %ptr3 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%"struct.(anonymous namespace)::D"*, ...)* @"\01??_9D@?A@@$BA@AE" to i8*), i8** %ptr4 5693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: } 5793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// 5893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64-LABEL: define void @"\01?f@@YAXXZ"() 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA@AA" to i8*), i8** %ptr 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B7AA" to i8*), i8** %ptr2 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BBA@AA" to i8*), i8** %ptr3 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%"struct.(anonymous namespace)::D"*, ...)* @"\01??_9D@?A@@$BA@AA" to i8*), i8** %ptr 6393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: } 6493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg} 6593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 6693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 6793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 1st virtual function in C with no parameters. 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BA@AE"(%struct.C* %this, ...) 690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR:[0-9]+]] 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NOT: unnamed_addr 710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: comdat 723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0 733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 7433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void 7693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: } 7793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BA@AA"(%struct.C* %this, ...) 790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR:[0-9]+]] 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NOT: unnamed_addr 810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: comdat 823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0 833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 8433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void 8693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: } 8793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 8893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 2nd virtual function in C, taking int and double as parameters, returning int. 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B3AE"(%struct.C* %this, ...) 900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] comdat 913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1 923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 9333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void 9593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: } 9693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$B7AA"(%struct.C* %this, ...) 980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]] comdat 993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1 1003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 10133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void 10393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: } 10493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 10593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 3rd virtual function in C, taking an int parameter, returning a struct. 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B7AE"(%struct.C* %this, ...) 1070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] comdat 1083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2 1093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 11033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void 11293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: } 11393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// 114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBA@AA"(%struct.C* %this, ...) 1150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]] comdat 1163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2 1173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 11833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void 12093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: } 12193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg 12293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the virtual function in internal class D. 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define internal x86_thiscallcc void @"\01??_9D@?A@@$BA@AE"(%"struct.(anonymous namespace)::D"* %this, ...) 1240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] 1253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0 1263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]] 12733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%"struct.(anonymous namespace)::D"*, ...) [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...) 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void 12993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: } 13093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define internal void @"\01??_9D@?A@@$BA@AA"(%"struct.(anonymous namespace)::D"* %this, ...) 1320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]] 1333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0 1343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]] 13533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%"struct.(anonymous namespace)::D"*, ...) [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...) 136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK64: } 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Thunk for calling the fourth virtual function in C, taking a struct parameter 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// and returning a struct. 1410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BM@AE"(%struct.C* %this, ...) {{.*}} comdat 1423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3 1433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 14433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK32: } 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// 1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBI@AA"(%struct.C* %this, ...) {{.*}} comdat 1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3 1503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 15133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 1523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: ret void 1533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: } 1543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 1553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// Thunk for calling the fifth virtual function in C which uses the __cdecl calling convention. 1563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32-LABEL: define linkonce_odr void @"\01??_9C@@$BBA@AA"(%struct.C* %this, ...) {{.*}} comdat align 2 { 1573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 4 1583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 15933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 1603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: ret void 1613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: } 1623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// 1633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BCA@AA"(%struct.C* %this, ...) {{.*}} comdat align 2 { 1643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 4 1653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]] 16633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...) 16793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: ret void 16893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: } 1690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] = {{{.*}}"thunk"{{.*}}} 171