ghc-9.2.5: The GHC API
Safe HaskellSafe-Inferred



The loader

This module deals with the top-level issues of dynamic linking (loading), calling the object-code linker and the byte-code linker where necessary.



newtype Loader Source #



data LoaderState Source #




  • closure_env :: ClosureEnv

    Current global mapping from Names to their true values

  • itbl_env :: !ItblEnv

    The current global mapping from RdrNames of DataCons to info table addresses. When a new Unlinked is linked into the running image, or an existing module in the image is replaced, the itbl_env must be updated appropriately.

  • bcos_loaded :: ![Linkable]

    The currently loaded interpreted modules (home package)

  • objs_loaded :: ![Linkable]

    And the currently-loaded compiled modules (home package)

  • pkgs_loaded :: ![UnitId]

    The currently-loaded packages; always object code Held, as usual, in dependency order; though I am not sure if that is really important

  • temp_sos :: ![(FilePath, String)]

    We need to remember the name of previous temporary DLL/.so libraries so we can link them (see #10322)

initLoaderState :: Interp -> HscEnv -> IO () Source #

Initialise the dynamic linker. This entails

a) Calling the C initialisation procedure,

b) Loading any packages specified on the command line,

c) Loading any packages specified on the command line, now held in the -l options in v_Opt_l,

d) Loading any .o/.dll files specified on the command line, now held in ldInputs,

e) Loading any MacOS frameworks.

NOTE: This function is idempotent; if called more than once, it does nothing. This is useful in Template Haskell, where we call it before trying to link.

showLoaderState :: Interp -> IO SDoc Source #

Display the loader state.

Load & Unload

loadExpr :: Interp -> HscEnv -> SrcSpan -> UnlinkedBCO -> IO ForeignHValue Source #

Load a single expression, including first loading packages and modules that this expression depends on.

Raises an IO exception (ProgramError) if it can't find a compiled version of the dependents to load.

loadPackages :: Interp -> HscEnv -> [UnitId] -> IO () Source #

Load exactly the specified packages, and their dependents (unless of course they are already loaded). The dependents are loaded automatically, and it doesn't matter what order you specify the input packages.

loadName :: Interp -> HscEnv -> Name -> IO ForeignHValue Source #

Load the module containing the given Name and get its associated HValue.

Throws a ProgramError if loading fails or the name cannot be found.

unload Source #


:: Interp 
-> HscEnv 
-> [Linkable]

The linkables to *keep*.

-> IO () 

Unloading old objects ready for a new compilation sweep.

The compilation manager provides us with a list of linkables that it considers "stable", i.e. won't be recompiled this time around. For each of the modules current linked in memory,

  • if the linkable is stable (and it's the same one -- the user may have recompiled the module on the side), we keep it,
  • otherwise, we unload it.
  • we also implicitly unload all temporary bindings at this point.


withExtendedLoadedEnv :: ExceptionMonad m => Interp -> [(Name, ForeignHValue)] -> m a -> m a Source #

Temporarily extend the loaded env.