Re: PR28149, debug info with wrong file association
authorAlan Modra <amodra@gmail.com>
Mon, 20 Sep 2021 02:00:41 +0000 (11:30 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 20 Sep 2021 02:08:55 +0000 (11:38 +0930)
Fixes segfaults when building aarch64-linux kernel, due to only doing
part of the work necessary when allocating file numbers late.  I'd
missed looping over subsegments, which resulted in some u.filename
entries left around and later interpreted as u.view.

PR 28149
* dwarf2dbg.c (purge_generated_debug): Iterate over subsegs too.
(dwarf2_finish): Call do_allocate_filenum for all subsegs too,
in a separate loop before subsegs are chained.

gas/dwarf2dbg.c

index 1250fcef54f8c26f01698b695c258fa656021644..e2abe19c88a48e484287b326f6ea3ff26f6924fb 100644 (file)
@@ -792,19 +792,23 @@ purge_generated_debug (void)
 
   for (s = all_segs; s; s = s->next)
     {
-      struct line_subseg *lss = s->head;
-      struct line_entry *e, *next;
+      struct line_subseg *lss;
 
-      for (e = lss->head; e; e = next)
+      for (lss = s->head; lss; lss = lss->next)
        {
-         know (e->loc.filenum == -1u);
-         next = e->next;
-         free (e);
-       }
+         struct line_entry *e, *next;
+
+         for (e = lss->head; e; e = next)
+           {
+             know (e->loc.filenum == -1u);
+             next = e->next;
+             free (e);
+           }
 
-      lss->head = NULL;
-      lss->ptail = &lss->head;
-      lss->pmove_tail = &lss->head;
+         lss->head = NULL;
+         lss->ptail = &lss->head;
+         lss->pmove_tail = &lss->head;
+       }
     }
 }
 
@@ -2887,15 +2891,21 @@ dwarf2_finish (void)
                             SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
     }
 
+  for (s = all_segs; s; s = s->next)
+    {
+      struct line_subseg *lss;
+
+      for (lss = s->head; lss; lss = lss->next)
+       if (lss->head)
+         do_allocate_filenum (lss->head);
+    }
+
   /* For each subsection, chain the debug entries together.  */
   for (s = all_segs; s; s = s->next)
     {
       struct line_subseg *lss = s->head;
       struct line_entry **ptail = lss->ptail;
 
-      if (lss->head && SEG_NORMAL (s->seg))
-       do_allocate_filenum (lss->head);
-
       /* Reset the initial view of the first subsection of the
         section.  */
       if (lss->head && lss->head->loc.u.view)