aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-03-07 18:16:29 -0700
committerTom Tromey <tom@tromey.com>2023-03-11 08:48:10 -0700
commit977a0c161de83a5e5397f9f7950d58173c4b4be2 (patch)
tree5264db12f959dba8dfddaac35b4008ee02a4253a
parent1acc9dca423f78e44553928f0de839b618c13766 (diff)
downloadfsf-binutils-gdb-977a0c161de83a5e5397f9f7950d58173c4b4be2.zip
fsf-binutils-gdb-977a0c161de83a5e5397f9f7950d58173c4b4be2.tar.gz
fsf-binutils-gdb-977a0c161de83a5e5397f9f7950d58173c4b4be2.tar.bz2
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 <simon.marchi@efficios.com>
-rw-r--r--gdb/buildsym.c12
-rw-r--r--gdb/disasm.c2
-rw-r--r--gdb/jit.c8
-rw-r--r--gdb/linespec.c6
-rw-r--r--gdb/mdebugread.c5
-rw-r--r--gdb/python/py-linetable.c11
-rw-r--r--gdb/record-btrace.c4
-rw-r--r--gdb/symmisc.c6
-rw-r--r--gdb/symtab.c40
-rw-r--r--gdb/symtab.h8
10 files changed, 54 insertions, 48 deletions
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 0117b06..56f11dd 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 2acde04..71d3b97 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 938155d..eb2e8ad 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 36f2ef4..7d969f3 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -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)
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 6fd3b09..13dc789 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<linetable *> (cust->primary_filetab ()->linetable ());
/* Get a new lexical context. */
diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c
index e42bcc2..6e89c43 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<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. */
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 55fe25e..5b6e33f 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 3579bf0..2f1e4f5 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 c6be14c..e11f926 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<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
diff --git a/gdb/symtab.h b/gdb/symtab.h
index df308e5..9fc9527 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<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