Make exit/stop return correct exit value; Add line number tracing.
authorMichael Meissner <gnu@the-meissners.org>
Wed, 18 Sep 1996 13:23:31 +0000 (13:23 +0000)
committerMichael Meissner <gnu@the-meissners.org>
Wed, 18 Sep 1996 13:23:31 +0000 (13:23 +0000)
sim/d10v/ChangeLog
sim/d10v/Makefile.in
sim/d10v/configure.in
sim/d10v/interp.c
sim/d10v/simops.c

index 3f22811d19434553a0c0ae9c1002d618478500c7..fbf57d85f470b3847834ec4fb0196762143251c3 100644 (file)
@@ -1,3 +1,36 @@
+Wed Sep 18 09:13:25 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
+
+       * d10v_sim.h (DEBUG_INSTRUCTION): New debug value to include line
+       numbers and function names in debug trace.
+       (DEBUG): If not defined, set to DEBUG_TRACE, DEBUG_VALUES, and
+       DEBUG_LINE_NUMBER. 
+       (SIG_D10V_{STOP,EXIT}): Values to represent the stop instruction
+       and exit system call trap being executed.
+
+       * interp.c (sim_stop_reason): Set exit code correctly for stop
+       instruction and exit system call trap.
+
+       * configure.in (--enable-sim-cflags): Remove trace case.
+       (--enable-sim-debug): New switch to set the debug values.
+       * configure: Regenerate.
+
+       * simops.c (trace_{input,output}_func): Rename from
+       trace_{input,output}.
+       (trace_{input,output}): Call trace_{input,output}_func if
+       d10v_debug is non-zero.
+       (SIZE_INSTRUCTION): Cut down to 8.
+       (SIZE_OPERANDS): Cut down to 18.
+       (SIZE_LOCATION): New value for size of line number, function name
+       field.
+       (init_text_p,text{,_start,_end}): New static variables for
+       printing line number and function name.
+       (sim_bfd): New external that run.c sets.
+       (trace_input_func): Print line number and function name if
+       available and if desired.
+       (OP_4E09): Don't print out DBT message.
+       (OP_5FE0): Set exception field to SIG_D10V_STOP.
+       (OP_5F00): Set exception field to SIG_D10V_EXIT.        
+
 Sat Sep 14 22:18:43 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * interp.c (do_2_short): If the instruction encodes jump->ins,
index 2e6aac56394b559d25a2a3170ea0541a2f48c049..19972b2948a8b13a86ef92106331e58f62b8af68 100644 (file)
@@ -61,7 +61,8 @@ CC = @CC@
 CC_FOR_BUILD = @CC_FOR_BUILD@
 CFLAGS = @CFLAGS@
 SIM_CFLAGS = @sim_cflags@
-CONFIG_CFLAGS = @DEFS@ $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) -DINSIDE_SIMULATOR
+DEBUG_CFLAGS = @sim_debug@
+CONFIG_CFLAGS = @DEFS@ $(SIM_CFLAGS) $(DEBUG_CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) -DINSIDE_SIMULATOR
 BUILD_CFLAGS = -g -O $(CSEARCH)
 MAKEINFO = makeinfo
 RANLIB = @RANLIB@
index 647255eff7db139b54351a9c84b4adf7688fdef5..cc9c4ad4951fb88973868a68f5e83b4485cce90c 100644 (file)
@@ -23,7 +23,7 @@ AC_ARG_ENABLE(sim-cflags,
 [  --enable-sim-cflags=opts            Extra CFLAGS for use in building simulator],
 [case "${enableval}" in
   yes)  sim_cflags="-O2";;
-  trace) sim_cflags="-O2 -DDEBUG=3";;
+  trace) AC_MSG_ERROR("Please use --enable-sim-debug instead."); sim_cflags="";;
   no)   sim_cflags="";;
   *)    sim_cflags=`echo "${enableval}" | sed -e "s/,/ /g"`;;
 esac
@@ -31,6 +31,17 @@ if test x"$silent" != x"yes" && test x"$sim_cflags" != x""; then
   echo "Setting sim cflags = $sim_cflags" 6>&1
 fi],[sim_cflags=""])dnl
 
+AC_ARG_ENABLE(sim-debug,
+[  --enable-sim-debug=opts             Enable debugging flags],
+[case "${enableval}" in
+  yes) sim_debug="-DDEBUG=7";;
+  no)  sim_debug="-DDEBUG=0";;
+  *)   sim_debug="-DDEBUG='(${enableval})'";;
+esac
+if test x"$silent" != x"yes" && test x"$sim_debug" != x""; then
+  echo "Setting sim debug = $sim_debug" 6>&1
+fi],[sim_cflags=""])dnl
+
 AC_SUBST(CC_FOR_BUILD)
 AC_SUBST(CFLAGS)
 AC_SUBST(HDEFINES)
@@ -38,6 +49,7 @@ AR=${AR-ar}
 AC_SUBST(AR)
 AC_PROG_RANLIB
 AC_SUBST(sim_cflags)
+AC_SUBST(sim_debug)
 
 # Put a plausible default for CC_FOR_BUILD in Makefile.
 AC_C_CROSS
index f035cf08d663693862f96f7985e6ef6c712f06be..d34c11698754bf7cd806a8fad6ebd9109ba024ef 100644 (file)
@@ -492,15 +492,22 @@ sim_stop_reason (reason, sigrc)
 {
 /*   (*d10v_callback->printf_filtered) (d10v_callback, "sim_stop_reason:  PC=0x%x\n",PC<<2); */
 
-  if (State.exception == SIGQUIT)
+  switch (State.exception)
     {
+    case SIG_D10V_STOP:                        /* stop instruction */
       *reason = sim_exited;
-      *sigrc = State.exception;
-    }
-  else
-    {
+      *sigrc = 0;
+      break;
+
+    case SIG_D10V_EXIT:                        /* exit trap */
+      *reason = sim_exited;
+      *sigrc = State.regs[2];
+      break;
+
+    default:                           /* some signal */
       *reason = sim_stopped;
       *sigrc = State.exception;
+      break;
     } 
 }
 
index 3a889a189e1c367af1e712d4ba836a38730a2c45..7f8cd0943aff7731ff41bdb0d97af664b3337ae4 100644 (file)
@@ -7,6 +7,7 @@
 #include "d10v_sim.h"
 #include "simops.h"
 #include "sys/syscall.h"
+#include "bfd.h"
 
 enum op_types {
   OP_VOID,
@@ -33,27 +34,41 @@ enum op_types {
 };
 
 #ifdef DEBUG
-static void trace_input PARAMS ((char *name,
-                                enum op_types in1,
-                                enum op_types in2,
-                                enum op_types in3));
+static void trace_input_func PARAMS ((char *name,
+                                     enum op_types in1,
+                                     enum op_types in2,
+                                     enum op_types in3));
 
-static void trace_output PARAMS ((enum op_types result));
+#define trace_input(name, in1, in2, in3) do { if (d10v_debug) trace_input_func (name, in1, in2, in3); } while (0)
+
+static void trace_output_func PARAMS ((enum op_types result));
+
+#define trace_output(result) do { if (d10v_debug) trace_output_func (result); } while (0)
+
+static int init_text_p = 0;
+static asection *text;
+static bfd_vma text_start;
+static bfd_vma text_end;
+extern bfd *sim_bfd;
 
 #ifndef SIZE_INSTRUCTION
-#define SIZE_INSTRUCTION 10
+#define SIZE_INSTRUCTION 8
 #endif
 
 #ifndef SIZE_OPERANDS
-#define SIZE_OPERANDS 24
+#define SIZE_OPERANDS 18
 #endif
 
 #ifndef SIZE_VALUES
 #define SIZE_VALUES 13
 #endif
 
+#ifndef SIZE_LOCATION
+#define SIZE_LOCATION 20
+#endif
+
 static void
-trace_input (name, in1, in2, in3)
+trace_input_func (name, in1, in2, in3)
      char *name;
      enum op_types in1;
      enum op_types in2;
@@ -62,10 +77,15 @@ trace_input (name, in1, in2, in3)
   char *comma;
   enum op_types in[3];
   int i;
-  char buf[80];
+  char buf[1024];
   char *p;
   long tmp;
   char *type;
+  asection *s;
+  const char *filename;
+  const char *functionname;
+  unsigned int linenumber;
+  bfd_vma byte_pc;
 
   if ((d10v_debug & DEBUG_TRACE) == 0)
     return;
@@ -81,10 +101,67 @@ trace_input (name, in1, in2, in3)
     case INS_LONG:             type = " B"; break;
     }
 
-  (*d10v_callback->printf_filtered) (d10v_callback,
-                                    "0x%.6x %s:  %-*s",
-                                    (unsigned)PC, type,
-                                    SIZE_INSTRUCTION, name);
+  if ((d10v_debug & DEBUG_LINE_NUMBER) == 0)
+    (*d10v_callback->printf_filtered) (d10v_callback,
+                                      "0x%.6x %s: %-*s",
+                                      (unsigned)PC, type,
+                                      SIZE_INSTRUCTION, name);
+
+  else
+    {
+      buf[0] = '\0';
+      if (!init_text_p)
+       {
+         init_text_p = 1;
+         for (s = sim_bfd->sections; s; s = s->next)
+           if (strcmp (bfd_get_section_name (sim_bfd, s), ".text") == 0)
+             {
+               text = s;
+               text_start = bfd_get_section_vma (sim_bfd, s);
+               text_end = text_start + bfd_section_size (sim_bfd, s);
+               break;
+             }
+       }
+
+      byte_pc = (bfd_vma)PC << 2;
+      if (text && byte_pc >= text_start && byte_pc < text_end)
+       {
+         filename = (const char *)0;
+         functionname = (const char *)0;
+         linenumber = 0;
+         if (bfd_find_nearest_line (sim_bfd, text, (struct symbol_cache_entry **)0, byte_pc - text_start,
+                                    &filename, &functionname, &linenumber))
+           {
+             p = buf;
+             if (linenumber)
+               {
+                 sprintf (p, "#%-4d ", linenumber);
+                 p += strlen (p);
+               }
+
+             if (functionname)
+               {
+                 sprintf (p, "%s ", functionname);
+                 p += strlen (p);
+               }
+             else if (filename)
+               {
+                 char *q = (char *) strrchr (filename, '/');
+                 sprintf (p, "%s ", (q) ? q+1 : filename);
+                 p += strlen (p);
+               }
+
+             if (*p == ' ')
+               *p = '\0';
+           }
+       }
+
+      (*d10v_callback->printf_filtered) (d10v_callback,
+                                        "0x%.6x %s: %-*.*s %-*s",
+                                        (unsigned)PC, type,
+                                        SIZE_LOCATION, SIZE_LOCATION, buf,
+                                        SIZE_INSTRUCTION, name);
+    }
 
   in[0] = in1;
   in[1] = in2;
@@ -286,7 +363,7 @@ trace_input (name, in1, in2, in3)
 }
 
 static void
-trace_output (result)
+trace_output_func (result)
      enum op_types result;
 {
   if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
@@ -865,7 +942,7 @@ OP_4E09 ()
 void
 OP_5F20 ()
 {
-  d10v_callback->printf_filtered(d10v_callback, "***** DBT *****  PC=%x\n",PC);
+  /* d10v_callback->printf_filtered(d10v_callback, "***** DBT *****  PC=%x\n",PC); */
   State.exception = SIGTRAP;
 }
 
@@ -2233,7 +2310,7 @@ void
 OP_5FE0 ()
 {
   trace_input ("stop", OP_VOID, OP_VOID, OP_VOID);
-  State.exception = SIGQUIT;
+  State.exception = SIG_D10V_STOP;
   trace_output (OP_VOID);
 }
 
@@ -2545,9 +2622,7 @@ OP_5F00 ()
            RETVAL = d10v_callback->open (d10v_callback, MEMPTR (PARM1), PARM2);
            break;
          case SYS_exit:
-           /* EXIT - caller can look in PARM1 to work out the 
-              reason */
-           State.exception = SIGQUIT;
+           State.exception = SIG_D10V_EXIT;
            break;
 
          case SYS_stat: