* config/obj-som.h (obj_attach_unwind_info): Define as a hook
authorJeff Law <law@redhat.com>
Tue, 2 Nov 1993 08:06:23 +0000 (08:06 +0000)
committerJeff Law <law@redhat.com>
Tue, 2 Nov 1993 08:06:23 +0000 (08:06 +0000)
so GAS can attach unwind descriptor information to a BFD symbol.
* config/tc-hppa.c (fix_new_hppa): If necessary attach unwind
descriptor information to the BFD symbol.
(md_apply_fix): R_HPPA_ENTRY and R_HPPA_EXIT can never be "applied",
they are simply markers.  Make R_HPPA_UNWIND_* handling OBJ_ELF
dependent.
(pa_build_unwind_subspace): Whole function is OBJ_ELF dependent.
(pa_entry): Build a R_HPPA_ENTRY relocation when configured for SOM.
(pa_exit): Likewise, but built a R_HPPA_EXIT relocation.  Do not
build "end-of-function" symbols for SOM, they are not needed.

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

index ce2f0ba5f0c3fd1e24f4d0eec68a087cac86a28e..51f6f13dda0269962c789543ee2b7cd2b4b7edff 100644 (file)
@@ -1,5 +1,17 @@
 Mon Nov  1 21:37:04 1993  Jeffrey A. Law  (law@snake.cs.utah.edu)
 
+       * config/obj-som.h (obj_attach_unwind_info): Define as a hook
+       so GAS can attach unwind descriptor information to a BFD symbol.
+       * config/tc-hppa.c (fix_new_hppa): If necessary attach unwind
+       descriptor information to the BFD symbol.
+       (md_apply_fix): R_HPPA_ENTRY and R_HPPA_EXIT can never be "applied",
+       they are simply markers.  Make R_HPPA_UNWIND_* handling OBJ_ELF
+       dependent.
+       (pa_build_unwind_subspace): Whole function is OBJ_ELF dependent.
+       (pa_entry): Build a R_HPPA_ENTRY relocation when configured for SOM.
+       (pa_exit): Likewise, but built a R_HPPA_EXIT relocation.  Do not
+       build "end-of-function" symbols for SOM, they are not needed.
+
        * config/tc-hppa.c (process_exit): Create temporary symbols with
        correct prefixes so they can be eliminated later.
 
index 9a6d3eca608762598068673bfbcd0ddc1d494876..8eca5c052ad92a807265d140204b05d755ae8c37 100644 (file)
@@ -1312,8 +1312,16 @@ fix_new_hppa (frag, where, size, add_symbol, offset, exp, pcrel,
   hppa_fix->fx_r_format = r_format;
   hppa_fix->fx_arg_reloc = arg_reloc;
   if (unwind_desc)
-    bcopy (unwind_desc, hppa_fix->fx_unwind, 8);
+    {
+      bcopy (unwind_desc, hppa_fix->fx_unwind, 8);
 
+      /* If necessary call BFD backend function to attach the
+        unwind bits to the target dependent parts of a BFD symbol.
+        Yuk.  */
+#ifdef obj_attach_unwind_info
+      obj_attach_unwind_info (add_symbol->bsym, unwind_desc);
+#endif
+    }
 }
 
 /* Parse a .byte, .word, .long expression for the HPPA.  Called by
@@ -3097,6 +3105,14 @@ md_apply_fix_1 (fixP, val)
   long new_val, result;
   unsigned int w1, w2, w;
 
+  /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can 
+     never be "applied".  They must always be emitted.  */
+#ifdef OBJ_SOM
+  if (fixP->fx_r_type == R_HPPA_ENTRY
+      || fixP->fx_r_type == R_HPPA_EXIT)
+    return;
+#endif
+
   /* There should have been an HPPA specific fixup associated
      with the GAS fixup.  */
   if (hppa_fixP)
@@ -3205,6 +3221,8 @@ md_apply_fix_1 (fixP, val)
 
        case 32:
 #ifdef OBJ_ELF
+         /* These are ELF specific relocations.  ELF unfortunately
+            handles unwinds in a completely different manner.  */
          if (hppa_fixP->fx_r_type == R_HPPA_UNWIND_ENTRY
              || hppa_fixP->fx_r_type == R_HPPA_UNWIND_ENTRIES)
            result = fixP->fx_addnumber;
@@ -4248,8 +4266,11 @@ is_same_frag (frag1, frag2)
     return (FALSE);
 }
 
-/* Build an entry in the UNWIND subspace from the given 
-   function attributes in CALL_INFO.  */
+#ifdef OBJ_ELF
+/* Build an entry in the UNWIND subspace from the given function 
+   attributes in CALL_INFO.  This is not needed for SOM as using
+   R_ENTRY and R_EXIT relocations allow the linker to handle building
+   of the unwind spaces.  */
    
 static void
 pa_build_unwind_subspace (call_info)
@@ -4348,6 +4369,7 @@ pa_build_unwind_subspace (call_info)
   /* Return back to the original segment/subsegment.  */
   subseg_set (save_seg, save_subseg);
 }
+#endif
 
 /* Process a .CALLINFO pseudo-op.  This information is used later
    to build unwind descriptors and maybe one day to support
@@ -4618,8 +4640,6 @@ static void
 pa_entry (unused)
      int unused;
 {
-  char *where;
-
   if (!within_procedure)
     as_bad ("Misplaced .entry. Ignored.");
   else
@@ -4631,12 +4651,31 @@ pa_entry (unused)
     }
   demand_empty_rest_of_line ();
   within_entry_exit = TRUE;
-  where = frag_more (0);
 
   /* Go back to the last symbol and turn on the BSF_FUNCTION flag.
      It will not be on if no .EXPORT pseudo-op exists (static function).  */
   last_call_info->start_symbol->bsym->flags |= BSF_FUNCTION;
 
+#ifdef OBJ_SOM
+  /* SOM defers building of unwind descriptors until the link phase.
+     The assembler is responsible for creating an R_ENTRY relocation
+     to mark the beginning of a region and hold the unwind bits, and
+     for creating an R_EXIT relocation to mark the end of the region.
+
+     FIXME.  ELF should be using the same conventions!  The problem
+     is an unwind requires too much relocation space.  Hmmm.  Maybe
+     if we split the unwind bits up between the relocations which
+     denote the entry and exit points.  */
+  {
+    char *where = frag_more (0);
+    fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 
+                 last_call_info->start_symbol, (offsetT) 0, NULL,
+                 0, R_HPPA_ENTRY, e_fsel, 0, 0,
+                 &last_call_info->ci_unwind.descriptor);
+  }
+#endif
+
   return;
 }
 
@@ -4679,6 +4718,7 @@ process_exit ()
 
   where = frag_more (0);
 
+#ifdef OBJ_ELF
   /* ELF does not have EXIT relocations.  All we do is create a
      temporary symbol marking the end of the function.  */
   {
@@ -4723,6 +4763,21 @@ process_exit ()
      table.  */
   last_call_info->end_frag = frag_now;
   pa_build_unwind_subspace (last_call_info);
+#else
+  /* SOM defers building of unwind descriptors until the link phase.
+     The assembler is responsible for creating an R_ENTRY relocation
+     to mark the beginning of a region and hold the unwind bits, and
+     for creating an R_EXIT relocation to mark the end of the region.
+
+     FIXME.  ELF should be using the same conventions!  The problem
+     is an unwind requires too much relocation space.  Hmmm.  Maybe
+     if we split the unwind bits up between the relocations which
+     denote the entry and exit points.  */
+  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
+               last_call_info->start_symbol, (offsetT) 0,
+               NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0, NULL);
+#endif
+
   exit_processing_complete = TRUE;
 }