]>
Commit | Line | Data |
---|---|---|
5b43fed1 RH |
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" } */ | |
55466f20 | 10 | /* { dg-require-effective-target nonlocal_goto } */ |
5b43fed1 | 11 | |
ee712eab JM |
12 | extern void abort (void); |
13 | ||
cdc497dd | 14 | #if defined(__alpha__) |
5b43fed1 RH |
15 | /* PIC register is $29, but is used even without -fpic. */ |
16 | #elif defined(__arc__) | |
17 | # define PIC_REG "26" | |
18 | #elif defined(__arm__) | |
19 | # define PIC_REG "9" | |
20 | #elif defined(AVR) | |
21 | /* No pic register. */ | |
5b43fed1 RH |
22 | #elif defined(__cris__) |
23 | # define PIC_REG "0" | |
feeeff5c JR |
24 | #elif defined(__epiphany__) |
25 | #define PIC_REG "r28" | |
5b43fed1 RH |
26 | #elif defined(__fr30__) |
27 | /* No pic register. */ | |
28 | #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) | |
29 | /* No pic register. */ | |
97c6c02c DE |
30 | #elif defined(_IBMR2) |
31 | /* No pic register. */ | |
5b43fed1 RH |
32 | #elif defined(__i386__) |
33 | # define PIC_REG "ebx" | |
5b43fed1 RH |
34 | #elif defined(__ia64__) |
35 | /* PIC register is r1, but is used even without -fpic. */ | |
aa4945c1 JB |
36 | #elif defined(__lm32__) |
37 | /* No pic register. */ | |
5b43fed1 RH |
38 | #elif defined(__M32R__) |
39 | /* No pic register. */ | |
40 | #elif defined(__m68k__) | |
41 | # define PIC_REG "a5" | |
5b43fed1 RH |
42 | #elif defined(__mc68hc1x__) |
43 | /* No pic register. */ | |
44 | #elif defined(__mcore__) | |
45 | /* No pic register. */ | |
debd11d9 EI |
46 | #elif defined(__MICROBLAZE__) |
47 | # define PIC_REG "r20" | |
5b43fed1 RH |
48 | #elif defined(__mips__) |
49 | /* PIC register is $28, but is used even without -fpic. */ | |
a541f1aa HPN |
50 | #elif defined(__MMIX__) |
51 | /* No pic register. */ | |
5b43fed1 RH |
52 | #elif defined(__mn10300__) |
53 | /* No pic register. */ | |
35b954c1 AG |
54 | #elif defined(__moxie__) |
55 | /* No pic register. */ | |
199f847c CJW |
56 | #elif defined(__nds32__) |
57 | /* No pic register. */ | |
e430824f CLT |
58 | #elif defined(__nios2__) |
59 | /* No pic register. */ | |
1f73c622 | 60 | #elif defined(__hppa__) |
5b43fed1 RH |
61 | /* PIC register is %r27 or %r19, but is used even without -fpic. */ |
62 | #elif defined(__pdp11__) | |
63 | /* No pic register. */ | |
e8a861bd | 64 | #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc) |
2ee2d707 | 65 | # ifdef __MACH__ |
5b43fed1 RH |
66 | # define PIC_REG "31" |
67 | # else | |
68 | # define PIC_REG "30" | |
69 | # endif | |
7036ee24 NC |
70 | #elif defined(__RX__) |
71 | /* No pic register. */ | |
5b43fed1 RH |
72 | #elif defined(__s390__) |
73 | # define PIC_REG "12" | |
74 | #elif defined(__sparc__) | |
75 | # define PIC_REG "l7" | |
dd552284 WL |
76 | #elif defined(__tile__) |
77 | # define PIC_REG "r51" | |
294689c4 BS |
78 | #elif defined(__TMS320C6X__) |
79 | # define PIC_REG "B14" | |
5b43fed1 RH |
80 | #elif defined(__v850) |
81 | /* No pic register. */ | |
82 | #elif defined(__vax__) | |
83 | /* No pic register. */ | |
0969ec7d EB |
84 | #elif defined(__VISIUM__) |
85 | /* No pic register. */ | |
5b43fed1 RH |
86 | #elif defined(__xstormy16__) |
87 | /* No pic register. */ | |
88 | #elif defined(__XTENSA__) | |
89 | /* No pic register. */ | |
309d8365 R |
90 | #elif defined(__sh__) |
91 | # define PIC_REG "r12" | |
278bba8b | 92 | #elif defined(__x86_64__) |
a239aa95 DD |
93 | /* No pic register. */ |
94 | #elif defined(__m32c__) | |
278bba8b | 95 | /* No pic register. */ |
69a0f8c6 BE |
96 | #elif defined(__SPU__) |
97 | # define PIC_REG "126" | |
b91670c7 | 98 | #elif defined (__frv__) |
c807acf9 NC |
99 | # ifdef __FRV_FDPIC__ |
100 | # define PIC_REG "gr15" | |
101 | # else | |
102 | # define PIC_REG "gr17" | |
103 | #endif | |
402d3de3 IB |
104 | #elif defined (__aarch64__) |
105 | /* No pic register -- yet. */ | |
ac63f305 NC |
106 | #elif defined(__RL78__) |
107 | /* No pic register. */ | |
108 | #elif defined(__MSP430__) | |
fb61af8b BS |
109 | /* No pic register. */ |
110 | #elif defined (__nvptx__) | |
ac63f305 | 111 | /* No pic register. */ |
5b43fed1 RH |
112 | #else |
113 | # error "Modify the test for your target." | |
114 | #endif | |
115 | ||
a4fa73f3 | 116 | #if defined PIC_REG && !defined __PIC__ && !defined __pic__ |
5b43fed1 RH |
117 | register void *reg __asm__(PIC_REG); |
118 | #else | |
119 | /* We really need a global register variable set to the PIC register | |
120 | to expose the bug. Oh well, let the test case not fail. */ | |
121 | static void *reg; | |
122 | #endif | |
123 | ||
124 | void * __attribute__((noinline)) | |
125 | dummy (void *x) | |
126 | { | |
127 | return x; | |
128 | } | |
129 | ||
130 | void | |
131 | f (void) | |
132 | { | |
133 | goto *dummy (&&bar); | |
134 | for (;;) | |
135 | { | |
136 | foo: | |
137 | reg = (void *) 1; | |
138 | if (!reg) | |
139 | goto baz; | |
140 | reg = &&foo; | |
141 | } | |
142 | ||
143 | bar: | |
144 | baz: | |
145 | reg = 0; | |
146 | } | |
147 | ||
148 | int | |
149 | main() | |
150 | { | |
151 | void *old_reg = reg; | |
152 | reg = (void *) 1; | |
9a1d8b2d | 153 | |
5b43fed1 | 154 | f (); |
9a1d8b2d RH |
155 | |
156 | /* Additionally test that the prologue/epilogue properly does *not* | |
157 | save and restore global registers. Not possible when the PIC | |
2ee2d707 GK |
158 | register is in a register window, of course. On Darwin, you can't |
159 | call library routines from non-PIC code. */ | |
e69d504e | 160 | #if !defined (__sparc__) && !defined(__MACH__) |
5b43fed1 RH |
161 | if (reg) |
162 | abort (); | |
9a1d8b2d RH |
163 | #endif |
164 | ||
5b43fed1 RH |
165 | reg = old_reg; |
166 | return 0; | |
167 | } |