diff options
author | Hui Zhu <teawater@gmail.com> | 2009-09-21 05:52:06 +0000 |
---|---|---|
committer | Hui Zhu <teawater@gmail.com> | 2009-09-21 05:52:06 +0000 |
commit | 3846b520e430eb5d47243add80b27a56bb2bd850 (patch) | |
tree | 72d5c444722ac7cca5bb0a7eee482c764636abd6 | |
parent | ba0f96ec3d5dd3db26d4be498af23ede04a7d9ac (diff) | |
download | gdb-3846b520e430eb5d47243add80b27a56bb2bd850.zip gdb-3846b520e430eb5d47243add80b27a56bb2bd850.tar.gz gdb-3846b520e430eb5d47243add80b27a56bb2bd850.tar.bz2 |
2009-09-21 Hui Zhu <teawater@gmail.com>
Michael Snyder <msnyder@vmware.com>
* gdbarch.sh (process_record_signal): New interface.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbarch.c | 33 | ||||
-rw-r--r-- | gdb/gdbarch.h | 9 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 4 |
4 files changed, 51 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 02f45d8..6cf8889 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-09-21 Hui Zhu <teawater@gmail.com> + Michael Snyder <msnyder@vmware.com> + + * gdbarch.sh (process_record_signal): New interface. + 2009-09-19 Matt Rice <ratmice@gmail.com> (tiny change) Checked in by Joel Brobecker <brobecker@gnat.com> diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index e1b9d0d..2ae3835 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -240,6 +240,7 @@ struct gdbarch gdbarch_static_transform_name_ftype *static_transform_name; int sofun_address_maybe_missing; gdbarch_process_record_ftype *process_record; + gdbarch_process_record_signal_ftype *process_record_signal; gdbarch_target_signal_from_host_ftype *target_signal_from_host; gdbarch_target_signal_to_host_ftype *target_signal_to_host; gdbarch_get_siginfo_type_ftype *get_siginfo_type; @@ -378,6 +379,7 @@ struct gdbarch startup_gdbarch = 0, /* static_transform_name */ 0, /* sofun_address_maybe_missing */ 0, /* process_record */ + 0, /* process_record_signal */ default_target_signal_from_host, /* target_signal_from_host */ default_target_signal_to_host, /* target_signal_to_host */ 0, /* get_siginfo_type */ @@ -635,6 +637,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of static_transform_name, has predicate */ /* Skip verify of sofun_address_maybe_missing, invalid_p == 0 */ /* Skip verify of process_record, has predicate */ + /* Skip verify of process_record_signal, has predicate */ /* Skip verify of target_signal_from_host, invalid_p == 0 */ /* Skip verify of target_signal_to_host, invalid_p == 0 */ /* Skip verify of get_siginfo_type, has predicate */ @@ -971,6 +974,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: process_record = <%s>\n", host_address_to_string (gdbarch->process_record)); fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_process_record_signal_p() = %d\n", + gdbarch_process_record_signal_p (gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: process_record_signal = <%s>\n", + host_address_to_string (gdbarch->process_record_signal)); + fprintf_unfiltered (file, "gdbarch_dump: ps_regnum = %s\n", plongest (gdbarch->ps_regnum)); fprintf_unfiltered (file, @@ -3307,6 +3316,30 @@ set_gdbarch_process_record (struct gdbarch *gdbarch, gdbarch->process_record = process_record; } +int +gdbarch_process_record_signal_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->process_record_signal != NULL; +} + +int +gdbarch_process_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, enum target_signal signal) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->process_record_signal != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_process_record_signal called\n"); + return gdbarch->process_record_signal (gdbarch, regcache, signal); +} + +void +set_gdbarch_process_record_signal (struct gdbarch *gdbarch, + gdbarch_process_record_signal_ftype process_record_signal) +{ + gdbarch->process_record_signal = process_record_signal; +} + enum target_signal gdbarch_target_signal_from_host (struct gdbarch *gdbarch, int signo) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 027541d..950b7ca 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -822,6 +822,15 @@ typedef int (gdbarch_process_record_ftype) (struct gdbarch *gdbarch, struct regc extern int gdbarch_process_record (struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR addr); extern void set_gdbarch_process_record (struct gdbarch *gdbarch, gdbarch_process_record_ftype *process_record); +/* Save process state after a signal. + Return -1 if something goes wrong, 0 otherwise. */ + +extern int gdbarch_process_record_signal_p (struct gdbarch *gdbarch); + +typedef int (gdbarch_process_record_signal_ftype) (struct gdbarch *gdbarch, struct regcache *regcache, enum target_signal signal); +extern int gdbarch_process_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, enum target_signal signal); +extern void set_gdbarch_process_record_signal (struct gdbarch *gdbarch, gdbarch_process_record_signal_ftype *process_record_signal); + /* Signal translation: translate inferior's signal (host's) number into GDB's representation. */ diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 3a6e483..1546342 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -709,6 +709,10 @@ v:int:sofun_address_maybe_missing:::0:0::0 # Return -1 if something goes wrong, 0 otherwise. M:int:process_record:struct regcache *regcache, CORE_ADDR addr:regcache, addr +# Save process state after a signal. +# Return -1 if something goes wrong, 0 otherwise. +M:int:process_record_signal:struct regcache *regcache, enum target_signal signal:regcache, signal + # Signal translation: translate inferior's signal (host's) number into # GDB's representation. m:enum target_signal:target_signal_from_host:int signo:signo::default_target_signal_from_host::0 |