Cheng Shao pushed to branch wip/batch-loaddll at Glasgow Haskell Compiler / GHC

Commits:

1 changed file:

Changes:

  • compiler/GHC/Linker/Loader.hs
    1 1
     {-# LANGUAGE CPP #-}
    
    2 2
     {-# LANGUAGE RecordWildCards #-}
    
    3 3
     {-# LANGUAGE LambdaCase #-}
    
    4
    +{-# LANGUAGE ViewPatterns #-}
    
    4 5
     
    
    5 6
     --
    
    6 7
     --  (c) The University of Glasgow 2002-2006
    
    ... ... @@ -1132,33 +1133,57 @@ loadPackages interp hsc_env new_pkgs = do
    1132 1133
     
    
    1133 1134
     loadPackages' :: Interp -> HscEnv -> [UnitId] -> LoaderState -> IO LoaderState
    
    1134 1135
     loadPackages' interp hsc_env new_pks pls = do
    
    1135
    -    pkgs' <- link (pkgs_loaded pls) new_pks
    
    1136
    -    return $! pls { pkgs_loaded = pkgs'
    
    1136
    +  (reverse -> pkgs_info_list, pkgs_almost_loaded) <-
    
    1137
    +    downsweep
    
    1138
    +      ([], pkgs_loaded pls)
    
    1139
    +      new_pks
    
    1140
    +  let link_one pkgs new_pkg_info = do
    
    1141
    +        (hs_cls, extra_cls, loaded_dlls) <-
    
    1142
    +          loadPackage
    
    1143
    +            interp
    
    1144
    +            hsc_env
    
    1145
    +            new_pkg_info
    
    1146
    +        evaluate $
    
    1147
    +          adjustUDFM
    
    1148
    +            ( \old_pkg_info ->
    
    1149
    +                old_pkg_info
    
    1150
    +                  { loaded_pkg_hs_objs = hs_cls,
    
    1151
    +                    loaded_pkg_non_hs_objs = extra_cls,
    
    1152
    +                    loaded_pkg_hs_dlls = loaded_dlls
    
    1137 1153
                       }
    
    1154
    +            )
    
    1155
    +            pkgs
    
    1156
    +            (Packages.unitId new_pkg_info)
    
    1157
    +  pkgs_loaded' <- foldlM link_one pkgs_almost_loaded pkgs_info_list
    
    1158
    +  evaluate $ pls {pkgs_loaded = pkgs_loaded'}
    
    1138 1159
       where
    
    1139
    -     link :: PkgsLoaded -> [UnitId] -> IO PkgsLoaded
    
    1140
    -     link pkgs new_pkgs =
    
    1141
    -         foldM link_one pkgs new_pkgs
    
    1142
    -
    
    1143
    -     link_one pkgs new_pkg
    
    1144
    -        | new_pkg `elemUDFM` pkgs   -- Already linked
    
    1145
    -        = return pkgs
    
    1146
    -
    
    1147
    -        | Just pkg_cfg <- lookupUnitId (hsc_units hsc_env) new_pkg
    
    1148
    -        = do { let deps = unitDepends pkg_cfg
    
    1149
    -               -- Link dependents first
    
    1150
    -             ; pkgs' <- link pkgs deps
    
    1151
    -                -- Now link the package itself
    
    1152
    -             ; (hs_cls, extra_cls, loaded_dlls) <- loadPackage interp hsc_env pkg_cfg
    
    1153
    -             ; let trans_deps = unionManyUniqDSets [ addOneToUniqDSet (loaded_pkg_trans_deps loaded_pkg_info) dep_pkg
    
    1154
    -                                                   | dep_pkg <- deps
    
    1155
    -                                                   , Just loaded_pkg_info <- pure (lookupUDFM pkgs' dep_pkg)
    
    1156
    -                                                   ]
    
    1157
    -             ; return (addToUDFM pkgs' new_pkg (LoadedPkgInfo new_pkg hs_cls extra_cls loaded_dlls trans_deps)) }
    
    1158
    -
    
    1159
    -        | otherwise
    
    1160
    -        = throwGhcExceptionIO (CmdLineError ("unknown package: " ++ unpackFS (unitIdFS new_pkg)))
    
    1161
    -
    
    1160
    +    downsweep = foldlM downsweep_one
    
    1161
    +
    
    1162
    +    downsweep_one (pkgs_info_list, pkgs) new_pkg
    
    1163
    +      | new_pkg `elemUDFM` pkgs = pure (pkgs_info_list, pkgs)
    
    1164
    +      | Just new_pkg_info <- lookupUnitId (hsc_units hsc_env) new_pkg = do
    
    1165
    +          let new_pkg_deps = unitDepends new_pkg_info
    
    1166
    +          (pkgs_info_list', pkgs') <- downsweep (pkgs_info_list, pkgs) new_pkg_deps
    
    1167
    +          let new_pkg_trans_deps =
    
    1168
    +                unionManyUniqDSets
    
    1169
    +                  [ addOneToUniqDSet (loaded_pkg_trans_deps loaded_pkg_info) dep_pkg
    
    1170
    +                  | dep_pkg <- new_pkg_deps,
    
    1171
    +                    loaded_pkg_info <- maybeToList $ pkgs' `lookupUDFM` dep_pkg
    
    1172
    +                  ]
    
    1173
    +          pure
    
    1174
    +            ( new_pkg_info : pkgs_info_list',
    
    1175
    +              addToUDFM pkgs' new_pkg $
    
    1176
    +                LoadedPkgInfo
    
    1177
    +                  { loaded_pkg_uid = new_pkg,
    
    1178
    +                    loaded_pkg_hs_objs = [],
    
    1179
    +                    loaded_pkg_non_hs_objs = [],
    
    1180
    +                    loaded_pkg_hs_dlls = [],
    
    1181
    +                    loaded_pkg_trans_deps = new_pkg_trans_deps
    
    1182
    +                  }
    
    1183
    +            )
    
    1184
    +      | otherwise =
    
    1185
    +          throwGhcExceptionIO
    
    1186
    +            (CmdLineError ("unknown package: " ++ unpackFS (unitIdFS new_pkg)))
    
    1162 1187
     
    
    1163 1188
     loadPackage :: Interp -> HscEnv -> UnitInfo -> IO ([LibrarySpec], [LibrarySpec], [RemotePtr LoadedDLL])
    
    1164 1189
     loadPackage interp hsc_env pkg