Fix assembler segfault on gcc/crtstuff.c file.
authorJim Wilson <wilson@tuliptree.org>
Mon, 15 Jan 2001 23:30:38 +0000 (23:30 +0000)
committerJim Wilson <wilson@tuliptree.org>
Mon, 15 Jan 2001 23:30:38 +0000 (23:30 +0000)
* config/tc-ia64.c (ia64_flush_insns): Handle unwind directives
not immediately followed by an instruction.

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

index 08310c3..4703f25 100644 (file)
@@ -1,3 +1,8 @@
+2001-01-15  Jim Wilson  <wilson@redhat.com>
+
+       * config/tc-ia64.c (ia64_flush_insns): Handle unwind directives
+       not immediately followed by an instruction.
+
 2001-01-15  Kazu Hirata  <kazu@hxi.com>
 
        * config/tc-m68hc11.c: Fix formatting.
index b0ff7ed..4f761e2 100644 (file)
@@ -909,6 +909,7 @@ ia64_flush_insns ()
   struct label_fix *lfix;
   segT saved_seg;
   subsegT saved_subseg;
+  unw_rec_list *ptr;
 
   if (!md.last_text_seg)
     return;
@@ -936,6 +937,22 @@ ia64_flush_insns ()
     }
   CURR_SLOT.tag_fixups = 0;
 
+  /* In case there are unwind directives following the last instruction,
+     resolve those now.  We only handle body and prologue directives here.
+     Give an error for others.  */
+  for (ptr = unwind.current_entry; ptr; ptr = ptr->next)
+    {
+      if (ptr->r.type == prologue || ptr->r.type == prologue_gr
+         || ptr->r.type == body)
+       {
+         ptr->slot_number = (unsigned long) frag_more (0);
+         ptr->slot_frag = frag_now;
+       }
+      else
+       as_bad (_("Unwind directive not followed by an instruction."));
+    }
+  unwind.current_entry = NULL;
+
   subseg_set (saved_seg, saved_subseg);
 
   if (md.qp.X_op == O_register)