diff options
author | Doug Evans <xdje42@gmail.com> | 2014-11-20 07:42:48 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2014-11-20 07:47:44 -0800 |
commit | 43f3e411c415ac74130808a76473e05ff41a1d94 (patch) | |
tree | 154cf54a5471f44e8c7608c07f09755fcc358bd2 /gdb/dwarf2read.c | |
parent | 5c47e525893b06db772d8b1c043233a173101c8c (diff) | |
download | gdb-43f3e411c415ac74130808a76473e05ff41a1d94.zip gdb-43f3e411c415ac74130808a76473e05ff41a1d94.tar.gz gdb-43f3e411c415ac74130808a76473e05ff41a1d94.tar.bz2 |
Split struct symtab into two: struct symtab and compunit_symtab.
Currently "symtabs" in gdb are stored as a single linked list of
struct symtab that contains both symbol symtabs (the blockvectors)
and file symtabs (the linetables).
This has led to confusion, bugs, and performance issues.
This patch is conceptually very simple: split struct symtab into
two pieces: one part containing things common across the entire
compilation unit, and one part containing things specific to each
source file.
Example.
For the case of a program built out of these files:
foo.c
foo1.h
foo2.h
bar.c
foo1.h
bar.h
Today we have a single list of struct symtabs:
objfile -> foo.c -> foo1.h -> foo2.h -> bar.c -> foo1.h -> bar.h -> NULL
where "->" means the "next" pointer in struct symtab.
With this patch, that turns into:
objfile -> foo.c(cu) -> bar.c(cu) -> NULL
| |
v v
foo.c bar.c
| |
v v
foo1.h foo1.h
| |
v v
foo2.h bar.h
| |
v v
NULL NULL
where "foo.c(cu)" and "bar.c(cu)" are struct compunit_symtab objects,
and the files foo.c, etc. are struct symtab objects.
So now, for example, when we want to iterate over all blockvectors
we can now just iterate over the compunit_symtab list.
Plus a lot of the data that was either unused or replicated for each
symtab in a compilation unit now lives in struct compunit_symtab.
E.g., the objfile pointer, the producer string, etc.
I thought of moving "language" out of struct symtab but there is
logic to try to compute the language based on previously seen files,
and I think that's best left as is for now.
With my standard monster benchmark with -readnow (which I can't actually
do, but based on my calculations), whereas today the list requires
77MB to store all the struct symtabs, it now only requires 37MB.
A modest space savings given the gigabytes needed for all the debug info,
etc. Still, it's nice. Plus, whereas today we create a copy of dirname
for each source file symtab in a compilation unit, we now only create one
for the compunit.
So this patch is basically just a data structure reorg,
I don't expect significant performance improvements from it.
Notes:
1) A followup patch can do a similar split for struct partial_symtab.
I have left that until after I get the changes I want in to
better utilize .gdb_index (it may affect how we do partial syms).
2) Another followup patch *could* rename struct symtab.
The term "symtab" is ambiguous and has been a source of confusion.
In this patch I'm leaving it alone, calling it the "historical" name
of "filetabs", which is what they are now: just the file-name + line-table.
gdb/ChangeLog:
Split struct symtab into two: struct symtab and compunit_symtab.
* amd64-tdep.c (amd64_skip_xmm_prologue): Fetch producer from compunit.
* block.c (blockvector_for_pc_sect): Change "struct symtab *" argument
to "struct compunit_symtab *". All callers updated.
(set_block_compunit_symtab): Renamed from set_block_symtab. Change
"struct symtab *" argument to "struct compunit_symtab *".
All callers updated.
(get_block_compunit_symtab): Renamed from get_block_symtab. Change
result to "struct compunit_symtab *". All callers updated.
(find_iterator_compunit_symtab): Renamed from find_iterator_symtab.
Change result to "struct compunit_symtab *". All callers updated.
* block.h (struct global_block) <compunit_symtab>: Renamed from symtab.
hange type to "struct compunit_symtab *". All uses updated.
(struct block_iterator) <d.compunit_symtab>: Renamed from "d.symtab".
Change type to "struct compunit_symtab *". All uses updated.
* buildsym.c (struct buildsym_compunit): New struct.
(subfiles, buildsym_compdir, buildsym_objfile, main_subfile): Delete.
(buildsym_compunit): New static global.
(finish_block_internal): Update to fetch objfile from
buildsym_compunit.
(make_blockvector): Delete objfile argument.
(start_subfile): Rewrite to use buildsym_compunit. Don't initialize
debugformat, producer.
(start_buildsym_compunit): New function.
(free_buildsym_compunit): Renamed from free_subfiles_list.
All callers updated.
(patch_subfile_names): Rewrite to use buildsym_compunit.
(get_compunit_symtab): New function.
(get_macro_table): Delete argument comp_dir. All callers updated.
(start_symtab): Change result to "struct compunit_symtab *".
All callers updated. Create the subfile of the main source file.
(watch_main_source_file_lossage): Rewrite to use buildsym_compunit.
(reset_symtab_globals): Update.
(end_symtab_get_static_block): Update to use buildsym_compunit.
(end_symtab_without_blockvector): Rewrite.
(end_symtab_with_blockvector): Change result to
"struct compunit_symtab *". All callers updated.
Update to use buildsym_compunit. Don't set symtab->dirname,
instead set it in the compunit.
Explicitly make sure main symtab is first in its list.
Set debugformat, producer, blockvector, block_line_section, and
macrotable in the compunit.
(end_symtab_from_static_block): Change result to
"struct compunit_symtab *". All callers updated.
(end_symtab, end_expandable_symtab): Ditto.
(set_missing_symtab): Change symtab argument to
"struct compunit_symtab *". All callers updated.
(augment_type_symtab): Ditto.
(record_debugformat): Update to use buildsym_compunit.
(record_producer): Update to use buildsym_compunit.
* buildsym.h (struct subfile) <dirname>: Delete.
<producer, debugformat>: Delete.
<buildsym_compunit>: New member.
(get_compunit_symtab): Declare.
* dwarf2read.c (struct type_unit_group) <compunit_symtab>: Renamed
from primary_symtab. Change type to "struct compunit_symtab *".
All uses updated.
(dwarf2_start_symtab): Change result to "struct compunit_symtab *".
All callers updated.
(dwarf_decode_macros): Delete comp_dir argument. All callers updated.
(struct dwarf2_per_cu_quick_data) <compunit_symtab>: Renamed from
symtab. Change type to "struct compunit_symtab *". All uses updated.
(dw2_instantiate_symtab): Change result to "struct compunit_symtab *".
All callers updated.
(dw2_find_last_source_symtab): Ditto.
(dw2_lookup_symbol): Ditto.
(recursively_find_pc_sect_compunit_symtab): Renamed from
recursively_find_pc_sect_symtab. Change result to
"struct compunit_symtab *". All callers updated.
(dw2_find_pc_sect_compunit_symtab): Renamed from
dw2_find_pc_sect_symtab. Change result to
"struct compunit_symtab *". All callers updated.
(get_compunit_symtab): Renamed from get_symtab. Change result to
"struct compunit_symtab *". All callers updated.
(recursively_compute_inclusions): Change type of immediate_parent
argument to "struct compunit_symtab *". All callers updated.
(compute_compunit_symtab_includes): Renamed from
compute_symtab_includes. All callers updated. Rewrite to compute
includes of compunit_symtabs and not symtabs.
(process_full_comp_unit): Update to work with struct compunit_symtab.
(process_full_type_unit): Ditto.
(dwarf_decode_lines_1): Delete argument comp_dir. All callers updated.
(dwarf_decode_lines): Remove special case handling of main subfile.
(macro_start_file): Delete argument comp_dir. All callers updated.
(dwarf_decode_macro_bytes): Ditto.
* guile/scm-block.c (bkscm_print_block_syms_progress_smob): Update to
use struct compunit_symtab.
* i386-tdep.c (i386_skip_prologue): Fetch producer from compunit.
* jit.c (finalize_symtab): Build compunit_symtab.
* jv-lang.c (get_java_class_symtab): Change result to
"struct compunit_symtab *". All callers updated.
* macroscope.c (sal_macro_scope): Fetch macro table from compunit.
* macrotab.c (struct macro_table) <compunit_symtab>: Renamed from
comp_dir. Change type to "struct compunit_symtab *".
All uses updated.
(new_macro_table): Change comp_dir argument to cust,
"struct compunit_symtab *". All callers updated.
* maint.c (struct cmd_stats) <nr_compunit_symtabs>: Renamed from
nr_primary_symtabs. All uses updated.
(count_symtabs_and_blocks): Update to handle compunits.
(report_command_stats): Update output, "primary symtabs" renamed to
"compunits".
* mdebugread.c (new_symtab): Change result to
"struct compunit_symtab *". All callers updated.
(parse_procedure): Change type of search_symtab argument to
"struct compunit_symtab *". All callers updated.
* objfiles.c (objfile_relocate1): Loop over blockvectors in a
separate loop.
* objfiles.h (struct objfile) <compunit_symtabs>: Renamed from
symtabs. Change type to "struct compunit_symtab *". All uses updated.
(ALL_OBJFILE_FILETABS): Renamed from ALL_OBJFILE_SYMTABS.
All uses updated.
(ALL_OBJFILE_COMPUNITS): Renamed from ALL_OBJFILE_PRIMARY_SYMTABS.
All uses updated.
(ALL_FILETABS): Renamed from ALL_SYMTABS. All uses updated.
(ALL_COMPUNITS): Renamed from ALL_PRIMARY_SYMTABS. All uses updated.
* psympriv.h (struct partial_symtab) <compunit_symtab>: Renamed from
symtab. Change type to "struct compunit_symtab *". All uses updated.
* psymtab.c (psymtab_to_symtab): Change result type to
"struct compunit_symtab *". All callers updated.
(find_pc_sect_compunit_symtab_from_partial): Renamed from
find_pc_sect_symtab_from_partial. Change result type to
"struct compunit_symtab *". All callers updated.
(lookup_symbol_aux_psymtabs): Change result type to
"struct compunit_symtab *". All callers updated.
(find_last_source_symtab_from_partial): Ditto.
* python/py-symtab.c (stpy_get_producer): Fetch producer from compunit.
* source.c (forget_cached_source_info_for_objfile): Fetch debugformat
and macro_table from compunit.
* symfile-debug.c (debug_qf_find_last_source_symtab): Change result
type to "struct compunit_symtab *". All callers updated.
(debug_qf_lookup_symbol): Ditto.
(debug_qf_find_pc_sect_compunit_symtab): Renamed from
debug_qf_find_pc_sect_symtab, change result type to
"struct compunit_symtab *". All callers updated.
* symfile.c (allocate_symtab): Delete objfile argument.
New argument cust.
(allocate_compunit_symtab): New function.
(add_compunit_symtab_to_objfile): New function.
* symfile.h (struct quick_symbol_functions) <lookup_symbol>:
Change result type to "struct compunit_symtab *". All uses updated.
<find_pc_sect_compunit_symtab>: Renamed from find_pc_sect_symtab.
Change result type to "struct compunit_symtab *". All uses updated.
* symmisc.c (print_objfile_statistics): Compute blockvector count in
separate loop.
(dump_symtab_1): Update test for primary source symtab.
(maintenance_info_symtabs): Update to handle compunit symtabs.
(maintenance_check_symtabs): Ditto.
* symtab.c (set_primary_symtab): Delete.
(compunit_primary_filetab): New function.
(compunit_language): New function.
(iterate_over_some_symtabs): Change type of arguments "first",
"after_last" to "struct compunit_symtab *". All callers updated.
Update to loop over symtabs in each compunit.
(error_in_psymtab_expansion): Rename symtab argument to cust,
and change type to "struct compunit_symtab *". All callers updated.
(find_pc_sect_compunit_symtab): Renamed from find_pc_sect_symtab.
Change result type to "struct compunit_symtab *". All callers updated.
(find_pc_compunit_symtab): Renamed from find_pc_symtab.
Change result type to "struct compunit_symtab *". All callers updated.
(find_pc_sect_line): Only loop over symtabs within selected compunit
instead of all symtabs in the objfile.
* symtab.h (struct symtab) <blockvector>: Moved to compunit_symtab.
<compunit_symtab> New member.
<block_line_section>: Moved to compunit_symtab.
<locations_valid>: Ditto.
<epilogue_unwind_valid>: Ditto.
<macro_table>: Ditto.
<dirname>: Ditto.
<debugformat>: Ditto.
<producer>: Ditto.
<objfile>: Ditto.
<call_site_htab>: Ditto.
<includes>: Ditto.
<user>: Ditto.
<primary>: Delete
(SYMTAB_COMPUNIT): New macro.
(SYMTAB_BLOCKVECTOR): Update definition.
(SYMTAB_OBJFILE): Update definition.
(SYMTAB_DIRNAME): Update definition.
(struct compunit_symtab): New type. Common members among all source
symtabs within a compilation unit moved here. All uses updated.
(COMPUNIT_OBJFILE): New macro.
(COMPUNIT_FILETABS): New macro.
(COMPUNIT_DEBUGFORMAT): New macro.
(COMPUNIT_PRODUCER): New macro.
(COMPUNIT_DIRNAME): New macro.
(COMPUNIT_BLOCKVECTOR): New macro.
(COMPUNIT_BLOCK_LINE_SECTION): New macro.
(COMPUNIT_LOCATIONS_VALID): New macro.
(COMPUNIT_EPILOGUE_UNWIND_VALID): New macro.
(COMPUNIT_CALL_SITE_HTAB): New macro.
(COMPUNIT_MACRO_TABLE): New macro.
(ALL_COMPUNIT_FILETABS): New macro.
(compunit_symtab_ptr): New typedef.
(DEF_VEC_P (compunit_symtab_ptr)): New vector type.
gdb/testsuite/ChangeLog:
* gdb.base/maint.exp: Update expected output.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 289 |
1 files changed, 144 insertions, 145 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 5860c57..0790388 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -715,10 +715,10 @@ struct type_unit_group and is deleted afterwards and not used again. */ VEC (sig_type_ptr) *tus; - /* The primary symtab. + /* The compunit symtab. Type units in a group needn't all be defined in the same source file, - so we create an essentially anonymous symtab as the primary symtab. */ - struct symtab *primary_symtab; + so we create an essentially anonymous symtab as the compunit symtab. */ + struct compunit_symtab *compunit_symtab; /* The data used to construct the hash key. */ struct stmt_list_hash hash; @@ -1516,8 +1516,9 @@ static void dwarf_decode_lines (struct line_header *, const char *, static void dwarf2_start_subfile (const char *, const char *); -static void dwarf2_start_symtab (struct dwarf2_cu *, - const char *, const char *, CORE_ADDR); +static struct compunit_symtab *dwarf2_start_symtab (struct dwarf2_cu *, + const char *, const char *, + CORE_ADDR); static struct symbol *new_symbol (struct die_info *, struct type *, struct dwarf2_cu *); @@ -1716,8 +1717,7 @@ static struct dwarf_block *dwarf_alloc_block (struct dwarf2_cu *); static struct die_info *dwarf_alloc_die (struct dwarf2_cu *, int); -static void dwarf_decode_macros (struct dwarf2_cu *, unsigned int, - const char *, int); +static void dwarf_decode_macros (struct dwarf2_cu *, unsigned int, int); static int attr_form_is_block (const struct attribute *); @@ -2496,7 +2496,7 @@ struct dwarf2_per_cu_quick_data /* The corresponding symbol table. This is NULL if symbols for this CU have not yet been read. */ - struct symtab *symtab; + struct compunit_symtab *compunit_symtab; /* A temporary mark bit used when iterating over all CUs in expand_symtabs_matching. */ @@ -2617,7 +2617,7 @@ dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) back_to = make_cleanup (dwarf2_release_queue, NULL); if (dwarf2_per_objfile->using_index - ? per_cu->v.quick->symtab == NULL + ? per_cu->v.quick->compunit_symtab == NULL : (per_cu->v.psymtab == NULL || !per_cu->v.psymtab->readin)) { queue_comp_unit (per_cu, language_minimal); @@ -2648,11 +2648,11 @@ dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) the objfile from which this CU came. Returns the resulting symbol table. */ -static struct symtab * +static struct compunit_symtab * dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) { gdb_assert (dwarf2_per_objfile->using_index); - if (!per_cu->v.quick->symtab) + if (!per_cu->v.quick->compunit_symtab) { struct cleanup *back_to = make_cleanup (free_cached_comp_units, NULL); increment_reading_symtab (); @@ -2661,10 +2661,7 @@ dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) do_cleanups (back_to); } - /* The result of symtab expansion is always the primary symtab. */ - gdb_assert (per_cu->v.quick->symtab->primary); - - return per_cu->v.quick->symtab; + return per_cu->v.quick->compunit_symtab; } /* Return the CU/TU given its index. @@ -3313,11 +3310,15 @@ dw2_get_real_path (struct objfile *objfile, static struct symtab * dw2_find_last_source_symtab (struct objfile *objfile) { + struct compunit_symtab *cust; int index; dw2_setup (objfile); index = dwarf2_per_objfile->n_comp_units - 1; - return dw2_instantiate_symtab (dw2_get_cutu (index)); + cust = dw2_instantiate_symtab (dw2_get_cutu (index)); + if (cust == NULL) + return NULL; + return compunit_primary_filetab (cust); } /* Traversal function for dw2_forget_cached_source_info. */ @@ -3360,10 +3361,10 @@ dw2_map_expand_apply (struct objfile *objfile, int (*callback) (struct symtab *, void *), void *data) { - struct symtab *last_made = objfile->symtabs; + struct compunit_symtab *last_made = objfile->compunit_symtabs; /* Don't visit already-expanded CUs. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) return 0; /* This may expand more than one symtab, and we want to iterate over @@ -3371,7 +3372,7 @@ dw2_map_expand_apply (struct objfile *objfile, dw2_instantiate_symtab (per_cu); return iterate_over_some_symtabs (name, real_path, callback, data, - objfile->symtabs, last_made); + objfile->compunit_symtabs, last_made); } /* Implementation of the map_symtabs_matching_filename method. */ @@ -3397,7 +3398,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name, struct quick_file_names *file_data; /* We only need to look at symtabs not already expanded. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) continue; file_data = dw2_get_file_names (per_cu); @@ -3544,7 +3545,7 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) per_cu = dw2_get_cutu (cu_index); /* Skip if already read in. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) continue; /* Check static vs global. */ @@ -3592,11 +3593,11 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) return NULL; } -static struct symtab * +static struct compunit_symtab * dw2_lookup_symbol (struct objfile *objfile, int block_index, const char *name, domain_enum domain) { - struct symtab *stab_best = NULL; + struct compunit_symtab *stab_best = NULL; struct mapped_index *index; dw2_setup (objfile); @@ -3614,8 +3615,8 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index, while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL) { struct symbol *sym = NULL; - struct symtab *stab = dw2_instantiate_symtab (per_cu); - const struct blockvector *bv = SYMTAB_BLOCKVECTOR (stab); + struct compunit_symtab *stab = dw2_instantiate_symtab (per_cu); + const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab); struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); /* Some caution must be observed with overloaded functions @@ -3650,7 +3651,7 @@ dw2_print_stats (struct objfile *objfile) { struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i); - if (!per_cu->v.quick->symtab) + if (!per_cu->v.quick->compunit_symtab) ++count; } printf_filtered (_(" Number of read CUs: %d\n"), total - count); @@ -3747,7 +3748,7 @@ dw2_expand_symtabs_with_fullname (struct objfile *objfile, struct quick_file_names *file_data; /* We only need to look at symtabs not already expanded. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) continue; file_data = dw2_get_file_names (per_cu); @@ -3827,7 +3828,7 @@ dw2_expand_symtabs_matching per_cu->v.quick->mark = 0; /* We only need to look at symtabs not already expanded. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) continue; file_data = dw2_get_file_names (per_cu); @@ -3962,26 +3963,27 @@ dw2_expand_symtabs_matching } } -/* A helper for dw2_find_pc_sect_symtab which finds the most specific +/* A helper for dw2_find_pc_sect_compunit_symtab which finds the most specific symtab. */ -static struct symtab * -recursively_find_pc_sect_symtab (struct symtab *symtab, CORE_ADDR pc) +static struct compunit_symtab * +recursively_find_pc_sect_compunit_symtab (struct compunit_symtab *cust, + CORE_ADDR pc) { int i; - if (SYMTAB_BLOCKVECTOR (symtab) != NULL - && blockvector_contains_pc (SYMTAB_BLOCKVECTOR (symtab), pc)) - return symtab; + if (COMPUNIT_BLOCKVECTOR (cust) != NULL + && blockvector_contains_pc (COMPUNIT_BLOCKVECTOR (cust), pc)) + return cust; - if (symtab->includes == NULL) + if (cust->includes == NULL) return NULL; - for (i = 0; symtab->includes[i]; ++i) + for (i = 0; cust->includes[i]; ++i) { - struct symtab *s = symtab->includes[i]; + struct compunit_symtab *s = cust->includes[i]; - s = recursively_find_pc_sect_symtab (s, pc); + s = recursively_find_pc_sect_compunit_symtab (s, pc); if (s != NULL) return s; } @@ -3989,15 +3991,15 @@ recursively_find_pc_sect_symtab (struct symtab *symtab, CORE_ADDR pc) return NULL; } -static struct symtab * -dw2_find_pc_sect_symtab (struct objfile *objfile, - struct bound_minimal_symbol msymbol, - CORE_ADDR pc, - struct obj_section *section, - int warn_if_readin) +static struct compunit_symtab * +dw2_find_pc_sect_compunit_symtab (struct objfile *objfile, + struct bound_minimal_symbol msymbol, + CORE_ADDR pc, + struct obj_section *section, + int warn_if_readin) { struct dwarf2_per_cu_data *data; - struct symtab *result; + struct compunit_symtab *result; dw2_setup (objfile); @@ -4008,11 +4010,13 @@ dw2_find_pc_sect_symtab (struct objfile *objfile, if (!data) return NULL; - if (warn_if_readin && data->v.quick->symtab) + if (warn_if_readin && data->v.quick->compunit_symtab) warning (_("(Internal error: pc %s in read in CU, but not in symtab.)"), paddress (get_objfile_arch (objfile), pc)); - result = recursively_find_pc_sect_symtab (dw2_instantiate_symtab (data), pc); + result + = recursively_find_pc_sect_compunit_symtab (dw2_instantiate_symtab (data), + pc); gdb_assert (result != NULL); return result; } @@ -4037,7 +4041,7 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, { struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i); - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) { void **slot = htab_find_slot (visited, per_cu->v.quick->file_names, INSERT); @@ -4054,7 +4058,7 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, void **slot; /* We only need to look at symtabs not already expanded. */ - if (per_cu->v.quick->symtab) + if (per_cu->v.quick->compunit_symtab) continue; file_data = dw2_get_file_names (per_cu); @@ -4105,7 +4109,7 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions = dw2_expand_symtabs_with_fullname, dw2_map_matching_symbols, dw2_expand_symtabs_matching, - dw2_find_pc_sect_symtab, + dw2_find_pc_sect_compunit_symtab, dw2_map_symbol_filenames }; @@ -4423,7 +4427,7 @@ dwarf2_create_include_psymtab (const char *name, struct partial_symtab *pst, subpst->n_global_syms = 0; subpst->statics_offset = 0; subpst->n_static_syms = 0; - subpst->symtab = NULL; + subpst->compunit_symtab = NULL; subpst->read_symtab = pst->read_symtab; subpst->readin = 0; @@ -4761,7 +4765,7 @@ fill_in_sig_entry_from_dwo_entry (struct objfile *objfile, if (dwarf2_per_objfile->using_index) { gdb_assert (sig_entry->per_cu.v.quick != NULL); - gdb_assert (sig_entry->per_cu.v.quick->symtab == NULL); + gdb_assert (sig_entry->per_cu.v.quick->compunit_symtab == NULL); } else gdb_assert (sig_entry->per_cu.v.psymtab == NULL); @@ -7450,7 +7454,7 @@ process_queue (void) for (item = dwarf2_queue; item != NULL; dwarf2_queue = item = next_item) { if (dwarf2_per_objfile->using_index - ? !item->per_cu->v.quick->symtab + ? !item->per_cu->v.quick->compunit_symtab : (item->per_cu->v.psymtab && !item->per_cu->v.psymtab->readin)) { struct dwarf2_per_cu_data *per_cu = item->per_cu; @@ -7777,26 +7781,26 @@ fixup_go_packaging (struct dwarf2_cu *cu) /* Return the symtab for PER_CU. This works properly regardless of whether we're using the index or psymtabs. */ -static struct symtab * -get_symtab (struct dwarf2_per_cu_data *per_cu) +static struct compunit_symtab * +get_compunit_symtab (struct dwarf2_per_cu_data *per_cu) { return (dwarf2_per_objfile->using_index - ? per_cu->v.quick->symtab - : per_cu->v.psymtab->symtab); + ? per_cu->v.quick->compunit_symtab + : per_cu->v.psymtab->compunit_symtab); } /* A helper function for computing the list of all symbol tables included by PER_CU. */ static void -recursively_compute_inclusions (VEC (symtab_ptr) **result, +recursively_compute_inclusions (VEC (compunit_symtab_ptr) **result, htab_t all_children, htab_t all_type_symtabs, struct dwarf2_per_cu_data *per_cu, - struct symtab *immediate_parent) + struct compunit_symtab *immediate_parent) { void **slot; int ix; - struct symtab *symtab; + struct compunit_symtab *cust; struct dwarf2_per_cu_data *iter; slot = htab_find_slot (all_children, per_cu, INSERT); @@ -7808,27 +7812,27 @@ recursively_compute_inclusions (VEC (symtab_ptr) **result, *slot = per_cu; /* Only add a CU if it has a symbol table. */ - symtab = get_symtab (per_cu); - if (symtab != NULL) + cust = get_compunit_symtab (per_cu); + if (cust != NULL) { /* If this is a type unit only add its symbol table if we haven't seen it yet (type unit per_cu's can share symtabs). */ if (per_cu->is_debug_types) { - slot = htab_find_slot (all_type_symtabs, symtab, INSERT); + slot = htab_find_slot (all_type_symtabs, cust, INSERT); if (*slot == NULL) { - *slot = symtab; - VEC_safe_push (symtab_ptr, *result, symtab); - if (symtab->user == NULL) - symtab->user = immediate_parent; + *slot = cust; + VEC_safe_push (compunit_symtab_ptr, *result, cust); + if (cust->user == NULL) + cust->user = immediate_parent; } } else { - VEC_safe_push (symtab_ptr, *result, symtab); - if (symtab->user == NULL) - symtab->user = immediate_parent; + VEC_safe_push (compunit_symtab_ptr, *result, cust); + if (cust->user == NULL) + cust->user = immediate_parent; } } @@ -7837,15 +7841,15 @@ recursively_compute_inclusions (VEC (symtab_ptr) **result, ++ix) { recursively_compute_inclusions (result, all_children, - all_type_symtabs, iter, symtab); + all_type_symtabs, iter, cust); } } -/* Compute the symtab 'includes' fields for the symtab related to +/* Compute the compunit_symtab 'includes' fields for the compunit_symtab of PER_CU. */ static void -compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) +compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu) { gdb_assert (! per_cu->is_debug_types); @@ -7853,13 +7857,13 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) { int ix, len; struct dwarf2_per_cu_data *per_cu_iter; - struct symtab *symtab_iter; - VEC (symtab_ptr) *result_symtabs = NULL; + struct compunit_symtab *compunit_symtab_iter; + VEC (compunit_symtab_ptr) *result_symtabs = NULL; htab_t all_children, all_type_symtabs; - struct symtab *symtab = get_symtab (per_cu); + struct compunit_symtab *cust = get_compunit_symtab (per_cu); /* If we don't have a symtab, we can just skip this case. */ - if (symtab == NULL) + if (cust == NULL) return; all_children = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer, @@ -7874,21 +7878,22 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu) { recursively_compute_inclusions (&result_symtabs, all_children, all_type_symtabs, per_cu_iter, - symtab); + cust); } /* Now we have a transitive closure of all the included symtabs. */ - len = VEC_length (symtab_ptr, result_symtabs); - symtab->includes + len = VEC_length (compunit_symtab_ptr, result_symtabs); + cust->includes = obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack, (len + 1) * sizeof (struct symtab *)); for (ix = 0; - VEC_iterate (symtab_ptr, result_symtabs, ix, symtab_iter); + VEC_iterate (compunit_symtab_ptr, result_symtabs, ix, + compunit_symtab_iter); ++ix) - symtab->includes[ix] = symtab_iter; - symtab->includes[len] = NULL; + cust->includes[ix] = compunit_symtab_iter; + cust->includes[len] = NULL; - VEC_free (symtab_ptr, result_symtabs); + VEC_free (compunit_symtab_ptr, result_symtabs); htab_delete (all_children); htab_delete (all_type_symtabs); } @@ -7909,7 +7914,7 @@ process_cu_includes (void) ++ix) { if (! iter->is_debug_types) - compute_symtab_includes (iter); + compute_compunit_symtab_includes (iter); } VEC_free (dwarf2_per_cu_ptr, dwarf2_per_objfile->just_read_cus); @@ -7925,7 +7930,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu, struct dwarf2_cu *cu = per_cu->cu; struct objfile *objfile = per_cu->objfile; CORE_ADDR lowpc, highpc; - struct symtab *symtab; + struct compunit_symtab *cust; struct cleanup *back_to, *delayed_list_cleanup; CORE_ADDR baseaddr; struct block *static_block; @@ -7969,18 +7974,19 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu, this comp unit. */ dwarf2_record_block_ranges (cu->dies, static_block, baseaddr, cu); - symtab = end_symtab_from_static_block (static_block, - SECT_OFF_TEXT (objfile), 0); + cust = end_symtab_from_static_block (static_block, + SECT_OFF_TEXT (objfile), 0); - if (symtab != NULL) + if (cust != NULL) { int gcc_4_minor = producer_is_gcc_ge_4 (cu->producer); /* Set symtab language to language from DW_AT_language. If the compilation is from a C file generated by language preprocessors, do not set the language if it was already deduced by start_subfile. */ - if (!(cu->language == language_c && symtab->language != language_c)) - symtab->language = cu->language; + if (!(cu->language == language_c + && COMPUNIT_FILETABS (cust)->language != language_c)) + COMPUNIT_FILETABS (cust)->language = cu->language; /* GCC-4.0 has started to support -fvar-tracking. GCC-3.x still can produce DW_AT_location with location lists but it can be possibly @@ -7995,20 +8001,20 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu, options - this waits on GCC PR other/32998 (-frecord-gcc-switches). */ if (cu->has_loclist && gcc_4_minor >= 5) - symtab->locations_valid = 1; + cust->locations_valid = 1; if (gcc_4_minor >= 5) - symtab->epilogue_unwind_valid = 1; + cust->epilogue_unwind_valid = 1; - symtab->call_site_htab = cu->call_site_htab; + cust->call_site_htab = cu->call_site_htab; } if (dwarf2_per_objfile->using_index) - per_cu->v.quick->symtab = symtab; + per_cu->v.quick->compunit_symtab = cust; else { struct partial_symtab *pst = per_cu->v.psymtab; - pst->symtab = symtab; + pst->compunit_symtab = cust; pst->readin = 1; } @@ -8027,7 +8033,7 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu, { struct dwarf2_cu *cu = per_cu->cu; struct objfile *objfile = per_cu->objfile; - struct symtab *symtab; + struct compunit_symtab *cust; struct cleanup *back_to, *delayed_list_cleanup; struct signatured_type *sig_type; @@ -8060,33 +8066,34 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu, If this is the first TU to use this symtab, complete the construction of it with end_expandable_symtab. Otherwise, complete the addition of this TU's symbols to the existing symtab. */ - if (sig_type->type_unit_group->primary_symtab == NULL) + if (sig_type->type_unit_group->compunit_symtab == NULL) { - symtab = end_expandable_symtab (0, SECT_OFF_TEXT (objfile)); - sig_type->type_unit_group->primary_symtab = symtab; + cust = end_expandable_symtab (0, SECT_OFF_TEXT (objfile)); + sig_type->type_unit_group->compunit_symtab = cust; - if (symtab != NULL) + if (cust != NULL) { /* Set symtab language to language from DW_AT_language. If the compilation is from a C file generated by language preprocessors, do not set the language if it was already deduced by start_subfile. */ - if (!(cu->language == language_c && symtab->language != language_c)) - symtab->language = cu->language; + if (!(cu->language == language_c + && COMPUNIT_FILETABS (cust)->language != language_c)) + COMPUNIT_FILETABS (cust)->language = cu->language; } } else { - augment_type_symtab (sig_type->type_unit_group->primary_symtab); - symtab = sig_type->type_unit_group->primary_symtab; + augment_type_symtab (sig_type->type_unit_group->compunit_symtab); + cust = sig_type->type_unit_group->compunit_symtab; } if (dwarf2_per_objfile->using_index) - per_cu->v.quick->symtab = symtab; + per_cu->v.quick->compunit_symtab = cust; else { struct partial_symtab *pst = per_cu->v.psymtab; - pst->symtab = symtab; + pst->compunit_symtab = cust; pst->readin = 1; } @@ -9067,7 +9074,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("CU refers to both DW_AT_GNU_macros and DW_AT_macro_info")); - dwarf_decode_macros (cu, DW_UNSND (attr), comp_dir, 1); + dwarf_decode_macros (cu, DW_UNSND (attr), 1); } else { @@ -9076,7 +9083,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) { unsigned int macro_offset = DW_UNSND (attr); - dwarf_decode_macros (cu, macro_offset, comp_dir, 0); + dwarf_decode_macros (cu, macro_offset, 0); } } @@ -9116,7 +9123,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) do it again, we could fake it and just recreate the part we need (file name,index -> symtab mapping). If data shows this optimization is useful we can do it then. */ - first_time = tu_group->primary_symtab == NULL; + first_time = tu_group->compunit_symtab == NULL; /* We have to handle the case of both a missing DW_AT_stmt_list or bad debug info. */ @@ -9135,7 +9142,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) gdb_assert (tu_group->symtabs == NULL); restart_symtab (0); } - /* Note: The primary symtab will get allocated at the end. */ + /* Note: The compunit symtab will get allocated at the end. */ return; } @@ -9144,7 +9151,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) if (first_time) { - dwarf2_start_symtab (cu, "", NULL, 0); + struct compunit_symtab *cust = dwarf2_start_symtab (cu, "", NULL, 0); tu_group->num_symtabs = lh->num_file_names; tu_group->symtabs = XNEWVEC (struct symtab *, lh->num_file_names); @@ -9158,17 +9165,14 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu) dir = lh->include_dirs[fe->dir_index - 1]; dwarf2_start_subfile (fe->name, dir); - /* Note: We don't have to watch for the main subfile here, type units - don't have DW_AT_name. */ - if (current_subfile->symtab == NULL) { /* NOTE: start_subfile will recognize when it's been passed a file it has already seen. So we can't assume there's a - simple mapping from lh->file_names to subfiles, + simple mapping from lh->file_names to subfiles, plus lh->file_names may contain dups. */ - current_subfile->symtab = allocate_symtab (current_subfile->name, - objfile); + current_subfile->symtab + = allocate_symtab (cust, current_subfile->name); } fe->symtab = current_subfile->symtab; @@ -17258,9 +17262,8 @@ dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile, Process the line number information in LH. */ static void -dwarf_decode_lines_1 (struct line_header *lh, const char *comp_dir, - struct dwarf2_cu *cu, const int decode_for_pst_p, - CORE_ADDR lowpc) +dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu, + const int decode_for_pst_p, CORE_ADDR lowpc) { const gdb_byte *line_ptr, *extended_end; const gdb_byte *line_end; @@ -17619,9 +17622,8 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, { struct objfile *objfile = cu->objfile; const int decode_for_pst_p = (pst != NULL); - struct subfile *first_subfile = current_subfile; - dwarf_decode_lines_1 (lh, comp_dir, cu, decode_for_pst_p, lowpc); + dwarf_decode_lines_1 (lh, cu, decode_for_pst_p, lowpc); if (decode_for_pst_p) { @@ -17643,6 +17645,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, /* Make sure a symtab is created for every file, even files which contain only variables (i.e. no code with associated line numbers). */ + struct compunit_symtab *cust = buildsym_compunit_symtab (); int i; for (i = 0; i < lh->num_file_names; i++) @@ -17655,15 +17658,11 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, dir = lh->include_dirs[fe->dir_index - 1]; dwarf2_start_subfile (fe->name, dir); - /* Skip the main file; we don't need it, and it must be - allocated last, so that it will show up before the - non-primary symtabs in the objfile's symtab list. */ - if (current_subfile == first_subfile) - continue; - if (current_subfile->symtab == NULL) - current_subfile->symtab = allocate_symtab (current_subfile->name, - objfile); + { + current_subfile->symtab + = allocate_symtab (cust, current_subfile->name); + } fe->symtab = current_subfile->symtab; } } @@ -17719,11 +17718,13 @@ dwarf2_start_subfile (const char *filename, const char *dirname) /* Start a symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to start_symtab. */ -static void +static struct compunit_symtab * dwarf2_start_symtab (struct dwarf2_cu *cu, const char *name, const char *comp_dir, CORE_ADDR low_pc) { - start_symtab (dwarf2_per_objfile->objfile, name, comp_dir, low_pc); + struct compunit_symtab *cust + = start_symtab (cu->objfile, name, comp_dir, low_pc); + record_debugformat ("DWARF 2"); record_producer (cu->producer); @@ -17731,6 +17732,8 @@ dwarf2_start_symtab (struct dwarf2_cu *cu, processing_gcc_compilation = 2; cu->processing_has_namespace_info = 0; + + return cust; } static void @@ -20365,8 +20368,7 @@ file_full_name (int file, struct line_header *lh, const char *comp_dir) static struct macro_source_file * macro_start_file (int file, int line, struct macro_source_file *current_file, - const char *comp_dir, - struct line_header *lh) + struct line_header *lh) { /* File name relative to the compilation directory of this source file. */ char *file_name = file_file_name (file, lh); @@ -20375,7 +20377,7 @@ macro_start_file (int file, int line, { /* Note: We don't create a macro table for this compilation unit at all until we actually get a filename. */ - struct macro_table *macro_table = get_macro_table (comp_dir); + struct macro_table *macro_table = get_macro_table (); /* If we have no current file, then this must be the start_file directive for the compilation unit's main source file. */ @@ -20753,7 +20755,7 @@ static void dwarf_decode_macro_bytes (bfd *abfd, const gdb_byte *mac_ptr, const gdb_byte *mac_end, struct macro_source_file *current_file, - struct line_header *lh, const char *comp_dir, + struct line_header *lh, struct dwarf2_section_info *section, int section_is_gnu, int section_is_dwz, unsigned int offset_size, @@ -20900,8 +20902,7 @@ dwarf_decode_macro_bytes (bfd *abfd, at_commandline = 0; } else - current_file = macro_start_file (file, line, current_file, - comp_dir, lh); + current_file = macro_start_file (file, line, current_file, lh); } break; @@ -20985,8 +20986,7 @@ dwarf_decode_macro_bytes (bfd *abfd, *slot = (void *) new_mac_ptr; dwarf_decode_macro_bytes (include_bfd, new_mac_ptr, - include_mac_end, current_file, - lh, comp_dir, + include_mac_end, current_file, lh, section, section_is_gnu, is_dwz, offset_size, include_hash); @@ -21024,7 +21024,7 @@ dwarf_decode_macro_bytes (bfd *abfd, static void dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, - const char *comp_dir, int section_is_gnu) + int section_is_gnu) { struct objfile *objfile = dwarf2_per_objfile->objfile; struct line_header *lh = cu->line_header; @@ -21143,8 +21143,7 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); mac_ptr += bytes_read; - current_file = macro_start_file (file, line, current_file, - comp_dir, lh); + current_file = macro_start_file (file, line, current_file, lh); } break; @@ -21209,7 +21208,7 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset, slot = htab_find_slot (include_hash, mac_ptr, INSERT); *slot = (void *) mac_ptr; dwarf_decode_macro_bytes (abfd, mac_ptr, mac_end, - current_file, lh, comp_dir, section, + current_file, lh, section, section_is_gnu, 0, offset_size, include_hash); do_cleanups (cleanup); } |