let w32_from = fromIntegral signal_from
let mi = tmap M.! w32_from
let mi'@(MethodInfo method cm sig) =
- case mi of
- (StaticMethod x) -> x
- (VirtualMethod _ (MethodInfo methname _ msig)) -> newMi methname msig
- (InterfaceMethod _ (MethodInfo methname _ msig)) -> newMi methname msig
- _ -> error "getMethodEntry: no TrapCause found. abort."
- where newMi mn = MethodInfo mn (vmap M.! fromIntegral methodtable)
+ case mi of
+ (StaticMethod x) -> x
+ (VirtualMethod _ (MethodInfo methname _ msig)) -> newMi methname msig
+ (InterfaceMethod _ (MethodInfo methname _ msig)) -> newMi methname msig
+ _ -> error "getMethodEntry: no TrapCause found. abort."
+ where newMi mn = MethodInfo mn (vmap M.! fromIntegral methodtable)
-- bernhard (TODO): doesn't work with gnu classpath at some point. didn't
-- figured out the problem yet :/ therefore, I have no
-- testcase for replaying the situation.
setMethodMap $ M.insert mi' nf mmap
return nf
else do
- hmap <- parseMethod cls' method sig
- case hmap of
- Just hmap' -> do
- entry <- compileBB hmap' (MethodInfo method (thisClass cls') sig)
- addMethodRef entry mi' clsnames
- return $ fromIntegral entry
- Nothing -> error $ show method ++ " not found. abort"
+ rawmethod <- parseMethod cls' method sig
+ entry <- compileBB rawmethod (MethodInfo method (thisClass cls') sig)
+ addMethodRef entry mi' clsnames
+ return $ fromIntegral entry
Nothing -> error $ show method ++ " not found. abort"
Just w32 -> return w32
return $ fromIntegral entryaddr
supercl <- getClassFile (superClass cls)
lookupMethodRecursive name sig nextclsn supercl
where
- res = lookupMethodSig name sig cls
- thisname = thisClass cls
- nextclsn :: [B.ByteString]
- nextclsn = thisname:clsnames
+ res = lookupMethodSig name sig cls
+ thisname = thisClass cls
+ nextclsn :: [B.ByteString]
+ nextclsn = thisname:clsnames
-- TODO(bernhard): UBERHAX. ghc patch?
foreign import ccall safe "lookupSymbol"
loadNativeFunction :: String -> IO Word32
loadNativeFunction sym = do
- _ <- loadRawObject "ffi/native.o"
- -- TODO(bernhard): WTF
- resolveObjs (return ())
- ptr <- withCString sym c_lookupSymbol
- if ptr == nullPtr
- then error $ "dyn. loading of \"" ++ sym ++ "\" failed."
- else return $ fromIntegral $ ptrToIntPtr ptr
+ _ <- loadRawObject "ffi/native.o"
+ -- TODO(bernhard): WTF
+ resolveObjs (return ())
+ ptr <- withCString sym c_lookupSymbol
+ if ptr == nullPtr
+ then error $ "dyn. loading of \"" ++ sym ++ "\" failed."
+ else return $ fromIntegral $ ptrToIntPtr ptr
-- t_01 :: IO ()
-- t_01 = do
setMethodMap $ mmap `M.union` newmap
-compileBB :: MapBB -> MethodInfo -> IO Word32
-compileBB hmap methodinfo = do
+compileBB :: RawMethod -> MethodInfo -> IO Word32
+compileBB rawmethod methodinfo = do
tmap <- getTrapMap
cls <- getClassFile (methClassName methodinfo)
- let ebb = emitFromBB (methName methodinfo) (methSignature methodinfo) cls hmap
+ let ebb = emitFromBB cls rawmethod
(_, Right right) <- runCodeGen ebb () ()
let ((entry, _, _, new_tmap), _) = right
setTrapMap $ tmap `M.union` new_tmap -- prefers elements in tmap
printfJit "generated code of \"%s\" from \"%s\":\n" (toString $ methName methodinfo) (toString $ methClassName methodinfo)
+ printfJit "\tstacksize: 0x%04x, locals: 0x%04x\n" (rawStackSize rawmethod) (rawLocals rawmethod)
mapM_ (printfJit "%s\n" . showAtt) (snd right)
printfJit "\n\n"
-- UNCOMMENT NEXT LINES FOR GDB FUN