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