533b6acfe4792b208bdebc881a0ac86a659d89ec
[ghc-hetmet.git] / ghc / compiler / ghci / Linker.lhs
1 %
2 % (c) The University of Glasgow, 2000
3 %
4 \section[Linker]{The In-Memory Object File Linker}
5
6 \begin{code}
7 {-# OPTIONS -#include "Linker.h" #-}
8 module Linker ( 
9    initLinker,   -- :: IO ()
10    loadObj,      -- :: String -> IO ()
11    unloadObj,    -- :: String -> IO ()
12    lookupSymbol, -- :: String -> IO (Maybe (Ptr a))
13    resolveObjs,  -- :: IO ()
14    addDLL        -- :: String -> IO Bool
15   )  where
16
17 import Foreign          ( Ptr, nullPtr )
18 import PrelByteArr
19 import PrelPack         (packString)
20 import Panic            ( panic )
21
22 -- ---------------------------------------------------------------------------
23 -- RTS Linker Interface
24 -- ---------------------------------------------------------------------------
25
26 lookupSymbol str = do
27    addr <- c_lookupSymbol (packString str)
28    if addr == nullPtr
29         then return Nothing
30         else return (Just addr)
31
32 loadObj str = do
33    r <- c_loadObj (packString str)
34    if (r == 0)
35         then panic "loadObj: failed"
36         else return ()
37
38 unloadObj str = do
39    r <- c_unloadObj (packString str)
40    if (r == 0)
41         then panic "unloadObj: failed"
42         else return ()
43
44 resolveObjs = do
45    r <- c_resolveObjs
46    if (r == 0)
47         then panic "resolveObjs: failed"
48         else return ()
49
50 addDLL str = do
51    r <- c_addDLL (packString str)
52    return (r == 0)
53
54 type PackedString = ByteArray Int
55
56 foreign import "lookupSymbol" unsafe
57    c_lookupSymbol :: PackedString -> IO (Ptr a)
58
59 foreign import "loadObj" unsafe
60    c_loadObj :: PackedString -> IO Int
61
62 foreign import "unloadObj" unsafe
63    c_unloadObj :: PackedString -> IO Int
64
65 foreign import "resolveObjs" unsafe
66    c_resolveObjs :: IO Int
67
68 foreign import "initLinker" unsafe
69    initLinker :: IO ()
70
71 foreign import "addDLL" unsafe 
72    c_addDLL :: PackedString -> IO Int
73
74 \end{code}