gcc uses trap 33 for profiling, but the simulator didn't support it.
authorJoern Rennecke <joern.rennecke@embecosm.com>
Fri, 11 Oct 2002 15:31:28 +0000 (15:31 +0000)
committerJoern Rennecke <joern.rennecke@embecosm.com>
Fri, 11 Oct 2002 15:31:28 +0000 (15:31 +0000)
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.

sim/sh/ChangeLog
sim/sh/gencode.c
sim/sh/interp.c

index ec587595082e10490cd4c0139d6c2d09dd5d5bd3..60b41f7c55253049bcb5f694b21865f3488e2a73 100644 (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>
 
        * Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h.
index ba6ee4c1bc6ae1e8914db0235d4b7a82e229cf0e..8e2445a7e11409a5fe2b9e88ec7dab32d264521d 100644 (file)
@@ -577,7 +577,7 @@ op tab[] =
   },
 
   { "", "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 */",
   },
 
@@ -951,8 +951,7 @@ op tab[] =
   },
 
   { "", "", "sleep", "0000000000011011",
-    "nip = PC;",
-    "trap (0xc3, R0, memory, maskl, maskw, endianw);",
+    "nip += trap (0xc3, R0, PC, memory, maskl, maskw, endianw);",
   },
 
   { "n", "", "stc <CREG_M>,<REG_N>", "0000nnnnmmmm0010",
@@ -1029,37 +1028,25 @@ op tab[] =
   },
 
   { "0", "", "trapa #<imm>", "11000011i8*1....", 
-#if 0
-    /* SH-[12] */
     "long imm = 0xff & i;",
-    "if (i==0xc3)",
-    "  PC-=2;",
-    "if (i<20||i==34||i==0xc3)",
-    "  trap(i,R,memory,maskl,maskw,endianw);",
+    "if (i < 20 || i == 33 || i == 34 || i == 0xc3)",
+    "  nip += trap (i, R, PC, memory, maskl, maskw,endianw);",
+#if 0
     "else {",
+    /* SH-[12] */
     "  R[15]-=4;",
-    "  WLAT(R[15],GET_SR());",
+    "  WLAT (R[15], GET_SR());",
     "  R[15]-=4;",
-    "  WLAT(R[15],PC+2);",
-    "  PC=RLAT(VBR+(imm<<2))-2;",
-    "}",
+    "  WLAT (R[15], PH2T (PC + 2));",
 #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) {",
-    "  /* FIXME: TRA = (imm << 2); */",
     "  SSR = GET_SR();",
     "  SPC = PH2T (PC + 2);",
     "  SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);",
     "  /* FIXME: EXPEVT = 0x00000160; */",
-    "  SET_NIP (PT2H (VBR + 0x00000100));",
-    "}",
 #endif
+    "  SET_NIP (PT2H (RLAT (VBR + (imm<<2))));",
+    "}",
   },
 
   { "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000",
index 2f5d1d37d596556cd902cd8116686562e8815d3a..8c2f3598a5d5f949a5fdb9c25a7c7c079923d192 100644 (file)
@@ -954,12 +954,14 @@ strnswap (str, len)
   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
-trap (i, regs, memory, maskl, maskw, endianw)
+static int
+trap (i, regs, insn_ptr, memory, maskl, maskw, endianw)
      int i;
      int *regs;
+     unsigned char *insn_ptr;
      unsigned char *memory;
 {
   switch (i)
@@ -971,6 +973,13 @@ trap (i, regs, memory, maskl, maskw, endianw)
       raise_exception (SIGQUIT);
       break;
     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:
       {
        extern int errno;
@@ -1154,9 +1163,11 @@ trap (i, regs, memory, maskl, maskw, endianw)
     case 0xc3:
     case 255:
       raise_exception (SIGTRAP);
+      if (i == 0xc3)
+       return -2;
       break;
     }
-
+  return 0;
 }
 
 void