From: Jie Zhang Date: Wed, 10 Mar 2010 15:37:44 +0000 (-0500) Subject: gdb: add get_offsets hook X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4194556af51fe9c553bd491178e2de61a63b82a6;p=thirdparty%2Fbinutils-gdb.git gdb: add get_offsets hook Signed-off-by: Jie Zhang Signed-off-by: Mike Frysinger --- diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py index e9051db3f17..0ac05c43575 100644 --- a/gdb/gdbarch-components.py +++ b/gdb/gdbarch-components.py @@ -2319,6 +2319,16 @@ True if inferiors share an address space (e.g., uClinux). invalid=False, ) +Value( + comment=""" +Query the remote side for the text, data and bss offsets. +""", + type="int", + name="use_get_offsets", + predefault="1", + invalid=False, +) + Method( comment=""" True if a fast tracepoint can be set at an address. diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index be83db144df..87ef21cbdd0 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -1427,6 +1427,11 @@ typedef int (gdbarch_has_shared_address_space_ftype) (struct gdbarch *gdbarch); extern int gdbarch_has_shared_address_space (struct gdbarch *gdbarch); extern void set_gdbarch_has_shared_address_space (struct gdbarch *gdbarch, gdbarch_has_shared_address_space_ftype *has_shared_address_space); +/* Query the remote side for the text, data and bss offsets. */ + +extern int gdbarch_use_get_offsets (struct gdbarch *gdbarch); +extern void set_gdbarch_use_get_offsets (struct gdbarch *gdbarch, int use_get_offsets); + /* True if a fast tracepoint can be set at an address. */ typedef int (gdbarch_fast_tracepoint_valid_at_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr, std::string *msg); diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 8519be9c105..5c6802daa0f 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -226,6 +226,7 @@ struct gdbarch int has_global_solist = 0; int has_global_breakpoints = 0; gdbarch_has_shared_address_space_ftype *has_shared_address_space = default_has_shared_address_space; + int use_get_offsets = 1; gdbarch_fast_tracepoint_valid_at_ftype *fast_tracepoint_valid_at = default_fast_tracepoint_valid_at; gdbarch_guess_tracepoint_registers_ftype *guess_tracepoint_registers = default_guess_tracepoint_registers; gdbarch_auto_charset_ftype *auto_charset = default_auto_charset; @@ -485,6 +486,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of has_global_solist, invalid_p == 0 */ /* Skip verify of has_global_breakpoints, invalid_p == 0 */ /* Skip verify of has_shared_address_space, invalid_p == 0 */ + /* Skip verify of use_get_offsets, invalid_p == 0 */ /* Skip verify of fast_tracepoint_valid_at, invalid_p == 0 */ /* Skip verify of guess_tracepoint_registers, invalid_p == 0 */ /* Skip verify of auto_charset, invalid_p == 0 */ @@ -1256,6 +1258,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) gdb_printf (file, "gdbarch_dump: has_shared_address_space = <%s>\n", host_address_to_string (gdbarch->has_shared_address_space)); + gdb_printf (file, + "gdbarch_dump: use_get_offsets = %s\n", + plongest (gdbarch->use_get_offsets)); gdb_printf (file, "gdbarch_dump: fast_tracepoint_valid_at = <%s>\n", host_address_to_string (gdbarch->fast_tracepoint_valid_at)); @@ -4801,6 +4806,23 @@ set_gdbarch_has_shared_address_space (struct gdbarch *gdbarch, gdbarch->has_shared_address_space = has_shared_address_space; } +int +gdbarch_use_get_offsets (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + /* Skip verify of use_get_offsets, invalid_p == 0 */ + if (gdbarch_debug >= 2) + gdb_printf (gdb_stdlog, "gdbarch_use_get_offsets called\n"); + return gdbarch->use_get_offsets; +} + +void +set_gdbarch_use_get_offsets (struct gdbarch *gdbarch, + int use_get_offsets) +{ + gdbarch->use_get_offsets = use_get_offsets; +} + int gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr, std::string *msg) { diff --git a/gdb/remote.c b/gdb/remote.c index 5118ecd0a31..6b9c427b5d4 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5006,6 +5006,10 @@ remote_target::start_remote_1 (int from_tty, int extended_p) return false; } + /* Get text, data & bss offsets. */ + if (gdbarch_use_get_offsets (target_gdbarch)) + get_offsets (); + /* Report all signals during attach/startup. */ pass_signals ({});