9f45579a52d4eca37e6f0d6d6ce8e9b53a947369
[ghc-hetmet.git] / compiler / ghci / Linker.lhs
1 %
2 % (c) The University of Glasgow 2005-2006
3 %
4
5 -- --------------------------------------
6 --      The dynamic linker for GHCi      
7 -- --------------------------------------
8
9 This module deals with the top-level issues of dynamic linking,
10 calling the object-code linker and the byte-code linker where
11 necessary.
12
13
14 \begin{code}
15 {-# OPTIONS -fno-cse #-}
16 -- -fno-cse is needed for GLOBAL_VAR's to behave properly
17
18 module Linker ( HValue, getHValue, showLinkerState,
19                 linkExpr, unload, withExtendedLinkEnv,
20                 extendLinkEnv, deleteFromLinkEnv,
21                 extendLoadedPkgs, 
22                 linkPackages,initDynLinker,
23                 dataConInfoPtrToName
24         ) where
25
26 #include "HsVersions.h"
27
28 import LoadIface
29 import ObjLink
30 import ByteCodeLink
31 import ByteCodeItbls
32 import ByteCodeAsm
33 import CgInfoTbls
34 import SMRep
35 import IfaceEnv
36 import TcRnMonad
37 import Packages
38 import DriverPhases
39 import Finder
40 import HscTypes
41 import Name
42 import NameEnv
43 import NameSet
44 import qualified OccName
45 import LazyUniqFM
46 import Module
47 import ListSetOps
48 import DynFlags
49 import BasicTypes
50 import Outputable
51 import Panic
52 import Util
53 import StaticFlags
54 import ErrUtils
55 import SrcLoc
56 import qualified Maybes
57 import UniqSet
58 import Constants
59 import FastString
60 import Config           ( cProjectVersion )
61
62 -- Standard libraries
63 import Control.Monad
64
65 import Data.Char
66 import Data.IORef
67 import Data.List
68 import Foreign
69
70 import System.FilePath
71 import System.IO
72 import System.Directory
73
74 import Distribution.Package hiding (depends, PackageId)
75
76 import Exception
77 \end{code}
78
79
80 %************************************************************************
81 %*                                                                      *
82                         The Linker's state
83 %*                                                                      *
84 %************************************************************************
85
86 The persistent linker state *must* match the actual state of the 
87 C dynamic linker at all times, so we keep it in a private global variable.
88
89
90 The PersistentLinkerState maps Names to actual closures (for
91 interpreted code only), for use during linking.
92
93 \begin{code}
94 GLOBAL_VAR(v_PersistentLinkerState, panic "Dynamic linker not initialised", PersistentLinkerState)
95 GLOBAL_VAR(v_InitLinkerDone, False, Bool)       -- Set True when dynamic linker is initialised
96
97 data PersistentLinkerState
98    = PersistentLinkerState {
99
100         -- Current global mapping from Names to their true values
101         closure_env :: ClosureEnv,
102
103         -- The current global mapping from RdrNames of DataCons to
104         -- info table addresses.
105         -- When a new Unlinked is linked into the running image, or an existing
106         -- module in the image is replaced, the itbl_env must be updated
107         -- appropriately.
108         itbl_env    :: ItblEnv,
109
110         -- The currently loaded interpreted modules (home package)
111         bcos_loaded :: [Linkable],
112
113         -- And the currently-loaded compiled modules (home package)
114         objs_loaded :: [Linkable],
115
116         -- The currently-loaded packages; always object code
117         -- Held, as usual, in dependency order; though I am not sure if
118         -- that is really important
119         pkgs_loaded :: [PackageId]
120      }
121
122 emptyPLS :: DynFlags -> PersistentLinkerState
123 emptyPLS _ = PersistentLinkerState { 
124                         closure_env = emptyNameEnv,
125                         itbl_env    = emptyNameEnv,
126                         pkgs_loaded = init_pkgs,
127                         bcos_loaded = [],
128                         objs_loaded = [] }
129                     
130   -- Packages that don't need loading, because the compiler 
131   -- shares them with the interpreted program.
132   --
133   -- The linker's symbol table is populated with RTS symbols using an
134   -- explicit list.  See rts/Linker.c for details.
135   where init_pkgs = [rtsPackageId]
136 \end{code}
137
138 \begin{code}
139 extendLoadedPkgs :: [PackageId] -> IO ()
140 extendLoadedPkgs pkgs
141     = modifyIORef v_PersistentLinkerState (\s -> s{pkgs_loaded = pkgs ++ pkgs_loaded s})
142
143 extendLinkEnv :: [(Name,HValue)] -> IO ()
144 -- Automatically discards shadowed bindings
145 extendLinkEnv new_bindings
146   = do  pls <- readIORef v_PersistentLinkerState
147         let new_closure_env = extendClosureEnv (closure_env pls) new_bindings
148             new_pls = pls { closure_env = new_closure_env }
149         writeIORef v_PersistentLinkerState new_pls
150
151 deleteFromLinkEnv :: [Name] -> IO ()
152 deleteFromLinkEnv to_remove
153   = do  pls <- readIORef v_PersistentLinkerState
154         let new_closure_env = delListFromNameEnv (closure_env pls) to_remove
155             new_pls = pls { closure_env = new_closure_env }
156         writeIORef v_PersistentLinkerState new_pls
157
158 -- | Given a data constructor in the heap, find its Name.
159 --   The info tables for data constructors have a field which records
160 --   the source name of the constructor as a Ptr Word8 (UTF-8 encoded
161 --   string). The format is:
162 --
163 --    Package:Module.Name
164 --
165 --   We use this string to lookup the interpreter's internal representation of the name
166 --   using the lookupOrig.    
167
168 dataConInfoPtrToName :: Ptr () -> TcM (Either String Name)
169 dataConInfoPtrToName x = do 
170    theString <- liftIO $ do
171       let ptr = castPtr x :: Ptr StgInfoTable
172       conDescAddress <- getConDescAddress ptr 
173       peekArray0 0 conDescAddress  
174    let (pkg, mod, occ) = parse theString 
175        pkgFS = mkFastStringByteList pkg
176        modFS = mkFastStringByteList mod
177        occFS = mkFastStringByteList occ
178        occName = mkOccNameFS OccName.dataName occFS
179        modName = mkModule (fsToPackageId pkgFS) (mkModuleNameFS modFS) 
180    return (Left$ showSDoc$ ppr modName <> dot <> ppr occName ) 
181     `recoverM` (Right `fmap` lookupOrig modName occName)
182
183    where
184
185    {- To find the string in the constructor's info table we need to consider 
186       the layout of info tables relative to the entry code for a closure.
187
188       An info table can be next to the entry code for the closure, or it can
189       be separate. The former (faster) is used in registerised versions of ghc, 
190       and the latter (portable) is for non-registerised versions. 
191
192       The diagrams below show where the string is to be found relative to 
193       the normal info table of the closure.
194
195       1) Code next to table:
196
197          --------------
198          |            |   <- pointer to the start of the string
199          --------------
200          |            |   <- the (start of the) info table structure
201          |            |
202          |            |
203          --------------
204          | entry code | 
205          |    ....    |
206
207          In this case the pointer to the start of the string can be found in
208          the memory location _one word before_ the first entry in the normal info 
209          table.
210
211       2) Code NOT next to table:
212
213                                  --------------
214          info table structure -> |     *------------------> --------------
215                                  |            |             | entry code |
216                                  |            |             |    ....    | 
217                                  --------------
218          ptr to start of str ->  |            |   
219                                  --------------
220
221          In this case the pointer to the start of the string can be found
222          in the memory location: info_table_ptr + info_table_size
223    -}
224
225    getConDescAddress :: Ptr StgInfoTable -> IO (Ptr Word8)
226    getConDescAddress ptr
227     | ghciTablesNextToCode = do
228        offsetToString <- peek $ ptr `plusPtr` (- wORD_SIZE)
229        return $ (ptr `plusPtr` stdInfoTableSizeB) `plusPtr` (fromIntegral (offsetToString :: StgWord))
230     | otherwise =
231        peek $ intPtrToPtr $ (ptrToIntPtr ptr) + fromIntegral stdInfoTableSizeB
232
233    -- parsing names is a little bit fiddly because we have a string in the form: 
234    -- pkg:A.B.C.foo, and we want to split it into three parts: ("pkg", "A.B.C", "foo").
235    -- Thus we split at the leftmost colon and the rightmost occurrence of the dot.
236    -- It would be easier if the string was in the form pkg:A.B.C:foo, but alas
237    -- this is not the conventional way of writing Haskell names. We stick with
238    -- convention, even though it makes the parsing code more troublesome.
239    -- Warning: this code assumes that the string is well formed.
240    parse :: [Word8] -> ([Word8], [Word8], [Word8])
241    parse input 
242       = ASSERT (all (>0) (map length [pkg, mod, occ])) (pkg, mod, occ)
243       where
244       dot = fromIntegral (ord '.')
245       (pkg, rest1) = break (== fromIntegral (ord ':')) input 
246       (mod, occ) 
247          = (concat $ intersperse [dot] $ reverse modWords, occWord)
248          where
249          (modWords, occWord) = ASSERT (length rest1 > 0) (parseModOcc [] (tail rest1))
250       parseModOcc :: [[Word8]] -> [Word8] -> ([[Word8]], [Word8])
251       parseModOcc acc str
252          = case break (== dot) str of
253               (top, []) -> (acc, top)
254               (top, _:bot) -> parseModOcc (top : acc) bot
255        
256
257 getHValue :: HscEnv -> Name -> IO HValue
258 getHValue hsc_env name = do
259    when (isExternalName name) $ do
260         ok <- linkDependencies hsc_env noSrcSpan [nameModule name]
261         when (failed ok) $ ghcError (ProgramError "")
262    pls <- readIORef v_PersistentLinkerState
263    lookupName (closure_env pls) name
264         
265 linkDependencies :: HscEnv -> SrcSpan -> [Module] -> IO SuccessFlag
266 linkDependencies hsc_env span needed_mods = do
267    let hpt = hsc_HPT hsc_env
268        dflags = hsc_dflags hsc_env
269         -- The interpreter and dynamic linker can only handle object code built
270         -- the "normal" way, i.e. no non-std ways like profiling or ticky-ticky.
271         -- So here we check the build tag: if we're building a non-standard way
272         -- then we need to find & link object files built the "normal" way.
273    maybe_normal_osuf <- checkNonStdWay dflags span
274
275         -- Find what packages and linkables are required
276    eps <- readIORef (hsc_EPS hsc_env)
277    (lnks, pkgs) <- getLinkDeps hsc_env hpt (eps_PIT eps) 
278                                 maybe_normal_osuf span needed_mods
279
280         -- Link the packages and modules required
281    linkPackages dflags pkgs
282    linkModules dflags lnks
283
284
285 -- | Temporarily extend the linker state.
286
287 withExtendedLinkEnv :: (MonadIO m, ExceptionMonad m) =>
288                        [(Name,HValue)] -> m a -> m a
289 withExtendedLinkEnv new_env action
290     = gbracket set_new_env
291                (\_ -> reset_old_env)
292                (\_ -> action)
293     where set_new_env = do 
294             pls <- liftIO $ readIORef v_PersistentLinkerState
295             let new_closure_env = extendClosureEnv (closure_env pls) new_env
296                 new_pls = pls { closure_env = new_closure_env }
297             liftIO $ writeIORef v_PersistentLinkerState new_pls
298             return ()
299
300         -- Remember that the linker state might be side-effected
301         -- during the execution of the IO action, and we don't want to
302         -- lose those changes (we might have linked a new module or
303         -- package), so the reset action only removes the names we
304         -- added earlier.
305           reset_old_env = liftIO $ do
306             modifyIORef v_PersistentLinkerState $ \pls ->
307                 let cur = closure_env pls
308                     new = delListFromNameEnv cur (map fst new_env)
309                 in
310                 pls{ closure_env = new }
311
312 -- filterNameMap removes from the environment all entries except 
313 --      those for a given set of modules;
314 -- Note that this removes all *local* (i.e. non-isExternal) names too 
315 --      (these are the temporary bindings from the command line).
316 -- Used to filter both the ClosureEnv and ItblEnv
317
318 filterNameMap :: [Module] -> NameEnv (Name, a) -> NameEnv (Name, a)
319 filterNameMap mods env 
320    = filterNameEnv keep_elt env
321    where
322      keep_elt (n,_) = isExternalName n 
323                       && (nameModule n `elem` mods)
324 \end{code}
325
326
327 \begin{code}
328 showLinkerState :: IO ()
329 -- Display the persistent linker state
330 showLinkerState
331   = do pls <- readIORef v_PersistentLinkerState
332        printDump (vcat [text "----- Linker state -----",
333                         text "Pkgs:" <+> ppr (pkgs_loaded pls),
334                         text "Objs:" <+> ppr (objs_loaded pls),
335                         text "BCOs:" <+> ppr (bcos_loaded pls)])
336 \end{code}
337                         
338         
339
340
341 %************************************************************************
342 %*                                                                      *
343 \subsection{Initialisation}
344 %*                                                                      *
345 %************************************************************************
346
347 We initialise the dynamic linker by
348
349 a) calling the C initialisation procedure
350
351 b) Loading any packages specified on the command line,
352
353 c) Loading any packages specified on the command line,
354    now held in the -l options in v_Opt_l
355
356 d) Loading any .o/.dll files specified on the command line,
357    now held in v_Ld_inputs
358
359 e) Loading any MacOS frameworks
360
361 \begin{code}
362 initDynLinker :: DynFlags -> IO ()
363 -- This function is idempotent; if called more than once, it does nothing
364 -- This is useful in Template Haskell, where we call it before trying to link
365 initDynLinker dflags
366   = do  { done <- readIORef v_InitLinkerDone
367         ; if done then return () 
368                   else do { writeIORef v_InitLinkerDone True
369                           ; reallyInitDynLinker dflags }
370         }
371
372 reallyInitDynLinker :: DynFlags -> IO ()
373 reallyInitDynLinker dflags
374   = do  {  -- Initialise the linker state
375         ; writeIORef v_PersistentLinkerState (emptyPLS dflags)
376
377                 -- (a) initialise the C dynamic linker
378         ; initObjLinker 
379
380                 -- (b) Load packages from the command-line
381         ; linkPackages dflags (preloadPackages (pkgState dflags))
382
383                 -- (c) Link libraries from the command-line
384         ; let optl = getOpts dflags opt_l
385         ; let minus_ls = [ lib | '-':'l':lib <- optl ]
386
387                 -- (d) Link .o files from the command-line
388         ; let lib_paths = libraryPaths dflags
389         ; cmdline_ld_inputs <- readIORef v_Ld_inputs
390
391         ; classified_ld_inputs <- mapM classifyLdInput cmdline_ld_inputs
392
393                 -- (e) Link any MacOS frameworks
394         ; let framework_paths
395                | isDarwinTarget = frameworkPaths dflags
396                | otherwise      = []
397         ; let frameworks
398                | isDarwinTarget = cmdlineFrameworks dflags
399                | otherwise      = []
400                 -- Finally do (c),(d),(e)       
401         ; let cmdline_lib_specs = [ l | Just l <- classified_ld_inputs ]
402                                ++ map DLL       minus_ls 
403                                ++ map Framework frameworks
404         ; if null cmdline_lib_specs then return ()
405                                     else do
406
407         { mapM_ (preloadLib dflags lib_paths framework_paths) cmdline_lib_specs
408         ; maybePutStr dflags "final link ... "
409         ; ok <- resolveObjs
410
411         ; if succeeded ok then maybePutStrLn dflags "done"
412           else ghcError (ProgramError "linking extra libraries/objects failed")
413         }}
414
415 classifyLdInput :: FilePath -> IO (Maybe LibrarySpec)
416 classifyLdInput f
417   | isObjectFilename f = return (Just (Object f))
418   | isDynLibFilename f = return (Just (DLLPath f))
419   | otherwise          = do
420         hPutStrLn stderr ("Warning: ignoring unrecognised input `" ++ f ++ "'")
421         return Nothing
422
423 preloadLib :: DynFlags -> [String] -> [String] -> LibrarySpec -> IO ()
424 preloadLib dflags lib_paths framework_paths lib_spec
425   = do maybePutStr dflags ("Loading object " ++ showLS lib_spec ++ " ... ")
426        case lib_spec of
427           Object static_ish
428              -> do b <- preload_static lib_paths static_ish
429                    maybePutStrLn dflags (if b  then "done"
430                                                 else "not found")
431          
432           DLL dll_unadorned
433              -> do maybe_errstr <- loadDynamic lib_paths dll_unadorned
434                    case maybe_errstr of
435                       Nothing -> maybePutStrLn dflags "done"
436                       Just mm -> preloadFailed mm lib_paths lib_spec
437
438           DLLPath dll_path
439              -> do maybe_errstr <- loadDLL dll_path
440                    case maybe_errstr of
441                       Nothing -> maybePutStrLn dflags "done"
442                       Just mm -> preloadFailed mm lib_paths lib_spec
443
444           Framework framework
445            | isDarwinTarget
446              -> do maybe_errstr <- loadFramework framework_paths framework
447                    case maybe_errstr of
448                       Nothing -> maybePutStrLn dflags "done"
449                       Just mm -> preloadFailed mm framework_paths lib_spec
450            | otherwise -> panic "preloadLib Framework"
451
452   where
453     preloadFailed :: String -> [String] -> LibrarySpec -> IO ()
454     preloadFailed sys_errmsg paths spec
455        = do maybePutStr dflags "failed.\n"
456             ghcError $
457               CmdLineError (
458                     "user specified .o/.so/.DLL could not be loaded ("
459                     ++ sys_errmsg ++ ")\nWhilst trying to load:  "
460                     ++ showLS spec ++ "\nAdditional directories searched:"
461                     ++ (if null paths then " (none)" else
462                         (concat (intersperse "\n" (map ("   "++) paths)))))
463     
464     -- Not interested in the paths in the static case.
465     preload_static _paths name
466        = do b <- doesFileExist name
467             if not b then return False
468                      else loadObj name >> return True
469 \end{code}
470
471
472 %************************************************************************
473 %*                                                                      *
474                 Link a byte-code expression
475 %*                                                                      *
476 %************************************************************************
477
478 \begin{code}
479 linkExpr :: HscEnv -> SrcSpan -> UnlinkedBCO -> IO HValue
480
481 -- Link a single expression, *including* first linking packages and 
482 -- modules that this expression depends on.
483 --
484 -- Raises an IO exception if it can't find a compiled version of the
485 -- dependents to link.
486 --
487 -- Note: This function side-effects the linker state (Pepe)
488
489 linkExpr hsc_env span root_ul_bco
490   = do {  
491         -- Initialise the linker (if it's not been done already)
492      let dflags = hsc_dflags hsc_env
493    ; initDynLinker dflags
494
495         -- Link the packages and modules required
496    ; ok <- linkDependencies hsc_env span needed_mods
497    ; if failed ok then
498         ghcError (ProgramError "")
499      else do {
500
501         -- Link the expression itself
502      pls <- readIORef v_PersistentLinkerState
503    ; let ie = itbl_env pls
504          ce = closure_env pls
505
506         -- Link the necessary packages and linkables
507    ; (_, (root_hval:_)) <- linkSomeBCOs False ie ce [root_ul_bco]
508    ; return root_hval
509    }}
510    where
511      free_names = nameSetToList (bcoFreeNames root_ul_bco)
512
513      needed_mods :: [Module]
514      needed_mods = [ nameModule n | n <- free_names, 
515                                     isExternalName n,           -- Names from other modules
516                                     not (isWiredInName n)       -- Exclude wired-in names
517                    ]                                            -- (see note below)
518         -- Exclude wired-in names because we may not have read
519         -- their interface files, so getLinkDeps will fail
520         -- All wired-in names are in the base package, which we link
521         -- by default, so we can safely ignore them here.
522  
523 dieWith :: SrcSpan -> Message -> IO a
524 dieWith span msg = ghcError (ProgramError (showSDoc (mkLocMessage span msg)))
525
526
527 checkNonStdWay :: DynFlags -> SrcSpan -> IO (Maybe String)
528 checkNonStdWay dflags srcspan = do
529   tag <- readIORef v_Build_tag
530   if null tag then return Nothing else do
531   let default_osuf = phaseInputExt StopLn
532   if objectSuf dflags == default_osuf
533         then failNonStd srcspan
534         else return (Just default_osuf)
535
536 failNonStd :: SrcSpan -> IO (Maybe String)
537 failNonStd srcspan = dieWith srcspan $
538   ptext (sLit "Dynamic linking required, but this is a non-standard build (eg. prof).") $$
539   ptext (sLit "You need to build the program twice: once the normal way, and then") $$
540   ptext (sLit "in the desired way using -osuf to set the object file suffix.")
541   
542
543 getLinkDeps :: HscEnv -> HomePackageTable -> PackageIfaceTable
544             -> Maybe String                     -- the "normal" object suffix
545             -> SrcSpan                          -- for error messages
546             -> [Module]                         -- If you need these
547             -> IO ([Linkable], [PackageId])     -- ... then link these first
548 -- Fails with an IO exception if it can't find enough files
549
550 getLinkDeps hsc_env hpt _ maybe_normal_osuf span mods
551 -- Find all the packages and linkables that a set of modules depends on
552  = do { pls <- readIORef v_PersistentLinkerState ;
553         -- 1.  Find the dependent home-pkg-modules/packages from each iface
554         (mods_s, pkgs_s) <- follow_deps mods emptyUniqSet emptyUniqSet;
555
556         let {
557         -- 2.  Exclude ones already linked
558         --      Main reason: avoid findModule calls in get_linkable
559             mods_needed = mods_s `minusList` linked_mods     ;
560             pkgs_needed = pkgs_s `minusList` pkgs_loaded pls ;
561
562             linked_mods = map (moduleName.linkableModule) 
563                                 (objs_loaded pls ++ bcos_loaded pls)
564         } ;
565         
566 --        putStrLn (showSDoc (ppr mods_s)) ;
567         -- 3.  For each dependent module, find its linkable
568         --     This will either be in the HPT or (in the case of one-shot
569         --     compilation) we may need to use maybe_getFileLinkable
570         lnks_needed <- mapM (get_linkable maybe_normal_osuf) mods_needed ;
571
572         return (lnks_needed, pkgs_needed) }
573   where
574     dflags = hsc_dflags hsc_env
575     this_pkg = thisPackage dflags
576
577         -- The ModIface contains the transitive closure of the module dependencies
578         -- within the current package, *except* for boot modules: if we encounter
579         -- a boot module, we have to find its real interface and discover the
580         -- dependencies of that.  Hence we need to traverse the dependency
581         -- tree recursively.  See bug #936, testcase ghci/prog007.
582     follow_deps :: [Module]             -- modules to follow
583                 -> UniqSet ModuleName         -- accum. module dependencies
584                 -> UniqSet PackageId          -- accum. package dependencies
585                 -> IO ([ModuleName], [PackageId]) -- result
586     follow_deps []     acc_mods acc_pkgs
587         = return (uniqSetToList acc_mods, uniqSetToList acc_pkgs)
588     follow_deps (mod:mods) acc_mods acc_pkgs
589         = do
590           mb_iface <- initIfaceCheck hsc_env $
591                         loadInterface msg mod (ImportByUser False)
592           iface <- case mb_iface of
593                     Maybes.Failed err      -> ghcError (ProgramError (showSDoc err))
594                     Maybes.Succeeded iface -> return iface
595
596           when (mi_boot iface) $ link_boot_mod_error mod
597
598           let
599             pkg = modulePackageId mod
600             deps  = mi_deps iface
601
602             pkg_deps = dep_pkgs deps
603             (boot_deps, mod_deps) = partitionWith is_boot (dep_mods deps)
604                     where is_boot (m,True)  = Left m
605                           is_boot (m,False) = Right m
606
607             boot_deps' = filter (not . (`elementOfUniqSet` acc_mods)) boot_deps
608             acc_mods'  = addListToUniqSet acc_mods (moduleName mod : mod_deps)
609             acc_pkgs'  = addListToUniqSet acc_pkgs pkg_deps
610           --
611           if pkg /= this_pkg
612              then follow_deps mods acc_mods (addOneToUniqSet acc_pkgs' pkg)
613              else follow_deps (map (mkModule this_pkg) boot_deps' ++ mods)
614                               acc_mods' acc_pkgs'
615         where
616             msg = text "need to link module" <+> ppr mod <+>
617                   text "due to use of Template Haskell"
618
619
620     link_boot_mod_error mod = 
621         ghcError (ProgramError (showSDoc (
622             text "module" <+> ppr mod <+> 
623             text "cannot be linked; it is only available as a boot module")))
624
625     no_obj mod = dieWith span $
626                      ptext (sLit "cannot find object file for module ") <> 
627                         quotes (ppr mod) $$
628                      while_linking_expr
629                 
630     while_linking_expr = ptext (sLit "while linking an interpreted expression")
631
632         -- This one is a build-system bug
633
634     get_linkable maybe_normal_osuf mod_name     -- A home-package module
635         | Just mod_info <- lookupUFM hpt mod_name 
636         = adjust_linkable (Maybes.expectJust "getLinkDeps" (hm_linkable mod_info))
637         | otherwise     
638         = do    -- It's not in the HPT because we are in one shot mode, 
639                 -- so use the Finder to get a ModLocation...
640              mb_stuff <- findHomeModule hsc_env mod_name
641              case mb_stuff of
642                   Found loc mod -> found loc mod
643                   _ -> no_obj mod_name
644         where
645             found loc mod = do {
646                 -- ...and then find the linkable for it
647                mb_lnk <- findObjectLinkableMaybe mod loc ;
648                case mb_lnk of {
649                   Nothing -> no_obj mod ;
650                   Just lnk -> adjust_linkable lnk
651               }}
652
653             adjust_linkable lnk
654                 | Just osuf <- maybe_normal_osuf = do
655                         new_uls <- mapM (adjust_ul osuf) (linkableUnlinked lnk)
656                         return lnk{ linkableUnlinked=new_uls }
657                 | otherwise =
658                         return lnk
659
660             adjust_ul osuf (DotO file) = do
661                 let new_file = replaceExtension file osuf
662                 ok <- doesFileExist new_file
663                 if (not ok)
664                    then dieWith span $
665                           ptext (sLit "cannot find normal object file ")
666                                 <> quotes (text new_file) $$ while_linking_expr
667                    else return (DotO new_file)
668             adjust_ul _ _ = panic "adjust_ul"
669 \end{code}
670
671
672 %************************************************************************
673 %*                                                                      *
674                 Link some linkables
675         The linkables may consist of a mixture of 
676         byte-code modules and object modules
677 %*                                                                      *
678 %************************************************************************
679
680 \begin{code}
681 linkModules :: DynFlags -> [Linkable] -> IO SuccessFlag
682 linkModules dflags linkables
683   = block $ do  -- don't want to be interrupted by ^C in here
684         
685         let (objs, bcos) = partition isObjectLinkable 
686                               (concatMap partitionLinkable linkables)
687
688                 -- Load objects first; they can't depend on BCOs
689         ok_flag <- dynLinkObjs dflags objs
690
691         if failed ok_flag then 
692                 return Failed
693           else do
694                 dynLinkBCOs bcos
695                 return Succeeded
696                 
697
698 -- HACK to support f-x-dynamic in the interpreter; no other purpose
699 partitionLinkable :: Linkable -> [Linkable]
700 partitionLinkable li
701    = let li_uls = linkableUnlinked li
702          li_uls_obj = filter isObject li_uls
703          li_uls_bco = filter isInterpretable li_uls
704      in 
705          case (li_uls_obj, li_uls_bco) of
706             (_:_, _:_) -> [li {linkableUnlinked=li_uls_obj},
707                            li {linkableUnlinked=li_uls_bco}]
708             _ -> [li]
709
710 findModuleLinkable_maybe :: [Linkable] -> Module -> Maybe Linkable
711 findModuleLinkable_maybe lis mod
712    = case [LM time nm us | LM time nm us <- lis, nm == mod] of
713         []   -> Nothing
714         [li] -> Just li
715         _    -> pprPanic "findModuleLinkable" (ppr mod)
716
717 linkableInSet :: Linkable -> [Linkable] -> Bool
718 linkableInSet l objs_loaded =
719   case findModuleLinkable_maybe objs_loaded (linkableModule l) of
720         Nothing -> False
721         Just m  -> linkableTime l == linkableTime m
722 \end{code}
723
724
725 %************************************************************************
726 %*                                                                      *
727 \subsection{The object-code linker}
728 %*                                                                      *
729 %************************************************************************
730
731 \begin{code}
732 dynLinkObjs :: DynFlags -> [Linkable] -> IO SuccessFlag
733         -- Side-effects the PersistentLinkerState
734
735 dynLinkObjs dflags objs
736   = do  pls <- readIORef v_PersistentLinkerState
737
738         -- Load the object files and link them
739         let (objs_loaded', new_objs) = rmDupLinkables (objs_loaded pls) objs
740             pls1                     = pls { objs_loaded = objs_loaded' }
741             unlinkeds                = concatMap linkableUnlinked new_objs
742
743         mapM_ loadObj (map nameOfObject unlinkeds)
744
745         -- Link the all together
746         ok <- resolveObjs
747
748         -- If resolving failed, unload all our 
749         -- object modules and carry on
750         if succeeded ok then do
751                 writeIORef v_PersistentLinkerState pls1
752                 return Succeeded
753           else do
754                 pls2 <- unload_wkr dflags [] pls1
755                 writeIORef v_PersistentLinkerState pls2
756                 return Failed
757
758
759 rmDupLinkables :: [Linkable]    -- Already loaded
760                -> [Linkable]    -- New linkables
761                -> ([Linkable],  -- New loaded set (including new ones)
762                    [Linkable])  -- New linkables (excluding dups)
763 rmDupLinkables already ls
764   = go already [] ls
765   where
766     go already extras [] = (already, extras)
767     go already extras (l:ls)
768         | linkableInSet l already = go already     extras     ls
769         | otherwise               = go (l:already) (l:extras) ls
770 \end{code}
771
772 %************************************************************************
773 %*                                                                      *
774 \subsection{The byte-code linker}
775 %*                                                                      *
776 %************************************************************************
777
778 \begin{code}
779 dynLinkBCOs :: [Linkable] -> IO ()
780         -- Side-effects the persistent linker state
781 dynLinkBCOs bcos
782   = do  pls <- readIORef v_PersistentLinkerState
783
784         let (bcos_loaded', new_bcos) = rmDupLinkables (bcos_loaded pls) bcos
785             pls1                     = pls { bcos_loaded = bcos_loaded' }
786             unlinkeds :: [Unlinked]
787             unlinkeds                = concatMap linkableUnlinked new_bcos
788
789             cbcs :: [CompiledByteCode]
790             cbcs      = map byteCodeOfObject unlinkeds
791                       
792                       
793             ul_bcos    = [b | ByteCode bs _  <- cbcs, b <- bs]
794             ies        = [ie | ByteCode _ ie <- cbcs]
795             gce       = closure_env pls
796             final_ie  = foldr plusNameEnv (itbl_env pls) ies
797
798         (final_gce, _linked_bcos) <- linkSomeBCOs True final_ie gce ul_bcos
799                 -- XXX What happens to these linked_bcos?
800
801         let pls2 = pls1 { closure_env = final_gce,
802                           itbl_env    = final_ie }
803
804         writeIORef v_PersistentLinkerState pls2
805         return ()
806
807 -- Link a bunch of BCOs and return them + updated closure env.
808 linkSomeBCOs :: Bool    -- False <=> add _all_ BCOs to returned closure env
809                         -- True  <=> add only toplevel BCOs to closure env
810              -> ItblEnv 
811              -> ClosureEnv 
812              -> [UnlinkedBCO]
813              -> IO (ClosureEnv, [HValue])
814                         -- The returned HValues are associated 1-1 with
815                         -- the incoming unlinked BCOs.  Each gives the
816                         -- value of the corresponding unlinked BCO
817                                         
818 linkSomeBCOs toplevs_only ie ce_in ul_bcos
819    = do let nms = map unlinkedBCOName ul_bcos
820         hvals <- fixIO 
821                     ( \ hvs -> let ce_out = extendClosureEnv ce_in (zipLazy nms hvs)
822                                in  mapM (linkBCO ie ce_out) ul_bcos )
823         let ce_all_additions = zip nms hvals
824             ce_top_additions = filter (isExternalName.fst) ce_all_additions
825             ce_additions     = if toplevs_only then ce_top_additions 
826                                                else ce_all_additions
827             ce_out = -- make sure we're not inserting duplicate names into the 
828                      -- closure environment, which leads to trouble.
829                      ASSERT (all (not . (`elemNameEnv` ce_in)) (map fst ce_additions))
830                      extendClosureEnv ce_in ce_additions
831         return (ce_out, hvals)
832
833 \end{code}
834
835
836 %************************************************************************
837 %*                                                                      *
838                 Unload some object modules
839 %*                                                                      *
840 %************************************************************************
841
842 \begin{code}
843 -- ---------------------------------------------------------------------------
844 -- Unloading old objects ready for a new compilation sweep.
845 --
846 -- The compilation manager provides us with a list of linkables that it
847 -- considers "stable", i.e. won't be recompiled this time around.  For
848 -- each of the modules current linked in memory,
849 --
850 --      * if the linkable is stable (and it's the same one - the
851 --        user may have recompiled the module on the side), we keep it,
852 --
853 --      * otherwise, we unload it.
854 --
855 --      * we also implicitly unload all temporary bindings at this point.
856
857 unload :: DynFlags -> [Linkable] -> IO ()
858 -- The 'linkables' are the ones to *keep*
859
860 unload dflags linkables
861   = block $ do -- block, so we're safe from Ctrl-C in here
862   
863         -- Initialise the linker (if it's not been done already)
864         initDynLinker dflags
865
866         pls     <- readIORef v_PersistentLinkerState
867         new_pls <- unload_wkr dflags linkables pls
868         writeIORef v_PersistentLinkerState new_pls
869
870         debugTraceMsg dflags 3 (text "unload: retaining objs" <+> ppr (objs_loaded new_pls))
871         debugTraceMsg dflags 3 (text "unload: retaining bcos" <+> ppr (bcos_loaded new_pls))
872         return ()
873
874 unload_wkr :: DynFlags
875            -> [Linkable]                -- stable linkables
876            -> PersistentLinkerState
877            -> IO PersistentLinkerState
878 -- Does the core unload business
879 -- (the wrapper blocks exceptions and deals with the PLS get and put)
880
881 unload_wkr _ linkables pls
882   = do  let (objs_to_keep, bcos_to_keep) = partition isObjectLinkable linkables
883
884         objs_loaded' <- filterM (maybeUnload objs_to_keep) (objs_loaded pls)
885         bcos_loaded' <- filterM (maybeUnload bcos_to_keep) (bcos_loaded pls)
886
887         let bcos_retained = map linkableModule bcos_loaded'
888             itbl_env'     = filterNameMap bcos_retained (itbl_env pls)
889             closure_env'  = filterNameMap bcos_retained (closure_env pls)
890             new_pls = pls { itbl_env = itbl_env',
891                             closure_env = closure_env',
892                             bcos_loaded = bcos_loaded',
893                             objs_loaded = objs_loaded' }
894
895         return new_pls
896   where
897     maybeUnload :: [Linkable] -> Linkable -> IO Bool
898     maybeUnload keep_linkables lnk
899       | linkableInSet lnk keep_linkables = return True
900       | otherwise                   
901       = do mapM_ unloadObj [f | DotO f <- linkableUnlinked lnk]
902                 -- The components of a BCO linkable may contain
903                 -- dot-o files.  Which is very confusing.
904                 --
905                 -- But the BCO parts can be unlinked just by 
906                 -- letting go of them (plus of course depopulating
907                 -- the symbol table which is done in the main body)
908            return False
909 \end{code}
910
911
912 %************************************************************************
913 %*                                                                      *
914                 Loading packages
915 %*                                                                      *
916 %************************************************************************
917
918
919 \begin{code}
920 data LibrarySpec 
921    = Object FilePath    -- Full path name of a .o file, including trailing .o
922                         -- For dynamic objects only, try to find the object 
923                         -- file in all the directories specified in 
924                         -- v_Library_paths before giving up.
925
926    | DLL String         -- "Unadorned" name of a .DLL/.so
927                         --  e.g.    On unix     "qt"  denotes "libqt.so"
928                         --          On WinDoze  "burble"  denotes "burble.DLL"
929                         --  loadDLL is platform-specific and adds the lib/.so/.DLL
930                         --  suffixes platform-dependently
931
932    | DLLPath FilePath   -- Absolute or relative pathname to a dynamic library
933                         -- (ends with .dll or .so).
934
935    | Framework String   -- Only used for darwin, but does no harm
936
937 -- If this package is already part of the GHCi binary, we'll already
938 -- have the right DLLs for this package loaded, so don't try to
939 -- load them again.
940 -- 
941 -- But on Win32 we must load them 'again'; doing so is a harmless no-op
942 -- as far as the loader is concerned, but it does initialise the list
943 -- of DLL handles that rts/Linker.c maintains, and that in turn is 
944 -- used by lookupSymbol.  So we must call addDLL for each library 
945 -- just to get the DLL handle into the list.
946 partOfGHCi :: [PackageName]
947 partOfGHCi
948  | isWindowsTarget || isDarwinTarget = []
949  | otherwise = map PackageName
950                    ["base", "haskell98", "template-haskell", "editline"]
951
952 showLS :: LibrarySpec -> String
953 showLS (Object nm)    = "(static) " ++ nm
954 showLS (DLL nm)       = "(dynamic) " ++ nm
955 showLS (DLLPath nm)   = "(dynamic) " ++ nm
956 showLS (Framework nm) = "(framework) " ++ nm
957
958 linkPackages :: DynFlags -> [PackageId] -> IO ()
959 -- Link exactly the specified packages, and their dependents
960 -- (unless of course they are already linked)
961 -- The dependents are linked automatically, and it doesn't matter
962 -- what order you specify the input packages.
963 --
964 -- NOTE: in fact, since each module tracks all the packages it depends on,
965 --       we don't really need to use the package-config dependencies.
966 -- However we do need the package-config stuff (to find aux libs etc),
967 -- and following them lets us load libraries in the right order, which 
968 -- perhaps makes the error message a bit more localised if we get a link
969 -- failure.  So the dependency walking code is still here.
970
971 linkPackages dflags new_pkgs
972    = do { pls     <- readIORef v_PersistentLinkerState
973         ; let pkg_map = pkgIdMap (pkgState dflags)
974
975         ; pkgs' <- link pkg_map (pkgs_loaded pls) new_pkgs
976
977         ; writeIORef v_PersistentLinkerState (pls { pkgs_loaded = pkgs' })
978         }
979    where
980      link :: PackageConfigMap -> [PackageId] -> [PackageId] -> IO [PackageId]
981      link pkg_map pkgs new_pkgs 
982         = foldM (link_one pkg_map) pkgs new_pkgs
983
984      link_one pkg_map pkgs new_pkg
985         | new_pkg `elem` pkgs   -- Already linked
986         = return pkgs
987
988         | Just pkg_cfg <- lookupPackage pkg_map new_pkg
989         = do {  -- Link dependents first
990                pkgs' <- link pkg_map pkgs (map mkPackageId (depends pkg_cfg))
991                 -- Now link the package itself
992              ; linkPackage dflags pkg_cfg
993              ; return (new_pkg : pkgs') }
994
995         | otherwise
996         = ghcError (CmdLineError ("unknown package: " ++ packageIdString new_pkg))
997
998
999 linkPackage :: DynFlags -> PackageConfig -> IO ()
1000 linkPackage dflags pkg
1001    = do 
1002         let dirs      =  Packages.libraryDirs pkg
1003
1004         let libs      =  Packages.hsLibraries pkg
1005         -- Because of slight differences between the GHC dynamic linker and
1006         -- the native system linker some packages have to link with a
1007         -- different list of libraries when using GHCi. Examples include: libs
1008         -- that are actually gnu ld scripts, and the possability that the .a
1009         -- libs do not exactly match the .so/.dll equivalents. So if the
1010         -- package file provides an "extra-ghci-libraries" field then we use
1011         -- that instead of the "extra-libraries" field.
1012                       ++ (if null (Packages.extraGHCiLibraries pkg)
1013                             then Packages.extraLibraries pkg
1014                             else Packages.extraGHCiLibraries pkg)
1015                       ++ [ lib | '-':'l':lib <- Packages.ldOptions pkg ]
1016         classifieds   <- mapM (locateOneObj dirs) libs
1017
1018         -- Complication: all the .so's must be loaded before any of the .o's.  
1019         let dlls = [ dll | DLL dll    <- classifieds ]
1020             objs = [ obj | Object obj <- classifieds ]
1021
1022         maybePutStr dflags ("Loading package " ++ display (package pkg) ++ " ... ")
1023
1024         -- See comments with partOfGHCi
1025         when (packageName pkg `notElem` partOfGHCi) $ do
1026             loadFrameworks pkg
1027             -- When a library A needs symbols from a library B, the order in
1028             -- extra_libraries/extra_ld_opts is "-lA -lB", because that's the
1029             -- way ld expects it for static linking. Dynamic linking is a
1030             -- different story: When A has no dependency information for B,
1031             -- dlopen-ing A with RTLD_NOW (see addDLL in Linker.c) will fail
1032             -- when B has not been loaded before. In a nutshell: Reverse the
1033             -- order of DLLs for dynamic linking.
1034             -- This fixes a problem with the HOpenGL package (see "Compiling
1035             -- HOpenGL under recent versions of GHC" on the HOpenGL list).
1036             mapM_ (load_dyn dirs) (reverse dlls)
1037         
1038         -- After loading all the DLLs, we can load the static objects.
1039         -- Ordering isn't important here, because we do one final link
1040         -- step to resolve everything.
1041         mapM_ loadObj objs
1042
1043         maybePutStr dflags "linking ... "
1044         ok <- resolveObjs
1045         if succeeded ok then maybePutStrLn dflags "done."
1046               else ghcError (InstallationError ("unable to load package `" ++ display (package pkg) ++ "'"))
1047
1048 load_dyn :: [FilePath] -> FilePath -> IO ()
1049 load_dyn dirs dll = do r <- loadDynamic dirs dll
1050                        case r of
1051                          Nothing  -> return ()
1052                          Just err -> ghcError (CmdLineError ("can't load .so/.DLL for: " 
1053                                                               ++ dll ++ " (" ++ err ++ ")" ))
1054
1055 loadFrameworks :: InstalledPackageInfo_ ModuleName -> IO ()
1056 loadFrameworks pkg
1057  | isDarwinTarget = mapM_ load frameworks
1058  | otherwise = return ()
1059   where
1060     fw_dirs    = Packages.frameworkDirs pkg
1061     frameworks = Packages.frameworks pkg
1062
1063     load fw = do  r <- loadFramework fw_dirs fw
1064                   case r of
1065                     Nothing  -> return ()
1066                     Just err -> ghcError (CmdLineError ("can't load framework: " 
1067                                                         ++ fw ++ " (" ++ err ++ ")" ))
1068
1069 -- Try to find an object file for a given library in the given paths.
1070 -- If it isn't present, we assume it's a dynamic library.
1071 locateOneObj :: [FilePath] -> String -> IO LibrarySpec
1072 locateOneObj dirs lib
1073  | not picIsOn
1074     -- When the GHC package was not compiled as dynamic library 
1075     -- (=__PIC__ not set), we search for .o libraries first.
1076   = do  { mb_obj_path <- findFile mk_obj_path dirs 
1077         ; case mb_obj_path of
1078             Just obj_path -> return (Object obj_path)
1079             Nothing       -> 
1080                 do { mb_lib_path <- findFile mk_dyn_lib_path dirs
1081                    ; case mb_lib_path of
1082                        Just _  -> return (DLL dyn_lib_name)
1083                        Nothing -> return (DLL lib) }} -- We assume
1084  | otherwise
1085     -- When the GHC package was compiled as dynamic library (=__PIC__ set),
1086     -- we search for .so libraries first.
1087   = do  { mb_lib_path <- findFile mk_dyn_lib_path dirs
1088         ; case mb_lib_path of
1089             Just _ -> return (DLL (lib ++ "-ghc" ++ cProjectVersion))
1090             Nothing       ->
1091                 do { mb_obj_path <- findFile mk_obj_path dirs
1092                    ; case mb_obj_path of
1093                        Just obj_path -> return (Object obj_path)
1094                        Nothing       -> return (DLL lib) }}             -- We assume
1095    where
1096      mk_obj_path dir = dir </> (lib <.> "o")
1097      dyn_lib_name = lib ++ "-ghc" ++ cProjectVersion
1098      mk_dyn_lib_path dir = dir </> mkSOName dyn_lib_name
1099
1100 -- ----------------------------------------------------------------------------
1101 -- Loading a dyanmic library (dlopen()-ish on Unix, LoadLibrary-ish on Win32)
1102
1103 -- return Nothing == success, else Just error message from dlopen
1104 loadDynamic :: [FilePath] -> FilePath -> IO (Maybe String)
1105 loadDynamic paths rootname
1106   = do  { mb_dll <- findFile mk_dll_path paths
1107         ; case mb_dll of
1108             Just dll -> loadDLL dll
1109             Nothing  -> loadDLL (mkSOName rootname) }
1110                         -- Tried all our known library paths, so let 
1111                         -- dlopen() search its own builtin paths now.
1112   where
1113     mk_dll_path dir = dir </> mkSOName rootname
1114
1115 mkSOName :: FilePath -> FilePath
1116 mkSOName root
1117  | isDarwinTarget  = ("lib" ++ root) <.> "dylib"
1118  | isWindowsTarget = -- Win32 DLLs have no .dll extension here, because
1119                      -- addDLL tries both foo.dll and foo.drv
1120                      root
1121  | otherwise       = ("lib" ++ root) <.> "so"
1122
1123 -- Darwin / MacOS X only: load a framework
1124 -- a framework is a dynamic library packaged inside a directory of the same
1125 -- name. They are searched for in different paths than normal libraries.
1126 loadFramework :: [FilePath] -> FilePath -> IO (Maybe String)
1127 loadFramework extraPaths rootname
1128    = do { either_dir <- tryIO getHomeDirectory
1129         ; let homeFrameworkPath = case either_dir of
1130                                   Left _ -> []
1131                                   Right dir -> [dir ++ "/Library/Frameworks"]
1132               ps = extraPaths ++ homeFrameworkPath ++ defaultFrameworkPaths
1133         ; mb_fwk <- findFile mk_fwk ps
1134         ; case mb_fwk of
1135             Just fwk_path -> loadDLL fwk_path
1136             Nothing       -> return (Just "not found") }
1137                 -- Tried all our known library paths, but dlopen()
1138                 -- has no built-in paths for frameworks: give up
1139    where
1140      mk_fwk dir = dir </> (rootname ++ ".framework/" ++ rootname)
1141         -- sorry for the hardcoded paths, I hope they won't change anytime soon:
1142      defaultFrameworkPaths = ["/Library/Frameworks", "/System/Library/Frameworks"]
1143 \end{code}
1144
1145 %************************************************************************
1146 %*                                                                      *
1147                 Helper functions
1148 %*                                                                      *
1149 %************************************************************************
1150
1151 \begin{code}
1152 findFile :: (FilePath -> FilePath)      -- Maps a directory path to a file path
1153          -> [FilePath]                  -- Directories to look in
1154          -> IO (Maybe FilePath)         -- The first file path to match
1155 findFile _ [] 
1156   = return Nothing
1157 findFile mk_file_path (dir:dirs)
1158   = do  { let file_path = mk_file_path dir
1159         ; b <- doesFileExist file_path
1160         ; if b then 
1161              return (Just file_path)
1162           else
1163              findFile mk_file_path dirs }
1164 \end{code}
1165
1166 \begin{code}
1167 maybePutStr :: DynFlags -> String -> IO ()
1168 maybePutStr dflags s | verbosity dflags > 0 = putStr s
1169                      | otherwise            = return ()
1170
1171 maybePutStrLn :: DynFlags -> String -> IO ()
1172 maybePutStrLn dflags s | verbosity dflags > 0 = putStrLn s
1173                        | otherwise            = return ()
1174 \end{code}