From 94ef949ef8b52cebaf8d4a81d7a169e100da2a73 Mon Sep 17 00:00:00 2001 From: Cheng Shao <terrorjack@type.dance> Date: Fri, 4 Oct 2024 20:23:08 +0000 Subject: [PATCH] compiler: fix checkNonStdWay for targets that require dynamic libraries This commit fixes checkNonStdWay to ensure that for targets whose RTS linker can only load dynamic code, the dynamic way of object is selected. --- compiler/GHC/Linker/Deps.hs | 11 +++++++++++ compiler/GHC/Linker/Loader.hs | 1 + 2 files changed, 12 insertions(+) diff --git a/compiler/GHC/Linker/Deps.hs b/compiler/GHC/Linker/Deps.hs index e363d12d4d4..a52aabc80f6 100644 --- a/compiler/GHC/Linker/Deps.hs +++ b/compiler/GHC/Linker/Deps.hs @@ -59,6 +59,7 @@ import System.Directory data LinkDepsOpts = LinkDepsOpts { ldObjSuffix :: !String -- ^ Suffix of .o files + , ldForceDyn :: !Bool -- ^ Always use .dyn_o? , ldOneShotMode :: !Bool -- ^ Is the driver in one-shot mode? , ldModuleGraph :: !ModuleGraph , ldUnitEnv :: !UnitEnv @@ -351,6 +352,16 @@ throwProgramError opts doc = throwGhcExceptionIO (ProgramError (renderWithContex checkNonStdWay :: LinkDepsOpts -> Interp -> SrcSpan -> IO (Maybe FilePath) checkNonStdWay _opts interp _srcspan + -- On some targets (e.g. wasm) the RTS linker only supports loading + -- dynamic code, in which case we need to ensure the .dyn_o object + -- is picked (instead of .o which is also present because of + -- -dynamic-too) + | ldForceDyn _opts = do + let target_ways = fullWays $ ldWays _opts + pure $ if target_ways `hasWay` WayDyn + then Nothing + else Just $ waysTag (WayDyn `addWay` target_ways) ++ "_o" + | ExternalInterp {} <- interpInstance interp = return Nothing -- with -fexternal-interpreter we load the .o files, whatever way -- they were built. If they were built for a non-std way, then diff --git a/compiler/GHC/Linker/Loader.hs b/compiler/GHC/Linker/Loader.hs index c3f9a8de2e1..d05539c4612 100644 --- a/compiler/GHC/Linker/Loader.hs +++ b/compiler/GHC/Linker/Loader.hs @@ -639,6 +639,7 @@ initLinkDepsOpts hsc_env = opts where opts = LinkDepsOpts { ldObjSuffix = objectSuf dflags + , ldForceDyn = sTargetRTSLinkerOnlySupportsSharedLibs $ settings dflags , ldOneShotMode = isOneShot (ghcMode dflags) , ldModuleGraph = hsc_mod_graph hsc_env , ldUnitEnv = hsc_unit_env hsc_env -- GitLab