aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/dwarf2read.c14
-rw-r--r--gdb/psymtab.c23
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,