1deefa7cd8df278a877220e7cdd4a3f391a108643Rafael Espindola// RUN: %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 8ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @both = alias void ()* @__both 9ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @both2 = alias void ()* @__both2 10ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @weakvar_alias = alias weak i32* @__weakvar_alias 11ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @foo = alias weak void ()* @__foo 12ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @foo2 = alias weak void ()* @__foo2 13ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @stutter = alias weak void ()* @__stutter 14ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @stutter2 = alias weak void ()* @__stutter2 15ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @declfirst = alias weak void ()* @__declfirst 16ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @declfirstattr = alias weak void ()* @__declfirstattr 17ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @mix2 = alias weak void ()* @__mix2 18ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @a1 = alias weak void ()* @__a1 19ac427669c139f6537375de57e3d680963885c67dRafael Espindola// CHECK-DAG: @xxx = alias weak void ()* @__xxx 2060e818811a419686fe9e998d169ac21858366ebfChris Lattner 2160e818811a419686fe9e998d169ac21858366ebfChris Lattner 2260e818811a419686fe9e998d169ac21858366ebfChris Lattner 2393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak void @weakdef() 2460e818811a419686fe9e998d169ac21858366ebfChris Lattner 258f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 268f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakvar 278f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnint weakvar; 288f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 298f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakdef 308f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid weakdef(void) {} 318f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 328f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak param // expected-warning {{weak identifier 'param' never declared}} 338f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak correct_linkage 348f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid f(int param) { 358f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn int correct_linkage; 368f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn} 378f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 388f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak weakvar_alias = __weakvar_alias 398f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnint __weakvar_alias; 408f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 418f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak foo = __foo 428f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __foo(void) {} 4393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__foo() 448f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 458f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 468f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __foo2(void) {} 478f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak foo2 = __foo2 4893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__foo2() 498f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 508f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 518f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///// test errors 528f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 538f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak unused // expected-warning {{weak identifier 'unused' never declared}} 548f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak unused_alias = __unused_alias // expected-warning {{weak identifier '__unused_alias' never declared}} 558f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 568f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak td // expected-warning {{weak identifier 'td' never declared}} 578f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynntypedef int td; 588f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 598f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak td2 = __td2 // expected-warning {{weak identifier '__td2' never declared}} 608f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynntypedef int __td2; 618f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 628f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 638f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///// test weird cases 648f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 658f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// test repeats 668f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 678f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter = __stutter 688f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter = __stutter 698f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __stutter(void) {} 7093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__stutter() 718f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 728f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __stutter2(void) {} 738f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter2 = __stutter2 748f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak stutter2 = __stutter2 7593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__stutter2() 768f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 778f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 788f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// test decl/pragma weak order 798f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 808f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirst(void); 818f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak declfirst = __declfirst 828f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirst(void) {} 8393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__declfirst() 848f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 858f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirstattr(void) __attribute((noinline)); 868f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak declfirstattr = __declfirstattr 878f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __declfirstattr(void) {} 8893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__declfirstattr() 898f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 908f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn//// test that other attributes are preserved 918f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 928f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn//// ensure that pragma weak/__attribute((weak)) play nice 938f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 948f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid mix(void); 958f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak mix 968f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn__attribute((weak)) void mix(void) { } 9793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define weak void @mix() 988f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 998f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// ensure following __attributes are preserved and that only a single 1008f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// alias is generated 1018f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak mix2 = __mix2 1028f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) __attribute((noinline)); 1038f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) __attribute((noinline)); 1048f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __mix2(void) {} 10593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__mix2() 1068f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1078f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn////////////// test #pragma weak/__attribute combinations 1088f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1098f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// if the SAME ALIAS is already declared then it overrides #pragma weak 1108f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// resulting in a non-weak alias in this case 1118f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid both(void) __attribute((alias("__both"))); 1128f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak both = __both 1138f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both(void) {} 11493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__both() 1158f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1168f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// if the TARGET is previously declared then whichever aliasing method 1178f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// comes first applies and subsequent aliases are discarded. 1188f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// TODO: warn about this 1198f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1208f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both2(void); 1218f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid both2(void) __attribute((alias("__both2"))); // first, wins 1228f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak both2 = __both2 1238f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __both2(void) {} 12493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @__both2() 1258f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1268f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn///////////// ensure that #pragma weak does not alter existing __attributes() 1278f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1288f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a1(void) __attribute((noinline)); 1298f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak a1 = __a1 1308f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid __a1(void) {} 131c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: define void @__a1() [[NI:#[0-9]+]] 1328f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1338f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak xxx = __xxx 134deefa7cd8df278a877220e7cdd4a3f391a108643Rafael Espindola__attribute((pure,noinline,const)) void __xxx(void) { } 135c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: void @__xxx() [[RN:#[0-9]+]] 1368f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 137900693b715b3832a42ae87157332baece94ccdd8Eli Friedman///////////// PR10878: Make sure we can call a weak alias 138900693b715b3832a42ae87157332baece94ccdd8Eli Friedmanvoid SHA512Pad(void *context) {} 139900693b715b3832a42ae87157332baece94ccdd8Eli Friedman#pragma weak SHA384Pad = SHA512Pad 140900693b715b3832a42ae87157332baece94ccdd8Eli Friedmanvoid PR10878() { SHA384Pad(0); } 141900693b715b3832a42ae87157332baece94ccdd8Eli Friedman// CHECK: call void @SHA384Pad(i8* null) 142900693b715b3832a42ae87157332baece94ccdd8Eli Friedman 143900693b715b3832a42ae87157332baece94ccdd8Eli Friedman 1448b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman// PR14046: Parse #pragma weak in function-local context 1458b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedmanextern int PR14046e(void); 1468b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedmanvoid PR14046f() { 1478b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman#pragma weak PR14046e 1488b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman PR14046e(); 1498b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman} 1508b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman// CHECK: declare extern_weak i32 @PR14046e() 1518b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman 152961d0573487933199cb287ce8c472121812b3c78Richard Smith// Parse #pragma weak after a label or case statement 153961d0573487933199cb287ce8c472121812b3c78Richard Smithextern int PR16705a(void); 154961d0573487933199cb287ce8c472121812b3c78Richard Smithextern int PR16705b(void); 155961d0573487933199cb287ce8c472121812b3c78Richard Smithextern int PR16705c(void); 156961d0573487933199cb287ce8c472121812b3c78Richard Smithvoid PR16705f(int a) { 157961d0573487933199cb287ce8c472121812b3c78Richard Smith switch(a) { 158961d0573487933199cb287ce8c472121812b3c78Richard Smith case 1: 159961d0573487933199cb287ce8c472121812b3c78Richard Smith#pragma weak PR16705a 160961d0573487933199cb287ce8c472121812b3c78Richard Smith PR16705a(); 161961d0573487933199cb287ce8c472121812b3c78Richard Smith default: 162961d0573487933199cb287ce8c472121812b3c78Richard Smith#pragma weak PR16705b 163961d0573487933199cb287ce8c472121812b3c78Richard Smith PR16705b(); 164961d0573487933199cb287ce8c472121812b3c78Richard Smith } 165961d0573487933199cb287ce8c472121812b3c78Richard Smithlabel: 166961d0573487933199cb287ce8c472121812b3c78Richard Smith #pragma weak PR16705c 167961d0573487933199cb287ce8c472121812b3c78Richard Smith PR16705c(); 168961d0573487933199cb287ce8c472121812b3c78Richard Smith} 169961d0573487933199cb287ce8c472121812b3c78Richard Smith 170961d0573487933199cb287ce8c472121812b3c78Richard Smith// CHECK: declare extern_weak i32 @PR16705a() 171961d0573487933199cb287ce8c472121812b3c78Richard Smith// CHECK: declare extern_weak i32 @PR16705b() 172961d0573487933199cb287ce8c472121812b3c78Richard Smith// CHECK: declare extern_weak i32 @PR16705c() 173961d0573487933199cb287ce8c472121812b3c78Richard Smith 1748b2bfdda35de8239df0ff4a588214d5876a38d28Eli Friedman 175900693b715b3832a42ae87157332baece94ccdd8Eli Friedman///////////// TODO: stuff that still doesn't work 1768f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn 1778f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// due to the fact that disparate TopLevelDecls cannot affect each other 1788f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// (due to clang's Parser and ASTConsumer behavior, and quite reasonable) 1798f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// #pragma weak must appear before or within the same TopLevelDecl as it 1808f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// references. 1818f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid yyy(void){} 1828f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynnvoid zzz(void){} 1838f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn#pragma weak yyy 1848f6e88f90f8e111bdcc7eac574e8c6a3b706f5b0Ryan Flynn// NOTE: weak doesn't apply, not before or in same TopLevelDec(!) 18593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @yyy() 18660e818811a419686fe9e998d169ac21858366ebfChris Lattner 18760e818811a419686fe9e998d169ac21858366ebfChris Lattnerint correct_linkage; 188f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling 189c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[NI]] = { noinline nounwind{{.*}} } 190c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECK: attributes [[RN]] = { noinline nounwind readnone{{.*}} } 191