Hi,

the attached patch adds handling for PLT and PLTOFF unspecs for S/390.
With the patch also constant addends to PLTOFF and GOTOFF are
accepted.

This fixes Java bootstrap for s390x.

Applied to mainline.

Bye,

-Andreas-

2011-03-22  Andreas Krebbel  <andreas.kreb...@de.ibm.com>

        * config/s390/s390.c (s390_delegitimize_address): Handle PLTOFF
        and PLT unspecs.

Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** s390_delegitimize_address (rtx orig_x)
*** 5019,5025 ****
    /* Extract the symbol ref from:
       (plus:SI (reg:SI 12 %r12)
                (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
!                                   UNSPEC_GOTOFF)))  */
    if (GET_CODE (x) == PLUS
        && REG_P (XEXP (x, 0))
        && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
--- 5019,5030 ----
    /* Extract the symbol ref from:
       (plus:SI (reg:SI 12 %r12)
                (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
!                                   UNSPEC_GOTOFF/PLTOFF)))
!      and
!      (plus:SI (reg:SI 12 %r12)
!               (const:SI (plus:SI (unspec:SI [(symbol_ref:SI ("L"))]
!                                              UNSPEC_GOTOFF/PLTOFF)
!                                (const_int 4 [0x4]))))  */
    if (GET_CODE (x) == PLUS
        && REG_P (XEXP (x, 0))
        && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
*************** s390_delegitimize_address (rtx orig_x)
*** 5027,5034 ****
      {
        /* The const operand.  */
        y = XEXP (XEXP (x, 1), 0);
        if (GET_CODE (y) == UNSPEC
!         && XINT (y, 1) == UNSPEC_GOTOFF)
        return XVECEXP (y, 0, 0);
      }
  
--- 5032,5045 ----
      {
        /* The const operand.  */
        y = XEXP (XEXP (x, 1), 0);
+ 
+       if (GET_CODE (y) == PLUS
+         && GET_CODE (XEXP (y, 1)) == CONST_INT)
+       y = XEXP (y, 0);
+ 
        if (GET_CODE (y) == UNSPEC
!         && (XINT (y, 1) == UNSPEC_GOTOFF
!             || XINT (y, 1) == UNSPEC_PLTOFF))
        return XVECEXP (y, 0, 0);
      }
  
*************** s390_delegitimize_address (rtx orig_x)
*** 5050,5058 ****
      }
    else if (GET_CODE (x) == CONST)
      {
        y = XEXP (x, 0);
        if (GET_CODE (y) == UNSPEC
!         && XINT (y, 1) == UNSPEC_GOTENT)
        y = XVECEXP (y, 0, 0);
        else
        return orig_x;
--- 5061,5074 ----
      }
    else if (GET_CODE (x) == CONST)
      {
+       /* Extract the symbol ref from:
+        (mem:QI (const:DI (unspec:DI [(symbol_ref:DI ("foo"))]
+                                      UNSPEC_PLT/GOTENT)))  */
+ 
        y = XEXP (x, 0);
        if (GET_CODE (y) == UNSPEC
!         && (XINT (y, 1) == UNSPEC_GOTENT
!             || XINT (y, 1) == UNSPEC_PLT))
        y = XVECEXP (y, 0, 0);
        else
        return orig_x;

Reply via email to