diff options
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/record.c | 70 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.reverse/sigall-reverse.exp | 2 |
4 files changed, 51 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0d9691a..347856d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2009-12-22 Hui Zhu <teawater@gmail.com> + + * record.c (record_message): Change argument. + (record_message_wrapper): New function. + (do_record_message): Change it name to + "record_message_wrapper_safe". + Let it call "record_message_wrapper". + (record_resume_error): Deleted. + (record_resume): Call "record_message". + (record_wait): Deleted record_resume_error. + Call "record_message_wrapper_safe". + Set status when do_record_message need stop the inferior. + 2009-12-21 Doug Evans <dje@google.com> * linux-nat.c (kill_lwp): Minor cleanup, move definition of diff --git a/gdb/record.c b/gdb/record.c index 85f969c8..327555d 100644 --- a/gdb/record.c +++ b/gdb/record.c @@ -572,17 +572,11 @@ record_arch_list_cleanups (void *ignore) record the running message of inferior and set them to record_arch_list, and add it to record_list. */ -struct record_message_args { - struct regcache *regcache; - enum target_signal signal; -}; - static int -record_message (void *args) +record_message (struct regcache *regcache, enum target_signal signal) { int ret; - struct record_message_args *myargs = args; - struct gdbarch *gdbarch = get_regcache_arch (myargs->regcache); + struct gdbarch *gdbarch = get_regcache_arch (regcache); struct cleanup *old_cleanups = make_cleanup (record_arch_list_cleanups, 0); record_arch_list_head = NULL; @@ -616,18 +610,18 @@ record_message (void *args) if (record_list != &record_first) /* FIXME better way to check */ { gdb_assert (record_list->type == record_end); - record_list->u.end.sigval = myargs->signal; + record_list->u.end.sigval = signal; } - if (myargs->signal == TARGET_SIGNAL_0 + if (signal == TARGET_SIGNAL_0 || !gdbarch_process_record_signal_p (gdbarch)) ret = gdbarch_process_record (gdbarch, - myargs->regcache, - regcache_read_pc (myargs->regcache)); + regcache, + regcache_read_pc (regcache)); else ret = gdbarch_process_record_signal (gdbarch, - myargs->regcache, - myargs->signal); + regcache, + signal); if (ret > 0) error (_("Process record: inferior program stopped.")); @@ -648,15 +642,29 @@ record_message (void *args) return 1; } +struct record_message_args { + struct regcache *regcache; + enum target_signal signal; +}; + static int -do_record_message (struct regcache *regcache, - enum target_signal signal) +record_message_wrapper (void *args) +{ + struct record_message_args *record_args = args; + + return record_message (record_args->regcache, record_args->signal); +} + +static int +record_message_wrapper_safe (struct regcache *regcache, + enum target_signal signal) { struct record_message_args args; args.regcache = regcache; args.signal = signal; - return catch_errors (record_message, &args, NULL, RETURN_MASK_ALL); + + return catch_errors (record_message_wrapper, &args, NULL, RETURN_MASK_ALL); } /* Set to 1 if record_store_registers and record_xfer_partial @@ -983,7 +991,6 @@ record_close (int quitting) } static int record_resume_step = 0; -static int record_resume_error; /* "to_resume" target method. Resume the process record target. */ @@ -995,15 +1002,7 @@ record_resume (struct target_ops *ops, ptid_t ptid, int step, if (!RECORD_IS_REPLAY) { - if (do_record_message (get_current_regcache (), signal)) - { - record_resume_error = 0; - } - else - { - record_resume_error = 1; - return; - } + record_message (get_current_regcache (), signal); record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1, signal); } @@ -1067,14 +1066,6 @@ record_wait (struct target_ops *ops, if (!RECORD_IS_REPLAY && ops != &record_core_ops) { - if (record_resume_error) - { - /* If record_resume get error, return directly. */ - status->kind = TARGET_WAITKIND_STOPPED; - status->value.sig = TARGET_SIGNAL_ABRT; - return inferior_ptid; - } - if (record_resume_step) { /* This is a single step. */ @@ -1130,8 +1121,13 @@ record_wait (struct target_ops *ops, { /* This must be a single-step trap. Record the insn and issue another step. */ - if (!do_record_message (regcache, TARGET_SIGNAL_0)) - break; + if (!record_message_wrapper_safe (regcache, + TARGET_SIGNAL_0)) + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_0; + break; + } record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5cefc92..59d6d40 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-12-22 Hui Zhu <teawater@gmail.com> + + * gdb.reverse/sigall-reverse.exp: Adjust. + 2009-12-21 Vladimir Prus <vladimir@codesourcery.com> PR gdb/10884 diff --git a/gdb/testsuite/gdb.reverse/sigall-reverse.exp b/gdb/testsuite/gdb.reverse/sigall-reverse.exp index 23c08bd..58cc1bc 100644 --- a/gdb/testsuite/gdb.reverse/sigall-reverse.exp +++ b/gdb/testsuite/gdb.reverse/sigall-reverse.exp @@ -262,7 +262,7 @@ gdb_test "continue" \ "get signal TERM" gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" -gdb_test "continue" "Program received .*" "continue to sigall exit" \ +gdb_test "continue" "\[process \[0-9\]+ .*" "continue to sigal exit" \ "The next instruction is syscall exit_group.* program...y. or n. " \ "yes" |