aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c b/gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c
new file mode 100644
index 000000000..63fbfcc5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.dg/20020312-2.c
@@ -0,0 +1,162 @@
+/* PR 5878.
+
+ We ICEd in verify_local_live_at_start because we incorrectly forced
+ the PIC register live between BAR and BAZ. We did this because the
+ definition of PIC_OFFSET_TABLE_REGNUM was incorrectly not INVALID_REGNUM
+ when !flag_pic for most targets. */
+
+/* { dg-do run } */
+/* { dg-options "-O -fno-pic" } */
+
+extern void abort (void);
+
+#if defined(__alpha__)
+/* PIC register is $29, but is used even without -fpic. */
+#elif defined(__arc__)
+# define PIC_REG "26"
+#elif defined(__arm__)
+# define PIC_REG "9"
+#elif defined(AVR)
+/* No pic register. */
+#elif defined(__cris__)
+# define PIC_REG "0"
+#elif defined(__epiphany__)
+#define PIC_REG "r28"
+#elif defined(__fr30__)
+/* No pic register. */
+#elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__)
+/* No pic register. */
+#elif defined(_IBMR2)
+/* No pic register. */
+#elif defined(__i386__)
+# define PIC_REG "ebx"
+#elif defined(__ia64__)
+/* PIC register is r1, but is used even without -fpic. */
+#elif defined(__lm32__)
+/* No pic register. */
+#elif defined(__M32R__)
+/* No pic register. */
+#elif defined(__m68k__)
+# define PIC_REG "a5"
+#elif defined(__mc68hc1x__)
+/* No pic register. */
+#elif defined(__mcore__)
+/* No pic register. */
+#elif defined(__MICROBLAZE__)
+# define PIC_REG "r20"
+#elif defined(__mips__)
+/* PIC register is $28, but is used even without -fpic. */
+#elif defined(__MMIX__)
+/* No pic register. */
+#elif defined(__mn10300__)
+/* No pic register. */
+#elif defined(__moxie__)
+/* No pic register. */
+#elif defined(__nds32__)
+/* No pic register. */
+#elif defined(__nios2__)
+/* No pic register. */
+#elif defined(__hppa__)
+/* PIC register is %r27 or %r19, but is used even without -fpic. */
+#elif defined(__pdp11__)
+/* No pic register. */
+#elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc)
+# ifdef __MACH__
+# define PIC_REG "31"
+# else
+# define PIC_REG "30"
+# endif
+#elif defined(__RX__)
+/* No pic register. */
+#elif defined(__s390__)
+# define PIC_REG "12"
+#elif defined(__sparc__)
+# define PIC_REG "l7"
+#elif defined(__tile__)
+# define PIC_REG "r51"
+#elif defined(__TMS320C6X__)
+# define PIC_REG "B14"
+#elif defined(__v850)
+/* No pic register. */
+#elif defined(__vax__)
+/* No pic register. */
+#elif defined(__xstormy16__)
+/* No pic register. */
+#elif defined(__XTENSA__)
+/* No pic register. */
+#elif defined(__sh__)
+# define PIC_REG "r12"
+#elif defined(__x86_64__)
+/* No pic register. */
+#elif defined(__m32c__)
+/* No pic register. */
+#elif defined(__SPU__)
+# define PIC_REG "126"
+#elif defined (__frv__)
+# ifdef __FRV_FDPIC__
+# define PIC_REG "gr15"
+# else
+# define PIC_REG "gr17"
+#endif
+#elif defined (__aarch64__)
+/* No pic register -- yet. */
+#elif defined(__RL78__)
+/* No pic register. */
+#elif defined(__MSP430__)
+/* No pic register. */
+#else
+# error "Modify the test for your target."
+#endif
+
+#if defined PIC_REG && !defined __PIC__ && !defined __pic__
+register void *reg __asm__(PIC_REG);
+#else
+/* We really need a global register variable set to the PIC register
+ to expose the bug. Oh well, let the test case not fail. */
+static void *reg;
+#endif
+
+void * __attribute__((noinline))
+dummy (void *x)
+{
+ return x;
+}
+
+void
+f (void)
+{
+ goto *dummy (&&bar);
+ for (;;)
+ {
+ foo:
+ reg = (void *) 1;
+ if (!reg)
+ goto baz;
+ reg = &&foo;
+ }
+
+ bar:
+ baz:
+ reg = 0;
+}
+
+int
+main()
+{
+ void *old_reg = reg;
+ reg = (void *) 1;
+
+ f ();
+
+ /* Additionally test that the prologue/epilogue properly does *not*
+ save and restore global registers. Not possible when the PIC
+ register is in a register window, of course. On Darwin, you can't
+ call library routines from non-PIC code. */
+#if !defined (__sparc__) && !defined(__MACH__)
+ if (reg)
+ abort ();
+#endif
+
+ reg = old_reg;
+ return 0;
+}