[commit: ghc] ghc-8.6: plugins: search for .a files if necessary (d2cd150)

git at git.haskell.org git at git.haskell.org
Sun Oct 28 18:41:32 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : ghc-8.6
Link       : http://ghc.haskell.org/trac/ghc/changeset/d2cd150eda599d0de83fc687efc48e22a2e74a5e/ghc

>---------------------------------------------------------------

commit d2cd150eda599d0de83fc687efc48e22a2e74a5e
Author: sheaf <sam.derbyshire at gmail.com>
Date:   Sun Oct 28 12:30:13 2018 -0400

    plugins: search for .a files if necessary
    
    Summary:
    on windows, plugins are loaded via .a files,
    but those paths were not being searched when loading plugins
    
    Test Plan: ./validate
    
    Reviewers: Phyx, bgamari
    
    Reviewed By: Phyx
    
    Subscribers: RyanGlScott, rwbarton, carter
    
    GHC Trac Issues: #15700
    
    Differential Revision: https://phabricator.haskell.org/D5253
    
    (cherry picked from commit 70298db16c3f0ea4adb603ccb2b5e93eb9c7a556)


>---------------------------------------------------------------

d2cd150eda599d0de83fc687efc48e22a2e74a5e
 compiler/deSugar/DsUsage.hs | 78 ++++++++++++++++++++++-----------------------
 1 file changed, 38 insertions(+), 40 deletions(-)

diff --git a/compiler/deSugar/DsUsage.hs b/compiler/deSugar/DsUsage.hs
index 58c31ee..39b4855 100644
--- a/compiler/deSugar/DsUsage.hs
+++ b/compiler/deSugar/DsUsage.hs
@@ -140,7 +140,7 @@ with optimisations turned on, and give basically all binders an INLINE pragma.
 
 So instead:
 
-  * For plugins that were build locally: we store the filepath and hash of the
+  * For plugins that were built locally: we store the filepath and hash of the
     object files of the module with the `plugin` binder, and the object files of
     modules that are dependencies of the plugin module and belong to the same
     `UnitId` as the plugin
@@ -165,59 +165,57 @@ One way to improve this is to either:
 mkPluginUsage :: HscEnv -> ModIface -> IO [Usage]
 mkPluginUsage hsc_env pluginModule
   = case lookupPluginModuleWithSuggestions dflags pNm Nothing of
-    -- The plug is from an external package, we just look up the dylib that
-    -- contains the plugin
     LookupFound _ pkg -> do
+    -- The plugin is from an external package:
+    -- search for the library files containing the plugin.
       let searchPaths = collectLibraryPaths dflags [pkg]
-          libs        = packageHsLibs dflags pkg
-          dynlibLocs  = [ searchPath </> mkHsSOName platform lib
-                        | searchPath <- searchPaths
-                        , lib <- libs
-                        ]
-      dynlibs <- filterM doesFileExist dynlibLocs
-      case dynlibs of
-        [] -> pprPanic
-                ("mkPluginUsage: no dylibs, tried:\n" ++ unlines dynlibLocs)
-                (ppr pNm)
-        _  -> mapM hashFile (nub dynlibs)
+          useDyn = WayDyn `elem` ways dflags
+          suffix = if useDyn then soExt platform else "a"
+          libLocs = [ searchPath </> "lib" ++ libLoc <.> suffix
+                    | searchPath <- searchPaths
+                    , libLoc     <- packageHsLibs dflags pkg
+                    ]
+          -- we also try to find plugin library files by adding WayDyn way,
+          -- if it isn't already present (see trac #15492)
+          paths =
+            if useDyn
+              then libLocs
+              else
+                let dflags'  = updateWays (addWay' WayDyn dflags)
+                    dlibLocs = [ searchPath </> mkHsSOName platform dlibLoc
+                               | searchPath <- searchPaths
+                               , dlibLoc    <- packageHsLibs dflags' pkg
+                               ]
+                in libLocs ++ dlibLocs
+      files <- filterM doesFileExist paths
+      case files of
+        [] ->
+          pprPanic
+             ( "mkPluginUsage: missing plugin library, tried:\n"
+              ++ unlines paths
+             )
+             (ppr pNm)
+        _  -> mapM hashFile (nub files)
     _ -> do
       foundM <- findPluginModule hsc_env pNm
       case foundM of
-        -- The plugin was built locally, look up the object file containing
-        -- the `plugin` binder, and all object files belong to modules that are
-        -- transitive dependencies of the plugin that belong to the same package
+      -- The plugin was built locally: look up the object file containing
+      -- the `plugin` binder, and all object files belong to modules that are
+      -- transitive dependencies of the plugin that belong to the same package.
         Found ml _ -> do
-          pluginObject <- hashFile  (ml_obj_file ml)
+          pluginObject <- hashFile (ml_obj_file ml)
           depObjects   <- catMaybes <$> mapM lookupObjectFile deps
           return (nub (pluginObject : depObjects))
-        _ -> pprPanic "mkPluginUsage: no object or dylib" (ppr pNm)
+        _ -> pprPanic "mkPluginUsage: no object file found" (ppr pNm)
   where
-    -- plugins are shared libraries, so WayDyn should be part of the dflags in
-    -- order to get the correct filenames and library paths.
-    --
-    -- We can distinguish two scenarios:
-    --
-    -- 1. The dflags do not contain WayDyn, in this case we need to remove
-    --    all other ways and only add WayDyn. Why? Because other ways change
-    --    the library tags, i.e. WayProf adds `_p`, and we would end up looking
-    --    for a profiled plugin which might not be installed. See #15492
-    --
-    -- 2. The dflags do contain WayDyn, in this case we can leave the ways as
-    --    is, because the plugin must be compiled with the same ways as the
-    --    module that is currently being build, e.g., if the module is
-    --    build with WayDyn and WayProf, then the plugin that was used
-    --    would've also had to been build with WayProf (and WayDyn).
-    dflags1  = hsc_dflags hsc_env
-    dflags   = if WayDyn `elem` ways dflags1
-                 then dflags1
-                 else updateWays (addWay' WayDyn (dflags1 {ways = []}))
+    dflags   = hsc_dflags hsc_env
     platform = targetPlatform dflags
     pNm      = moduleName (mi_module pluginModule)
     pPkg     = moduleUnitId (mi_module pluginModule)
     deps     = map fst (dep_mods (mi_deps pluginModule))
 
-    -- loopup object file for a plugin dependencies from the same package as the
-    -- the plugin
+    -- Lookup object file for a plugin dependency,
+    -- from the same package as the plugin.
     lookupObjectFile nm = do
       foundM <- findImportedModule hsc_env nm Nothing
       case foundM of



More information about the ghc-commits mailing list