* 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.
This commit is contained in:
Jeff Law 1996-02-27 18:50:42 +00:00
parent 431e1e858c
commit 6c7b309055
3 changed files with 94 additions and 32 deletions

View File

@ -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 <shebs@andros.cygnus.com>
* mpw-make.sed: Edit out recent shared library support, and

View File

@ -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;

View File

@ -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;