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