145
|
1 /* { dg-do run { target { nonpic || pie_enabled } } } */
|
111
|
2 /* { dg-require-weak "" } */
|
|
3 /* { dg-require-alias "" } */
|
131
|
4 /* { dg-options "-O2 -fdelete-null-pointer-checks" } */
|
111
|
5 /* { dg-skip-if "" { powerpc-ibm-aix* } } */
|
145
|
6 /* { dg-skip-if "function pointers can be NULL" { keeps_null_pointer_checks } } */
|
111
|
7 void abort (void);
|
|
8 extern int undef_var0, undef_var1;
|
|
9 extern __attribute__ ((weak)) int weak_undef_var0;
|
|
10 extern __attribute__ ((weak)) int weak_undef_var1;
|
|
11 __attribute__ ((weak)) int weak_def_var0;
|
|
12 int def_var0=0, def_var1=0;
|
|
13 static int alias_var0 __attribute__ ((alias("def_var0")));
|
|
14 extern int weak_alias_var0 __attribute__ ((alias("def_var0"))) __attribute__ ((weak));
|
|
15 void undef_fn0(void);
|
|
16 void undef_fn1(void);
|
|
17 void def_fn0(void)
|
|
18 {
|
|
19 }
|
|
20 void def_fn1(void)
|
|
21 {
|
|
22 }
|
|
23 __attribute__ ((weak))
|
|
24 void weak_def_fn0(void)
|
|
25 {
|
|
26 }
|
|
27 __attribute__ ((weak))
|
|
28 void weak_def_fn1(void)
|
|
29 {
|
|
30 }
|
|
31 __attribute__ ((weak)) void weak_undef_fn0(void);
|
|
32
|
|
33 inline
|
|
34 void inline_fn0(void)
|
|
35 {
|
|
36 }
|
|
37 inline
|
|
38 void inline_fn1(void)
|
|
39 {
|
|
40 }
|
|
41
|
|
42 int
|
|
43 main(int argc, char **argv)
|
|
44 {
|
|
45 /* Two definitions are always different unless they can be interposed. */
|
|
46 if (!__builtin_constant_p (def_fn0 == def_fn1))
|
|
47 abort();
|
|
48 if (def_fn0 == def_fn1)
|
|
49 abort();
|
|
50
|
|
51 if (!__builtin_constant_p (&def_var0 == &def_var1))
|
|
52 abort();
|
|
53 if (&def_var0 == &def_var1)
|
|
54 abort();
|
|
55
|
|
56 /* Same symbol is the same no matter on interposition. */
|
|
57 if (!__builtin_constant_p (undef_fn0 != undef_fn0))
|
|
58 abort ();
|
|
59 if (undef_fn0 != undef_fn0)
|
|
60 abort ();
|
|
61
|
|
62 /* Do not get confused by same offset. */
|
|
63 if (!__builtin_constant_p (&undef_var0 + argc != &undef_var0 + argc))
|
|
64 abort ();
|
|
65 if (&undef_var0 + argc != &undef_var0 + argc)
|
|
66 abort ();
|
|
67
|
|
68 /* Alias and its target is equivalent unless one of them can be interposed. */
|
|
69 if (!__builtin_constant_p (&def_var0 != &alias_var0))
|
|
70 abort ();
|
|
71 if (&def_var0 != &alias_var0 )
|
|
72 abort ();
|
|
73
|
|
74 if (__builtin_constant_p (&def_var0 != &weak_alias_var0))
|
|
75 abort ();
|
|
76 if (&def_var0 != &weak_alias_var0)
|
|
77 abort ();
|
|
78
|
|
79 /* Weak definitions may be both NULL. */
|
|
80 if (__builtin_constant_p ((void *)weak_undef_fn0 == (void *)&weak_undef_var0))
|
|
81 abort ();
|
|
82 if ((void *)weak_undef_fn0 != (void *)&weak_undef_var0)
|
|
83 abort ();
|
|
84
|
|
85 /* Variables and functions do not share same memory locations otherwise. */
|
|
86 if (!__builtin_constant_p ((void *)undef_fn0 == (void *)&undef_var0))
|
|
87 abort ();
|
|
88 if ((void *)undef_fn0 == (void *)&undef_var0)
|
|
89 abort ();
|
|
90
|
|
91 /* This works for cases where one object is just weakly defined, too. */
|
|
92 if (!__builtin_constant_p ((void *)weak_undef_fn0 == (void *)&weak_def_var0))
|
|
93 abort ();
|
|
94 if ((void *)weak_undef_fn0 == (void *)&weak_def_var0)
|
|
95 abort ();
|
|
96
|
|
97 /* Inline functions are known to be different. */
|
|
98 if (!__builtin_constant_p (inline_fn0 != inline_fn1))
|
|
99 abort ();
|
|
100 if (inline_fn0 == inline_fn1)
|
|
101 abort ();
|
|
102 return 0;
|
|
103 }
|