gdb: add compunit_symtab::set_primary_filetab method
authorSimon Marchi <simon.marchi@efficios.com>
Sat, 20 Nov 2021 02:14:36 +0000 (21:14 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Sun, 6 Feb 2022 20:48:18 +0000 (15:48 -0500)
Add a method to set the primary filetab of the CU.  This is currently
done in buildsym_compunit::end_symtab_with_blockvector.

Change-Id: I16c51a6b90a4cb4c0c5f183b0f2e12bc64b6fd74

gdb/buildsym.c
gdb/symtab.c
gdb/symtab.h

index 1754f5ffe6ede39105ed5d74b3f582fd8705ab44..914834f8e51f0a09d791fd18c76cb4a729e5fe88 100644 (file)
@@ -996,28 +996,8 @@ buildsym_compunit::end_symtab_with_blockvector (struct block *static_block,
       symtab->language = subfile->language;
     }
 
-  /* Make sure the symtab of main_subfile is the first in its list.  */
-  {
-    struct symtab *main_symtab, *prev_symtab;
-
-    main_symtab = m_main_subfile->symtab;
-    prev_symtab = NULL;
-    for (symtab *symtab : compunit_filetabs (cu))
-      {
-       if (symtab == main_symtab)
-         {
-           if (prev_symtab != NULL)
-             {
-               prev_symtab->next = main_symtab->next;
-               main_symtab->next = COMPUNIT_FILETABS (cu);
-               COMPUNIT_FILETABS (cu) = main_symtab;
-             }
-           break;
-         }
-       prev_symtab = symtab;
-      }
-    gdb_assert (main_symtab == COMPUNIT_FILETABS (cu));
-  }
+  /* Make sure the filetab of main_subfile is the primary filetab of the CU.  */
+  cu->set_primary_filetab (m_main_subfile->symtab);
 
   /* Fill out the compunit symtab.  */
 
index 2028e837f0f1b707ea1fc27c0d706d0468db61b1..f4f5f09f215af6101c7beaa4616ba2f7b92a48da 100644 (file)
@@ -361,6 +361,34 @@ compunit_symtab::set_call_site_htab (htab_t call_site_htab)
 
 /* See symtab.h.  */
 
+void
+compunit_symtab::set_primary_filetab (symtab *primary_filetab)
+{
+  symtab *prev_filetab = nullptr;
+
+  /* Move PRIMARY_FILETAB to the head of the filetab list.  */
+  for (symtab *filetab : compunit_filetabs (this))
+    {
+      if (filetab == primary_filetab)
+       {
+         if (prev_filetab != nullptr)
+           {
+             prev_filetab->next = primary_filetab->next;
+             primary_filetab->next = this->filetabs;
+             this->filetabs = primary_filetab;
+           }
+
+         break;
+       }
+
+      prev_filetab = filetab;
+    }
+
+  gdb_assert (primary_filetab == this->filetabs);
+}
+
+/* See symtab.h.  */
+
 struct symtab *
 compunit_symtab::primary_filetab () const
 {
index 3fa4d5f5d0eb611160a541f95ef1ae8d7a9c963e..23a348a381ceb4b3d1b2981408389c087b1ad8d9 100644 (file)
@@ -1473,6 +1473,12 @@ struct compunit_symtab
       }
   }
 
+  /* Make PRIMARY_FILETAB the primary filetab of this compunit symtab.
+
+     PRIMARY_FILETAB must already be a filetab of this compunit symtab.  */
+
+  void set_primary_filetab (symtab *primary_filetab);
+
   /* Return the primary filetab of the compunit.  */
   symtab *primary_filetab () const;