sim: parse_args: display getopt error ourselves
[external/binutils.git] / sim / common / sim-trace.c
index fc20d00..6c01e15 100644 (file)
@@ -1,6 +1,5 @@
 /* Simulator tracing/debugging support.
-   Copyright (C) 1997-1998, 2001, 2007-2012 Free Software Foundation,
-   Inc.
+   Copyright (C) 1997-2016 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
 This file is part of GDB, the GNU debugger.
@@ -78,7 +77,8 @@ enum {
   OPTION_TRACE_DEBUG,
   OPTION_TRACE_FILE,
   OPTION_TRACE_VPU,
-  OPTION_TRACE_SYSCALL
+  OPTION_TRACE_SYSCALL,
+  OPTION_TRACE_REGISTER
 };
 
 static const OPTION trace_options[] =
@@ -103,19 +103,19 @@ static const OPTION trace_options[] =
       '\0', "on|off", "Trace memory operations",
       trace_option_handler, NULL },
   { {"trace-alu", optional_argument, NULL, OPTION_TRACE_ALU},
-      '\0', "on|off", "Trace ALU operations",
+      '\0', "on|off", "Trace ALU (Arithmetic Logic Unit) operations",
       trace_option_handler, NULL },
   { {"trace-fpu", optional_argument, NULL, OPTION_TRACE_FPU},
-      '\0', "on|off", "Trace FPU operations",
+      '\0', "on|off", "Trace FPU (Floating Point Unit) operations",
       trace_option_handler, NULL },
   { {"trace-vpu", optional_argument, NULL, OPTION_TRACE_VPU},
-      '\0', "on|off", "Trace VPU operations",
+      '\0', "on|off", "Trace VPU (Vector Processing Unit) operations",
       trace_option_handler, NULL },
   { {"trace-branch", optional_argument, NULL, OPTION_TRACE_BRANCH},
       '\0', "on|off", "Trace branching",
       trace_option_handler, NULL },
   { {"trace-semantics", optional_argument, NULL, OPTION_TRACE_SEMANTICS},
-      '\0', "on|off", "Perform ALU, FPU, MEMORY, and BRANCH tracing",
+      '\0', "on|off", "Perform ALU, FPU, VPU, MEMORY, and BRANCH tracing",
       trace_option_handler, NULL },
   { {"trace-model", optional_argument, NULL, OPTION_TRACE_MODEL},
       '\0', "on|off", "Include model performance data",
@@ -129,6 +129,9 @@ static const OPTION trace_options[] =
   { {"trace-syscall", optional_argument, NULL, OPTION_TRACE_SYSCALL},
       '\0', "on|off", "Trace system calls",
       trace_option_handler, NULL },
+  { {"trace-register", optional_argument, NULL, OPTION_TRACE_REGISTER},
+      '\0', "on|off", "Trace cpu register accesses",
+      trace_option_handler, NULL },
 #ifdef SIM_HAVE_ADDR_RANGE
   { {"trace-range", required_argument, NULL, OPTION_TRACE_RANGE},
       '\0', "START,END", "Specify range of addresses for instruction tracing",
@@ -174,22 +177,14 @@ set_trace_option_mask (SIM_DESC sd, const char *name, int mask, const char *arg)
        }
     }
 
-  /* update applicable trace bits */
+  /* Update applicable trace bits.  */
   for (trace_nr = 0; trace_nr < MAX_TRACE_VALUES; ++trace_nr)
     {
       if ((mask & (1 << trace_nr)) == 0)
        continue;
 
       /* Set non-cpu specific values.  */
-      switch (trace_nr)
-       {
-       case TRACE_EVENTS_IDX:
-         STATE_EVENTS (sd)->trace = trace_val;
-         break;
-       case TRACE_DEBUG_IDX:
-         STATE_TRACE_FLAGS (sd)[trace_nr] = trace_val;
-         break;
-       }
+      STATE_TRACE_FLAGS (sd)[trace_nr] = trace_val;
 
       /* Set cpu values.  */
       for (cpu_nr = 0; cpu_nr < MAX_NR_PROCESSORS; cpu_nr++)
@@ -241,7 +236,7 @@ trace_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
   switch (opt)
     {
     case 't' :
-      if (! WITH_TRACE)
+      if (!WITH_TRACE_ANY_P)
        sim_io_eprintf (sd, "Tracing not compiled in, `-t' ignored\n");
       else
        return set_trace_option_mask (sd, "trace", TRACE_USEFUL_MASK, arg);
@@ -342,6 +337,13 @@ trace_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
        sim_io_eprintf (sd, "System call tracing not compiled in, `--trace-syscall' ignored\n");
       break;
 
+    case OPTION_TRACE_REGISTER :
+      if (WITH_TRACE_REGISTER_P)
+       return set_trace_option (sd, "-register", TRACE_REGISTER_IDX, arg);
+      else
+       sim_io_eprintf (sd, "Register tracing not compiled in, `--trace-register' ignored\n");
+      break;
+
     case OPTION_TRACE_SEMANTICS :
       if (WITH_TRACE_ALU_P
          && WITH_TRACE_FPU_P
@@ -361,7 +363,7 @@ trace_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
 
 #ifdef SIM_HAVE_ADDR_RANGE
     case OPTION_TRACE_RANGE :
-      if (WITH_TRACE)
+      if (WITH_TRACE_ANY_P)
        {
          int cpu_nr;
          char *chp = arg;
@@ -387,7 +389,7 @@ trace_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
       break;
 
     case OPTION_TRACE_FUNCTION :
-      if (WITH_TRACE)
+      if (WITH_TRACE_ANY_P)
        {
          /*wip: need to compute function range given name*/
        }
@@ -404,7 +406,7 @@ trace_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
       break;
 
     case OPTION_TRACE_FILE :
-      if (! WITH_TRACE)
+      if (!WITH_TRACE_ANY_P)
        sim_io_eprintf (sd, "Tracing not compiled in, `--trace-file' ignored\n");
       else
        {
@@ -497,17 +499,6 @@ trace_uninstall (SIM_DESC sd)
     }
 }
 \f
-typedef enum {
-  trace_fmt_invalid,
-  trace_fmt_word,
-  trace_fmt_fp,
-  trace_fmt_fpu,
-  trace_fmt_string,
-  trace_fmt_bool,
-  trace_fmt_addr,
-  trace_fmt_instruction_incomplete,
-} data_fmt;
-
 /* compute the nr of trace data units consumed by data */
 static int
 save_data_size (TRACE_DATA *data,
@@ -519,7 +510,7 @@ save_data_size (TRACE_DATA *data,
 
 
 /* Archive DATA into the trace buffer */
-static void
+void
 save_data (SIM_DESC sd,
           TRACE_DATA *data,
           data_fmt fmt,
@@ -623,17 +614,18 @@ trace_idx_to_str (int trace_idx)
   static char num[8];
   switch (trace_idx)
     {
-    case TRACE_ALU_IDX:     return "alu:     ";
-    case TRACE_INSN_IDX:    return "insn:    ";
-    case TRACE_DECODE_IDX:  return "decode:  ";
-    case TRACE_EXTRACT_IDX: return "extract: ";
-    case TRACE_MEMORY_IDX:  return "memory:  ";
-    case TRACE_CORE_IDX:    return "core:    ";
-    case TRACE_EVENTS_IDX:  return "events:  ";
-    case TRACE_FPU_IDX:     return "fpu:     ";
-    case TRACE_BRANCH_IDX:  return "branch:  ";
-    case TRACE_SYSCALL_IDX: return "syscall: ";
-    case TRACE_VPU_IDX:     return "vpu:     ";
+    case TRACE_ALU_IDX:      return "alu:     ";
+    case TRACE_INSN_IDX:     return "insn:    ";
+    case TRACE_DECODE_IDX:   return "decode:  ";
+    case TRACE_EXTRACT_IDX:  return "extract: ";
+    case TRACE_MEMORY_IDX:   return "memory:  ";
+    case TRACE_CORE_IDX:     return "core:    ";
+    case TRACE_EVENTS_IDX:   return "events:  ";
+    case TRACE_FPU_IDX:      return "fpu:     ";
+    case TRACE_BRANCH_IDX:   return "branch:  ";
+    case TRACE_SYSCALL_IDX:  return "syscall: ";
+    case TRACE_REGISTER_IDX: return "reg:     ";
+    case TRACE_VPU_IDX:      return "vpu:     ";
     default:
       sprintf (num, "?%d?", trace_idx);
       return num;
@@ -1226,107 +1218,12 @@ trace_vprintf (SIM_DESC sd, sim_cpu *cpu, const char *fmt, va_list ap)
     }
 }
 
-/* The function trace_one_insn has been replaced by the function pair
-   trace_prefix() + trace_generic().  It is still used. */
-void
-trace_one_insn (SIM_DESC sd, sim_cpu *cpu, address_word pc,
-               int line_p, const char *filename, int linenum,
-               const char *phase_wo_colon, const char *fmt,
-               ...)
-{
-  va_list ap;
-  char phase[SIZE_PHASE+2];
-
-  strncpy (phase, phase_wo_colon, SIZE_PHASE);
-  strcat (phase, ":");
-
-  if (!line_p)
-    {
-      trace_printf (sd, cpu, "%-*s %s:%-*d 0x%.*lx ",
-                   SIZE_PHASE+1, phase,
-                   filename,
-                   SIZE_LINE_NUMBER, linenum,
-                   SIZE_PC, (long)pc);
-      va_start (ap, fmt);
-      trace_vprintf (sd, cpu, fmt, ap);
-      va_end (ap);
-      trace_printf (sd, cpu, "\n");
-    }
-  else
-    {
-      char buf[256];
-
-      buf[0] = 0;
-      if (STATE_TEXT_SECTION (CPU_STATE (cpu))
-         && pc >= STATE_TEXT_START (CPU_STATE (cpu))
-         && pc < STATE_TEXT_END (CPU_STATE (cpu)))
-       {
-         const char *pc_filename = (const char *)0;
-         const char *pc_function = (const char *)0;
-         unsigned int pc_linenum = 0;
-
-         if (bfd_find_nearest_line (STATE_PROG_BFD (CPU_STATE (cpu)),
-                                    STATE_TEXT_SECTION (CPU_STATE (cpu)),
-                                    (struct bfd_symbol **) 0,
-                                    pc - STATE_TEXT_START (CPU_STATE (cpu)),
-                                    &pc_filename, &pc_function, &pc_linenum))
-           {
-             char *p = buf;
-             if (pc_linenum)
-               {
-                 sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, pc_linenum);
-                 p += strlen (p);
-               }
-             else
-               {
-                 sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
-                 p += SIZE_LINE_NUMBER+2;
-               }
-
-             if (pc_function)
-               {
-                 sprintf (p, "%s ", pc_function);
-                 p += strlen (p);
-               }
-             else if (pc_filename)
-               {
-                 char *q = (char *) strrchr (pc_filename, '/');
-                 sprintf (p, "%s ", (q) ? q+1 : pc_filename);
-                 p += strlen (p);
-               }
-
-             if (*p == ' ')
-               *p = '\0';
-           }
-       }
-
-      trace_printf (sd, cpu, "%-*s 0x%.*x %-*.*s ",
-                   SIZE_PHASE+1, phase,
-                   SIZE_PC, (unsigned) pc,
-                   SIZE_LOCATION, SIZE_LOCATION, buf);
-      va_start (ap, fmt);
-      trace_vprintf (sd, cpu, fmt, ap);
-      va_end (ap);
-      trace_printf (sd, cpu, "\n");
-    }
-}
-
 void
-trace_printf VPARAMS ((SIM_DESC sd, sim_cpu *cpu, const char *fmt, ...))
+trace_printf (SIM_DESC sd, sim_cpu *cpu, const char *fmt, ...)
 {
-#if !defined __STDC__ && !defined ALMOST_STDC
-  SIM_DESC sd;
-  sim_cpu *cpu;
-  const char *fmt;
-#endif
   va_list ap;
 
-  VA_START (ap, fmt);
-#if !defined __STDC__ && !defined ALMOST_STDC
-  sd = va_arg (ap, SIM_DESC);
-  cpu = va_arg (ap, sim_cpu *);
-  fmt = va_arg (ap, const char *);
-#endif
+  va_start (ap, fmt);
 
   trace_vprintf (sd, cpu, fmt, ap);
 
@@ -1334,19 +1231,11 @@ trace_printf VPARAMS ((SIM_DESC sd, sim_cpu *cpu, const char *fmt, ...))
 }
 
 void
-debug_printf VPARAMS ((sim_cpu *cpu, const char *fmt, ...))
+sim_debug_printf (sim_cpu *cpu, const char *fmt, ...)
 {
-#if !defined __STDC__ && !defined ALMOST_STDC
-  sim_cpu *cpu;
-  const char *fmt;
-#endif
   va_list ap;
 
-  VA_START (ap, fmt);
-#if !defined __STDC__ && !defined ALMOST_STDC
-  cpu = va_arg (ap, sim_cpu *);
-  fmt = va_arg (ap, const char *);
-#endif
+  va_start (ap, fmt);
 
   if (CPU_DEBUG_FILE (cpu) == NULL)
     (* STATE_CALLBACK (CPU_STATE (cpu))->evprintf_filtered)