Constify linetables
authorTom Tromey <tom@tromey.com>
Wed, 8 Mar 2023 01:16:29 +0000 (18:16 -0700)
committerTom Tromey <tom@tromey.com>
Sat, 11 Mar 2023 15:48:10 +0000 (08:48 -0700)
Linetables no longer change after they are created.  This patch
applies const to them.

Note there is one hack to cast away const in mdebugread.c.  This code
allocates a linetable using 'malloc', then later copies it to the
obstack.  While this could be cleaned up, I chose not to do so because
I have no way of testing it.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/buildsym.c
gdb/disasm.c
gdb/jit.c
gdb/linespec.c
gdb/mdebugread.c
gdb/python/py-linetable.c
gdb/record-btrace.c
gdb/symmisc.c
gdb/symtab.c
gdb/symtab.h

index 0117b06a94ac02e1724aa3c304edd0be2f0deab7..56f11dd167fbab63bcc39e306915d8b6e55966bb 100644 (file)
@@ -916,13 +916,15 @@ buildsym_compunit::end_compunit_symtab_with_blockvector
          size_t entry_array_size = n_entries * sizeof (struct linetable_entry);
          int linetablesize = sizeof (struct linetable) + entry_array_size;
 
-         symtab->set_linetable
-           (XOBNEWVAR (&m_objfile->objfile_obstack, struct linetable,
-                       linetablesize));
+         struct linetable *new_table
+           XOBNEWVAR (&m_objfile->objfile_obstack, struct linetable,
+                        linetablesize);
 
-         symtab->linetable ()->nitems = n_entries;
-         memcpy (symtab->linetable ()->item,
+         new_table->nitems = n_entries;
+         memcpy (new_table->item,
                  subfile->line_vector_entries.data (), entry_array_size);
+
+         symtab->set_linetable (new_table);
        }
       else
        symtab->set_linetable (nullptr);
index 2acde04ffe95f03beec1c48ea84718fd5d6c27b4..71d3b97258d32d384d927bc63673bca62d6ca990 100644 (file)
@@ -573,7 +573,7 @@ do_mixed_source_and_assembly_deprecated
 {
   int newlines = 0;
   int nlines;
-  struct linetable_entry *le;
+  const struct linetable_entry *le;
   struct deprecated_dis_line_entry *mle;
   struct symtab_and_line sal;
   int i;
index 938155d59288575c02097ef72614322115e76644..eb2e8adf519b7735328094b42682d38b5105a8e3 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -543,9 +543,11 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
       size_t size = ((stab->linetable->nitems - 1)
                     * sizeof (struct linetable_entry)
                     + sizeof (struct linetable));
-      filetab->set_linetable ((struct linetable *)
-                             obstack_alloc (&objfile->objfile_obstack, size));
-      memcpy (filetab->linetable (), stab->linetable.get (), size);
+      struct linetable *new_table
+       = (struct linetable *) obstack_alloc (&objfile->objfile_obstack,
+                                             size);
+      memcpy (new_table, stab->linetable.get (), size);
+      filetab->set_linetable (new_table);
     }
 
   blockvector_size = (sizeof (struct blockvector)
index 36f2ef46a7c3a211c73fa54e6341e335c3d0dea0..7d969f37fbf08b5a02fa71d99296e614f7702454 100644 (file)
@@ -403,7 +403,7 @@ static std::vector<symtab_and_line> decode_digits_ordinary
   (struct linespec_state *self,
    linespec *ls,
    int line,
-   linetable_entry **best_entry);
+   const linetable_entry **best_entry);
 
 static std::vector<symtab_and_line> decode_digits_list_mode
   (struct linespec_state *self,
@@ -2079,7 +2079,7 @@ create_sals_line_offset (struct linespec_state *self,
     values = decode_digits_list_mode (self, ls, val);
   else
     {
-      struct linetable_entry *best_entry = NULL;
+      const linetable_entry *best_entry = NULL;
       int i, j;
 
       std::vector<symtab_and_line> intermediate_results
@@ -4026,7 +4026,7 @@ static std::vector<symtab_and_line>
 decode_digits_ordinary (struct linespec_state *self,
                        linespec *ls,
                        int line,
-                       struct linetable_entry **best_entry)
+                       const linetable_entry **best_entry)
 {
   std::vector<symtab_and_line> sals;
   for (const auto &elt : ls->file_symtabs)
index 6fd3b09e518652b00d179438e3c2ea5e4a81f0e2..13dc7899d446a265bb07b994cffdbff42768fd87 100644 (file)
@@ -4065,7 +4065,10 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 
       psymtab_language = cust->primary_filetab ()->language ();
 
-      lines = cust->primary_filetab ()->linetable ();
+      /* This code allocates the line table on the heap and then later
+        copies it to the obstack.  So, while casting away const here
+        is ugly, it's not incorrect.  */
+      lines = const_cast<linetable *> (cust->primary_filetab ()->linetable ());
 
       /* Get a new lexical context.  */
 
index e42bcc2c792850a135027a38ab8742f20ad3931f..6e89c43e65fbb756e73cf4621091e0bca3a5f091 100644 (file)
@@ -156,7 +156,7 @@ ltpy_get_pcs_for_line (PyObject *self, PyObject *args)
 {
   struct symtab *symtab;
   gdb_py_longest py_line;
-  struct linetable_entry *best_entry = NULL;
+  const linetable_entry *best_entry = nullptr;
   std::vector<CORE_ADDR> pcs;
 
   LTPY_REQUIRE_VALID (self, symtab);
@@ -201,7 +201,7 @@ ltpy_has_line (PyObject *self, PyObject *args)
 
   for (index = 0; index < symtab->linetable ()->nitems; index++)
     {
-      struct linetable_entry *item = &(symtab->linetable ()->item[index]);
+      const linetable_entry *item = &(symtab->linetable ()->item[index]);
       if (item->line == py_line)
          Py_RETURN_TRUE;
     }
@@ -219,7 +219,6 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args)
 {
   struct symtab *symtab;
   Py_ssize_t index;
-  struct linetable_entry *item;
 
   LTPY_REQUIRE_VALID (self, symtab);
 
@@ -236,7 +235,7 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args)
 
   for (index = 0; index < symtab->linetable ()->nitems; index++)
     {
-      item = &(symtab->linetable ()->item[index]);
+      const linetable_entry *item = &(symtab->linetable ()->item[index]);
 
       /* 0 is used to signify end of line table information.  Do not
         include in the source set. */
@@ -395,7 +394,6 @@ ltpy_iternext (PyObject *self)
   ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) self;
   struct symtab *symtab;
   PyObject *obj;
-  struct linetable_entry *item;
 
   LTPY_REQUIRE_VALID (iter_obj->source, symtab);
 
@@ -405,7 +403,8 @@ ltpy_iternext (PyObject *self)
       return NULL;
     }
 
-  item = &(symtab->linetable ()->item[iter_obj->current_index]);
+  const linetable_entry *item
+    = &(symtab->linetable ()->item[iter_obj->current_index]);
 
   /* Skip over internal entries such as 0.  0 signifies the end of
      line table data and is not useful to the API user.  */
index 55fe25e84ae3cc1261c2f9d62668b668f8072c1c..5b6e33f78feb7c0f963c6733fe083a95a585085c 100644 (file)
@@ -705,8 +705,8 @@ static struct btrace_line_range
 btrace_find_line_range (CORE_ADDR pc)
 {
   struct btrace_line_range range;
-  struct linetable_entry *lines;
-  struct linetable *ltable;
+  const linetable_entry *lines;
+  const linetable *ltable;
   struct symtab *symtab;
   int nlines, i;
 
index 3579bf0b67ff2b8b659d0b79bea1bd04a6fb5fa7..2f1e4f5b784c1f5f98a46167df305d1b8c70fc59 100644 (file)
@@ -237,7 +237,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
   struct objfile *objfile = symtab->compunit ()->objfile ();
   struct gdbarch *gdbarch = objfile->arch ();
   struct mdict_iterator miter;
-  struct linetable *l;
+  const struct linetable *l;
   struct symbol *sym;
   int depth;
 
@@ -948,7 +948,7 @@ block_depth (const struct block *block)
 static int
 maintenance_print_one_line_table (struct symtab *symtab, void *data)
 {
-  struct linetable *linetable;
+  const struct linetable *linetable;
   struct objfile *objfile;
 
   objfile = symtab->compunit ()->objfile ();
@@ -986,7 +986,7 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data)
 
       for (int i = 0; i < linetable->nitems; ++i)
        {
-         struct linetable_entry *item;
+         const linetable_entry *item;
 
          item = &linetable->item [i];
          ui_out_emit_tuple tuple_emitter (uiout, nullptr);
index c6be14c5ba1c3ec3df8872fd6fa9de52bf7fe15d..e11f9262a22301dd460934f6c8a7b66bc5bd30b9 100644 (file)
@@ -78,7 +78,7 @@
 
 static void rbreak_command (const char *, int);
 
-static int find_line_common (struct linetable *, int, int *, int);
+static int find_line_common (const linetable *, int, int *, int);
 
 static struct block_symbol
   lookup_symbol_aux (const char *name,
@@ -2987,15 +2987,15 @@ struct symtab_and_line
 find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 {
   struct compunit_symtab *cust;
-  struct linetable *l;
+  const linetable *l;
   int len;
-  struct linetable_entry *item;
+  const linetable_entry *item;
   const struct blockvector *bv;
   struct bound_minimal_symbol msymbol;
 
   /* Info on best line seen so far, and where it starts, and its file.  */
 
-  struct linetable_entry *best = NULL;
+  const linetable_entry *best = NULL;
   CORE_ADDR best_end = 0;
   struct symtab *best_symtab = 0;
 
@@ -3004,11 +3004,11 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
      If we don't find a line whose range contains PC,
      we will use a line one less than this,
      with a range from the start of that file to the first line's pc.  */
-  struct linetable_entry *alt = NULL;
+  const linetable_entry *alt = NULL;
 
   /* Info on best line seen in this file.  */
 
-  struct linetable_entry *prev;
+  const linetable_entry *prev;
 
   /* If this pc is not from the current frame,
      it is the address of the end of a call instruction.
@@ -3164,8 +3164,8 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
        return comp_pc < lhs.raw_pc ();
       };
 
-      struct linetable_entry *first = item;
-      struct linetable_entry *last = item + len;
+      const linetable_entry *first = item;
+      const linetable_entry *last = item + len;
       item = std::upper_bound (first, last,
                               pc - objfile->text_section_offset (),
                               pc_compare);
@@ -3196,7 +3196,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
             pretty cheap.  */
          if (!best->is_stmt)
            {
-             struct linetable_entry *tmp = best;
+             const linetable_entry *tmp = best;
              while (tmp > first && (tmp - 1)->raw_pc () == tmp->raw_pc ()
                     && (tmp - 1)->line != 0 && !tmp->is_stmt)
                --tmp;
@@ -3304,7 +3304,7 @@ find_line_symtab (struct symtab *sym_tab, int line,
      so far seen.  */
 
   int best_index;
-  struct linetable *best_linetable;
+  const struct linetable *best_linetable;
   struct symtab *best_symtab;
 
   /* First try looking it up in the given symtab.  */
@@ -3339,7 +3339,7 @@ find_line_symtab (struct symtab *sym_tab, int line,
            {
              for (symtab *s : cu->filetabs ())
                {
-                 struct linetable *l;
+                 const struct linetable *l;
                  int ind;
 
                  if (FILENAME_CMP (sym_tab->filename, s->filename) != 0)
@@ -3388,7 +3388,7 @@ done:
 
 std::vector<CORE_ADDR>
 find_pcs_for_symtab_line (struct symtab *symtab, int line,
-                         struct linetable_entry **best_item)
+                         const linetable_entry **best_item)
 {
   int start = 0;
   std::vector<CORE_ADDR> result;
@@ -3407,7 +3407,7 @@ find_pcs_for_symtab_line (struct symtab *symtab, int line,
 
       if (!was_exact)
        {
-         struct linetable_entry *item = &symtab->linetable ()->item[idx];
+         const linetable_entry *item = &symtab->linetable ()->item[idx];
 
          if (*best_item == NULL
              || (item->line < (*best_item)->line && item->is_stmt))
@@ -3431,7 +3431,7 @@ find_pcs_for_symtab_line (struct symtab *symtab, int line,
 bool
 find_line_pc (struct symtab *symtab, int line, CORE_ADDR *pc)
 {
-  struct linetable *l;
+  const struct linetable *l;
   int ind;
 
   *pc = 0;
@@ -3496,7 +3496,7 @@ find_line_pc_range (struct symtab_and_line sal, CORE_ADDR *startptr,
    Set *EXACT_MATCH nonzero if the value returned is an exact match.  */
 
 static int
-find_line_common (struct linetable *l, int lineno,
+find_line_common (const linetable *l, int lineno,
                  int *exact_match, int start)
 {
   int i;
@@ -3519,7 +3519,7 @@ find_line_common (struct linetable *l, int lineno,
   len = l->nitems;
   for (i = start; i < len; i++)
     {
-      struct linetable_entry *item = &(l->item[i]);
+      const linetable_entry *item = &(l->item[i]);
 
       /* Ignore non-statements.  */
       if (!item->is_stmt)
@@ -3633,7 +3633,7 @@ static CORE_ADDR
 skip_prologue_using_lineinfo (CORE_ADDR func_addr, struct symtab *symtab)
 {
   CORE_ADDR func_start, func_end;
-  struct linetable *l;
+  const struct linetable *l;
   int i;
 
   /* Give up if this symbol has no lineinfo table.  */
@@ -3654,7 +3654,7 @@ skip_prologue_using_lineinfo (CORE_ADDR func_addr, struct symtab *symtab)
      address we are looking for.  */
   for (i = 0; i < l->nitems; i++)
     {
-      struct linetable_entry *item = &(l->item[i]);
+      const linetable_entry *item = &(l->item[i]);
       CORE_ADDR item_pc = item->pc (objfile);
 
       /* Don't use line numbers of zero, they mark special entries in
@@ -3686,7 +3686,7 @@ skip_prologue_using_linetable (CORE_ADDR func_addr)
   if (prologue_sal.symtab != nullptr
       && prologue_sal.symtab->language () != language_asm)
     {
-      struct linetable *linetable = prologue_sal.symtab->linetable ();
+      const linetable *linetable = prologue_sal.symtab->linetable ();
 
       struct objfile *objfile = prologue_sal.symtab->compunit ()->objfile ();
       start_pc -= objfile->text_section_offset ();
@@ -3939,7 +3939,7 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
        {
          struct objfile *objfile
            = prologue_sal.symtab->compunit ()->objfile ();
-         struct linetable *linetable = prologue_sal.symtab->linetable ();
+         const linetable *linetable = prologue_sal.symtab->linetable ();
          int idx = 0;
 
          /* Skip any earlier lines, and any end-of-sequence marker
index df308e5b493f15f84070dc7e5f86fb06d4e5dd57..9fc9527d21d390155ce8de3fe09a236866ba45ed 100644 (file)
@@ -1635,12 +1635,12 @@ struct symtab
     m_compunit = compunit;
   }
 
-  struct linetable *linetable () const
+  const struct linetable *linetable () const
   {
     return m_linetable;
   }
 
-  void set_linetable (struct linetable *linetable)
+  void set_linetable (const struct linetable *linetable)
   {
     m_linetable = linetable;
   }
@@ -1667,7 +1667,7 @@ struct symtab
   /* Table mapping core addresses to line numbers for this file.
      Can be NULL if none.  Never shared between different symtabs.  */
 
-  struct linetable *m_linetable;
+  const struct linetable *m_linetable;
 
   /* Name of this source file, in a form appropriate to print to the user.
 
@@ -2698,7 +2698,7 @@ void iterate_over_symtabs (const char *name,
 
 
 std::vector<CORE_ADDR> find_pcs_for_symtab_line
-    (struct symtab *symtab, int line, struct linetable_entry **best_entry);
+    (struct symtab *symtab, int line, const linetable_entry **best_entry);
 
 /* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS.  The callback
    is called once per matching symbol SYM.  The callback should return