diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1994-01-04 21:53:53 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1994-01-04 21:53:53 +0000 |
commit | 67ac97591175936a06cc1ef1df228746edcdb545 (patch) | |
tree | eb6068254e2992c5aa83741da1e59bb1af9562f4 /gdb/infcmd.c | |
parent | e14316e7fe96be0212669a9a4d60608707f66c90 (diff) | |
download | gdb-67ac97591175936a06cc1ef1df228746edcdb545.zip gdb-67ac97591175936a06cc1ef1df228746edcdb545.tar.gz gdb-67ac97591175936a06cc1ef1df228746edcdb545.tar.bz2 |
* target.h: Add enum target_waitkind, enum target_signal, and
struct target_waitstatus. Change status argument to target_wait to
be struct target_waitstatus * instead of int *.
* target.h, infrun.c, all targets: Change type of signal arguments
to resume(), proceed(), and target_resume() from int to enum
target_signal.
* All targets (*_wait, *_resume): Change accordingly.
* infcmd.c (program_info, signal_command), throughout infrun.c,
* fork-child.c, solib.c, hppa-tdep.c, osfsolib.c: Use this stuff.
* convex-xdep.c, convex-tdep.c: Add FIXME's (getting the Convex
signal code stuff right with the new signals would be non-trivial).
* inferior.h (stop_signal): Make it enum target_signal not int.
* target.c, target.h (target_signal_to_string, target_signal_to_name,
target_signal_from_name): New functions.
* inftarg.c, target.h (target_signal_to_host, target_signal_from_host,
store_waitstatus): New functions.
* procfs.c (procfs_notice_signals): Use them.
* i960-tdep.c (i960_fault_to_signal): New function, to replace
print_fault.
* config/i960/tm-i960.h: Don't define PRINT_RANDOM_SIGNAL.
Diffstat (limited to 'gdb/infcmd.c')
-rw-r--r-- | gdb/infcmd.c | 75 |
1 files changed, 43 insertions, 32 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c index f4de3ab..569abc8 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -128,7 +128,7 @@ int inferior_pid; /* Last signal that the inferior received (why it stopped). */ -int stop_signal; +enum target_signal stop_signal; /* Address at which inferior stopped. */ @@ -468,7 +468,7 @@ jump_command (arg, from_tty) local_hex_string((unsigned long) addr)); clear_proceed_status (); - proceed (addr, 0, 0); + proceed (addr, TARGET_SIGNAL_0, 0); } /* Continue program giving it specified signal. */ @@ -478,7 +478,7 @@ signal_command (signum_exp, from_tty) char *signum_exp; int from_tty; { - register int signum; + enum target_signal oursig; dont_repeat (); /* Too dangerous. */ ERROR_NO_INFERIOR; @@ -489,25 +489,35 @@ signal_command (signum_exp, from_tty) /* It would be even slicker to make signal names be valid expressions, (the type could be "enum $signal" or some such), then the user could assign them to convenience variables. */ - signum = strtosigno (signum_exp); + oursig = target_signal_from_name (signum_exp); - if (signum == 0) - /* Not found as a name, try it as an expression. */ - signum = parse_and_eval_address (signum_exp); + if (oursig == TARGET_SIGNAL_UNKNOWN) + { + /* Not found as a name, try it as an expression. */ + /* The numeric signal refers to our own internal signal numbering + from target.h, not to host/target signal number. This is a + feature; users really should be using symbolic names anyway, + and the common ones like SIGHUP, SIGINT, SIGALRM, etc. will + work right anyway. */ + int signum = parse_and_eval_address (signum_exp); + if (signum <= 0 + || signum >= (int)TARGET_SIGNAL_LAST + || signum == (int)TARGET_SIGNAL_UNKNOWN) + error ("Invalid signal number %d.", signum); + oursig = signum; + } if (from_tty) { - char *signame = strsigno (signum); - printf_filtered ("Continuing with signal "); - if (signame == NULL || signum == 0) - printf_filtered ("%d.\n", signum); + if (oursig == TARGET_SIGNAL_0) + printf_filtered ("Continuing with no signal.\n"); else - /* Do we need to print the number as well as the name? */ - printf_filtered ("%s (%d).\n", signame, signum); + printf_filtered ("Continuing with signal %s.\n", + target_signal_to_name (oursig)); } clear_proceed_status (); - proceed (stop_pc, signum, 0); + proceed (stop_pc, oursig, 0); } /* Call breakpoint_auto_delete on the current contents of the bpstat @@ -592,7 +602,7 @@ run_stack_dummy (addr, buffer) #endif /* CALL_DUMMY_BREAKPOINT_OFFSET. */ proceed_to_finish = 1; /* We want stop_registers, please... */ - proceed (addr, 0, 0); + proceed (addr, TARGET_SIGNAL_0, 0); discard_cleanups (old_cleanups); @@ -788,21 +798,12 @@ program_info (args, from_tty) num = bpstat_num (&bs); } } - else if (stop_signal) + else if (stop_signal != TARGET_SIGNAL_0) { -#ifdef PRINT_RANDOM_SIGNAL - PRINT_RANDOM_SIGNAL (stop_signal); -#else - char *signame = strsigno (stop_signal); - printf_filtered ("It stopped with signal "); - if (signame == NULL) - printf_filtered ("%d", stop_signal); - else - /* Do we need to print the number as well as the name? */ - printf_filtered ("%s (%d)", signame, stop_signal); - printf_filtered (", %s.\n", safe_strsignal (stop_signal)); -#endif - } + printf_filtered ("It stopped with signal %s, %s.\n", + target_signal_to_name (stop_signal), + target_signal_to_string (stop_signal)); + } if (!from_tty) printf_filtered ("Type \"info stack\" or \"info registers\" for more information.\n"); @@ -1070,14 +1071,24 @@ do_registers_info (regnum, fpregs) fputs_filtered (reg_names[i], gdb_stdout); print_spaces_filtered (15 - strlen (reg_names[i]), gdb_stdout); - /* Get the data in raw format, then convert also to virtual format. */ + /* Get the data in raw format. */ if (read_relative_register_raw_bytes (i, raw_buffer)) { printf_filtered ("Invalid register contents\n"); continue; } - - REGISTER_CONVERT_TO_VIRTUAL (i, raw_buffer, virtual_buffer); + + /* Convert raw data to virtual format if necessary. */ +#ifdef REGISTER_CONVERTIBLE + if (REGISTER_CONVERTIBLE (i)) + { + REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i), + raw_buffer, virtual_buffer); + } + else +#endif + memcpy (virtual_buffer, raw_buffer, + REGISTER_VIRTUAL_SIZE (i)); /* If virtual format is floating, print it that way, and in raw hex. */ if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT |