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;