codegen: get full jnmap in patcher
authorBernhard Urban <lewurm@gmail.com>
Sun, 9 Sep 2012 12:56:15 +0000 (14:56 +0200)
committerBernhard Urban <lewurm@gmail.com>
Sun, 9 Sep 2012 16:02:51 +0000 (18:02 +0200)
at compile-time, the java PC to native PC map is not complete yet.

Mate.hs
Mate/ClassPool.hs
Mate/MethodPool.hs
Mate/MethodPool.hs-boot
Mate/X86CodeGen.hs

diff --git a/Mate.hs b/Mate.hs
index e93fea493e6d5a527dfe32a9e92ddc92c2c5ad9a..2231a5818be418b39fd6499043eb15927ab9207a 100644 (file)
--- a/Mate.hs
+++ b/Mate.hs
@@ -67,7 +67,7 @@ executeMain bclspath cls = do
     Just m -> do
       let mi = MethodInfo "main" bclspath $ methodSignature m
       rawmethod <- parseMethod cls "main" $ methodSignature m
-      entry <- compileBB rawmethod mi
+      entry <- compileBB mi rawmethod mi
       addMethodRef entry mi [bclspath]
       printfInfo "executing `main' now:\n"
       executeFuncPtr $ fst entry
index baf49a3d6eca25a762c5c06952695e747c827f46..245b1a4d13aa0c22b8a81d1dd69b8638931cf64f 100644 (file)
@@ -275,7 +275,8 @@ loadAndInitClass path = do
     Just m -> do
       rawmethod <- parseMethod (ciFile ci) "<clinit>" $ MethodSignature [] ReturnsVoid
       let mi = MethodInfo "<clinit>" path (methodSignature m)
-      entry <- compileBB rawmethod mi
+      -- TODO(bernhard): test exception handling in static initalizer
+      entry <- compileBB mi rawmethod mi
       addMethodRef entry mi [path]
       printfCp $ printf "executing static initializer from %s now\n" (toString path)
       executeFuncPtr $ fst entry
index 6eba0d4ac21273f6fb520a1d1ee272e9af7938a5..5918a2f1bb655112369af4b1c5047d7add87a4d7 100644 (file)
@@ -77,7 +77,7 @@ getMethodEntry mi@(MethodInfo method cm sig) = do
                   return nf'
               else do
                 rawmethod <- parseMethod cls' method sig
-                entry <- compileBB rawmethod (MethodInfo method (thisClass cls') sig)
+                entry <- compileBB mi rawmethod (MethodInfo method (thisClass cls') sig)
                 addMethodRef entry mi clsnames
                 return entry
         Nothing -> error $ show method ++ " not found. abort"
@@ -133,13 +133,13 @@ addMethodRef entry (MethodInfo mmname _ msig) clsnames = do
   setMethodMap $ mmap `M.union` newmap
 
 
-compileBB :: RawMethod -> MethodInfo -> IO (NativeWord, JpcNpcMap)
-compileBB rawmethod methodinfo = do
+compileBB :: MethodInfo -> RawMethod -> MethodInfo -> IO (NativeWord, JpcNpcMap)
+compileBB mi rawmethod methodinfo = do
   tmap <- getTrapMap
 
   cls <- getClassFile (methClassName methodinfo)
   printfJit $ printf "emit code of \"%s\" from \"%s\":\n" (toString $ methName methodinfo) (toString $ methClassName methodinfo)
-  let ebb = emitFromBB cls rawmethod
+  let ebb = emitFromBB cls mi rawmethod
   let cgconfig = defaultCodeGenConfig { codeBufferSize = fromIntegral $ rawCodeLength rawmethod * 32 }
   (jnmap, Right right) <- runCodeGenWithConfig ebb () M.empty cgconfig
 
index e55aab8b654717e1b3e92f0079a2601f57bd60bf..6bb91c313e7af62f2ee5c3e719226dfd89e3e18b 100644 (file)
@@ -10,6 +10,6 @@ import Foreign.C.Types
 
 
 addMethodRef :: (NativeWord, JpcNpcMap) -> MethodInfo -> [B.ByteString] -> IO ()
-compileBB :: RawMethod -> MethodInfo -> IO (NativeWord, JpcNpcMap)
+compileBB :: MethodInfo -> RawMethod -> MethodInfo -> IO (NativeWord, JpcNpcMap)
 executeFuncPtr :: NativeWord -> IO ()
 getMethodEntry :: MethodInfo -> IO (CPtrdiff, JpcNpcMap)
index 03333ce0d35d5163a3b31da763a60eb3d20b6ad6..79586ef02dd49ab33e512484d7d9c86558844201 100644 (file)
@@ -45,8 +45,8 @@ type BBStarts = M.Map BlockID Int
 type CompileInfo = (EntryPoint, Int, TrapMap)
 
 
-emitFromBB :: Class Direct -> RawMethod -> CodeGen e JpcNpcMap (CompileInfo, [Instruction])
-emitFromBB cls method = do
+emitFromBB :: Class Direct -> MethodInfo -> RawMethod -> CodeGen e JpcNpcMap (CompileInfo, [Instruction])
+emitFromBB cls miThis method = do
     let keys = M.keys hmap
     llmap <- mapM (newNamedLabel . (++) "bb_" . show) keys
     let lmap = zip keys llmap
@@ -218,6 +218,7 @@ emitFromBB cls method = do
     emit' ATHROW = do
       trapaddr <- emitSigIllTrap 2
       let patcher resp reip = do
+            (_, jnmap) <- liftIO $ getMethodEntry miThis
             error "no athrow for you, sorry"
             emitSigIllTrap 2
             return reip