From: Joel Brobecker Date: Tue, 5 Jun 2012 13:50:57 +0000 (+0000) Subject: Windows-specific iterate_over_objfiles_in_search_order X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a8e1bb344dad8bc875d9faf0c68d41bca8e142c1;p=binutils-gdb.git Windows-specific iterate_over_objfiles_in_search_order This patch sets the windows target to use their own version of the iterate_over_objfiles_in_search_order gdbarch method, in order to make global symbol searches sensitive to the current objfile. gdb/ChangeLog: * windows-tdep.h (windows_iterate_over_objfiles_in_search_order): Add declaration. * windows-tdep.c: #include "objfiles.h". (windows_iterate_over_objfiles_in_search_order): New function. * amd64-windows-tdep.c (amd64_windows_init_abi): Set iterate_over_objfiles_in_search_order gdbarch method to windows_iterate_over_objfiles_in_search_order. * i386-cygwin-tdep.c (i386_cygwin_init_abi): Likewise. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a6448a71f10..3fb91b38240 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2012-06-05 Joel Brobecker + + * windows-tdep.h (windows_iterate_over_objfiles_in_search_order): + Add declaration. + * windows-tdep.c: #include "objfiles.h". + (windows_iterate_over_objfiles_in_search_order): New function. + * amd64-windows-tdep.c (amd64_windows_init_abi): Set + iterate_over_objfiles_in_search_order gdbarch method to + windows_iterate_over_objfiles_in_search_order. + * i386-cygwin-tdep.c (i386_cygwin_init_abi): Likewise. + 2012-06-05 Joel Brobecker * gdbarch.sh: Add generation of diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c index 4a40f4799b0..41e0efa4e76 100644 --- a/gdb/amd64-windows-tdep.c +++ b/gdb/amd64-windows-tdep.c @@ -23,6 +23,7 @@ #include "gdbtypes.h" #include "gdbcore.h" #include "regcache.h" +#include "windows-tdep.h" /* The registers used to pass integer arguments during a function call. */ static int amd64_windows_dummy_call_integer_regs[] = @@ -174,6 +175,9 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_return_value (gdbarch, amd64_windows_return_value); set_gdbarch_skip_main_prologue (gdbarch, amd64_skip_main_prologue); + set_gdbarch_iterate_over_objfiles_in_search_order + (gdbarch, windows_iterate_over_objfiles_in_search_order); + set_solib_ops (gdbarch, &solib_target_so_ops); } diff --git a/gdb/i386-cygwin-tdep.c b/gdb/i386-cygwin-tdep.c index fb940f8b758..bb395e79c8e 100644 --- a/gdb/i386-cygwin-tdep.c +++ b/gdb/i386-cygwin-tdep.c @@ -257,6 +257,9 @@ i386_cygwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Canonical paths on this target look like `c:\Program Files\Foo App\mydll.dll', for example. */ set_gdbarch_has_dos_based_file_system (gdbarch, 1); + + set_gdbarch_iterate_over_objfiles_in_search_order + (gdbarch, windows_iterate_over_objfiles_in_search_order); } static enum gdb_osabi diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c index a7045994e7d..116525c9fa2 100644 --- a/gdb/windows-tdep.c +++ b/gdb/windows-tdep.c @@ -26,6 +26,7 @@ #include "command.h" #include "gdbcmd.h" #include "gdbthread.h" +#include "objfiles.h" struct cmd_list_element *info_w32_cmdlist; @@ -398,6 +399,51 @@ windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr, obstack_grow_str (obstack, "\"/>"); } +/* Implement the "iterate_over_objfiles_in_search_order" gdbarch + method. It searches all objfiles, starting with CURRENT_OBJFILE + first (if not NULL). + + On Windows, the system behaves a little differently when two + objfiles each define a global symbol using the same name, compared + to other platforms such as GNU/Linux for instance. On GNU/Linux, + all instances of the symbol effectively get merged into a single + one, but on Windows, they remain distinct. + + As a result, it usually makes sense to start global symbol searches + with the current objfile before expanding it to all other objfiles. + This helps for instance when a user debugs some code in a DLL that + refers to a global variable defined inside that DLL. When trying + to print the value of that global variable, it would be unhelpful + to print the value of another global variable defined with the same + name, but in a different DLL. */ + +void +windows_iterate_over_objfiles_in_search_order + (struct gdbarch *gdbarch, + iterate_over_objfiles_in_search_order_cb_ftype *cb, + void *cb_data, struct objfile *current_objfile) +{ + int stop; + struct objfile *objfile; + + if (current_objfile) + { + stop = cb (current_objfile, cb_data); + if (stop) + return; + } + + ALL_OBJFILES (objfile) + { + if (objfile != current_objfile) + { + stop = cb (objfile, cb_data); + if (stop) + return; + } + } +} + static void show_maint_show_all_tib (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) diff --git a/gdb/windows-tdep.h b/gdb/windows-tdep.h index c790e0ac2ca..20bf66d4ab6 100644 --- a/gdb/windows-tdep.h +++ b/gdb/windows-tdep.h @@ -29,4 +29,9 @@ extern void windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr, struct gdbarch *gdbarch, struct obstack *obstack); + +extern void windows_iterate_over_objfiles_in_search_order + (struct gdbarch *gdbarch, + iterate_over_objfiles_in_search_order_cb_ftype *cb, + void *cb_data, struct objfile *current_objfile); #endif