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