OSDN Git Service

* g++.old-deja/g++.jason/thunk2.C: Remove traces of dead
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / 20020312-2.c
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 #if defined(__alpha__)
12 /* PIC register is $29, but is used even without -fpic.  */
13 #elif defined(__arc__)
14 # define PIC_REG  "26"
15 #elif defined(__arm__)
16 # define PIC_REG  "9"
17 #elif defined(AVR)
18 /* No pic register.  */
19 #elif defined(__cris__)
20 # define PIC_REG  "0"
21 #elif defined(__D30V__)
22 /* No pic register.  */
23 #elif defined(__dsp1600__)
24 /* No pic register.  */
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 #cpu(i370)
32 /* No pic register.  */
33 #elif defined(__i386__)
34 # define PIC_REG  "ebx"
35 #elif defined(__i960__)
36 /* No pic register.  */
37 #elif defined(__ia64__)
38 /* PIC register is r1, but is used even without -fpic.  */
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(__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 #cpu(ns32k)
54 /* No pic register.  */
55 #elif defined(__hppa__)
56 /* PIC register is %r27 or %r19, but is used even without -fpic.  */
57 #elif defined(__pdp11__)
58 /* No pic register.  */
59 #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__)
60 # ifdef __MACH__
61 #  define PIC_REG  "31"
62 # else
63 #  define PIC_REG  "30"
64 # endif
65 #elif defined(__s390__)
66 # define PIC_REG  "12"
67 #elif defined(__sparc__)
68 # define PIC_REG  "l7"
69 #elif defined(__v850)
70 /* No pic register.  */
71 #elif defined(__vax__)
72 /* No pic register.  */
73 #elif defined(__xstormy16__)
74 /* No pic register.  */
75 #elif defined(__XTENSA__)
76 /* No pic register.  */
77 #elif defined(__sh__)
78 # define PIC_REG  "r12"
79 #elif defined(__x86_64__)
80 /* No pic register.  */
81 #else
82 # error "Modify the test for your target."
83 #endif
84
85 #if defined PIC_REG && !defined __PIC__ && !defined __pic__
86 register void *reg __asm__(PIC_REG);
87 #else
88 /* We really need a global register variable set to the PIC register
89    to expose the bug.  Oh well, let the test case not fail.  */
90 static void *reg;
91 #endif
92
93 void * __attribute__((noinline))
94 dummy (void *x)
95 {
96   return x;
97 }
98
99 void
100 f (void)
101 {
102   goto *dummy (&&bar);
103   for (;;)
104     {
105     foo:
106       reg = (void *) 1;
107       if (!reg)
108         goto baz;
109       reg = &&foo;
110     }
111
112  bar:
113  baz:
114   reg = 0;
115 }
116
117 int
118 main()
119 {
120   void *old_reg = reg;
121   reg = (void *) 1;
122
123   f ();
124
125   /* Additionally test that the prologue/epilogue properly does *not*
126      save and restore global registers.  Not possible when the PIC
127      register is in a register window, of course.  On Darwin, you can't
128      call library routines from non-PIC code.  */
129 #if !defined (__sparc__) && !(defined(__MACH__) && defined(__POWERPC__))
130   if (reg)
131     abort ();
132 #endif
133
134   reg = old_reg;
135   return 0;
136 }