codegen: register dump at runtime
authorBernhard Urban <lewurm@gmail.com>
Fri, 17 Aug 2012 17:21:45 +0000 (19:21 +0200)
committerBernhard Urban <lewurm@gmail.com>
Fri, 17 Aug 2012 13:47:04 +0000 (15:47 +0200)
just a debugging aid

Mate/X86CodeGen.hs
Mate/X86TrapHandling.hs
ffi/trap.c

index 448c966e19d5f41e51003e39685ac0a21f7e2601..f1f9969da9237e802697d7890eeffa923993d577 100644 (file)
@@ -91,6 +91,13 @@ emitFromBB cls method = do
     -- TODO(bernhard): implement `emit' as function which accepts a list of
     --                 instructions, so we can use patterns for optimizations
     where
+    forceRegDump :: CodeGen e s ()
+    forceRegDump = do
+      push esi
+      mov esi (0x13371234 :: Word32)
+      mov esi (Addr 0)
+      pop esi
+
     getCurrentOffset :: CodeGen e s Word32
     getCurrentOffset = do
       ep <- getEntryPoint
@@ -183,6 +190,7 @@ emitFromBB cls method = do
       sete al
       movzxb eax al
       push eax
+      forceRegDump
       return $ Just (trapaddr, InstanceOf $ buildClassID cls cpidx)
     emit' insn = emit insn >> return Nothing
 
index ad7e043ec6d70ed047e2089343c9c206bdf78b22..325f7928c44eb82401d32a44b957ad9a416336ea 100644 (file)
@@ -26,6 +26,7 @@ data TrapType =
   | VirtualMethodCall Bool
   | InterfaceMethodCall Bool
   | InstanceOfMiss B.ByteString
+  | NoKnownTrap String
 
 getTrapType :: TrapMap -> CPtrdiff -> CPtrdiff -> TrapType
 getTrapType tmap signal_from from2 =
@@ -33,17 +34,17 @@ getTrapType tmap signal_from from2 =
     (Just (StaticMethod _)) -> StaticMethodCall
     (Just (StaticField _)) -> StaticFieldAccess
     (Just (InstanceOf cn)) -> InstanceOfMiss cn
-    (Just _) -> error "getTrapMap: doesn't happen"
+    (Just _) -> NoKnownTrap "getTrapMap: doesn't happen"
     -- maybe we've a hit on the second `from' value
     Nothing -> case M.lookup (fromIntegral from2) tmap of
       (Just (VirtualMethod imm8 _)) -> VirtualMethodCall imm8
       (Just (InterfaceMethod imm8 _)) -> InterfaceMethodCall imm8
-      (Just _) -> error "getTrapType: abort #1 :-("
-      Nothing -> error $ "getTrapType: abort #2 :-(" ++ show signal_from ++ ", " ++ show from2 ++ ", " ++ show tmap
+      (Just _) -> NoKnownTrap "getTrapType: abort #1 :-("
+      Nothing -> NoKnownTrap $ "getTrapType: abort #2 :-(" ++ show signal_from ++ ", " ++ show from2 ++ ", " ++ show tmap
 
-foreign export ccall mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
-mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
-mateHandler eip eax ebx esp = do
+foreign export ccall mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
+mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
+mateHandler eip eax ebx esp esi = do
   callerAddr <- callerAddrFromStack esp
   tmap <- getTrapMap
   case getTrapType tmap eip callerAddr of
@@ -52,6 +53,10 @@ mateHandler eip eax ebx esp = do
     (InstanceOfMiss cn) -> instanceOfMissHandler eip cn
     VirtualMethodCall imm8   -> invokeHandler eax eax esp imm8
     InterfaceMethodCall imm8 -> invokeHandler eax ebx esp imm8
+    NoKnownTrap err ->
+      case esi of
+        0x13371234 -> return (-1)
+        _ -> error err
 
 staticCallHandler :: CPtrdiff -> IO CPtrdiff
 staticCallHandler eip = do
index 301f2060ce47f5252bb4d2dfd73112efa069d9a7..75d4c1729081a95d8ce857084d153b9eae472763 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <sys/ucontext.h>
 
-ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t);
+ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t);
 
 #ifdef DBG_TRAP
 #define dprintf(args...) do { printf (args); } while (0);
@@ -33,16 +33,28 @@ ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t);
 void chandler(int nSignal, siginfo_t *info, void *ctx)
 {
        mcontext_t *mctx = &((ucontext_t *) ctx)->uc_mcontext;
+       greg_t *regs = mctx->gregs;
 
-       ptrdiff_t eip = (ptrdiff_t) mctx->gregs[REG_EIP];
-       ptrdiff_t eax = (ptrdiff_t) mctx->gregs[REG_EAX];
-       ptrdiff_t ebx = (ptrdiff_t) mctx->gregs[REG_EBX];
-       ptrdiff_t esp = (ptrdiff_t) mctx->gregs[REG_ESP];
+       ptrdiff_t eip = (ptrdiff_t) regs[REG_EIP];
+       ptrdiff_t eax = (ptrdiff_t) regs[REG_EAX];
+       ptrdiff_t ebx = (ptrdiff_t) regs[REG_EBX];
+       ptrdiff_t esp = (ptrdiff_t) regs[REG_ESP];
+       ptrdiff_t esi = (ptrdiff_t) regs[REG_ESI];
        dprintf("trap: type %d, eip 0x%08x, eax 0x%08x, ebx 0x%08x, "
                        "esp 0x%08x, *esp 0x%08x\n", nSignal, eip,
                        eax, ebx, esp, *(ptrdiff_t*) esp);
 
-       mctx->gregs[REG_EIP] = mateHandler(eip, eax, ebx, esp);
+       ptrdiff_t ret = mateHandler(eip, eax, ebx, esp, esi);
+       if (ret == -1) {
+               dprintf("regdump @ EIP: 0x%08x\n", regs[REG_EIP]);
+               dprintf("\tEAX: 0x%08lx EBX: 0x%08lx ECX: 0x%08lx EDX: 0x%08lx\n",
+                       regs[REG_EAX], regs[REG_EBX], regs[REG_ECX], regs[REG_EDX]);
+               dprintf("\tESI: 0x%08lx EDI: 0x%08lx EBP: 0x%08lx ESP: 0x%08lx\n",
+                       regs[REG_ESI], regs[REG_EDI], regs[REG_EBP], regs[REG_ESP]);
+               mctx->gregs[REG_EIP] = eip + 6;
+       } else {
+               mctx->gregs[REG_EIP] = ret;
+       }
 }
 
 void register_signal(void)