annotate gcc/testsuite/gcc.dg/20020312-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR 5878.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 We ICEd in verify_local_live_at_start because we incorrectly forced
kono
parents:
diff changeset
4 the PIC register live between BAR and BAZ. We did this because the
kono
parents:
diff changeset
5 definition of PIC_OFFSET_TABLE_REGNUM was incorrectly not INVALID_REGNUM
kono
parents:
diff changeset
6 when !flag_pic for most targets. */
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 /* { dg-do run } */
kono
parents:
diff changeset
9 /* { dg-options "-O -fno-pic" } */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
10 /* { dg-additional-options "-no-pie" { target pie_enabled } } */
111
kono
parents:
diff changeset
11 /* { dg-require-effective-target nonlocal_goto } */
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 extern void abort (void);
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 #if defined(__alpha__)
kono
parents:
diff changeset
16 /* PIC register is $29, but is used even without -fpic. */
kono
parents:
diff changeset
17 #elif defined(__arc__)
kono
parents:
diff changeset
18 # define PIC_REG "26"
kono
parents:
diff changeset
19 #elif defined(__arm__)
kono
parents:
diff changeset
20 # define PIC_REG "9"
kono
parents:
diff changeset
21 #elif defined(AVR)
kono
parents:
diff changeset
22 /* No pic register. */
kono
parents:
diff changeset
23 #elif defined(__cris__)
kono
parents:
diff changeset
24 # define PIC_REG "0"
kono
parents:
diff changeset
25 #elif defined(__epiphany__)
kono
parents:
diff changeset
26 #define PIC_REG "r28"
kono
parents:
diff changeset
27 #elif defined(__fr30__)
kono
parents:
diff changeset
28 /* No pic register. */
kono
parents:
diff changeset
29 #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__)
kono
parents:
diff changeset
30 /* No pic register. */
kono
parents:
diff changeset
31 #elif defined(_IBMR2)
kono
parents:
diff changeset
32 /* No pic register. */
kono
parents:
diff changeset
33 #elif defined(__i386__)
kono
parents:
diff changeset
34 # define PIC_REG "ebx"
kono
parents:
diff changeset
35 #elif defined(__ia64__)
kono
parents:
diff changeset
36 /* PIC register is r1, but is used even without -fpic. */
kono
parents:
diff changeset
37 #elif defined(__lm32__)
kono
parents:
diff changeset
38 /* No pic register. */
kono
parents:
diff changeset
39 #elif defined(__M32R__)
kono
parents:
diff changeset
40 /* No pic register. */
kono
parents:
diff changeset
41 #elif defined(__m68k__)
kono
parents:
diff changeset
42 # define PIC_REG "a5"
kono
parents:
diff changeset
43 #elif defined(__mc68hc1x__)
kono
parents:
diff changeset
44 /* No pic register. */
kono
parents:
diff changeset
45 #elif defined(__mcore__)
kono
parents:
diff changeset
46 /* No pic register. */
kono
parents:
diff changeset
47 #elif defined(__MICROBLAZE__)
kono
parents:
diff changeset
48 # define PIC_REG "r20"
kono
parents:
diff changeset
49 #elif defined(__mips__)
kono
parents:
diff changeset
50 /* PIC register is $28, but is used even without -fpic. */
kono
parents:
diff changeset
51 #elif defined(__MMIX__)
kono
parents:
diff changeset
52 /* No pic register. */
kono
parents:
diff changeset
53 #elif defined(__mn10300__)
kono
parents:
diff changeset
54 /* No pic register. */
kono
parents:
diff changeset
55 #elif defined(__moxie__)
kono
parents:
diff changeset
56 /* No pic register. */
kono
parents:
diff changeset
57 #elif defined(__nds32__)
kono
parents:
diff changeset
58 /* No pic register. */
kono
parents:
diff changeset
59 #elif defined(__nios2__)
kono
parents:
diff changeset
60 /* No pic register. */
kono
parents:
diff changeset
61 #elif defined(__hppa__)
kono
parents:
diff changeset
62 /* PIC register is %r27 or %r19, but is used even without -fpic. */
kono
parents:
diff changeset
63 #elif defined(__pdp11__)
kono
parents:
diff changeset
64 /* No pic register. */
kono
parents:
diff changeset
65 #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc)
kono
parents:
diff changeset
66 # ifdef __MACH__
kono
parents:
diff changeset
67 # define PIC_REG "31"
kono
parents:
diff changeset
68 # else
kono
parents:
diff changeset
69 # define PIC_REG "30"
kono
parents:
diff changeset
70 # endif
kono
parents:
diff changeset
71 #elif defined(__riscv)
kono
parents:
diff changeset
72 /* No pic register. */
kono
parents:
diff changeset
73 #elif defined(__RX__)
kono
parents:
diff changeset
74 /* No pic register. */
kono
parents:
diff changeset
75 #elif defined(__s390__)
kono
parents:
diff changeset
76 # define PIC_REG "12"
kono
parents:
diff changeset
77 #elif defined(__sparc__)
kono
parents:
diff changeset
78 # define PIC_REG "l7"
kono
parents:
diff changeset
79 #elif defined(__tile__)
kono
parents:
diff changeset
80 # define PIC_REG "r51"
kono
parents:
diff changeset
81 #elif defined(__TMS320C6X__)
kono
parents:
diff changeset
82 # define PIC_REG "B14"
kono
parents:
diff changeset
83 #elif defined(__v850)
kono
parents:
diff changeset
84 /* No pic register. */
kono
parents:
diff changeset
85 #elif defined(__vax__)
kono
parents:
diff changeset
86 /* No pic register. */
kono
parents:
diff changeset
87 #elif defined(__VISIUM__)
kono
parents:
diff changeset
88 /* No pic register. */
kono
parents:
diff changeset
89 #elif defined(__xstormy16__)
kono
parents:
diff changeset
90 /* No pic register. */
kono
parents:
diff changeset
91 #elif defined(__XTENSA__)
kono
parents:
diff changeset
92 /* No pic register. */
kono
parents:
diff changeset
93 #elif defined(__sh__)
kono
parents:
diff changeset
94 # define PIC_REG "r12"
kono
parents:
diff changeset
95 #elif defined(__x86_64__)
kono
parents:
diff changeset
96 /* No pic register. */
kono
parents:
diff changeset
97 #elif defined(__m32c__)
kono
parents:
diff changeset
98 /* No pic register. */
kono
parents:
diff changeset
99 #elif defined(__SPU__)
kono
parents:
diff changeset
100 # define PIC_REG "126"
kono
parents:
diff changeset
101 #elif defined (__frv__)
kono
parents:
diff changeset
102 # ifdef __FRV_FDPIC__
kono
parents:
diff changeset
103 # define PIC_REG "gr15"
kono
parents:
diff changeset
104 # else
kono
parents:
diff changeset
105 # define PIC_REG "gr17"
kono
parents:
diff changeset
106 #endif
kono
parents:
diff changeset
107 #elif defined (__aarch64__)
kono
parents:
diff changeset
108 /* No pic register -- yet. */
kono
parents:
diff changeset
109 #elif defined(__RL78__)
kono
parents:
diff changeset
110 /* No pic register. */
kono
parents:
diff changeset
111 #elif defined(__MSP430__)
kono
parents:
diff changeset
112 /* No pic register. */
kono
parents:
diff changeset
113 #elif defined (__nvptx__)
kono
parents:
diff changeset
114 /* No pic register. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 #elif defined (__csky__)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 /* Pic register is r28, but some cores only have r0-r15. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 # if defined (__CK807__) || defined (__CK810__)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 # define PIC_REG "r28"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 # endif
111
kono
parents:
diff changeset
120 #else
kono
parents:
diff changeset
121 # error "Modify the test for your target."
kono
parents:
diff changeset
122 #endif
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 #if defined PIC_REG && !defined __PIC__ && !defined __pic__
kono
parents:
diff changeset
125 register void *reg __asm__(PIC_REG);
kono
parents:
diff changeset
126 #else
kono
parents:
diff changeset
127 /* We really need a global register variable set to the PIC register
kono
parents:
diff changeset
128 to expose the bug. Oh well, let the test case not fail. */
kono
parents:
diff changeset
129 static void *reg;
kono
parents:
diff changeset
130 #endif
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 void * __attribute__((noinline))
kono
parents:
diff changeset
133 dummy (void *x)
kono
parents:
diff changeset
134 {
kono
parents:
diff changeset
135 return x;
kono
parents:
diff changeset
136 }
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 void
kono
parents:
diff changeset
139 f (void)
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 goto *dummy (&&bar);
kono
parents:
diff changeset
142 for (;;)
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 foo:
kono
parents:
diff changeset
145 reg = (void *) 1;
kono
parents:
diff changeset
146 if (!reg)
kono
parents:
diff changeset
147 goto baz;
kono
parents:
diff changeset
148 reg = &&foo;
kono
parents:
diff changeset
149 }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 bar:
kono
parents:
diff changeset
152 baz:
kono
parents:
diff changeset
153 reg = 0;
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 int
kono
parents:
diff changeset
157 main()
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 void *old_reg = reg;
kono
parents:
diff changeset
160 reg = (void *) 1;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 f ();
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 /* Additionally test that the prologue/epilogue properly does *not*
kono
parents:
diff changeset
165 save and restore global registers. Not possible when the PIC
kono
parents:
diff changeset
166 register is in a register window, of course. On Darwin, you can't
kono
parents:
diff changeset
167 call library routines from non-PIC code. */
kono
parents:
diff changeset
168 #if !defined (__sparc__) && !defined(__MACH__)
kono
parents:
diff changeset
169 if (reg)
kono
parents:
diff changeset
170 abort ();
kono
parents:
diff changeset
171 #endif
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 reg = old_reg;
kono
parents:
diff changeset
174 return 0;
kono
parents:
diff changeset
175 }