This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: FYI: change type searching
>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
Tom> I will revert this patch soon, and think up a different approach.
Here's the reversion.
Tom
2010-09-08 Tom Tromey <tromey@redhat.com>
Revert:
2010-09-01 Tom Tromey <tromey@redhat.com>
* dwarf2read.c, gdbtypes.c, psymtab.c, symfile.h, symtab.c,
symtab.h: Revert earlier change.
Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.450
diff -u -r1.450 dwarf2read.c
--- dwarf2read.c 1 Sep 2010 21:50:24 -0000 1.450
+++ dwarf2read.c 8 Sep 2010 17:13:31 -0000
@@ -2198,7 +2198,7 @@
dw2_lookup_symbol (struct objfile *objfile, int block_index,
const char *name, domain_enum domain)
{
- /* We do all the work in the expand_one_symtab_matching hook
+ /* We do all the work in the pre_expand_symtabs_matching hook
instead. */
return NULL;
}
@@ -2229,46 +2229,12 @@
}
}
-static struct symbol *
-dw2_expand_one_symtab_matching (struct objfile *objfile,
- int kind, const char *name,
- domain_enum domain,
- struct symbol *(*matcher) (struct symtab *,
- int,
- const char *,
- domain_enum,
- void *),
- void *data)
+static void
+dw2_pre_expand_symtabs_matching (struct objfile *objfile,
+ int kind, const char *name,
+ domain_enum domain)
{
- dw2_setup (objfile);
-
- if (dwarf2_per_objfile->index_table)
- {
- offset_type *vec;
-
- if (find_slot_in_mapped_hash (dwarf2_per_objfile->index_table,
- name, &vec))
- {
- offset_type i, len = MAYBE_SWAP (*vec);
- for (i = 0; i < len; ++i)
- {
- offset_type cu_index = MAYBE_SWAP (vec[i + 1]);
- struct dwarf2_per_cu_data *cu = dw2_get_cu (cu_index);
- struct symtab *symtab;
- struct symbol *sym;
-
- if (cu->v.quick->symtab)
- continue;
-
- symtab = dw2_instantiate_symtab (objfile, cu);
- sym = matcher (symtab, kind, name, domain, data);
- if (sym)
- return sym;
- }
- }
- }
-
- return NULL;
+ dw2_do_expand_symtabs_matching (objfile, name);
}
static void
@@ -2572,7 +2538,7 @@
dw2_forget_cached_source_info,
dw2_lookup_symtab,
dw2_lookup_symbol,
- dw2_expand_one_symtab_matching,
+ dw2_pre_expand_symtabs_matching,
dw2_print_stats,
dw2_dump,
dw2_relocate,
@@ -6305,9 +6271,9 @@
(B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields);
- /* We don't set TYPE_FIELD_IGNORE_BITS here. The DWARF reader
- never sets any bits in that array, so leaving it NULL lets us
- save a little memory. */
+ TYPE_FIELD_IGNORE_BITS (type) =
+ (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
+ B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields);
}
/* If the type has baseclasses, allocate and clear a bit vector for
Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.198
diff -u -r1.198 gdbtypes.c
--- gdbtypes.c 1 Sep 2010 21:50:26 -0000 1.198
+++ gdbtypes.c 8 Sep 2010 17:13:31 -0000
@@ -1051,7 +1051,7 @@
struct symbol *sym;
struct type *tmp;
- sym = lookup_type_symbol (name, block, VAR_DOMAIN, language->la_language);
+ sym = lookup_symbol (name, block, VAR_DOMAIN, 0);
if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
{
tmp = language_lookup_primitive_type_by_name (language, gdbarch, name);
Index: psymtab.c
===================================================================
RCS file: /cvs/src/src/gdb/psymtab.c,v
retrieving revision 1.13
diff -u -r1.13 psymtab.c
--- psymtab.c 7 Sep 2010 15:00:00 -0000 1.13
+++ psymtab.c 8 Sep 2010 17:13:31 -0000
@@ -426,18 +426,12 @@
return NULL;
}
-static struct symbol *
-expand_one_symtab_matching_psymtabs (struct objfile *objfile,
- int kind, const char *name,
- domain_enum domain,
- struct symbol *(*matcher) (struct symtab *,
- int,
- const char *,
- domain_enum,
- void *),
- void *data)
+static void
+pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
+ int kind, const char *name,
+ domain_enum domain)
{
- return NULL;
+ /* Nothing. */
}
/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
@@ -1218,7 +1212,7 @@
forget_cached_source_info_partial,
lookup_symtab_via_partial_symtab,
lookup_symbol_aux_psymtabs,
- expand_one_symtab_matching_psymtabs,
+ pre_expand_symtabs_matching_psymtabs,
print_psymtab_stats_for_objfile,
dump_psymtabs_for_objfile,
relocate_psymtabs,
Index: symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.71
diff -u -r1.71 symfile.h
--- symfile.h 1 Sep 2010 21:50:26 -0000 1.71
+++ symfile.h 8 Sep 2010 17:13:31 -0000
@@ -171,25 +171,14 @@
int kind, const char *name,
domain_enum domain);
- /* Expand each symbol table in OBJFILE that may have items matching
- KIND, NAME, and DOMAIN -- these arguments are as for
- `lookup_symbol'. For each such symbol table, call MATCHER with
- the symbol table and DATA arguments. If MATCHER returns NULL,
- keep going. Otherwise, return the result of MATCHER. If MATCHER
- never returns non-NULL, return NULL. A backend can choose to
- implement this and then have its `lookup_symbol' hook always
- return NULL, or the reverse. (It doesn't make sense to implement
- both.) */
- struct symbol *(*expand_one_symtab_matching)
- (struct objfile *objfile,
- int kind, const char *name,
- domain_enum domain,
- struct symbol *(*matcher) (struct symtab *symtab,
- int kind,
- const char *name,
- domain_enum domain,
- void *data),
- void *data);
+ /* This is called to expand symbol tables before looking up a
+ symbol. A backend can choose to implement this and then have its
+ `lookup_symbol' hook always return NULL, or the reverse. (It
+ doesn't make sense to implement both.) The arguments are as for
+ `lookup_symbol'. */
+ void (*pre_expand_symtabs_matching) (struct objfile *objfile,
+ int kind, const char *name,
+ domain_enum domain);
/* Print statistics about any indices loaded for OBJFILE. The
statistics should be printed to gdb_stdout. This is used for
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.252
diff -u -r1.252 symtab.c
--- symtab.c 1 Sep 2010 21:50:26 -0000 1.252
+++ symtab.c 8 Sep 2010 17:13:32 -0000
@@ -91,8 +91,7 @@
const struct block *block,
const domain_enum domain,
enum language language,
- int *is_a_field_of_this,
- int for_type);
+ int *is_a_field_of_this);
static
struct symbol *lookup_symbol_aux_local (const char *name,
@@ -995,8 +994,6 @@
C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
NAME is a field of the current implied argument `this'. If so set
*IS_A_FIELD_OF_THIS to 1, otherwise set it to zero.
- FOR_TYPE is non-zero if searching specifically for a type; zero
- otherwise.
BLOCK_FOUND is set to the block in which NAME is found (in the case of
a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
@@ -1010,10 +1007,10 @@
variable and thus can probably assume it will never hit the C++
code). */
-static struct symbol *
-lookup_symbol_in_language_full (const char *name, const struct block *block,
- const domain_enum domain, enum language lang,
- int *is_a_field_of_this, int for_type)
+struct symbol *
+lookup_symbol_in_language (const char *name, const struct block *block,
+ const domain_enum domain, enum language lang,
+ int *is_a_field_of_this)
{
char *demangled_name = NULL;
const char *modified_name = NULL;
@@ -1078,41 +1075,12 @@
}
returnval = lookup_symbol_aux (modified_name, block, domain, lang,
- is_a_field_of_this, for_type);
+ is_a_field_of_this);
do_cleanups (cleanup);
return returnval;
}
-/* Find the definition for a specified symbol name NAME
- in domain DOMAIN, visible from lexical block BLOCK.
- Returns the struct symbol pointer, or zero if no symbol is found.
- C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
- NAME is a field of the current implied argument `this'. If so set
- *IS_A_FIELD_OF_THIS to 1, otherwise set it to zero.
- BLOCK_FOUND is set to the block in which NAME is found (in the case of
- a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
-
-struct symbol *
-lookup_symbol_in_language (const char *name, const struct block *block,
- const domain_enum domain, enum language lang,
- int *is_a_field_of_this)
-{
- return lookup_symbol_in_language_full (name, block, domain, lang,
- is_a_field_of_this, 0);
-}
-
-/* Like lookup_symbol_in_language, but search specifically for a
- type. */
-
-struct symbol *
-lookup_type_symbol (const char *name, const struct block *block,
- const domain_enum domain, enum language lang)
-{
- return lookup_symbol_in_language_full (name, block, domain, lang,
- NULL, 1);
-}
-
/* Behave like lookup_symbol_in_language, but performed with the
current language. */
@@ -1133,8 +1101,7 @@
static struct symbol *
lookup_symbol_aux (const char *name, const struct block *block,
const domain_enum domain, enum language language,
- int *is_a_field_of_this,
- int for_type)
+ int *is_a_field_of_this)
{
struct symbol *sym;
const struct language_defn *langdef;
@@ -1198,20 +1165,14 @@
}
/* Now do whatever is appropriate for LANGUAGE to look
- up static and global variables. If we are searching for a type,
- we bypass this lookup, because types aren't global. */
+ up static and global variables. */
- if (!for_type)
- {
- sym = langdef->la_lookup_symbol_nonlocal (name, block, domain);
- if (sym != NULL)
- return sym;
- }
+ sym = langdef->la_lookup_symbol_nonlocal (name, block, domain);
+ if (sym != NULL)
+ return sym;
- /* Now search all static file-level symbols. When searching for a
- type, this is what we generally want, because types are put into
- the file scope. For other objects, not strictly correct, but
- more useful than an error. */
+ /* Now search all static file-level symbols. Not strictly correct,
+ but more useful than an error. */
return lookup_static_symbol_aux (name, domain);
}
@@ -1366,35 +1327,6 @@
return NULL;
}
-/* A helper for lookup_symbol_aux_symtabs that is passed as a callback
- to the expand_one_symtab_matching quick function. */
-
-static struct symbol *
-match_symbol_aux (struct symtab *symtab,
- int kind, const char *name, domain_enum domain,
- void *arg)
-{
- struct objfile *objfile = arg;
-
- if (symtab->primary)
- {
- struct symbol *sym;
- struct blockvector *bv;
- const struct block *block;
-
- bv = BLOCKVECTOR (symtab);
- block = BLOCKVECTOR_BLOCK (bv, kind);
- sym = lookup_block_symbol (block, name, domain);
- if (sym)
- {
- block_found = block;
- return fixup_symbol_section (sym, objfile);
- }
- }
-
- return NULL;
-}
-
/* Check to see if the symbol is defined in one of the symtabs.
BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
depending on whether or not we want to search global symbols or
@@ -1412,6 +1344,11 @@
ALL_OBJFILES (objfile)
{
+ if (objfile->sf)
+ objfile->sf->qf->pre_expand_symtabs_matching (objfile,
+ block_index,
+ name, domain);
+
ALL_OBJFILE_SYMTABS (objfile, s)
if (s->primary)
{
@@ -1424,17 +1361,6 @@
return fixup_symbol_section (sym, objfile);
}
}
-
- if (objfile->sf)
- {
- sym = objfile->sf->qf->expand_one_symtab_matching (objfile,
- block_index,
- name, domain,
- match_symbol_aux,
- objfile);
- if (sym)
- return sym;
- }
}
return NULL;
@@ -1656,30 +1582,6 @@
return NULL;
}
-/* A helper function for basic_lookup_transparent_type that is passed
- to the expand_one_symtab_matching quick function. */
-
-static struct symbol *
-match_transparent_type (struct symtab *symtab,
- int kind, const char *name, domain_enum domain,
- void *data)
-{
- if (symtab->primary)
- {
- struct blockvector *bv;
- struct block *block;
- struct symbol *sym;
-
- bv = BLOCKVECTOR (symtab);
- block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
- sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
- if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
- return sym;
- }
-
- return NULL;
-}
-
/* The standard implementation of lookup_transparent_type. This code
was modeled on lookup_symbol -- the parts not relevant to looking
up types were just left out. In particular it's assumed here that
@@ -1703,6 +1605,11 @@
ALL_OBJFILES (objfile)
{
+ if (objfile->sf)
+ objfile->sf->qf->pre_expand_symtabs_matching (objfile,
+ GLOBAL_BLOCK,
+ name, STRUCT_DOMAIN);
+
ALL_OBJFILE_SYMTABS (objfile, s)
if (s->primary)
{
@@ -1714,18 +1621,6 @@
return SYMBOL_TYPE (sym);
}
}
-
- if (objfile->sf)
- {
- sym
- = objfile->sf->qf->expand_one_symtab_matching (objfile,
- GLOBAL_BLOCK, name,
- STRUCT_DOMAIN,
- match_transparent_type,
- NULL);
- if (sym)
- return SYMBOL_TYPE (sym);
- }
}
ALL_OBJFILES (objfile)
@@ -1745,6 +1640,10 @@
ALL_OBJFILES (objfile)
{
+ if (objfile->sf)
+ objfile->sf->qf->pre_expand_symtabs_matching (objfile, STATIC_BLOCK,
+ name, STRUCT_DOMAIN);
+
ALL_OBJFILE_SYMTABS (objfile, s)
{
bv = BLOCKVECTOR (s);
@@ -1755,18 +1654,6 @@
return SYMBOL_TYPE (sym);
}
}
-
- if (objfile->sf)
- {
- sym
- = objfile->sf->qf->expand_one_symtab_matching (objfile,
- STATIC_BLOCK, name,
- STRUCT_DOMAIN,
- match_transparent_type,
- NULL);
- if (sym)
- return SYMBOL_TYPE (sym);
- }
}
ALL_OBJFILES (objfile)
Index: symtab.h
===================================================================
RCS file: /cvs/src/src/gdb/symtab.h,v
retrieving revision 1.162
diff -u -r1.162 symtab.h
--- symtab.h 1 Sep 2010 21:50:26 -0000 1.162
+++ symtab.h 8 Sep 2010 17:13:32 -0000
@@ -977,10 +977,6 @@
extern void reread_symbols (void);
-extern struct symbol *lookup_type_symbol (const char* name,
- const struct block *block,
- const domain_enum domain,
- enum language lang);
extern struct type *lookup_transparent_type (const char *);
extern struct type *basic_lookup_transparent_type (const char *);