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.
This commit is contained in:
Joel Brobecker
2012-06-05 13:50:57 +00:00
parent 19630284f5
commit a8e1bb344d
5 changed files with 69 additions and 0 deletions

View File

@@ -1,3 +1,14 @@
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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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