diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/amd64-windows-tdep.c | 4 | ||||
-rw-r--r-- | gdb/i386-cygwin-tdep.c | 3 | ||||
-rw-r--r-- | gdb/windows-tdep.c | 46 | ||||
-rw-r--r-- | gdb/windows-tdep.h | 5 |
5 files changed, 69 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a6448a7..3fb91b3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2012-06-05 Joel Brobecker <brobecker@adacore.com> + * 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 <brobecker@adacore.com> + * gdbarch.sh: Add generation of "iterate_over_objfiles_in_search_order_cb_ftype" typedef in gdbarch.h. Add include of "objfiles.h" in gdbarch.c. diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c index 4a40f47..41e0efa 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 fb940f8..bb395e7 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 a704599..116525c 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, "\"/></library>"); } +/* 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 c790e0a..20bf66d 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 |