+#include "sys/syscall.h"
+#include "bfd.h"
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+
+enum op_types {
+ OP_UNKNOWN,
+ OP_NONE,
+ OP_TRAP,
+ OP_REG,
+ OP_REG_REG,
+ OP_REG_REG_CMP,
+ OP_REG_REG_MOVE,
+ OP_IMM_REG,
+ OP_IMM_REG_CMP,
+ OP_IMM_REG_MOVE,
+ OP_COND_BR,
+ OP_LOAD16,
+ OP_STORE16,
+ OP_LOAD32,
+ OP_STORE32,
+ OP_JUMP,
+ OP_IMM_REG_REG,
+ OP_UIMM_REG_REG,
+ OP_BIT,
+ OP_EX1,
+ OP_EX2,
+ OP_LDSR,
+ OP_STSR
+};
+
+#ifdef DEBUG
+static void trace_input PARAMS ((char *name, enum op_types type, int size));
+static void trace_output PARAMS ((enum op_types result));
+static int init_text_p = 0;
+static asection *text;
+static bfd_vma text_start;
+static bfd_vma text_end;
+extern bfd *exec_bfd;
+
+#ifndef SIZE_INSTRUCTION
+#define SIZE_INSTRUCTION 6
+#endif
+
+#ifndef SIZE_OPERANDS
+#define SIZE_OPERANDS 16
+#endif
+
+#ifndef SIZE_VALUES
+#define SIZE_VALUES 11
+#endif
+
+#ifndef SIZE_LOCATION
+#define SIZE_LOCATION 40
+#endif
+
+static void
+trace_input (name, type, size)
+ char *name;
+ enum op_types type;
+ int size;
+{
+ char buf[1024];
+ char *p;
+ uint32 values[3];
+ int num_values, i;
+ char *cond;
+ asection *s;
+ const char *filename;
+ const char *functionname;
+ unsigned int linenumber;
+
+ if ((v850_debug & DEBUG_TRACE) == 0)
+ return;
+
+ buf[0] = '\0';
+ if (!init_text_p)
+ {
+ init_text_p = 1;
+ for (s = exec_bfd->sections; s; s = s->next)
+ if (strcmp (bfd_get_section_name (exec_bfd, s), ".text") == 0)
+ {
+ text = s;
+ text_start = bfd_get_section_vma (exec_bfd, s);
+ text_end = text_start + bfd_section_size (exec_bfd, s);
+ break;
+ }
+ }
+
+ if (text && PC >= text_start && PC < text_end)
+ {
+ filename = (const char *)0;
+ functionname = (const char *)0;
+ linenumber = 0;
+ if (bfd_find_nearest_line (exec_bfd, text, (struct symbol_cache_entry **)0, PC - text_start,
+ &filename, &functionname, &linenumber))
+ {
+ p = buf;
+ if (linenumber)
+ {
+ sprintf (p, "Line %5d ", linenumber);
+ p += strlen (p);
+ }
+
+ if (functionname)
+ {
+ sprintf (p, "Func %s ", functionname);
+ p += strlen (p);
+ }
+ else if (filename)
+ {
+ char *q = (char *) strrchr (filename, '/');
+ sprintf (p, "File %s ", (q) ? q+1 : filename);
+ p += strlen (p);
+ }
+
+ if (*p == ' ')
+ *p = '\0';
+ }
+ }
+
+ (*v850_callback->printf_filtered) (v850_callback, "0x%.8x: %-*.*s %-*s",
+ (unsigned)PC,
+ SIZE_LOCATION, SIZE_LOCATION, buf,
+ SIZE_INSTRUCTION, name);
+
+ switch (type)
+ {
+ default:
+ case OP_UNKNOWN:
+ case OP_NONE:
+ strcpy (buf, "unknown");
+ break;
+
+ case OP_TRAP:
+ sprintf (buf, "%d", OP[0]);
+ break;
+
+ case OP_REG:
+ sprintf (buf, "r%d", OP[0]);
+ break;
+
+ case OP_REG_REG:
+ case OP_REG_REG_CMP:
+ case OP_REG_REG_MOVE:
+ sprintf (buf, "r%d,r%d", OP[0], OP[1]);
+ break;
+
+ case OP_IMM_REG:
+ case OP_IMM_REG_CMP:
+ case OP_IMM_REG_MOVE:
+ sprintf (buf, "%d,r%d", OP[0], OP[1]);
+ break;
+
+ case OP_COND_BR:
+ sprintf (buf, "%d", SEXT9 (OP[0]));
+ break;
+
+ case OP_LOAD16:
+ sprintf (buf, "%d[r30],r%d", OP[1] * size, OP[0]);
+ break;
+
+ case OP_STORE16:
+ sprintf (buf, "r%d,%d[r30]", OP[0], OP[1] * size);
+ break;
+
+ case OP_LOAD32:
+ sprintf (buf, "%d[r%d],r%d", SEXT16 (OP[2]) & ~0x1, OP[0], OP[1]);
+ break;
+
+ case OP_STORE32:
+ sprintf (buf, "r%d,%d[r%d]", OP[1], SEXT16 (OP[2] & ~0x1), OP[0]);
+ break;
+
+ case OP_JUMP:
+ sprintf (buf, "%d,r%d", SEXT22 (OP[0]), OP[1]);
+ break;
+
+ case OP_IMM_REG_REG:
+ sprintf (buf, "%d,r%d,r%d", SEXT16 (OP[0]), OP[1], OP[2]);
+ break;
+
+ case OP_UIMM_REG_REG:
+ sprintf (buf, "%d,r%d,r%d", OP[0] & 0xffff, OP[1], OP[2]);
+ break;
+
+ case OP_BIT:
+ sprintf (buf, "%d,%d[r%d]", OP[1] & 0x7, SEXT16 (OP[2]), OP[0]);
+ break;
+
+ case OP_EX1:
+ switch (OP[0] & 0xf)
+ {
+ default: cond = "?"; break;
+ case 0x0: cond = "v"; break;
+ case 0x1: cond = "c"; break;
+ case 0x2: cond = "z"; break;
+ case 0x3: cond = "nh"; break;
+ case 0x4: cond = "s"; break;
+ case 0x5: cond = "t"; break;
+ case 0x6: cond = "lt"; break;
+ case 0x7: cond = "le"; break;
+ case 0x8: cond = "nv"; break;
+ case 0x9: cond = "nc"; break;
+ case 0xa: cond = "nz"; break;
+ case 0xb: cond = "h"; break;
+ case 0xc: cond = "ns"; break;
+ case 0xd: cond = "sa"; break;
+ case 0xe: cond = "ge"; break;
+ case 0xf: cond = "gt"; break;
+ }
+
+ sprintf (buf, "%s,r%d", cond, OP[1]);
+ break;
+
+ case OP_EX2:
+ strcpy (buf, "EX2");
+ break;
+
+ case OP_LDSR:
+ case OP_STSR:
+ sprintf (buf, "r%d,s%d", OP[0], OP[1]);
+ break;
+ }