comparison gcc/testsuite/gcc.dg/addr_equal-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 /* { dg-do run } */
2 /* { dg-require-effective-target nonpic } */
3 /* { dg-require-weak "" } */
4 /* { dg-require-alias "" } */
5 /* { dg-options "-O2" } */
6 /* { dg-skip-if "" { powerpc-ibm-aix* } } */
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 }