From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 38045 invoked by alias); 21 Mar 2018 17:18:18 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 37864 invoked by uid 89); 21 Mar 2018 17:18:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=sk:find_pc, symtabc, UD:symtab.c, symtab.c X-HELO: gateway31.websitewelcome.com Received: from gateway31.websitewelcome.com (HELO gateway31.websitewelcome.com) (192.185.144.97) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 21 Mar 2018 17:18:13 +0000 Received: from cm11.websitewelcome.com (cm11.websitewelcome.com [100.42.49.5]) by gateway31.websitewelcome.com (Postfix) with ESMTP id AB206E56A2F for ; Wed, 21 Mar 2018 12:18:12 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id yhNMeF4TgA3CSyhNMeQvj8; Wed, 21 Mar 2018 12:18:12 -0500 Received: from 174-29-60-18.hlrn.qwest.net ([174.29.60.18]:52016 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89_1) (envelope-from ) id 1eyhNM-001P3q-DG; Wed, 21 Mar 2018 12:18:12 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 2/2] Constify the line table Date: Wed, 21 Mar 2018 17:18:00 -0000 Message-Id: <20180321171809.13115-3-tom@tromey.com> In-Reply-To: <20180321171809.13115-1-tom@tromey.com> References: <20180321171809.13115-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1eyhNM-001P3q-DG X-Source-Sender: 174-29-60-18.hlrn.qwest.net (bapiya.Home) [174.29.60.18]:52016 X-Source-Auth: tom+tromey.com X-Email-Count: 5 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-SW-Source: 2018-03/txt/msg00386.txt.bz2 From: Tom Tromey Now that linetables aren't relocated, we can make them immutable in the symbol table. This patch applies "const" there and then fixes up the fallout. gdb/ChangeLog 2018-03-21 Tom Tromey * record-btrace.c (btrace_find_line_range): Constify. * buildsym.c (end_symtab_from_static_block): Update. * disasm.c (do_mixed_source_and_assembly, gdb_disassembly): Update. * jit.c (finalize_symtab): Update and rearrange for constification. * linespec.c (create_sals_line_offset): Update. (decode_digits_ordinary): Make "best_entry" const. * mdebugread.c (psymtab_to_symtab_1): Update. (new_symtab): Add "lines" parameter. * mi/mi-symbol-cmds.c (mi_cmd_symbol_list_lines): Update. * python/py-linetable.c (ltpy_get_pcs_for_line, ltpy_has_line) (ltpy_get_all_source_lines, ltpy_iternext): Update. * symmisc.c (dump_symtab_1, maintenance_print_one_line_table): Update. * symtab.c (find_pc_sect_line, find_line_symtab) (find_pcs_for_symtab_line, find_line_common) (skip_prologue_using_lineinfo, skip_prologue_using_sal): Update. * symtab.h (struct symtab) : Now const. (find_pcs_for_symtab_line): Update. --- gdb/ChangeLog | 23 +++++++++++++++++++++++ gdb/buildsym.c | 6 +++--- gdb/disasm.c | 2 +- gdb/jit.c | 8 ++++---- gdb/linespec.c | 6 +++--- gdb/mdebugread.c | 22 +++++++++------------- gdb/mi/mi-symbol-cmds.c | 2 +- gdb/python/py-linetable.c | 9 +++++---- gdb/record-btrace.c | 4 ++-- gdb/symmisc.c | 6 +++--- gdb/symtab.c | 39 ++++++++++++++++++++------------------- gdb/symtab.h | 5 +++-- 12 files changed, 77 insertions(+), 55 deletions(-) diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 99a92a8e31..a4945aa7aa 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -1373,10 +1373,10 @@ end_symtab_with_blockvector (struct block *static_block, if (subfile->line_vector) { /* Reallocate the line table on the symbol obstack. */ - SYMTAB_LINETABLE (symtab) = (struct linetable *) + linetable *new_table = (struct linetable *) obstack_alloc (&objfile->objfile_obstack, linetablesize); - memcpy (SYMTAB_LINETABLE (symtab), subfile->line_vector, - linetablesize); + memcpy (new_table, subfile->line_vector, linetablesize); + SYMTAB_LINETABLE (symtab) = new_table; } else { diff --git a/gdb/disasm.c b/gdb/disasm.c index ec5b8a9b81..3f9d6f8b55 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -343,7 +343,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 e5c64cc791..c68ee167a0 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -672,10 +672,10 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) size_t size = ((stab->linetable->nitems - 1) * sizeof (struct linetable_entry) + sizeof (struct linetable)); - SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)) - = (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size); - memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), stab->linetable, - size); + struct linetable *new_table = + (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size); + memcpy (new_table, stab->linetable, size); + SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)) = new_table; } blockvector_size = (sizeof (struct blockvector) diff --git a/gdb/linespec.c b/gdb/linespec.c index 1236b3f475..9f94f80de5 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -389,7 +389,7 @@ static std::vector decode_digits_ordinary (struct linespec_state *self, linespec_p ls, int line, - linetable_entry **best_entry); + const linetable_entry **best_entry); static std::vector decode_digits_list_mode (struct linespec_state *self, @@ -2192,7 +2192,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 struct linetable_entry *best_entry = NULL; int i, j; std::vector intermediate_results @@ -4235,7 +4235,7 @@ static std::vector decode_digits_ordinary (struct linespec_state *self, linespec_p ls, int line, - struct linetable_entry **best_entry) + const struct linetable_entry **best_entry) { int ix; struct symtab *elt; diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index c9b29bcc0f..cd53582baf 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -236,7 +236,8 @@ enum block_type { FUNCTION_BLOCK, NON_FUNCTION_BLOCK }; static struct block *new_block (enum block_type, enum language); -static struct compunit_symtab *new_symtab (const char *, int, struct objfile *); +static struct compunit_symtab *new_symtab (const char *, int, struct objfile *, + struct linetable **); static struct linetable *new_linetable (int); @@ -2177,9 +2178,6 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets, numbers can go back and forth, apparently we can live with that and do not need to reorder our linetables. */ -static void parse_lines (FDR *, PDR *, struct linetable *, int, - struct partial_symtab *, CORE_ADDR); - static void parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines, struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr) @@ -3919,7 +3917,6 @@ psymtab_to_symtab_1 (struct objfile *objfile, int i; struct compunit_symtab *cust = NULL; FDR *fh; - struct linetable *lines; CORE_ADDR lowest_pdr_addr = 0; int last_symtab_ended = 0; struct section_offsets *section_offsets = objfile->section_offsets; @@ -4159,16 +4156,17 @@ psymtab_to_symtab_1 (struct objfile *objfile, int maxlines, size; EXTR *ext_ptr; + struct linetable *lines; if (fh == 0) { maxlines = 0; - cust = new_symtab ("unknown", 0, objfile); + cust = new_symtab ("unknown", 0, objfile, &lines); } else { maxlines = 2 * fh->cline; - cust = new_symtab (pst->filename, maxlines, objfile); + cust = new_symtab (pst->filename, maxlines, objfile, &lines); /* The proper language was already determined when building the psymtab, use it. */ @@ -4177,8 +4175,6 @@ psymtab_to_symtab_1 (struct objfile *objfile, psymtab_language = COMPUNIT_FILETABS (cust)->language; - lines = SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)); - /* Get a new lexical context. */ push_parse_stack (); @@ -4712,17 +4708,17 @@ sort_blocks (struct symtab *s) linenumbers MAXLINES we'll put in it. */ static struct compunit_symtab * -new_symtab (const char *name, int maxlines, struct objfile *objfile) +new_symtab (const char *name, int maxlines, struct objfile *objfile, + struct linetable **lines) { struct compunit_symtab *cust = allocate_compunit_symtab (objfile, name); - struct symtab *symtab; struct blockvector *bv; enum language lang; add_compunit_symtab_to_objfile (cust); - symtab = allocate_symtab (cust, name); + allocate_symtab (cust, name); - SYMTAB_LINETABLE (symtab) = new_linetable (maxlines); + *lines = new_linetable (maxlines); lang = compunit_language (cust); /* All symtabs must have at least two blocks. */ diff --git a/gdb/mi/mi-symbol-cmds.c b/gdb/mi/mi-symbol-cmds.c index 8f3b28e8f8..f42014a2ae 100644 --- a/gdb/mi/mi-symbol-cmds.c +++ b/gdb/mi/mi-symbol-cmds.c @@ -34,7 +34,7 @@ mi_cmd_symbol_list_lines (const char *command, char **argv, int argc) struct symtab *s; int i; struct ui_out *uiout = current_uiout; - struct linetable *linetable; + const struct linetable *linetable; if (argc != 1) error (_("-symbol-list-lines: Usage: SOURCE_FILENAME")); diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index 5f91804d60..aa4a5982e8 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -158,7 +158,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 struct linetable_entry *best_entry = NULL; std::vector pcs; LTPY_REQUIRE_VALID (self, symtab); @@ -204,7 +204,8 @@ ltpy_has_line (PyObject *self, PyObject *args) for (index = 0; index < SYMTAB_LINETABLE (symtab)->nitems; index++) { - struct linetable_entry *item = &(SYMTAB_LINETABLE (symtab)->item[index]); + const struct linetable_entry *item + = &(SYMTAB_LINETABLE (symtab)->item[index]); if (item->line == py_line) Py_RETURN_TRUE; } @@ -222,7 +223,7 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args) { struct symtab *symtab; Py_ssize_t index; - struct linetable_entry *item; + const struct linetable_entry *item; LTPY_REQUIRE_VALID (self, symtab); @@ -397,7 +398,7 @@ ltpy_iternext (PyObject *self) ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) self; struct symtab *symtab; PyObject *obj; - struct linetable_entry *item; + const struct linetable_entry *item; LTPY_REQUIRE_VALID (iter_obj->source, symtab); diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 0b447292f6..d2ecfea51a 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -576,8 +576,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 struct linetable_entry *lines; + const struct linetable *ltable; struct symtab *symtab; int nlines, i; diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 89506ebfc0..794dc6b41a 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -276,7 +276,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) int i; struct dict_iterator iter; int len; - struct linetable *l; + const struct linetable *l; const struct blockvector *bv; struct symbol *sym; struct block *b; @@ -986,7 +986,7 @@ block_depth (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_symtab->objfile; @@ -1017,7 +1017,7 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data) for (i = 0; i < linetable->nitems; ++i) { - struct linetable_entry *item; + const struct linetable_entry *item; item = &linetable->item [i]; printf_filtered (_("%-6d %6d %s\n"), i, item->line, diff --git a/gdb/symtab.c b/gdb/symtab.c index f57ecafa42..8550f096a7 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -72,7 +72,7 @@ static void rbreak_command (const char *, int); -static int find_line_common (struct linetable *, int, int *, int); +static int find_line_common (const struct linetable *, int, int *, int); static struct block_symbol lookup_symbol_aux (const char *name, @@ -3051,16 +3051,16 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) { struct compunit_symtab *cust; struct symtab *iter_s; - struct linetable *l; + const struct linetable *l; int len; int i; - struct linetable_entry *item; + const struct 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 struct linetable_entry *best = NULL; CORE_ADDR best_end = 0; struct symtab *best_symtab = 0; @@ -3069,12 +3069,12 @@ 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 struct linetable_entry *alt = NULL; struct symtab *alt_symtab = NULL; /* Info on best line seen in this file. */ - struct linetable_entry *prev; + const struct linetable_entry *prev; /* If this pc is not from the current frame, it is the address of the end of a call instruction. @@ -3224,8 +3224,8 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) return pc < LINETABLE_ENTRY_ADDRESS (iter_s, lhs); }; - struct linetable_entry *first = item; - struct linetable_entry *last = item + len; + const struct linetable_entry *first = item; + const struct linetable_entry *last = item + len; item = std::upper_bound (first, last, pc, pc_compare); if (item != first) prev = item - 1; /* Found a matching item. */ @@ -3342,7 +3342,7 @@ find_line_symtab (struct symtab *symtab, 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. */ @@ -3381,7 +3381,7 @@ find_line_symtab (struct symtab *symtab, int line, ALL_FILETABS (objfile, cu, s) { - struct linetable *l; + const struct linetable *l; int ind; if (FILENAME_CMP (symtab->filename, s->filename) != 0) @@ -3428,11 +3428,11 @@ done: std::vector find_pcs_for_symtab_line (struct symtab *symtab, int line, - struct linetable_entry **best_item) + const struct linetable_entry **best_item) { int start = 0; std::vector result; - struct linetable *linetable = SYMTAB_LINETABLE (symtab); + const struct linetable *linetable = SYMTAB_LINETABLE (symtab); /* First, collect all the PCs that are at this line. */ while (1) @@ -3446,7 +3446,7 @@ find_pcs_for_symtab_line (struct symtab *symtab, int line, if (!was_exact) { - struct linetable_entry *item = &linetable->item[idx]; + const struct linetable_entry *item = &linetable->item[idx]; if (*best_item == NULL || item->line < (*best_item)->line) *best_item = item; @@ -3470,7 +3470,7 @@ find_pcs_for_symtab_line (struct symtab *symtab, int line, int find_line_pc (struct symtab *symtab, int line, CORE_ADDR *pc) { - struct linetable *l; + const struct linetable *l; int ind; *pc = 0; @@ -3535,7 +3535,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 struct linetable *l, int lineno, int *exact_match, int start) { int i; @@ -3558,7 +3558,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 struct linetable_entry *item = &(l->item[i]); if (item->line == lineno) { @@ -3646,7 +3646,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. */ @@ -3665,7 +3665,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 struct linetable_entry *item = &(l->item[i]); /* Don't use line numbers of zero, they mark special entries in the table. See the commentary on symtab.h before the @@ -3889,7 +3889,8 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr) do this. */ if (prologue_sal.symtab->language != language_asm) { - struct linetable *linetable = SYMTAB_LINETABLE (prologue_sal.symtab); + const struct linetable *linetable + = SYMTAB_LINETABLE (prologue_sal.symtab); int idx = 0; /* Skip any earlier lines, and any end-of-sequence marker diff --git a/gdb/symtab.h b/gdb/symtab.h index 2b3d8018a7..33e0ba4c09 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1316,7 +1316,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 *linetable; + const struct linetable *linetable; /* Name of this source file. This pointer is never NULL. */ @@ -2032,7 +2032,8 @@ 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 struct 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 -- 2.13.6