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 11 extern void abort (void); 12 13 #if defined(__alpha__) 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. */ 21 #elif defined(__cris__) 22 # define PIC_REG "0" 23 #elif defined(__epiphany__) 24 #define PIC_REG "r28" 25 #elif defined(__fr30__) 26 /* No pic register. */ 27 #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) 28 /* No pic register. */ 29 #elif defined(_IBMR2) 30 /* No pic register. */ 31 #elif defined(__i386__) 32 # define PIC_REG "ebx" 33 #elif defined(__ia64__) 34 /* PIC register is r1, but is used even without -fpic. */ 35 #elif defined(__lm32__) 36 /* No pic register. */ 37 #elif defined(__M32R__) 38 /* No pic register. */ 39 #elif defined(__m68k__) 40 # define PIC_REG "a5" 41 #elif defined(__mc68hc1x__) 42 /* No pic register. */ 43 #elif defined(__mcore__) 44 /* No pic register. */ 45 #elif defined(__MICROBLAZE__) 46 # define PIC_REG "r20" 47 #elif defined(__mips__) 48 /* PIC register is $28, but is used even without -fpic. */ 49 #elif defined(__MMIX__) 50 /* No pic register. */ 51 #elif defined(__mn10300__) 52 /* No pic register. */ 53 #elif defined(__moxie__) 54 /* No pic register. */ 55 #elif defined(__nds32__) 56 /* No pic register. */ 57 #elif defined(__nios2__) 58 /* No pic register. */ 59 #elif defined(__hppa__) 60 /* PIC register is %r27 or %r19, but is used even without -fpic. */ 61 #elif defined(__pdp11__) 62 /* No pic register. */ 63 #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc) 64 # ifdef __MACH__ 65 # define PIC_REG "31" 66 # else 67 # define PIC_REG "30" 68 # endif 69 #elif defined(__RX__) 70 /* No pic register. */ 71 #elif defined(__s390__) 72 # define PIC_REG "12" 73 #elif defined(__sparc__) 74 # define PIC_REG "l7" 75 #elif defined(__tile__) 76 # define PIC_REG "r51" 77 #elif defined(__TMS320C6X__) 78 # define PIC_REG "B14" 79 #elif defined(__v850) 80 /* No pic register. */ 81 #elif defined(__vax__) 82 /* No pic register. */ 83 #elif defined(__xstormy16__) 84 /* No pic register. */ 85 #elif defined(__XTENSA__) 86 /* No pic register. */ 87 #elif defined(__sh__) 88 # define PIC_REG "r12" 89 #elif defined(__x86_64__) 90 /* No pic register. */ 91 #elif defined(__m32c__) 92 /* No pic register. */ 93 #elif defined(__SPU__) 94 # define PIC_REG "126" 95 #elif defined (__frv__) 96 # ifdef __FRV_FDPIC__ 97 # define PIC_REG "gr15" 98 # else 99 # define PIC_REG "gr17" 100 #endif 101 #elif defined (__aarch64__) 102 /* No pic register -- yet. */ 103 #elif defined(__RL78__) 104 /* No pic register. */ 105 #elif defined(__MSP430__) 106 /* No pic register. */ 107 #else 108 # error "Modify the test for your target." 109 #endif 110 111 #if defined PIC_REG && !defined __PIC__ && !defined __pic__ 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)) dummy(void * x)120dummy (void *x) 121 { 122 return x; 123 } 124 125 void f(void)126f (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 main()144main() 145 { 146 void *old_reg = reg; 147 reg = (void *) 1; 148 149 f (); 150 151 /* Additionally test that the prologue/epilogue properly does *not* 152 save and restore global registers. Not possible when the PIC 153 register is in a register window, of course. On Darwin, you can't 154 call library routines from non-PIC code. */ 155 #if !defined (__sparc__) && !defined(__MACH__) 156 if (reg) 157 abort (); 158 #endif 159 160 reg = old_reg; 161 return 0; 162 } 163