From 67ac97591175936a06cc1ef1df228746edcdb545 Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Tue, 4 Jan 1994 21:53:53 +0000 Subject: * 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. --- gdb/infcmd.c | 75 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 32 deletions(-) (limited to 'gdb/infcmd.c') 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 -- cgit v1.1