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  /* { dg-additional-options "-no-pie" { target pie_enabled } } */
      11  /* { dg-require-effective-target nonlocal_goto } */
      12  /* { dg-skip-if "" { arm*-*-uclinuxfdpiceabi } "*" "" } */
      13  
      14  extern void abort (void);
      15  
      16  #if defined(__alpha__)
      17  /* PIC register is $29, but is used even without -fpic.  */
      18  #elif defined(__arc__)
      19  # define PIC_REG  "26"
      20  #elif defined(__arm__)
      21  # define PIC_REG  "9"
      22  #elif defined(AVR)
      23  /* No pic register.  */
      24  #elif defined(__cris__)
      25  # define PIC_REG  "0"
      26  #elif defined(__epiphany__)
      27  #define PIC_REG "r28"
      28  #elif defined(__fr30__)
      29  /* No pic register.  */
      30  #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__)
      31  /* No pic register.  */
      32  #elif defined(_IBMR2)
      33  /* No pic register.  */
      34  #elif defined(__i386__)
      35  # define PIC_REG  "ebx"
      36  #elif defined(__ia64__)
      37  /* PIC register is r1, but is used even without -fpic.  */
      38  #elif defined(__lm32__)
      39  /* No pic register.  */
      40  #elif defined(__loongarch__)
      41  /* No pic register.  */
      42  #elif defined(__M32R__)
      43  /* No pic register.  */
      44  #elif defined(__m68k__)
      45  # define PIC_REG  "a5"
      46  #elif defined(__mc68hc1x__)
      47  /* No pic register.  */
      48  #elif defined(__mcore__)
      49  /* No pic register.  */
      50  #elif defined(__MICROBLAZE__)
      51  # define PIC_REG "r20"
      52  #elif defined(__mips__)
      53  /* PIC register is $28, but is used even without -fpic.  */
      54  #elif defined(__MMIX__)
      55  /* No pic register.  */
      56  #elif defined(__mn10300__)
      57  /* No pic register.  */
      58  #elif defined(__moxie__)
      59  /* No pic register.  */
      60  #elif defined(__nds32__)
      61  /* No pic register.  */
      62  #elif defined(__nios2__)
      63  /* No pic register.  */
      64  #elif defined(__hppa__)
      65  /* PIC register is %r27 or %r19, but is used even without -fpic.  */
      66  #elif defined(__pdp11__)
      67  /* No pic register.  */
      68  #elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__) || defined (__ppc)
      69  # ifdef __MACH__
      70  #  define PIC_REG  "31"
      71  # else
      72  #  define PIC_REG  "30"
      73  # endif
      74  #elif defined(__riscv)
      75  /* No pic register.  */
      76  #elif defined(__RX__)
      77  /* No pic register.  */
      78  #elif defined(__s390__)
      79  # define PIC_REG  "12"
      80  #elif defined(__sparc__)
      81  # define PIC_REG  "l7"
      82  #elif defined(__tile__)
      83  # define PIC_REG "r51"
      84  #elif defined(__TMS320C6X__)
      85  # define PIC_REG "B14"
      86  #elif defined(__v850)
      87  /* No pic register.  */
      88  #elif defined(__vax__)
      89  /* No pic register.  */
      90  #elif defined(__VISIUM__)
      91  /* No pic register.  */
      92  #elif defined(__xstormy16__)
      93  /* No pic register.  */
      94  #elif defined(__XTENSA__)
      95  /* No pic register.  */
      96  #elif defined(__sh__)
      97  # define PIC_REG  "r12"
      98  #elif defined(__x86_64__)
      99  /* No pic register.  */
     100  #elif defined(__m32c__)
     101  /* No pic register.  */
     102  #elif defined (__frv__)
     103  # ifdef __FRV_FDPIC__
     104  #  define PIC_REG "gr15"
     105  # else
     106  #  define PIC_REG "gr17"
     107  #endif
     108  #elif defined (__aarch64__)
     109  /* No pic register -- yet.  */
     110  #elif defined(__RL78__)
     111  /* No pic register.  */
     112  #elif defined(__MSP430__)
     113  /* No pic register.  */
     114  #elif defined (__nvptx__)
     115  /* No pic register.  */
     116  #elif defined (__csky__)
     117  /* Pic register is r28, but some cores only have r0-r15.  */
     118  # if defined (__CK807__) || defined (__CK810__)
     119  #   define PIC_REG  "r28"
     120  # endif
     121  #elif defined (__or1k__)
     122  /* No pic register.  */
     123  #elif defined (__AMDGCN__)
     124  /* No pic register.  */
     125  #elif defined(__PRU__)
     126  /* No pic register.  */
     127  #else
     128  # error "Modify the test for your target."
     129  #endif
     130  
     131  #if defined PIC_REG && !defined __PIC__ && !defined __pic__
     132  register void *reg __asm__(PIC_REG);
     133  #else
     134  /* We really need a global register variable set to the PIC register
     135     to expose the bug.  Oh well, let the test case not fail.  */
     136  static void *reg;
     137  #endif
     138  
     139  void * __attribute__((noinline))
     140  dummy (void *x)
     141  {
     142    return x;
     143  }
     144  
     145  void
     146  f (void)
     147  {
     148    goto *dummy (&&bar);
     149    for (;;)
     150      {
     151      foo:
     152        reg = (void *) 1;
     153        if (!reg)
     154          goto baz;
     155        reg = &&foo;
     156      }
     157  
     158   bar:
     159   baz:
     160    reg = 0;
     161  }
     162  
     163  int
     164  main()
     165  {
     166    void *old_reg = reg;
     167    reg = (void *) 1;
     168  
     169    f ();
     170  
     171    /* Additionally test that the prologue/epilogue properly does *not*
     172       save and restore global registers.  Not possible when the PIC
     173       register is in a register window, of course.  On Darwin, you can't
     174       call library routines from non-PIC code.  */
     175  #if !defined (__sparc__) && !defined(__MACH__)
     176    if (reg)
     177      abort ();
     178  #endif
     179  
     180    reg = old_reg;
     181    return 0;
     182  }