OSDN Git Service

libcpp:
[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 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(__fr30__)
24 /* No pic register.  */
25 #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__)
26 /* No pic register.  */
27 #elif defined(_IBMR2)
28 /* No pic register.  */
29 #elif defined(__i386__)
30 # define PIC_REG  "ebx"
31 #elif defined(__ia64__)
32 /* PIC register is r1, but is used even without -fpic.  */
33 #elif defined(__lm32__)
34 /* No pic register.  */
35 #elif defined(__M32R__)
36 /* No pic register.  */
37 #elif defined(__m68k__)
38 # define PIC_REG  "a5"
39 #elif defined(__mc68hc1x__)
40 /* No pic register.  */
41 #elif defined(__mcore__)
42 /* No pic register.  */
43 #elif defined(__mips__)
44 /* PIC register is $28, but is used even without -fpic.  */
45 #elif defined(__MMIX__)
46 /* No pic register.  */
47 #elif defined(__mn10300__)
48 /* No pic register.  */
49 #elif defined(__hppa__)
50 /* PIC register is %r27 or %r19, but is used even without -fpic.  */
51 #elif defined(__pdp11__)
52 /* No pic register.  */
53 #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc)
54 # ifdef __MACH__
55 #  define PIC_REG  "31"
56 # else
57 #  define PIC_REG  "30"
58 # endif
59 #elif defined(__s390__)
60 # define PIC_REG  "12"
61 #elif defined(__sparc__)
62 # define PIC_REG  "l7"
63 #elif defined(__v850)
64 /* No pic register.  */
65 #elif defined(__vax__)
66 /* No pic register.  */
67 #elif defined(__xstormy16__)
68 /* No pic register.  */
69 #elif defined(__XTENSA__)
70 /* No pic register.  */
71 #elif defined(__sh__)
72 # define PIC_REG  "r12"
73 #elif defined(__x86_64__)
74 /* No pic register.  */
75 #elif defined(__m32c__)
76 /* No pic register.  */
77 #elif defined(__SPU__)
78 #  define PIC_REG  "126"
79 #elif defined (__frv__)
80 # ifdef __FRV_FDPIC__
81 #  define PIC_REG "gr15"
82 # else
83 #  define PIC_REG "gr17"
84 #endif
85 #else
86 # error "Modify the test for your target."
87 #endif
88
89 #if defined PIC_REG && !defined __PIC__ && !defined __pic__
90 register void *reg __asm__(PIC_REG);
91 #else
92 /* We really need a global register variable set to the PIC register
93    to expose the bug.  Oh well, let the test case not fail.  */
94 static void *reg;
95 #endif
96
97 void * __attribute__((noinline))
98 dummy (void *x)
99 {
100   return x;
101 }
102
103 void
104 f (void)
105 {
106   goto *dummy (&&bar);
107   for (;;)
108     {
109     foo:
110       reg = (void *) 1;
111       if (!reg)
112         goto baz;
113       reg = &&foo;
114     }
115
116  bar:
117  baz:
118   reg = 0;
119 }
120
121 int
122 main()
123 {
124   void *old_reg = reg;
125   reg = (void *) 1;
126
127   f ();
128
129   /* Additionally test that the prologue/epilogue properly does *not*
130      save and restore global registers.  Not possible when the PIC
131      register is in a register window, of course.  On Darwin, you can't
132      call library routines from non-PIC code.  */
133 #if !defined (__sparc__) && !defined(__MACH__)
134   if (reg)
135     abort ();
136 #endif
137
138   reg = old_reg;
139   return 0;
140 }