X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FObjLink.lhs;h=135afbb07dcadce0cc39d6fe3d2df47775a6a726;hb=ab5b8aa357c685a7c702262903bce04c66f79156;hp=5988165886e3767690265feda9efab291c11fe8e;hpb=53e5ed273237468ed64ee30caf7a82e2678c4669;p=ghc-hetmet.git diff --git a/compiler/ghci/ObjLink.lhs b/compiler/ghci/ObjLink.lhs index 5988165..135afbb 100644 --- a/compiler/ghci/ObjLink.lhs +++ b/compiler/ghci/ObjLink.lhs @@ -1,5 +1,5 @@ % -% (c) The University of Glasgow, 2000 +% (c) The University of Glasgow, 2000-2006 % -- --------------------------------------------------------------------------- @@ -17,22 +17,26 @@ module ObjLink ( loadObj, -- :: String -> IO () unloadObj, -- :: String -> IO () insertSymbol, -- :: String -> String -> Ptr a -> IO () - insertStableSymbol, -- :: String -> String -> a -> IO () lookupSymbol, -- :: String -> IO (Maybe (Ptr a)) - resolveObjs -- :: IO SuccessFlag + resolveObjs, -- :: IO SuccessFlag + lookupDataCon -- :: Ptr a -> IO (Maybe String) ) where -import Monad ( when ) - -import Foreign.C -import Foreign ( nullPtr ) +import ByteCodeItbls ( StgInfoTable ) import Panic ( panic ) import BasicTypes ( SuccessFlag, successIf ) import Config ( cLeadingUnderscore ) import Outputable +import Control.Monad ( when ) +import Foreign.C +import Foreign ( nullPtr ) import GHC.Exts ( Ptr(..), unsafeCoerce# ) +import Constants ( wORD_SIZE ) +import Foreign ( plusPtr ) + + -- --------------------------------------------------------------------------- -- RTS Linker Interface -- --------------------------------------------------------------------------- @@ -44,13 +48,6 @@ insertSymbol obj_name key symbol withCString str $ \c_str -> c_insertSymbol c_obj_name c_str symbol -insertStableSymbol :: String -> String -> a -> IO () -insertStableSymbol obj_name key symbol - = let str = prefixUnderscore key - in withCString obj_name $ \c_obj_name -> - withCString str $ \c_str -> - c_insertStableSymbol c_obj_name c_str (Ptr (unsafeCoerce# symbol)) - lookupSymbol :: String -> IO (Maybe (Ptr a)) lookupSymbol str_in = do let str = prefixUnderscore str_in @@ -60,6 +57,14 @@ lookupSymbol str_in = do then return Nothing else return (Just addr) +-- | Expects a Ptr to an info table, not to a closure +lookupDataCon :: Ptr StgInfoTable -> IO (Maybe String) +lookupDataCon ptr = do + name <- c_lookupDataCon (ptr `plusPtr` (wORD_SIZE*2)) + if name == nullPtr + then return Nothing + else peekCString name >>= return . Just + prefixUnderscore :: String -> String prefixUnderscore | cLeadingUnderscore == "YES" = ('_':) @@ -96,26 +101,13 @@ resolveObjs = do -- Foreign declaractions to RTS entry points which does the real work; -- --------------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ >= 504 foreign import ccall unsafe "addDLL" c_addDLL :: CString -> IO CString foreign import ccall unsafe "initLinker" initObjLinker :: IO () foreign import ccall unsafe "insertSymbol" c_insertSymbol :: CString -> CString -> Ptr a -> IO () -foreign import ccall unsafe "insertStableSymbol" c_insertStableSymbol - :: CString -> CString -> Ptr a -> IO () foreign import ccall unsafe "lookupSymbol" c_lookupSymbol :: CString -> IO (Ptr a) foreign import ccall unsafe "loadObj" c_loadObj :: CString -> IO Int foreign import ccall unsafe "unloadObj" c_unloadObj :: CString -> IO Int foreign import ccall unsafe "resolveObjs" c_resolveObjs :: IO Int -#else -foreign import "addDLL" unsafe c_addDLL :: CString -> IO CString -foreign import "initLinker" unsafe initLinker :: IO () -foreign import "insertSymbol" unsafe c_insertSymbol :: CString -> CString -> Ptr a -> IO () -foreign import "insertStableSymbol" unsafe c_insertStableSymbol - :: CString -> CString -> Ptr a -> IO () -foreign import "lookupSymbol" unsafe c_lookupSymbol :: CString -> IO (Ptr a) -foreign import "loadObj" unsafe c_loadObj :: CString -> IO Int -foreign import "unloadObj" unsafe c_unloadObj :: CString -> IO Int -foreign import "resolveObjs" unsafe c_resolveObjs :: IO Int -#endif +foreign import ccall unsafe "lookupDataCon" c_lookupDataCon :: Ptr a -> IO CString \end{code}