aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1996-02-27 18:50:42 +0000
committerJeff Law <law@redhat.com>1996-02-27 18:50:42 +0000
commit6c7b309055066861281ffdb0b8e7d64d5227257f (patch)
tree6f23d2024147f877fcfbeb67097e46d0d3e69759
parent431e1e858c2bce0edcda91ae36799697f9979d5e (diff)
downloadgdb-6c7b309055066861281ffdb0b8e7d64d5227257f.zip
gdb-6c7b309055066861281ffdb0b8e7d64d5227257f.tar.gz
gdb-6c7b309055066861281ffdb0b8e7d64d5227257f.tar.bz2
* 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.
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/libhppa.h47
-rw-r--r--bfd/som.c67
3 files changed, 94 insertions, 32 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9ad370a..f587f19 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 <shebs@andros.cygnus.com>
* mpw-make.sed: Edit out recent shared library support, and
diff --git a/bfd/libhppa.h b/bfd/libhppa.h
index 4014999..1b366d1 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 59d07fc..47ffbb1 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;