Apparently I forgot to commit this change:
authorJeff Law <law@redhat.com>
Tue, 7 Feb 1995 18:20:57 +0000 (18:20 +0000)
committerJeff Law <law@redhat.com>
Tue, 7 Feb 1995 18:20:57 +0000 (18:20 +0000)
        * config/tc-hppa.c (md_apply_fix): Go ahead and call
        hppa_field_adjust to get a new value for R_DATA_ONE_SYMBOL
        relocations in SOM.
        (hppa_fix_adjustable): Refine somewhat.

gas/ChangeLog
gas/config/tc-hppa.c

index 47ee3370e9cc3d205fba676299630018998c4e46..72fc95e56ad56d94e1d809d84e5542b992d422c8 100644 (file)
@@ -38,6 +38,13 @@ Thu Feb  2 15:21:24 1995  Ken Raeburn  <raeburn@cujo.cygnus.com>
        (VMS_RSYM_Parse):  move S_GET_VALUE() inside switch to avoid
        calling it for uninteresting cases.
 
+Wed Feb  1 23:52:45 1995  Jeff Law  (law@snake.cs.utah.edu)
+
+       * config/tc-hppa.c (md_apply_fix): Go ahead and call
+       hppa_field_adjust to get a new value for R_DATA_ONE_SYMBOL
+       relocations in SOM.
+       (hppa_fix_adjustable): Refine somewhat.
+
 Fri Jan 27 21:29:53 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * config/tc-ppc.h (NO_STRING_ESCAPES): Don't define if we are
index d0806fb0be008bfe3fbfae4ee1a0ad6171b09d7e..2b79428f5fc0002fb7ed9d0c286c13187a32e665 100644 (file)
@@ -2215,7 +2215,7 @@ pa_ip (str)
              num = pa_get_absolute_expression (&the_insn, &s);
              s = expr_end;
              CHECK_FIELD (num, 671108864, 0, 0);
-             INSERT_FIELD_AND_CONTINUE (opcode, num, 1);
+             INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
 
            /* Handle a 3 bit SFU identifier at 25.  */
            case 'f':
@@ -2855,8 +2855,18 @@ md_apply_fix (fixP, valp)
         which will need a SOM relocation (except for some PC-relative relocs).
         In such cases we should treat the "val" or "addend" as zero since it
         will be added in as needed from fx_offset in tc_gen_reloc.  */
-      if (fixP->fx_addsy != NULL
-         || fixP->fx_r_type == R_HPPA_NONE)
+      if ((fixP->fx_addsy != NULL
+          || fixP->fx_r_type == R_HPPA_NONE)
+#ifdef OBJ_SOM
+         && fmt != 32
+         || hppa_fixP->fx_r_field == e_psel
+         || hppa_fixP->fx_r_field == e_rpsel
+         || hppa_fixP->fx_r_field == e_lpsel
+         || hppa_fixP->fx_r_field == e_tsel
+         || hppa_fixP->fx_r_field == e_rtsel
+         || hppa_fixP->fx_r_field == e_ltsel
+#endif
+         )
        new_val = ((fmt == 12 || fmt == 17) ? 8 : 0);
       else
        new_val = hppa_field_adjust (*valp, 0, hppa_fixP->fx_r_field);
@@ -5379,6 +5389,9 @@ pa_subspace (unused)
       else
        section = subseg_new (ss_name, 0);
 
+      if (zero)
+       seg_info (section)->bss = 1;
+
       /* Now set the flags.  */
       bfd_set_section_flags (stdoutput, section, applicable);
 
@@ -6123,13 +6136,11 @@ pa_text (unused)
    selectors).
 
    Reject reductions involving symbols with external scope; such
-   reductions make life a living hell for object file editors.
+   reductions make life a living hell for object file editors. 
 
-   FIXME.  Also reject R_HPPA relocations which are 32 bits
-   wide.  Helps with code lables in arrays for SOM.  (SOM BFD code
-   needs to generate relocations to push the addend and symbol value
-   onto the stack, add them, then pop the value off the stack and
-   use it in a relocation -- yuk.  */
+   FIXME.  Also reject R_HPPA relocations which are 32bits wide in
+   the code space.  The SOM BFD backend doesn't know how to pull the
+   right bits out of an instruction.  */
 
 int
 hppa_fix_adjustable (fixp)
@@ -6145,10 +6156,14 @@ hppa_fix_adjustable (fixp)
     return 0;
 #endif
 
-  /* Reject reductions of symbols in DLT relative relocs.  */
+  /* Reject reductions of symbols in DLT relative relocs,
+     relocations with plabels.  */
   if (hppa_fix->fx_r_field == e_tsel
       || hppa_fix->fx_r_field == e_ltsel
-      || hppa_fix->fx_r_field == e_rtsel)
+      || hppa_fix->fx_r_field == e_rtsel
+      || hppa_fix->fx_r_field == e_psel
+      || hppa_fix->fx_r_field == e_rpsel
+      || hppa_fix->fx_r_field == e_lpsel)
     return 0;
 
   if (fixp->fx_addsy && fixp->fx_addsy->bsym->flags & BSF_GLOBAL)