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
#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
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
#undef e_rdsel
#undef e_lrsel
#undef e_rrsel
+#undef e_nsel
#undef e_psel
#undef e_lpsel
#undef e_rpsel
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,
}
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
}
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
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
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;
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;
{
/* 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;
/* 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
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 */
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 */
-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
#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"},
{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"},
{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"},
case R_COMP2:
case R_BEGIN_BRTAB:
case R_END_BRTAB:
+ case R_N0SEL:
+ case R_N1SEL:
reloc_offset = bfd_reloc->address;
break;