diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4f4ad6ad62..b73da5ec86 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2018-07-16 Tom Tromey + + * xcoffread.c (aix_process_linenos, complete_symtab): Update. + * dbxread.c (read_ofile_symtab): Update. + * coffread.c (coff_start_symtab, coff_end_symtab): Update. + * buildsym.h (last_source_start_addr): Remove. + (set_last_source_start_addr, get_last_source_start_addr): + Declare. + * buildsym.c (buildsym_compunit::buildsym_compunit): Add last_addr + parameter. + (struct buildsym_compunit) : New + member. + (prepare_for_building): Remove start_addr parameter. + (start_symtab, restart_symtab, end_symtab_get_static_block) + (end_symtab_with_blockvector): Update. + (set_last_source_start_addr, get_last_source_start_addr): New + functions. + 2018-07-16 Tom Tromey * buildsym.c (struct buildsym_compunit) : New diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 8fd100921b..1cbde1d762 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -106,11 +106,13 @@ struct buildsym_compunit (or NULL if not known). */ buildsym_compunit (struct objfile *objfile_, const char *name, - const char *comp_dir_, enum language language_) + const char *comp_dir_, enum language language_, + CORE_ADDR last_addr) : objfile (objfile_), m_last_source_file (name == nullptr ? nullptr : xstrdup (name)), comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)), - language (language_) + language (language_), + m_last_source_start_addr (last_addr) { } @@ -195,6 +197,11 @@ struct buildsym_compunit /* True if symtab has line number info. This prevents an otherwise empty symtab from being tossed. */ bool m_have_line_numbers = false; + + /* Core address of start of text of current source file. This too + comes from the N_SO symbol. For Dwarf it typically comes from the + DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */ + CORE_ADDR m_last_source_start_addr; }; /* The work-in-progress of the compunit we are building. @@ -1017,10 +1024,8 @@ get_macro_table (void) buildsym_init. */ static void -prepare_for_building (CORE_ADDR start_addr) +prepare_for_building () { - last_source_start_addr = start_addr; - local_symbols = NULL; local_using_directives = NULL; within_function = 0; @@ -1053,10 +1058,10 @@ struct compunit_symtab * start_symtab (struct objfile *objfile, const char *name, const char *comp_dir, CORE_ADDR start_addr, enum language language) { - prepare_for_building (start_addr); + prepare_for_building (); buildsym_compunit = new struct buildsym_compunit (objfile, name, comp_dir, - language); + language, start_addr); /* Allocate the compunit symtab now. The caller needs it to allocate non-primary symtabs. It is also needed by get_macro_table. */ @@ -1090,13 +1095,14 @@ void restart_symtab (struct compunit_symtab *cust, const char *name, CORE_ADDR start_addr) { - prepare_for_building (start_addr); + prepare_for_building (); buildsym_compunit = new struct buildsym_compunit (COMPUNIT_OBJFILE (cust), name, COMPUNIT_DIRNAME (cust), - compunit_language (cust)); + compunit_language (cust), + start_addr); buildsym_compunit->compunit_symtab = cust; } @@ -1291,8 +1297,8 @@ end_symtab_get_static_block (CORE_ADDR end_addr, int expandable, int required) { /* Define the STATIC_BLOCK. */ return finish_block_internal (NULL, &file_symbols, NULL, NULL, - last_source_start_addr, end_addr, - 0, expandable); + buildsym_compunit->m_last_source_start_addr, + end_addr, 0, expandable); } } @@ -1319,7 +1325,7 @@ end_symtab_with_blockvector (struct block *static_block, /* Create the GLOBAL_BLOCK and build the blockvector. */ finish_block_internal (NULL, &global_symbols, NULL, NULL, - last_source_start_addr, end_addr, + buildsym_compunit->m_last_source_start_addr, end_addr, 1, expandable); blockvector = make_blockvector (); @@ -1727,6 +1733,24 @@ get_last_source_file (void) return buildsym_compunit->m_last_source_file.get (); } +/* See buildsym.h. */ + +void +set_last_source_start_addr (CORE_ADDR addr) +{ + gdb_assert (buildsym_compunit != nullptr); + buildsym_compunit->m_last_source_start_addr = addr; +} + +/* See buildsym.h. */ + +CORE_ADDR +get_last_source_start_addr () +{ + gdb_assert (buildsym_compunit != nullptr); + return buildsym_compunit->m_last_source_start_addr; +} + /* Initialize anything that needs initializing when starting to read a diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 536d50a58e..61ffc0fd89 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -49,12 +49,6 @@ struct dynamic_prop; #define HASHSIZE 127 /* Size of things hashed via hashname(). */ -/* Core address of start of text of current source file. This too - comes from the N_SO symbol. For Dwarf it typically comes from the - DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */ - -EXTERN CORE_ADDR last_source_start_addr; - /* The list of sub-source-files within the current individual compilation. Each file gets its own symtab with its own linetable and associated info, but they all share one blockvector. */ @@ -310,6 +304,16 @@ extern struct compunit_symtab *buildsym_compunit_symtab (void); extern struct macro_table *get_macro_table (void); +/* Set the last source start address. Can only be used between + start_symtab and end_symtab* calls. */ + +extern void set_last_source_start_addr (CORE_ADDR addr); + +/* Get the last source start address. Can only be used between + start_symtab and end_symtab* calls. */ + +extern CORE_ADDR get_last_source_start_addr (); + #undef EXTERN #endif /* defined (BUILDSYM_H) */ diff --git a/gdb/coffread.c b/gdb/coffread.c index 30583e1dda..0b0cbace6b 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -390,8 +390,8 @@ coff_start_symtab (struct objfile *objfile, const char *name) xstrdup (name), /* We never know the directory name for COFF. */ NULL, - /* The start address is irrelevant, since we set - last_source_start_addr in coff_end_symtab. */ + /* The start address is irrelevant, since we call + set_last_source_start_addr in coff_end_symtab. */ 0, /* Let buildsym.c deduce the language for this symtab. */ language_unknown); @@ -420,7 +420,7 @@ complete_symtab (const char *name, CORE_ADDR start_addr, unsigned int size) static void coff_end_symtab (struct objfile *objfile) { - last_source_start_addr = current_source_start_addr; + set_last_source_start_addr (current_source_start_addr); end_symtab (current_source_end_addr, SECT_OFF_TEXT (objfile)); diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 1b524ec0e2..f6059a8c87 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -2371,14 +2371,14 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst) /* In a Solaris elf file, this variable, which comes from the value of the N_SO symbol, will still be 0. Luckily, text_offset, which comes from pst->textlow is correct. */ - if (last_source_start_addr == 0) - last_source_start_addr = text_offset; + if (get_last_source_start_addr () == 0) + set_last_source_start_addr (text_offset); /* In reordered executables last_source_start_addr may not be the lower bound for this symtab, instead use text_offset which comes from pst->textlow which is correct. */ - if (last_source_start_addr > text_offset) - last_source_start_addr = text_offset; + if (get_last_source_start_addr () > text_offset) + set_last_source_start_addr (text_offset); pst->compunit_symtab = end_symtab (text_offset + text_size, SECT_OFF_TEXT (objfile)); diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 79b1df70fd..6d4dfd95e6 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -814,7 +814,7 @@ aix_process_linenos (struct objfile *objfile) return; /* Process line numbers and enter them into line vector. */ - process_linenos (last_source_start_addr, cur_src_end_addr); + process_linenos (get_last_source_start_addr (), cur_src_end_addr); } @@ -900,7 +900,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, #define complete_symtab(name, start_addr) { \ set_last_source_file (name); \ - last_source_start_addr = start_addr; \ + set_last_source_start_addr (start_addr); \ }