gcc uses trap 33 for profiling, but the simulator didn't support it.

This patch fixes the gcc.dg/nest.c failures for sh-elf.

Fri Oct 11 16:22:28 2002  J"orn Rennecke <joern.rennecke@superh.com>

	* interp.c (trap): Return int.  Take extra parameter for address
	of the trap instruction.  Changed all callers.
	Add case 33 for profiling.
	* gencode.c (trapa): Handle trap 33 using the trap function.
	Add read of vector for generic traps.
This commit is contained in:
Joern Rennecke 2002-10-11 15:31:28 +00:00
parent 6c381eeb71
commit fd8f4948fe
3 changed files with 33 additions and 27 deletions

View file

@ -1,3 +1,11 @@
Fri Oct 11 16:22:28 2002 J"orn Rennecke <joern.rennecke@superh.com>
* interp.c (trap): Return int. Take extra parameter for address
of the trap instruction. Changed all callers.
Add case 33 for profiling.
* gencode.c (trapa): Handle trap 33 using the trap function.
Add read of vector for generic traps.
Wed Jul 17 19:36:38 2002 J"orn Rennecke <joern.rennecke@superh.com> Wed Jul 17 19:36:38 2002 J"orn Rennecke <joern.rennecke@superh.com>
* Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h. * Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h.

View file

@ -577,7 +577,7 @@ op tab[] =
}, },
{ "", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111", { "", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
"trap (255,R0,memory,maskl,maskw, endianw);", "trap (255, R0, PC, memory, maskl, maskw, endianw);",
"/* FIXME: mac.l support */", "/* FIXME: mac.l support */",
}, },
@ -951,8 +951,7 @@ op tab[] =
}, },
{ "", "", "sleep", "0000000000011011", { "", "", "sleep", "0000000000011011",
"nip = PC;", "nip += trap (0xc3, R0, PC, memory, maskl, maskw, endianw);",
"trap (0xc3, R0, memory, maskl, maskw, endianw);",
}, },
{ "n", "", "stc <CREG_M>,<REG_N>", "0000nnnnmmmm0010", { "n", "", "stc <CREG_M>,<REG_N>", "0000nnnnmmmm0010",
@ -1029,37 +1028,25 @@ op tab[] =
}, },
{ "0", "", "trapa #<imm>", "11000011i8*1....", { "0", "", "trapa #<imm>", "11000011i8*1....",
#if 0
/* SH-[12] */
"long imm = 0xff & i;", "long imm = 0xff & i;",
"if (i==0xc3)", "if (i < 20 || i == 33 || i == 34 || i == 0xc3)",
" PC-=2;", " nip += trap (i, R, PC, memory, maskl, maskw,endianw);",
"if (i<20||i==34||i==0xc3)", #if 0
" trap(i,R,memory,maskl,maskw,endianw);",
"else {", "else {",
/* SH-[12] */
" R[15]-=4;", " R[15]-=4;",
" WLAT(R[15],GET_SR());", " WLAT (R[15], GET_SR());",
" R[15]-=4;", " R[15]-=4;",
" WLAT(R[15],PC+2);", " WLAT (R[15], PH2T (PC + 2));",
" PC=RLAT(VBR+(imm<<2))-2;",
"}",
#else #else
"if (i == 0xc3)",
" {",
" nip = PC;",
" trap (i, R, memory, maskl, maskw,endianw);",
" }",
"else if (i < 20 || i==34 || i==0xc3)",
" trap (i, R, memory, maskl, maskw,endianw);",
"else if (!SR_BL) {", "else if (!SR_BL) {",
" /* FIXME: TRA = (imm << 2); */",
" SSR = GET_SR();", " SSR = GET_SR();",
" SPC = PH2T (PC + 2);", " SPC = PH2T (PC + 2);",
" SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);", " SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);",
" /* FIXME: EXPEVT = 0x00000160; */", " /* FIXME: EXPEVT = 0x00000160; */",
" SET_NIP (PT2H (VBR + 0x00000100));",
"}",
#endif #endif
" SET_NIP (PT2H (RLAT (VBR + (imm<<2))));",
"}",
}, },
{ "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000", { "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000",

View file

@ -954,12 +954,14 @@ strnswap (str, len)
while (start < end); while (start < end);
} }
/* Simulate a monitor trap, put the result into r0 and errno into r1 */ /* Simulate a monitor trap, put the result into r0 and errno into r1
return offset by which to adjust pc. */
static void static int
trap (i, regs, memory, maskl, maskw, endianw) trap (i, regs, insn_ptr, memory, maskl, maskw, endianw)
int i; int i;
int *regs; int *regs;
unsigned char *insn_ptr;
unsigned char *memory; unsigned char *memory;
{ {
switch (i) switch (i)
@ -971,6 +973,13 @@ trap (i, regs, memory, maskl, maskw, endianw)
raise_exception (SIGQUIT); raise_exception (SIGQUIT);
break; break;
case 3: /* FIXME: for backwards compat, should be removed */ case 3: /* FIXME: for backwards compat, should be removed */
case 33:
{
unsigned int countp = * (unsigned int *) (insn_ptr + 4);
WLAT (countp, RLAT (countp) + 1);
return 6;
}
case 34: case 34:
{ {
extern int errno; extern int errno;
@ -1154,9 +1163,11 @@ trap (i, regs, memory, maskl, maskw, endianw)
case 0xc3: case 0xc3:
case 255: case 255:
raise_exception (SIGTRAP); raise_exception (SIGTRAP);
if (i == 0xc3)
return -2;
break; break;
} }
return 0;
} }
void void