8bcb3a1fa5378488ca879c8882c0f3835d83441c
[ghc-hetmet.git] / ghc / compiler / ghci / CmLink.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1993-2000
3 %
4 \section[CmLink]{Linker for GHCI}
5
6 \begin{code}
7 module CmLink ( Linkable(..), 
8                 filterModuleLinkables, 
9                 modname_of_linkable, is_package_linkable,
10                 LinkResult(..),
11                 HValue,
12                 link, 
13                 PLS{-abstractly!-}, emptyPLS )
14                   
15 where
16
17 import CmStaticInfo     ( PCI )
18 import CmFind           ( Path, PkgName )
19 import Module           ( Module )
20 import Outputable       ( SDoc )
21 import FiniteMap        ( FiniteMap, emptyFM )
22 import RdrName          ( RdrName )
23 import Digraph          ( SCC )
24 import Addr             ( Addr )
25 import Panic            ( panic )
26
27 #include "HsVersions.h"
28
29 \end{code}
30
31 \begin{code}
32 data PLS 
33    = MkPLS {
34         source_symtab :: FiniteMap RdrName HValue,
35         object_symtab :: FiniteMap String Addr
36      }
37
38 data HValue = HValue -- fix this ... just temporary?
39
40
41 link :: PCI -> [SCC Linkable] -> PLS -> IO LinkResult
42 link pci linkabless pls
43    = return (error "link:unimp")
44
45 data LinkResult 
46    = LinkOK   PLS
47    | LinkErrs PLS [SDoc]
48
49 data Unlinked
50    = DotO Path
51    | DotA Path
52    | DotDLL Path
53    -- | Trees [StgTree RdrName]
54
55 data Linkable
56    = LM {-should be:Module-} String{- == ModName-} [Unlinked]
57    | LP PkgName
58
59 modname_of_linkable (LM nm _) = nm
60 modname_of_linkable (LP _)    = panic "modname_of_linkable: package"
61
62 is_package_linkable (LP _)   = True
63 is_package_linkable (LM _ _) = False
64
65 filterModuleLinkables :: (String{- ==ModName-} -> Bool) 
66                       -> [Linkable] 
67                       -> [Linkable]
68 filterModuleLinkables p [] = []
69 filterModuleLinkables p (li:lis)
70    = case li of
71         LP _       -> retain
72         LM modnm _ -> if p modnm then retain else dump
73      where
74         dump   = filterModuleLinkables p lis
75         retain = li : dump
76
77 emptyPLS :: IO PLS
78 emptyPLS = return (MkPLS { source_symtab = emptyFM, 
79                            object_symtab = emptyFM })
80 \end{code}