* libhppa.h (pa_arch): Add pa20.
authorJeff Law <law@redhat.com>
Tue, 27 Feb 1996 18:50:42 +0000 (18:50 +0000)
committerJeff Law <law@redhat.com>
Tue, 27 Feb 1996 18:50:42 +0000 (18:50 +0000)
        (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
bfd/libhppa.h
bfd/som.c

index 9ad370af43661726179e559b281da54693894817..f587f192fe95f5ad0965cda8acd07b6c46c48e95 100644 (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
index 40149999e3a55be4e212b35046bf4d1a9387c6f8..1b366d1fb54f49b0a9bd50005df5256a741e3cce 100644 (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;
index 59d07fcc00e31780f6379768d0240178af8b9761..47ffbb1d9f7582477f53669460f210162a6d9a8a 100644 (file)
--- 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;