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