* 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:
parent
431e1e858c
commit
6c7b309055
3 changed files with 94 additions and 32 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
67
bfd/som.c
67
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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue