From: Tom Tromey Date: Wed, 8 Mar 2023 01:16:29 +0000 (-0700) Subject: Constify linetables X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=977a0c161de83a5e5397f9f7950d58173c4b4be2;p=binutils-gdb.git Constify linetables 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 --- diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 0117b06a94a..56f11dd167f 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -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); diff --git a/gdb/disasm.c b/gdb/disasm.c index 2acde04ffe9..71d3b97258d 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -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; diff --git a/gdb/jit.c b/gdb/jit.c index 938155d5928..eb2e8adf519 100644 --- 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) diff --git a/gdb/linespec.c b/gdb/linespec.c index 36f2ef46a7c..7d969f37fbf 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -403,7 +403,7 @@ static std::vector decode_digits_ordinary (struct linespec_state *self, linespec *ls, int line, - linetable_entry **best_entry); + const linetable_entry **best_entry); static std::vector 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 intermediate_results @@ -4026,7 +4026,7 @@ static std::vector decode_digits_ordinary (struct linespec_state *self, linespec *ls, int line, - struct linetable_entry **best_entry) + const linetable_entry **best_entry) { std::vector sals; for (const auto &elt : ls->file_symtabs) diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 6fd3b09e518..13dc7899d44 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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 (cust->primary_filetab ()->linetable ()); /* Get a new lexical context. */ diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index e42bcc2c792..6e89c43e65f 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -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 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. */ diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 55fe25e84ae..5b6e33f78fe 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -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; diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 3579bf0b67f..2f1e4f5b784 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -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); diff --git a/gdb/symtab.c b/gdb/symtab.c index c6be14c5ba1..e11f9262a22 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -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 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 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 diff --git a/gdb/symtab.h b/gdb/symtab.h index df308e5b493..9fc9527d21d 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -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 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