mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 16:05:56 +08:00
Use trace_one_insn in trace functions. Buffer up trace data so that
it is displayed in a single block.
This commit is contained in:
@ -1,3 +1,12 @@
|
|||||||
|
Tue Sep 16 15:14:01 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* simops.c (trace_pc, trace_name, trace_values, trace_num_values):
|
||||||
|
New static globals.
|
||||||
|
(trace_input): Just save pc, name and values for trace_output.
|
||||||
|
(trace_output): Write trace values to a buffer. Use
|
||||||
|
trace_one_insn to print trace info and buffer.
|
||||||
|
(SIZE_OPERANDS, SIZE_LOCATION): Delete.
|
||||||
|
|
||||||
Tue Sep 16 09:02:00 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
Tue Sep 16 09:02:00 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* sim-main.h (struct _sim_cpu): Add psw_mask so that reserved bits
|
* sim-main.h (struct _sim_cpu): Add psw_mask so that reserved bits
|
||||||
|
@ -108,7 +108,7 @@ clean-igen:
|
|||||||
../igen/igen:
|
../igen/igen:
|
||||||
cd ../igen && $(MAKE)
|
cd ../igen && $(MAKE)
|
||||||
|
|
||||||
IGEN_TRACE= # -G trace-rule-selection -G trace-rule-rejection -G trace-entries
|
IGEN_TRACE= -G omit-line-numbers # -G trace-rule-selection -G trace-rule-rejection -G trace-entries
|
||||||
IGEN_INSN=$(srcdir)/v850.igen
|
IGEN_INSN=$(srcdir)/v850.igen
|
||||||
IGEN_DC=$(srcdir)/v850-dc
|
IGEN_DC=$(srcdir)/v850-dc
|
||||||
tmp-igen: $(IGEN_INSN) $(IGEN_DC) ../igen/igen
|
tmp-igen: $(IGEN_INSN) $(IGEN_DC) ../igen/igen
|
||||||
|
@ -56,20 +56,18 @@ int type3_regs[15] = { 2, 1, 0, 27, 26, 25, 24, 31, 30, 29, 28, 23, 22, 20, 21};
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#ifndef SIZE_INSTRUCTION
|
#ifndef SIZE_INSTRUCTION
|
||||||
#define SIZE_INSTRUCTION 6
|
#define SIZE_INSTRUCTION 18
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SIZE_OPERANDS
|
|
||||||
#define SIZE_OPERANDS 16
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SIZE_VALUES
|
#ifndef SIZE_VALUES
|
||||||
#define SIZE_VALUES 11
|
#define SIZE_VALUES 11
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SIZE_LOCATION
|
|
||||||
#define SIZE_LOCATION 40
|
static unsigned32 trace_values[3];
|
||||||
#endif
|
static int trace_num_values;
|
||||||
|
static unsigned32 trace_pc;
|
||||||
|
static char *trace_name;
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -78,61 +76,12 @@ trace_input (name, type, size)
|
|||||||
enum op_types type;
|
enum op_types type;
|
||||||
int size;
|
int size;
|
||||||
{
|
{
|
||||||
char buf[1024];
|
|
||||||
char *p;
|
|
||||||
uint32 values[3];
|
|
||||||
int num_values, i;
|
|
||||||
const char *filename;
|
|
||||||
const char *functionname;
|
|
||||||
unsigned int linenumber;
|
|
||||||
|
|
||||||
if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
|
if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buf[0] = '\0';
|
trace_pc = PC;
|
||||||
|
trace_name = name;
|
||||||
if (STATE_TEXT_SECTION (simulator)
|
|
||||||
&& PC >= STATE_TEXT_START (simulator)
|
|
||||||
&& PC < STATE_TEXT_END (simulator))
|
|
||||||
{
|
|
||||||
filename = (const char *)0;
|
|
||||||
functionname = (const char *)0;
|
|
||||||
linenumber = 0;
|
|
||||||
if (bfd_find_nearest_line (STATE_PROG_BFD (simulator),
|
|
||||||
STATE_TEXT_SECTION (simulator),
|
|
||||||
(struct symbol_cache_entry **)0,
|
|
||||||
PC - STATE_TEXT_START (simulator),
|
|
||||||
&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';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
"0x%.8x: %-*.*s %-*s",
|
|
||||||
(unsigned)PC,
|
|
||||||
SIZE_LOCATION, SIZE_LOCATION, buf,
|
|
||||||
SIZE_INSTRUCTION, name);
|
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@ -140,13 +89,13 @@ trace_input (name, type, size)
|
|||||||
case OP_UNKNOWN:
|
case OP_UNKNOWN:
|
||||||
case OP_NONE:
|
case OP_NONE:
|
||||||
case OP_TRAP:
|
case OP_TRAP:
|
||||||
num_values = 0;
|
trace_num_values = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_REG:
|
case OP_REG:
|
||||||
case OP_REG_REG_MOVE:
|
case OP_REG_REG_MOVE:
|
||||||
values[0] = State.regs[OP[0]];
|
trace_values[0] = State.regs[OP[0]];
|
||||||
num_values = 1;
|
trace_num_values = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* start-sanitize-v850e */
|
/* start-sanitize-v850e */
|
||||||
@ -154,167 +103,178 @@ trace_input (name, type, size)
|
|||||||
/* end-sanitize-v850e */
|
/* end-sanitize-v850e */
|
||||||
case OP_REG_REG:
|
case OP_REG_REG:
|
||||||
case OP_REG_REG_CMP:
|
case OP_REG_REG_CMP:
|
||||||
values[0] = State.regs[OP[1]];
|
trace_values[0] = State.regs[OP[1]];
|
||||||
values[1] = State.regs[OP[0]];
|
trace_values[1] = State.regs[OP[0]];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_IMM_REG:
|
case OP_IMM_REG:
|
||||||
case OP_IMM_REG_CMP:
|
case OP_IMM_REG_CMP:
|
||||||
values[0] = SEXT5 (OP[0]);
|
trace_values[0] = SEXT5 (OP[0]);
|
||||||
values[1] = OP[1];
|
trace_values[1] = OP[1];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_IMM_REG_MOVE:
|
case OP_IMM_REG_MOVE:
|
||||||
values[0] = SEXT5 (OP[0]);
|
trace_values[0] = SEXT5 (OP[0]);
|
||||||
num_values = 1;
|
trace_num_values = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_COND_BR:
|
case OP_COND_BR:
|
||||||
values[0] = State.pc;
|
trace_values[0] = State.pc;
|
||||||
values[1] = SEXT9 (OP[0]);
|
trace_values[1] = SEXT9 (OP[0]);
|
||||||
values[2] = PSW;
|
trace_values[2] = PSW;
|
||||||
num_values = 3;
|
trace_num_values = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_LOAD16:
|
case OP_LOAD16:
|
||||||
values[0] = OP[1] * size;
|
trace_values[0] = OP[1] * size;
|
||||||
values[1] = State.regs[30];
|
trace_values[1] = State.regs[30];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_STORE16:
|
case OP_STORE16:
|
||||||
values[0] = State.regs[OP[0]];
|
trace_values[0] = State.regs[OP[0]];
|
||||||
values[1] = OP[1] * size;
|
trace_values[1] = OP[1] * size;
|
||||||
values[2] = State.regs[30];
|
trace_values[2] = State.regs[30];
|
||||||
num_values = 3;
|
trace_num_values = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_LOAD32:
|
case OP_LOAD32:
|
||||||
values[0] = EXTEND16 (OP[2]);
|
trace_values[0] = EXTEND16 (OP[2]);
|
||||||
values[1] = State.regs[OP[0]];
|
trace_values[1] = State.regs[OP[0]];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_STORE32:
|
case OP_STORE32:
|
||||||
values[0] = State.regs[OP[1]];
|
trace_values[0] = State.regs[OP[1]];
|
||||||
values[1] = EXTEND16 (OP[2]);
|
trace_values[1] = EXTEND16 (OP[2]);
|
||||||
values[2] = State.regs[OP[0]];
|
trace_values[2] = State.regs[OP[0]];
|
||||||
num_values = 3;
|
trace_num_values = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_JUMP:
|
case OP_JUMP:
|
||||||
values[0] = SEXT22 (OP[0]);
|
trace_values[0] = SEXT22 (OP[0]);
|
||||||
values[1] = State.pc;
|
trace_values[1] = State.pc;
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_IMM_REG_REG:
|
case OP_IMM_REG_REG:
|
||||||
values[0] = EXTEND16 (OP[0]) << size;
|
trace_values[0] = EXTEND16 (OP[0]) << size;
|
||||||
values[1] = State.regs[OP[1]];
|
trace_values[1] = State.regs[OP[1]];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_UIMM_REG_REG:
|
case OP_UIMM_REG_REG:
|
||||||
values[0] = (OP[0] & 0xffff) << size;
|
trace_values[0] = (OP[0] & 0xffff) << size;
|
||||||
values[1] = State.regs[OP[1]];
|
trace_values[1] = State.regs[OP[1]];
|
||||||
num_values = 2;
|
trace_num_values = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_BIT:
|
case OP_BIT:
|
||||||
num_values = 0;
|
trace_num_values = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_EX1:
|
case OP_EX1:
|
||||||
values[0] = PSW;
|
trace_values[0] = PSW;
|
||||||
num_values = 1;
|
trace_num_values = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_EX2:
|
case OP_EX2:
|
||||||
num_values = 0;
|
trace_num_values = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_LDSR:
|
case OP_LDSR:
|
||||||
values[0] = State.regs[OP[0]];
|
trace_values[0] = State.regs[OP[0]];
|
||||||
num_values = 1;
|
trace_num_values = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_STSR:
|
case OP_STSR:
|
||||||
values[0] = State.sregs[OP[1]];
|
trace_values[0] = State.sregs[OP[1]];
|
||||||
num_values = 1;
|
trace_num_values = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_values; i++)
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
"%*s0x%.8lx", SIZE_VALUES - 10, "", values[i]);
|
|
||||||
|
|
||||||
while (i++ < 3)
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
"%*s", SIZE_VALUES, "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
trace_output (result)
|
trace_output (result)
|
||||||
enum op_types result;
|
enum op_types result;
|
||||||
{
|
{
|
||||||
if (TRACE_ALU_P (STATE_CPU (simulator, 0)))
|
char buf[1000];
|
||||||
|
char *chp;
|
||||||
|
|
||||||
|
if (!TRACE_ALU_P (STATE_CPU (simulator, 0)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
buf[0] = '\0';
|
||||||
|
chp = buf;
|
||||||
|
|
||||||
|
/* write out the values saved during the trace_input call */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < trace_num_values; i++)
|
||||||
|
{
|
||||||
|
sprintf (chp, "%*s0x%.8lx", SIZE_VALUES - 10, "", trace_values[i]);
|
||||||
|
chp = strchr (chp, '\0');
|
||||||
|
}
|
||||||
|
while (i++ < 3)
|
||||||
|
{
|
||||||
|
sprintf (chp, "%*s", SIZE_VALUES, "");
|
||||||
|
chp = strchr (chp, '\0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (result)
|
||||||
{
|
{
|
||||||
switch (result)
|
default:
|
||||||
{
|
case OP_UNKNOWN:
|
||||||
default:
|
case OP_NONE:
|
||||||
case OP_UNKNOWN:
|
case OP_TRAP:
|
||||||
case OP_NONE:
|
case OP_REG:
|
||||||
case OP_TRAP:
|
case OP_REG_REG_CMP:
|
||||||
case OP_REG:
|
case OP_IMM_REG_CMP:
|
||||||
case OP_REG_REG_CMP:
|
case OP_COND_BR:
|
||||||
case OP_IMM_REG_CMP:
|
case OP_STORE16:
|
||||||
case OP_COND_BR:
|
case OP_STORE32:
|
||||||
case OP_STORE16:
|
case OP_BIT:
|
||||||
case OP_STORE32:
|
case OP_EX2:
|
||||||
case OP_BIT:
|
break;
|
||||||
case OP_EX2:
|
|
||||||
break;
|
case OP_LOAD16:
|
||||||
|
case OP_STSR:
|
||||||
case OP_LOAD16:
|
sprintf (chp, " :: 0x%.8lx", (unsigned long)State.regs[OP[0]]);
|
||||||
case OP_STSR:
|
break;
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
" :: 0x%.8lx", (unsigned long)State.regs[OP[0]]);
|
case OP_REG_REG:
|
||||||
break;
|
case OP_REG_REG_MOVE:
|
||||||
|
case OP_IMM_REG:
|
||||||
case OP_REG_REG:
|
case OP_IMM_REG_MOVE:
|
||||||
case OP_REG_REG_MOVE:
|
case OP_LOAD32:
|
||||||
case OP_IMM_REG:
|
case OP_EX1:
|
||||||
case OP_IMM_REG_MOVE:
|
sprintf (chp, " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
|
||||||
case OP_LOAD32:
|
break;
|
||||||
case OP_EX1:
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
case OP_IMM_REG_REG:
|
||||||
" :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
|
case OP_UIMM_REG_REG:
|
||||||
break;
|
sprintf (chp, " :: 0x%.8lx", (unsigned long)State.regs[OP[2]]);
|
||||||
|
break;
|
||||||
case OP_IMM_REG_REG:
|
|
||||||
case OP_UIMM_REG_REG:
|
case OP_JUMP:
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
if (OP[1] != 0)
|
||||||
" :: 0x%.8lx", (unsigned long)State.regs[OP[2]]);
|
sprintf (chp, " :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_JUMP:
|
case OP_LDSR:
|
||||||
if (OP[1] != 0)
|
sprintf (chp, " :: 0x%.8lx", (unsigned long)State.sregs[OP[1]]);
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
break;
|
||||||
" :: 0x%.8lx", (unsigned long)State.regs[OP[1]]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OP_LDSR:
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
" :: 0x%.8lx", (unsigned long)State.sregs[OP[1]]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_printf (simulator, STATE_CPU (simulator, 0),
|
|
||||||
"\n");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
trace_one_insn (simulator, STATE_CPU (simulator, 0), trace_pc,
|
||||||
|
TRACE_LINENUM_P (STATE_CPU (simulator, 0)),
|
||||||
|
"simops", __LINE__, "alu",
|
||||||
|
"%-*s -%s", SIZE_INSTRUCTION, trace_name, buf);
|
||||||
|
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user