196e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm %s -o - -verify | FileCheck %s 260e818811a419686fe9e998d169ac21858366ebfChris Lattner 360e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @weakvar = weak global 460e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @__weakvar_alias = common global 560e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @correct_linkage = weak global 660e818811a419686fe9e998d169ac21858366ebfChris Lattner 760e818811a419686fe9e998d169ac21858366ebfChris Lattner 860e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @both = alias void ()* @__both 960e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @both2 = alias void ()* @__both2 1060e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @both3 = alias weak void ()* @__both3 1160e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @a3 = alias weak void ()* @__a3 1260e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @weakvar_alias = alias weak i32* @__weakvar_alias 1360e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @foo = alias weak void ()* @__foo 1460e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @foo2 = alias weak void ()* @__foo2 1560e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @stutter = alias weak void ()* @__stutter 1660e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @stutter2 = alias weak void ()* @__stutter2 1760e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @declfirst = alias weak void ()* @__declfirst 1860e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @declfirstattr = alias weak void ()* @__declfirstattr 1960e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @mix2 = alias weak void ()* @__mix2 2060e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @a1 = alias weak void ()* @__a1 2160e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: @xxx = alias weak void ()* @__xxx 2260e818811a419686fe9e998d169ac21858366ebfChris Lattner 2360e818811a419686fe9e998d169ac21858366ebfChris Lattner 2460e818811a419686fe9e998d169ac21858366ebfChris Lattner 2560e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define weak void @weakdef() 2660e818811a419686fe9e998d169ac21858366ebfChris Lattner 278f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 288f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakvar 298f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnint weakvar; 308f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 318f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakdef 328f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid weakdef(void) {} 338f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 348f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak param // expected-warning {{weak identifier 'param' never declared}} 358f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak correct_linkage 368f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid f(int param) { 378f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn int correct_linkage; 388f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn} 398f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 408f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakvar_alias = __weakvar_alias 418f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnint __weakvar_alias; 428f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 438f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak foo = __foo 448f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __foo(void) {} 4560e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__foo() 468f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 478f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 488f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __foo2(void) {} 498f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak foo2 = __foo2 5060e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__foo2() 518f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 528f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 538f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///// test errors 548f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 558f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak unused // expected-warning {{weak identifier 'unused' never declared}} 568f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak unused_alias = __unused_alias // expected-warning {{weak identifier '__unused_alias' never declared}} 578f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 588f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak td // expected-warning {{weak identifier 'td' never declared}} 598f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynntypedef int td; 608f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 618f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak td2 = __td2 // expected-warning {{weak identifier '__td2' never declared}} 628f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynntypedef int __td2; 638f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 648f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 658f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///// test weird cases 668f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 678f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// test repeats 688f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 698f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter = __stutter 708f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter = __stutter 718f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __stutter(void) {} 7260e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__stutter() 738f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 748f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __stutter2(void) {} 758f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter2 = __stutter2 768f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter2 = __stutter2 7760e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__stutter2() 788f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 798f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 808f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// test decl/pragma weak order 818f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 828f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirst(void); 838f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak declfirst = __declfirst 848f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirst(void) {} 8560e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__declfirst() 868f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 878f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirstattr(void) __attribute((noinline)); 888f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak declfirstattr = __declfirstattr 898f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirstattr(void) {} 9060e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__declfirstattr() 918f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 928f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn//// test that other attributes are preserved 938f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 948f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn//// ensure that pragma weak/__attribute((weak)) play nice 958f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 968f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid mix(void); 978f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak mix 988f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn__attribute((weak)) void mix(void) { } 9960e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define weak void @mix() 1008f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1018f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// ensure following __attributes are preserved and that only a single 1028f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// alias is generated 1038f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak mix2 = __mix2 1048f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) __attribute((noinline)); 1058f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) __attribute((noinline)); 1068f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) {} 10760e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__mix2() 1088f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1098f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn////////////// test #pragma weak/__attribute combinations 1108f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1118f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// if the SAME ALIAS is already declared then it overrides #pragma weak 1128f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// resulting in a non-weak alias in this case 1138f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid both(void) __attribute((alias("__both"))); 1148f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak both = __both 1158f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both(void) {} 11660e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__both() 1178f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1188f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// if the TARGET is previously declared then whichever aliasing method 1198f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// comes first applies and subsequent aliases are discarded. 1208f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// TODO: warn about this 1218f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1228f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both2(void); 1238f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid both2(void) __attribute((alias("__both2"))); // first, wins 1248f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak both2 = __both2 1258f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both2(void) {} 12660e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__both2() 1278f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1288f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both3(void); 1298f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak both3 = __both3 // first, wins 1308f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid both3(void) __attribute((alias("__both3"))); 1318f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both3(void) {} 13260e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @__both3() 1338f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1348f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///////////// ensure that #pragma weak does not alter existing __attributes() 1358f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1368f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a1(void) __attribute((noinline)); 1378f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak a1 = __a1 1388f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a1(void) {} 139c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: define void @__a1() [[NI:#[0-9]+]] 1408f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1418f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// attributes introduced BEFORE a combination of #pragma weak and alias() 1428f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// hold... 1438f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a3(void) __attribute((noinline)); 1448f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak a3 = __a3 1458f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid a3(void) __attribute((alias("__a3"))); 1468f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a3(void) {} 147c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: define void @__a3() [[NI]] 1488f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1498f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak xxx = __xxx 1508f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn__attribute((pure,noinline,const,fastcall)) void __xxx(void) { } 151c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: void @__xxx() [[RN:#[0-9]+]] 1528f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 153900693b715b3832a42ae87157332baece94ccdd8Eli Friedman///////////// PR10878: Make sure we can call a weak alias 154900693b715b3832a42ae87157332baece94ccdd8Eli Friedmanvoid SHA512Pad(void *context) {} 155900693b715b3832a42ae87157332baece94ccdd8Eli Friedman#pragma weak SHA384Pad = SHA512Pad 156900693b715b3832a42ae87157332baece94ccdd8Eli Friedmanvoid PR10878() { SHA384Pad(0); } 157900693b715b3832a42ae87157332baece94ccdd8Eli Friedman// CHECK: call void @SHA384Pad(i8* null) 158900693b715b3832a42ae87157332baece94ccdd8Eli Friedman 159900693b715b3832a42ae87157332baece94ccdd8Eli Friedman 1608b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman// PR14046: Parse #pragma weak in function-local context 1618b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedmanextern int PR14046e(void); 1628b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedmanvoid PR14046f() { 1638b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman#pragma weak PR14046e 1648b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman PR14046e(); 1658b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman} 1668b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman// CHECK: declare extern_weak i32 @PR14046e() 1678b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman 1688b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman 169900693b715b3832a42ae87157332baece94ccdd8Eli Friedman///////////// TODO: stuff that still doesn't work 1708f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1718f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// due to the fact that disparate TopLevelDecls cannot affect each other 1728f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// (due to clang's Parser and ASTConsumer behavior, and quite reasonable) 1738f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// #pragma weak must appear before or within the same TopLevelDecl as it 1748f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// references. 1758f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid yyy(void){} 1768f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid zzz(void){} 1778f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak yyy 1788f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// NOTE: weak doesn't apply, not before or in same TopLevelDec(!) 17960e818811a419686fe9e998d169ac21858366ebfChris Lattner// CHECK: define void @yyy() 18060e818811a419686fe9e998d169ac21858366ebfChris Lattner 18160e818811a419686fe9e998d169ac21858366ebfChris Lattnerint correct_linkage; 182f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling 183c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[NI]] = { noinline nounwind{{.*}} } 184c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[RN]] = { noinline nounwind readnone{{.*}} } 185