Message ID | m3tx2qjee1.fsf@sspiff.org |
---|---|
State | New |
Headers | show |
Doug Evans <xdje42@gmail.com> writes: > struct symbol * > lookup_static_symbol_aux (const char *name, const domain_enum domain) > { > struct objfile *objfile; > struct symbol *sym; > > sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); > if (sym != NULL) > return sym; > > ALL_OBJFILES (objfile) > { > sym = lookup_symbol_aux_quick (objfile, STATIC_BLOCK, name, domain); > if (sym != NULL) > return sym; > } > > return NULL; > } > > Note what we're doing here. > First we're searching over all expanded symtabs in all objfiles, > and then we search partial/gdb_index tables in all objfiles. Eh? > > Normally when looking up a symbol in a particular objfile > we first list in expanded symtabs and then look in partial/gdb_index > tables. And *then* we try the next objfile. > > I can't think of any justification for the current behaviour. > > This patch changes things to be consistent, > but it is a behavioural change. Yes, it changes the behavior. Here is an example in my mind, but not sure it is correct or not, say, we have a static int foo defined in two objfiles respectively (1.c and 2.c), foo is in the partial table of two objfiles, but is only expanded to the full symtab of *one* objfile (2.c). 1.c 2.c partial foo foo full foo before your patch, GDB gets foo from 2.c full table, and after it, GDB gets foo from 1.c partial table. Is it possible? Regarding the change, we also need to update the comments to iterate_over_objfiles_in_search_order in gdbarch.sh, # Iterate over all objfiles in the order that makes the most sense # for the architecture to make global symbol searches. ^^^^^^^^^^^^^ > The testsuite passes, and any noticeable difference > by this change would be dependent on the order in which > symtabs got expanded. Thus I can't think of a reason to not > apply this change. If read this <https://www.sourceware.org/ml/gdb-patches/2012-05/msg00204.html> correctly, Joel expressed the same intention there. Since gdbarch method iterate_over_objfiles_in_search_order was added for windows target and this patch uses it, we need to test it on windows target. If you don't have mingw testing env, let me know, I'll see if I can do the test.
Yao Qi <yao@codesourcery.com> writes: > Doug Evans <xdje42@gmail.com> writes: > >> struct symbol * >> lookup_static_symbol_aux (const char *name, const domain_enum domain) >> { >> struct objfile *objfile; >> struct symbol *sym; >> >> sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); >> if (sym != NULL) >> return sym; >> >> ALL_OBJFILES (objfile) >> { >> sym = lookup_symbol_aux_quick (objfile, STATIC_BLOCK, name, domain); >> if (sym != NULL) >> return sym; >> } >> >> return NULL; >> } >> >> Note what we're doing here. >> First we're searching over all expanded symtabs in all objfiles, >> and then we search partial/gdb_index tables in all objfiles. Eh? >> >> Normally when looking up a symbol in a particular objfile >> we first list in expanded symtabs and then look in partial/gdb_index >> tables. And *then* we try the next objfile. >> >> I can't think of any justification for the current behaviour. >> >> This patch changes things to be consistent, >> but it is a behavioural change. > > Yes, it changes the behavior. Here is an example in my mind, but not > sure it is correct or not, say, we have a static int foo defined in two > objfiles respectively (1.c and 2.c), foo is in the partial table of two > objfiles, but is only expanded to the full symtab of *one* objfile (2.c). > > 1.c 2.c > partial foo foo > full foo Also note that the context is searching across objfiles, so 1.c and 2.c are also 1.so and 2.so. > before your patch, GDB gets foo from 2.c full table, and after it, GDB > gets foo from 1.c partial table. Is it possible? The question isn't whether it is possible, the question is whether this is a behavioural change on which we make some kind of guarantee. For the task at hand, we should be making a guarantee related to library search order before making any kind of guarantee related to internal implementation details (partial vs full syms). [I'm not saying we can or should make search order guarantees, per se. Rather, such things should at least be coherent.] With this patch we now perform a proper full search of libraries in a partcular order (however that order is defined which is a separate discussion). Whereas today we could find foo in the last library in the search order, even if every library has foo, just because someone accessed some other symbol in the last library and caused the symtab with foo to be expanded. > Regarding the change, we also need to update the comments to > iterate_over_objfiles_in_search_order in gdbarch.sh, > > # Iterate over all objfiles in the order that makes the most sense > # for the architecture to make global symbol searches. > ^^^^^^^^^^^^^ Ah, righto. >> The testsuite passes, and any noticeable difference >> by this change would be dependent on the order in which >> symtabs got expanded. Thus I can't think of a reason to not >> apply this change. > > If read this > <https://www.sourceware.org/ml/gdb-patches/2012-05/msg00204.html> > correctly, Joel expressed the same intention there. Righto. > Since gdbarch method iterate_over_objfiles_in_search_order was added for > windows target and this patch uses it, we need to test it on windows target. > If you don't have mingw testing env, let me know, I'll see if I can do > the test. I'm going to be making more symtab changes so I might as well get mingw testing going here. Testing in progress.
diff --git a/gdb/symtab.c b/gdb/symtab.c index 07e9fce..54bbb67 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -80,11 +80,6 @@ struct symbol *lookup_local_symbol (const char *name, enum language language); static -struct symbol *lookup_symbol_aux_symtabs (int block_index, - const char *name, - const domain_enum domain); - -static struct symbol *lookup_symbol_via_quick_fns (struct objfile *objfile, int block_index, const char *name, @@ -1474,28 +1469,6 @@ lookup_symbol_aux (const char *name, const struct block *block, return lookup_static_symbol (name, domain); } -/* See symtab.h. */ - -struct symbol * -lookup_static_symbol (const char *name, const domain_enum domain) -{ - struct objfile *objfile; - struct symbol *sym; - - sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); - if (sym != NULL) - return sym; - - ALL_OBJFILES (objfile) - { - sym = lookup_symbol_via_quick_fns (objfile, STATIC_BLOCK, name, domain); - if (sym != NULL) - return sym; - } - - return NULL; -} - /* Check to see if the symbol is defined in BLOCK or its superiors. Don't search STATIC_BLOCK or GLOBAL_BLOCK. */ @@ -1648,26 +1621,6 @@ lookup_symbol_in_symtabs (struct objfile *objfile, int block_index, return NULL; } -/* Wrapper around lookup_symbol_in_symtabs to search all objfiles. - Returns the first match found. */ - -static struct symbol * -lookup_symbol_aux_symtabs (int block_index, const char *name, - const domain_enum domain) -{ - struct symbol *sym; - struct objfile *objfile; - - ALL_OBJFILES (objfile) - { - sym = lookup_symbol_in_symtabs (objfile, block_index, name, domain); - if (sym) - return sym; - } - - return NULL; -} - /* Wrapper around lookup_symbol_in_symtabs for search_symbols. Look up LINKAGE_NAME in DOMAIN in the global and static blocks of OBJFILE and all related objfiles. */ @@ -1771,7 +1724,7 @@ basic_lookup_symbol_nonlocal (const char *name, not it would be appropriate to search the current global block here as well. (That's what this code used to do before the is_a_field_of_this check was moved up.) On the one hand, it's - redundant with the lookup_symbol_aux_symtabs search that happens + redundant with the lookup in all objfiles search that happens next. On the other hand, if decode_line_1 is passed an argument like filename:var, then the user presumably wants 'var' to be searched for in filename. On the third hand, there shouldn't be @@ -1815,9 +1768,9 @@ lookup_symbol_in_static_block (const char *name, return NULL; } -/* Private data to be used with lookup_symbol_global_iterator_cb. */ +/* Private data to be used with lookup_symbol_iterator_cb. */ -struct global_sym_lookup_data +struct iterated_sym_lookup_data { /* The name of the symbol we are searching for. */ const char *name; @@ -1825,29 +1778,31 @@ struct global_sym_lookup_data /* The domain to use for our search. */ domain_enum domain; + /* One of STATIC_BLOCK or GLOBAL_BLOCK. */ + int block_index; + /* The field where the callback should store the symbol if found. It should be initialized to NULL before the search is started. */ struct symbol *result; }; /* A callback function for gdbarch_iterate_over_objfiles_in_search_order. - It searches by name for a symbol in the GLOBAL_BLOCK of the given + It searches by name for a symbol in the given block of the given OBJFILE. The arguments for the search are passed via CB_DATA, - which in reality is a pointer to struct global_sym_lookup_data. */ + which in reality is a pointer to struct iterated_sym_lookup_data. */ static int -lookup_symbol_global_iterator_cb (struct objfile *objfile, - void *cb_data) +lookup_symbol_iterator_cb (struct objfile *objfile, void *cb_data) { - struct global_sym_lookup_data *data = - (struct global_sym_lookup_data *) cb_data; + struct iterated_sym_lookup_data *data = + (struct iterated_sym_lookup_data *) cb_data; gdb_assert (data->result == NULL); - data->result = lookup_symbol_in_symtabs (objfile, GLOBAL_BLOCK, + data->result = lookup_symbol_in_symtabs (objfile, data->block_index, data->name, data->domain); if (data->result == NULL) - data->result = lookup_symbol_via_quick_fns (objfile, GLOBAL_BLOCK, + data->result = lookup_symbol_via_quick_fns (objfile, data->block_index, data->name, data->domain); /* If we found a match, tell the iterator to stop. Otherwise, @@ -1858,13 +1813,30 @@ lookup_symbol_global_iterator_cb (struct objfile *objfile, /* See symtab.h. */ struct symbol * +lookup_static_symbol (const char *name, const domain_enum domain) +{ + struct iterated_sym_lookup_data lookup_data; + + memset (&lookup_data, 0, sizeof (lookup_data)); + lookup_data.name = name; + lookup_data.domain = domain; + lookup_data.block_index = STATIC_BLOCK; + gdbarch_iterate_over_objfiles_in_search_order + (target_gdbarch (), lookup_symbol_iterator_cb, &lookup_data, NULL); + + return lookup_data.result; +} + +/* See symtab.h. */ + +struct symbol * lookup_symbol_global (const char *name, const struct block *block, const domain_enum domain) { struct symbol *sym = NULL; struct objfile *objfile = NULL; - struct global_sym_lookup_data lookup_data; + struct iterated_sym_lookup_data lookup_data; /* Call library-specific lookup procedure. */ objfile = lookup_objfile_from_block (block); @@ -1876,9 +1848,10 @@ lookup_symbol_global (const char *name, memset (&lookup_data, 0, sizeof (lookup_data)); lookup_data.name = name; lookup_data.domain = domain; + lookup_data.block_index = GLOBAL_BLOCK; gdbarch_iterate_over_objfiles_in_search_order (objfile != NULL ? get_objfile_arch (objfile) : target_gdbarch (), - lookup_symbol_global_iterator_cb, &lookup_data, objfile); + lookup_symbol_iterator_cb, &lookup_data, objfile); return lookup_data.result; }