* target.h: Add enum target_waitkind, enum target_signal, and
[deliverable/binutils-gdb.git] / gdb / infcmd.c
index f4de3abb96de3be13d0a821b6260f0dbe64fc8ae..569abc8f91d5607e8412341a927809b7061c3c04 100644 (file)
@@ -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
This page took 0.025237 seconds and 4 git commands to generate.