summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/20020312-2.c
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gcc.dg/20020312-2.c
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gcc.dg/20020312-2.c')
-rw-r--r--gcc/testsuite/gcc.dg/20020312-2.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/20020312-2.c b/gcc/testsuite/gcc.dg/20020312-2.c
new file mode 100644
index 000000000..0689636b2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020312-2.c
@@ -0,0 +1,144 @@
+/* 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(__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(__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(__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(__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
+#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;
+}