From 6c7b309055066861281ffdb0b8e7d64d5227257f Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 27 Feb 1996 18:50:42 +0000 Subject: [PATCH] * libhppa.h (pa_arch): Add pa20. (hppa_reloc_field_selector_type): Add R_HPPA_NSEL. (e_nsel): Undefine. Add to hppa_reloc_field_selector_type_alt. (hppa_field_adjust): Handle e_nsel. * som.c: Provide default definitions for many new relocs found only in hpux10 include files. (som_fixup_formats): Add several new relocs from hpux10. (som_hppa_howto_table): Add hpux10 relocs. (som_write_fixups): Handle R_N0SEL and R_N1SEL hpux10 relocs. Quick stab at handling some of the new hpux10 features. --- bfd/ChangeLog | 12 +++++++++ bfd/libhppa.h | 47 +++++++++++++++++++++--------------- bfd/som.c | 67 ++++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 94 insertions(+), 32 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9ad370af436..f587f192fe9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +Tue Feb 27 11:31:34 1996 Jeffrey A Law (law@cygnus.com) + + * libhppa.h (pa_arch): Add pa20. + (hppa_reloc_field_selector_type): Add R_HPPA_NSEL. + (e_nsel): Undefine. Add to hppa_reloc_field_selector_type_alt. + (hppa_field_adjust): Handle e_nsel. + * som.c: Provide default definitions for many new relocs found only + in hpux10 include files. + (som_fixup_formats): Add several new relocs from hpux10. + (som_hppa_howto_table): Add hpux10 relocs. + (som_write_fixups): Handle R_N0SEL and R_N1SEL hpux10 relocs. + Mon Feb 26 12:52:48 1996 Stan Shebs * mpw-make.sed: Edit out recent shared library support, and diff --git a/bfd/libhppa.h b/bfd/libhppa.h index 40149999e3a..1b366d1fb54 100644 --- a/bfd/libhppa.h +++ b/bfd/libhppa.h @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _HPPA_H #define _HPPA_H @@ -34,6 +34,9 @@ #endif /* GNU C? */ #endif /* INLINE */ +/* The PA instruction set variants. */ +enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20}; + /* HP PA-RISC relocation types */ enum hppa_reloc_field_selector_type @@ -47,12 +50,13 @@ enum hppa_reloc_field_selector_type R_HPPA_RDSEL = 0x6, R_HPPA_LRSEL = 0x7, R_HPPA_RRSEL = 0x8, - R_HPPA_PSEL = 0x9, - R_HPPA_LPSEL = 0xa, - R_HPPA_RPSEL = 0xb, - R_HPPA_TSEL = 0xc, - R_HPPA_LTSEL = 0xd, - R_HPPA_RTSEL = 0xe + R_HPPA_NSEL = 0x9, + R_HPPA_PSEL = 0xa, + R_HPPA_LPSEL = 0xb, + R_HPPA_RPSEL = 0xc, + R_HPPA_TSEL = 0xd, + R_HPPA_LTSEL = 0xe, + R_HPPA_RTSEL = 0xf }; /* /usr/include/reloc.h defines these to constants. We want to use @@ -69,6 +73,7 @@ enum hppa_reloc_field_selector_type #undef e_rdsel #undef e_lrsel #undef e_rrsel +#undef e_nsel #undef e_psel #undef e_lpsel #undef e_rpsel @@ -94,6 +99,7 @@ enum hppa_reloc_field_selector_type_alt e_rdsel = R_HPPA_RDSEL, e_lrsel = R_HPPA_LRSEL, e_rrsel = R_HPPA_RRSEL, + e_nsel = R_HPPA_NSEL, e_psel = R_HPPA_PSEL, e_lpsel = R_HPPA_LPSEL, e_rpsel = R_HPPA_RPSEL, @@ -226,10 +232,10 @@ dis_assemble_21 (as21, x) } static INLINE unsigned long -sign_ext (x, len) +sign_extend (x, len) unsigned int x, len; { - return (x << (32 - len)) >> (32 - len); + return (int)(x >> (len - 1) ? (-1 << len) | x : x); } static INLINE unsigned int @@ -263,17 +269,10 @@ sign_unext (x, len, result) } static INLINE unsigned long -low_sign_ext (x, len) +low_sign_extend (x, len) unsigned int x, len; { - unsigned int temp1, temp2; - unsigned int len_ones; - - len_ones = ones (len); - - temp1 = (x & 1) << (len - 1); - temp2 = ((x & 0xfffffffe) & len_ones) >> 1; - return sign_ext ((temp1 | temp2), len); + return (int)((x & 0x1 ? (-1 << (len - 1)) : 0) | x >> 1); } static INLINE void @@ -311,16 +310,19 @@ hppa_field_adjust (value, constant_value, r_field) switch (r_field) { case e_fsel: /* F : no change */ + value += constant_value; break; case e_lssel: /* LS : if (bit 21) then add 0x800 arithmetic shift right 11 bits */ + value += constant_value; if (value & 0x00000400) value += 0x800; value = (value & 0xfffff800) >> 11; break; case e_rssel: /* RS : Sign extend from bit 21 */ + value += constant_value; if (value & 0x00000400) value |= 0xfffff800; else @@ -328,23 +330,28 @@ hppa_field_adjust (value, constant_value, r_field) break; case e_lsel: /* L : Arithmetic shift right 11 bits */ + value += constant_value; value = (value & 0xfffff800) >> 11; break; case e_rsel: /* R : Set bits 0-20 to zero */ + value += constant_value; value = value & 0x7ff; break; case e_ldsel: /* LD : Add 0x800, arithmetic shift right 11 bits */ + value += constant_value; value += 0x800; value = (value & 0xfffff800) >> 11; break; case e_rdsel: /* RD : Set bits 0-20 to one */ + value += constant_value; value |= 0xfffff800; break; + case e_nsel: /* Just a guess at the moment. */ case e_lrsel: /* LR : L with "rounded" constant */ value = value + ((constant_value + 0x1000) & 0xffffe000); value = (value & 0xfffff800) >> 11; @@ -410,7 +417,7 @@ hppa_field_adjust (value, constant_value, r_field) FIXME: opcodes which do not map to a known format should return an error of some sort. */ -static char +static INLINE char bfd_hppa_insn2fmt (insn) unsigned long insn; { @@ -469,7 +476,7 @@ bfd_hppa_insn2fmt (insn) /* Insert VALUE into INSN using R_FORMAT to determine exactly what bits to change. */ -static unsigned long +static INLINE unsigned long hppa_rebuild_insn (abfd, insn, value, r_format) bfd *abfd; unsigned long insn; diff --git a/bfd/som.c b/bfd/som.c index 59d07fcc00e..47ffbb1d9f7 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -1,5 +1,5 @@ /* bfd back-end for HP PA-RISC SOM objects. - Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Contributed by the Center for Software Science at the @@ -430,8 +430,9 @@ static const struct fixup_format som_fixup_formats[256] = 1, "Lb4*=Mb1+L*=", /* 0x2b */ 2, "Lb4*=Md1+4*=", /* 0x2c */ 3, "Ld1+=Me1+=", /* 0x2d */ - /* R_RESERVED */ + /* R_SHORT_PCREL_MODE */ 0, "", /* 0x2e */ + /* R_LONG_PCREL_MODE */ 0, "", /* 0x2f */ /* R_PCREL_CALL */ 0, "L4=RD=Sb=", /* 0x30 */ @@ -637,14 +638,21 @@ static const struct fixup_format som_fixup_formats[256] = 1, "P", /* 0xd4 */ 2, "P", /* 0xd5 */ 3, "P", /* 0xd6 */ - /* R_RESERVED */ + /* R_SEC_STMT */ 0, "", /* 0xd7 */ + /* R_N0SEL */ 0, "", /* 0xd8 */ + /* R_N1SEL */ 0, "", /* 0xd9 */ + /* R_LINETAB */ 0, "", /* 0xda */ + /* R_LINETAB_ESC */ 0, "", /* 0xdb */ + /* R_LTP_OVERRIDE */ 0, "", /* 0xdc */ + /* R_COMMENT */ 0, "", /* 0xdd */ + /* R_RESERVED */ 0, "", /* 0xde */ 0, "", /* 0xdf */ 0, "", /* 0xe0 */ @@ -719,7 +727,7 @@ static const int comp3_opcodes[] = -1 }; -/* These apparently are not in older versions of hpux reloc.h. */ +/* These apparently are not in older versions of hpux reloc.h (hpux7). */ #ifndef R_DLT_REL #define R_DLT_REL 0x78 #endif @@ -732,6 +740,39 @@ static const int comp3_opcodes[] = #define R_SEC_STMT 0xd7 #endif +/* And these first appeared in hpux10. */ +#ifndef R_SHORT_PCREL_MODE +#define R_SHORT_PCREL_MODE 0x3e +#endif + +#ifndef R_LONG_PCREL_MODE +#define R_LONG_PCREL_MODE 0x3f +#endif + +#ifndef R_N0SEL +#define R_N0SEL 0xd8 +#endif + +#ifndef R_N1SEL +#define R_N1SEL 0xd9 +#endif + +#ifndef R_LINETAB +#define R_LINETAB 0xda +#endif + +#ifndef R_LINETAB_ESC +#define R_LINETAB_ESC 0xdb +#endif + +#ifndef R_LTP_OVERRIDE +#define R_LTP_OVERRIDE 0xdc +#endif + +#ifndef R_COMMENT +#define R_COMMENT 0xdd +#endif + static reloc_howto_type som_hppa_howto_table[] = { {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, @@ -796,8 +837,8 @@ static reloc_howto_type som_hppa_howto_table[] = {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, + {R_SHORT_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SHORT_PCREL_MODE"}, + {R_LONG_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LONG_PCREL_MODE"}, {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, @@ -950,12 +991,12 @@ static reloc_howto_type som_hppa_howto_table[] = {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, {R_SEC_STMT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SEC_STMT"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, + {R_N0SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N0SEL"}, + {R_N1SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N1SEL"}, + {R_LINETAB, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB"}, + {R_LINETAB_ESC, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB_ESC"}, + {R_LTP_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LTP_OVERRIDE"}, + {R_COMMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMMENT"}, {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, @@ -2578,6 +2619,8 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep) case R_COMP2: case R_BEGIN_BRTAB: case R_END_BRTAB: + case R_N0SEL: + case R_N1SEL: reloc_offset = bfd_reloc->address; break; -- 2.30.2