diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 14 | ||||
-rw-r--r-- | gdb/psymtab.c | 23 |
3 files changed, 31 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6bd84c0..2a22d82 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2014-11-18 Doug Evans <xdje42@gmail.com> + + The result of symtab expansion is always a primary symtab. + * dwarf2read.c (dw2_instantiate_symtab): Add assert. + (dw2_lookup_symbol): Remove unnecessary test for primary symbol table. + * psymtab.c (lookup_symbol_aux_psymtabs): Ditto. + (psymtab_to_symtab): Add comment and assert. + (map_matching_symbols_psymtab): Remove unnecessary test for + non-primary symtab. + 2014-11-15 Doug Evans <xdje42@gmail.com> PR symtab/17559 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 9762d98..d929017 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -2660,6 +2660,10 @@ dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu) process_cu_includes (); 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; } @@ -3611,17 +3615,13 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index, { struct symbol *sym = NULL; struct symtab *stab = dw2_instantiate_symtab (per_cu); + const struct blockvector *bv = BLOCKVECTOR (stab); + struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); /* Some caution must be observed with overloaded functions and methods, since the index will not contain any overload information (but NAME might contain it). */ - if (stab->primary) - { - const struct blockvector *bv = BLOCKVECTOR (stab); - struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); - - sym = block_lookup_symbol (block, name, domain); - } + sym = block_lookup_symbol (block, name, domain); if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) { diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 2514b55..9cfc2c1 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -510,17 +510,16 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile, { struct symbol *sym = NULL; struct symtab *stab = psymtab_to_symtab (objfile, ps); + /* Note: While psymtab_to_symtab can return NULL if the partial symtab + is empty, we can assume it won't here because lookup_partial_symbol + succeeded. */ + const struct blockvector *bv = BLOCKVECTOR (stab); + struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); /* Some caution must be observed with overloaded functions and methods, since the psymtab will not contain any overload information (but NAME might contain it). */ - if (stab->primary) - { - const struct blockvector *bv = BLOCKVECTOR (stab); - struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); - - sym = block_lookup_symbol (block, name, domain); - } + sym = block_lookup_symbol (block, name, domain); if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) { @@ -756,7 +755,10 @@ lookup_partial_symbol (struct objfile *objfile, } /* Get the symbol table that corresponds to a partial_symtab. - This is fast after the first time you do it. */ + This is fast after the first time you do it. + The result will be NULL if the primary symtab has no symbols, + which can happen. Otherwise the result is the primary symtab + that contains PST. */ static struct symtab * psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) @@ -779,6 +781,9 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) do_cleanups (back_to); } + if (pst->symtab != NULL) + gdb_assert (pst->symtab->primary); + return pst->symtab; } @@ -1259,7 +1264,7 @@ map_matching_symbols_psymtab (struct objfile *objfile, struct symtab *s = psymtab_to_symtab (objfile, ps); struct block *block; - if (s == NULL || !s->primary) + if (s == NULL) continue; block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind); if (map_block (name, namespace, objfile, block, |