This fixes an internal error in GAS, triggered by the test case reported in PR 16765.
authorNick Clifton <nickc@redhat.com>
Wed, 2 Apr 2014 15:29:35 +0000 (16:29 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 2 Apr 2014 15:29:35 +0000 (16:29 +0100)
The problem was that gcc was generating assembler with missing unwind directives in it,
so that a gas_assert was being triggered.  The patch replaces the assert with an error
message.

* config/tc-arm.c (create_unwind_entry): Report an error if an
attempt to recreate an unwind directive is encountered.

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

index bdb7c2f..c6b2bb5 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-02  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/16765
+       * config/tc-arm.c (create_unwind_entry): Report an error if an
+       attempt to recreate an unwind directive is encountered.
+
 2014-03-27  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-score.c (s3_parse_pce_inst): Add "%s" parameter to
index 69299c7..1795d37 100644 (file)
@@ -20992,7 +20992,7 @@ start_unwind_section (const segT text_seg, int idx)
 
 /* Start an unwind table entry.         HAVE_DATA is nonzero if we have additional
    personality routine data.  Returns zero, or the index table value for
-   and inline entry.  */
+   an inline entry.  */
 
 static valueT
 create_unwind_entry (int have_data)
@@ -21063,7 +21063,12 @@ create_unwind_entry (int have_data)
     }
   else
     {
-      gas_assert (unwind.personality_index == -1);
+      /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
+      if (unwind.personality_index != -1)
+       {
+         as_bad (_("attempt to recreate an unwind entry"));
+         return 1;
+       }
 
       /* An extra byte is required for the opcode count.       */
       size = unwind.opcode_count + 1;