ghc-lib 8.10.2.20200916 → 8.10.3.20201220
raw patch · 16 files changed
+349/−87 lines, 16 filesdep ~ghc-lib-parser
Dependency ranges changed: ghc-lib-parser
Files
- compiler/cmm/CmmParse.y +1/−0
- compiler/deSugar/DsForeign.hs +21/−10
- compiler/ghci/Linker.hs +69/−23
- compiler/llvmGen/LlvmCodeGen/Base.hs +12/−6
- compiler/main/DriverPipeline.hs +63/−5
- compiler/main/GhcMake.hs +1/−1
- compiler/main/SysTools.hs +12/−2
- compiler/main/SysTools/Settings.hs +5/−1
- compiler/main/SysTools/Tasks.hs +50/−0
- compiler/nativeGen/X86/CodeGen.hs +84/−14
- compiler/nativeGen/X86/Cond.hs +16/−16
- compiler/nativeGen/X86/Instr.hs +3/−2
- compiler/typecheck/TcSigs.hs +7/−3
- ghc-lib.cabal +2/−3
- ghc-lib/stage0/lib/ghcversion.h +1/−1
- ghc-lib/stage0/lib/settings +2/−0
compiler/cmm/CmmParse.y view
@@ -204,6 +204,7 @@ import GhcPrelude import qualified Prelude+import qualified Prelude -- for happy-generated code import GHC.StgToCmm.ExtCode import CmmCallConv
compiler/deSugar/DsForeign.hs view
@@ -86,15 +86,16 @@ dsForeigns' [] = return (NoStubs, nilOL) dsForeigns' fos = do+ mod <- getModule fives <- mapM do_ldecl fos let (hs, cs, idss, bindss) = unzip4 fives fe_ids = concat idss- fe_init_code = map foreignExportInitialiser fe_ids+ fe_init_code = foreignExportsInitialiser mod fe_ids -- return (ForeignStubs (vcat hs)- (vcat cs $$ vcat fe_init_code),+ (vcat cs $$ fe_init_code), foldr (appOL . toOL) nilOL bindss) where do_ldecl (dL->L loc decl) = putSrcSpanDs loc (do_decl decl)@@ -667,8 +668,8 @@ ] -foreignExportInitialiser :: Id -> SDoc-foreignExportInitialiser hs_fn =+foreignExportsInitialiser :: Module -> [Id] -> SDoc+foreignExportsInitialiser mod hs_fns = -- Initialise foreign exports by registering a stable pointer from an -- __attribute__((constructor)) function. -- The alternative is to do this from stginit functions generated in@@ -677,14 +678,24 @@ -- all modules that are imported directly or indirectly are actually used by -- the program. -- (this is bad for big umbrella modules like Graphics.Rendering.OpenGL)+ --+ -- See Note [Tracking foreign exports] in rts/ForeignExports.c vcat- [ text "static void stginit_export_" <> ppr hs_fn- <> text "() __attribute__((constructor));"- , text "static void stginit_export_" <> ppr hs_fn <> text "()"- , braces (text "foreignExportStablePtr"- <> parens (text "(StgPtr) &" <> ppr hs_fn <> text "_closure")- <> semi)+ [ text "static struct ForeignExportsList" <+> list_symbol <+> equals+ <+> braces (text ".exports = " <+> export_list) <> semi+ , text "static void " <> ctor_symbol <> text "(void)"+ <+> text " __attribute__((constructor));"+ , text "static void " <> ctor_symbol <> text "()"+ , braces (text "registerForeignExports" <> parens (char '&' <> list_symbol) <> semi) ]+ where+ mod_str = pprModuleName (moduleName mod)+ ctor_symbol = text "stginit_export_" <> mod_str+ list_symbol = text "stg_exports_" <> mod_str+ export_list = braces $ pprWithCommas closure_ptr hs_fns++ closure_ptr :: Id -> SDoc+ closure_ptr fn = text "(StgPtr) &" <> ppr fn <> text "_closure" mkHObj :: Type -> SDoc
compiler/ghci/Linker.hs view
@@ -913,20 +913,22 @@ ldInputs = concatMap (\l -> [ Option ("-l" ++ l) ]) (nub $ snd <$> temp_sos)- ++ concatMap (\lp -> [ Option ("-L" ++ lp)- , Option "-Xlinker"- , Option "-rpath"- , Option "-Xlinker"- , Option lp ])+ ++ concatMap (\lp -> Option ("-L" ++ lp)+ : if gopt Opt_RPath dflags+ then [ Option "-Xlinker"+ , Option "-rpath"+ , Option "-Xlinker"+ , Option lp ]+ else []) (nub $ fst <$> temp_sos) ++ concatMap- (\lp ->- [ Option ("-L" ++ lp)- , Option "-Xlinker"- , Option "-rpath"- , Option "-Xlinker"- , Option lp- ])+ (\lp -> Option ("-L" ++ lp)+ : if gopt Opt_RPath dflags+ then [ Option "-Xlinker"+ , Option "-rpath"+ , Option "-Xlinker"+ , Option lp ]+ else []) minus_big_ls -- See Note [-Xlinker -rpath vs -Wl,-rpath] ++ map (\l -> Option ("-l" ++ l)) minus_ls,@@ -1132,14 +1134,15 @@ where unloadObjs :: Linkable -> IO () unloadObjs lnk+ -- The RTS's PEi386 linker currently doesn't support unloading.+ | isWindowsHost = return ()+ | dynamicGhc = return () -- We don't do any cleanup when linking objects with the -- dynamic linker. Doing so introduces extra complexity for -- not much benefit. - -- Code unloading currently disabled due to instability.- -- See #16841.- | False -- otherwise+ | otherwise = mapM_ (unloadObj hsc_env) [f | DotO f <- linkableUnlinked lnk] -- The components of a BCO linkable may contain -- dot-o files. Which is very confusing.@@ -1147,7 +1150,6 @@ -- But the BCO parts can be unlinked just by -- letting go of them (plus of course depopulating -- the symbol table which is done in the main body)- | otherwise = return () -- see #16841 {- ********************************************************************** @@ -1677,6 +1679,38 @@ -- ---------------------------------------------------------------------------- -- Loading a dynamic library (dlopen()-ish on Unix, LoadLibrary-ish on Win32) +{-+Note [macOS Big Sur dynamic libraries]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++macOS Big Sur makes the following change to how frameworks are shipped+with the OS:++> New in macOS Big Sur 11 beta, the system ships with a built-in+> dynamic linker cache of all system-provided libraries. As part of+> this change, copies of dynamic libraries are no longer present on+> the filesystem. Code that attempts to check for dynamic library+> presence by looking for a file at a path or enumerating a directory+> will fail. Instead, check for library presence by attempting to+> dlopen() the path, which will correctly check for the library in the+> cache. (62986286)++(https://developer.apple.com/documentation/macos-release-notes/macos-big-sur-11-beta-release-notes/)++Therefore, the previous method of checking whether a library exists+before attempting to load it makes GHC.Runtime.Linker.loadFramework+fail to find frameworks installed at /System/Library/Frameworks.+Instead, any attempt to load a framework at runtime, such as by+passing -framework OpenGL to runghc or running code loading such a+framework with GHCi, fails with a 'not found' message.++GHC.Runtime.Linker.loadFramework now opportunistically loads the+framework libraries without checking for their existence first,+failing only if all attempts to load a given framework from any of the+various possible locations fail. See also #18446, which this change+addresses.+-}+ -- Darwin / MacOS X only: load a framework -- a framework is a dynamic library packaged inside a directory of the same -- name. They are searched for in different paths than normal libraries.@@ -1687,16 +1721,28 @@ Left _ -> [] Right dir -> [dir </> "Library/Frameworks"] ps = extraPaths ++ homeFrameworkPath ++ defaultFrameworkPaths- ; mb_fwk <- findFile ps fwk_file- ; case mb_fwk of- Just fwk_path -> loadDLL hsc_env fwk_path- Nothing -> return (Just "not found") }- -- Tried all our known library paths, but dlopen()- -- has no built-in paths for frameworks: give up+ ; errs <- findLoadDLL ps []+ ; return $ fmap (intercalate ", ") errs+ } where fwk_file = rootname <.> "framework" </> rootname- -- sorry for the hardcoded paths, I hope they won't change anytime soon:++ -- sorry for the hardcoded paths, I hope they won't change anytime soon: defaultFrameworkPaths = ["/Library/Frameworks", "/System/Library/Frameworks"]++ -- Try to call loadDLL for each candidate path.+ --+ -- See Note [macOS Big Sur dynamic libraries]+ findLoadDLL [] errs =+ -- Tried all our known library paths, but dlopen()+ -- has no built-in paths for frameworks: give up+ return $ Just errs+ findLoadDLL (p:ps) errs =+ do { dll <- loadDLL hsc_env (p </> fwk_file)+ ; case dll of+ Nothing -> return Nothing+ Just err -> findLoadDLL ps ((p ++ ": " ++ err):errs)+ } {- **********************************************************************
compiler/llvmGen/LlvmCodeGen/Base.hs view
@@ -475,13 +475,16 @@ ghcInternalFunctions :: LlvmM () ghcInternalFunctions = do dflags <- getDynFlags- mk "memcpy" i8Ptr [i8Ptr, i8Ptr, llvmWord dflags]- mk "memmove" i8Ptr [i8Ptr, i8Ptr, llvmWord dflags]- mk "memset" i8Ptr [i8Ptr, llvmWord dflags, llvmWord dflags]- mk "newSpark" (llvmWord dflags) [i8Ptr, i8Ptr]+ let w = llvmWord dflags+ cint = LMInt $ widthInBits $ cIntWidth dflags+ mk "memcmp" cint [i8Ptr, i8Ptr, w]+ mk "memcpy" i8Ptr [i8Ptr, i8Ptr, w]+ mk "memmove" i8Ptr [i8Ptr, i8Ptr, w]+ mk "memset" i8Ptr [i8Ptr, w, w]+ mk "newSpark" w [i8Ptr, i8Ptr] where mk n ret args = do- let n' = llvmDefLabel $ fsLit n+ let n' = fsLit n decl = LlvmFunctionDecl n' ExternallyVisible CC_Ccc ret FixedArgs (tysToParams args) Nothing renderLlvm $ ppLlvmFunctionDecl decl@@ -538,7 +541,10 @@ let mkGlbVar lbl ty = LMGlobalVar lbl (LMPointer ty) Private Nothing Nothing case m_ty of -- Directly reference if we have seen it already- Just ty -> return $ mkGlbVar (llvmDefLabel llvmLbl) ty Global+ Just ty -> do+ if llvmLbl `elem` (map fsLit ["newSpark", "memmove", "memcpy", "memcmp", "memset"])+ then return $ mkGlbVar (llvmLbl) ty Global+ else return $ mkGlbVar (llvmDefLabel llvmLbl) ty Global -- Otherwise use a forward alias of it Nothing -> do saveAlias llvmLbl
compiler/main/DriverPipeline.hs view
@@ -382,7 +382,56 @@ -- --------------------------------------------------------------------------- -- Link-+--+-- Note [Dynamic linking on macOS]+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+--+-- Since macOS Sierra (10.14), the dynamic system linker enforces+-- a limit on the Load Commands. Specifically the Load Command Size+-- Limit is at 32K (32768). The Load Commands contain the install+-- name, dependencies, runpaths, and a few other commands. We however+-- only have control over the install name, dependencies and runpaths.+--+-- The install name is the name by which this library will be+-- referenced. This is such that we do not need to bake in the full+-- absolute location of the library, and can move the library around.+--+-- The dependency commands contain the install names from of referenced+-- libraries. Thus if a libraries install name is @rpath/libHS...dylib,+-- that will end up as the dependency.+--+-- Finally we have the runpaths, which informs the linker about the+-- directories to search for the referenced dependencies.+--+-- The system linker can do recursive linking, however using only the+-- direct dependencies conflicts with ghc's ability to inline across+-- packages, and as such would end up with unresolved symbols.+--+-- Thus we will pass the full dependency closure to the linker, and then+-- ask the linker to remove any unused dynamic libraries (-dead_strip_dylibs).+--+-- We still need to add the relevant runpaths, for the dynamic linker to+-- lookup the referenced libraries though. The linker (ld64) does not+-- have any option to dead strip runpaths; which makes sense as runpaths+-- can be used for dependencies of dependencies as well.+--+-- The solution we then take in GHC is to not pass any runpaths to the+-- linker at link time, but inject them after the linking. For this to+-- work we'll need to ask the linker to create enough space in the header+-- to add more runpaths after the linking (-headerpad 8000).+--+-- After the library has been linked by $LD (usually ld64), we will use+-- otool to inspect the libraries left over after dead stripping, compute+-- the relevant runpaths, and inject them into the linked product using+-- the install_name_tool command.+--+-- This strategy should produce the smallest possible set of load commands+-- while still retaining some form of relocatability via runpaths.+--+-- The only way I can see to reduce the load command size further would be+-- by shortening the library names, or start putting libraries into the same+-- folders, such that one runpath would be sufficient for multiple/all+-- libraries. link :: GhcLink -- interactive or batch -> DynFlags -- dynamic flags -> Bool -- attempt linking in batch mode?@@ -1769,9 +1818,12 @@ rc_objs <- maybeCreateManifest dflags output_fn - let link = if staticLink- then SysTools.runLibtool- else SysTools.runLink+ let link dflags args | staticLink = SysTools.runLibtool dflags args+ | platformOS platform == OSDarwin+ = SysTools.runLink dflags args >> SysTools.runInjectRPaths dflags pkg_lib_paths output_fn+ | otherwise+ = SysTools.runLink dflags args+ link dflags ( map SysTools.Option verbFlags ++ [ SysTools.Option "-o"@@ -1838,7 +1890,13 @@ ++ pkg_link_opts ++ pkg_framework_opts ++ (if platformOS platform == OSDarwin- then [ "-Wl,-dead_strip_dylibs" ]+ -- dead_strip_dylibs, will remove unused dylibs, and thus save+ -- space in the load commands. The -headerpad is necessary so+ -- that we can inject more @rpath's later for the left over+ -- libraries during runInjectRpaths phase.+ --+ -- See Note [Dynamic linking on macOS].+ then [ "-Wl,-dead_strip_dylibs", "-Wl,-headerpad,8000" ] else []) ))
compiler/main/GhcMake.hs view
@@ -2185,7 +2185,7 @@ where condition ms = unboxed_tuples_or_sums (ms_hspp_opts ms) &&- not (gopt Opt_ByteCode (ms_hspp_opts ms)) &&+ not (gopt Opt_ByteCodeIfUnboxed (ms_hspp_opts ms)) && not (isBootSummary ms) unboxed_tuples_or_sums d = xopt LangExt.UnboxedTuples d || xopt LangExt.UnboxedSums d
compiler/main/SysTools.hs view
@@ -254,7 +254,10 @@ | ( osElfTarget (platformOS (targetPlatform dflags)) || osMachOTarget (platformOS (targetPlatform dflags)) ) && dynLibLoader dflags == SystemDependent &&- WayDyn `elem` ways dflags+ -- Only if we want dynamic libraries+ WayDyn `elem` ways dflags &&+ -- Only use RPath if we explicitly asked for it+ gopt Opt_RPath dflags = ["-L" ++ l, "-Xlinker", "-rpath", "-Xlinker", l] -- See Note [-Xlinker -rpath vs -Wl,-rpath] | otherwise = ["-L" ++ l]@@ -377,8 +380,15 @@ ++ map Option pkg_lib_path_opts ++ map Option pkg_link_opts ++ map Option pkg_framework_opts- ++ [ Option "-Wl,-dead_strip_dylibs" ]+ -- dead_strip_dylibs, will remove unused dylibs, and thus save+ -- space in the load commands. The -headerpad is necessary so+ -- that we can inject more @rpath's later for the leftover+ -- libraries in the runInjectRpaths phase below.+ --+ -- See Note [Dynamic linking on macOS]+ ++ [ Option "-Wl,-dead_strip_dylibs", Option "-Wl,-headerpad,8000" ] )+ runInjectRPaths dflags pkg_lib_paths output_fn _ -> do ------------------------------------------------------------------- -- Making a DSO
compiler/main/SysTools/Settings.hs view
@@ -119,6 +119,8 @@ windres_path <- getToolSetting "windres command" libtool_path <- getToolSetting "libtool command" ar_path <- getToolSetting "ar command"+ otool_path <- getToolSetting "otool command"+ install_name_tool_path <- getToolSetting "install_name_tool command" ranlib_path <- getToolSetting "ranlib command" -- TODO this side-effect doesn't belong here. Reading and parsing the settings@@ -141,7 +143,7 @@ as_args = map Option cc_args ld_prog = cc_prog ld_args = map Option (cc_args ++ words cc_link_args_str)- ld_r_prog <- getSetting "Merge objects command"+ ld_r_prog <- getToolSetting "Merge objects command" ld_r_args <- getSetting "Merge objects flags" llvmTarget <- getSetting "LLVM target"@@ -210,6 +212,8 @@ , toolSettings_pgm_windres = windres_path , toolSettings_pgm_libtool = libtool_path , toolSettings_pgm_ar = ar_path+ , toolSettings_pgm_otool = otool_path+ , toolSettings_pgm_install_name_tool = install_name_tool_path , toolSettings_pgm_ranlib = ranlib_path , toolSettings_pgm_lo = (lo_prog,[]) , toolSettings_pgm_lc = (lc_prog,[])
compiler/main/SysTools/Tasks.hs view
@@ -28,6 +28,10 @@ import SysTools.Process import SysTools.Info +import Control.Monad (join, forM, filterM)+import System.Directory (doesFileExist)+import System.FilePath ((</>))+ {- ************************************************************************ * *@@ -237,6 +241,41 @@ return Nothing) +-- | On macOS we rely on the linkers @-dead_strip_dylibs@ flag to remove unused+-- libraries from the dynamic library. We do this to reduce the number of load+-- commands that end up in the dylib, and has been limited to 32K (32768) since+-- macOS Sierra (10.14).+--+-- @-dead_strip_dylibs@ does not dead strip @-rpath@ entries, as such passing+-- @-l@ and @-rpath@ to the linker will result in the unnecesasry libraries not+-- being included in the load commands, however the @-rpath@ entries are all+-- forced to be included. This can lead to 100s of @-rpath@ entries being+-- included when only a handful of libraries end up being truely linked.+--+-- Thus after building the library, we run a fixup phase where we inject the+-- @-rpath@ for each found library (in the given library search paths) into the+-- dynamic library through @-add_rpath@.+--+-- See Note [Dynamic linking on macOS]+runInjectRPaths :: DynFlags -> [FilePath] -> FilePath -> IO ()+runInjectRPaths dflags lib_paths dylib = do+ info <- lines <$> askOtool dflags Nothing [Option "-L", Option dylib]+ -- filter the output for only the libraries. And then drop the @rpath prefix.+ let libs = fmap (drop 7) $ filter (isPrefixOf "@rpath") $ fmap (head.words) $ info+ -- find any pre-existing LC_PATH items+ info <- fmap words.lines <$> askOtool dflags Nothing [Option "-l", Option dylib]+ let paths = concatMap f info+ where f ("path":p:_) = [p]+ f _ = []+ lib_paths' = [ p | p <- lib_paths, not (p `elem` paths) ]+ -- only find those rpaths, that aren't already in the library.+ rpaths <- nub.sort.join <$> forM libs (\f -> filterM (\l -> doesFileExist (l </> f)) lib_paths')+ -- inject the rpaths+ case rpaths of+ [] -> return ()+ _ -> runInstallNameTool dflags $ map Option $ "-add_rpath":(intersperse "-add_rpath" rpaths) ++ [dylib]++ runLink :: DynFlags -> [Option] -> IO () runLink dflags args = traceToolCommand dflags "linker" $ do -- See Note [Run-time linker info]@@ -334,6 +373,17 @@ let ar = pgm_ar dflags runSomethingWith dflags "Ar" ar args $ \real_args -> readCreateProcessWithExitCode' (proc ar real_args){ cwd = mb_cwd }++askOtool :: DynFlags -> Maybe FilePath -> [Option] -> IO String+askOtool dflags mb_cwd args = do+ let otool = pgm_otool dflags+ runSomethingWith dflags "otool" otool args $ \real_args ->+ readCreateProcessWithExitCode' (proc otool real_args){ cwd = mb_cwd }++runInstallNameTool :: DynFlags -> [Option] -> IO ()+runInstallNameTool dflags args = do+ let tool = pgm_install_name_tool dflags+ runSomethingFiltered dflags id "Install Name Tool" tool args Nothing Nothing runRanlib :: DynFlags -> [Option] -> IO () runRanlib dflags args = traceToolCommand dflags "ranlib" $ do
compiler/nativeGen/X86/CodeGen.hs view
@@ -1804,7 +1804,36 @@ codes are set according to the supplied comparison operation. -} +{- Note [64-bit integer comparisons on 32-bit]+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + When doing these comparisons there are 2 kinds of+ comparisons.++ * Comparison for equality (or lack thereof)++ We use xor to check if high/low bits are+ equal. Then combine the results using or and+ perform a single conditional jump based on the+ result.++ * Other comparisons:++ We map all other comparisons to the >= operation.+ Why? Because it's easy to encode it with a single+ conditional jump.++ We do this by first computing [r1_lo - r2_lo]+ and use the carry flag to compute+ [r1_high - r2_high - CF].++ At which point if r1 >= r2 then the result will be+ positive. Otherwise negative so we can branch on this+ condition.++-}++ genCondBranch :: BlockId -- the source of the jump -> BlockId -- the true branch target@@ -1821,22 +1850,63 @@ -> NatM InstrBlock -- 64-bit integer comparisons on 32-bit+-- See Note [64-bit integer comparisons on 32-bit] genCondBranch' is32Bit _bid true false (CmmMachOp mop [e1,e2]) | is32Bit, Just W64 <- maybeIntComparison mop = do- ChildCode64 code1 r1_lo <- iselExpr64 e1- ChildCode64 code2 r2_lo <- iselExpr64 e2- let r1_hi = getHiVRegFromLo r1_lo- r2_hi = getHiVRegFromLo r2_lo- cond = machOpToCond mop- Just cond' = maybeFlipCond cond- --TODO: Update CFG for x86- let code = code1 `appOL` code2 `appOL` toOL [- CMP II32 (OpReg r2_hi) (OpReg r1_hi),- JXX cond true,- JXX cond' false,- CMP II32 (OpReg r2_lo) (OpReg r1_lo),- JXX cond true] `appOL` genBranch false- return code++ -- The resulting registers here are both the lower part of+ -- the register as well as a way to get at the higher part.+ ChildCode64 code1 r1 <- iselExpr64 e1+ ChildCode64 code2 r2 <- iselExpr64 e2+ let cond = machOpToCond mop :: Cond++ let cmpCode = intComparison cond true false r1 r2+ return $ code1 `appOL` code2 `appOL` cmpCode++ where+ intComparison :: Cond -> BlockId -> BlockId -> Reg -> Reg -> InstrBlock+ intComparison cond true false r1_lo r2_lo =+ case cond of+ -- Impossible results of machOpToCond+ ALWAYS -> panic "impossible"+ NEG -> panic "impossible"+ POS -> panic "impossible"+ CARRY -> panic "impossible"+ OFLO -> panic "impossible"+ PARITY -> panic "impossible"+ NOTPARITY -> panic "impossible"+ -- Special case #1 x == y and x != y+ EQQ -> cmpExact+ NE -> cmpExact+ -- [x >= y]+ GE -> cmpGE+ GEU -> cmpGE+ -- [x > y] <==> ![y >= x]+ GTT -> intComparison GE false true r2_lo r1_lo+ GU -> intComparison GEU false true r2_lo r1_lo+ -- [x <= y] <==> [y >= x]+ LE -> intComparison GE true false r2_lo r1_lo+ LEU -> intComparison GEU true false r2_lo r1_lo+ -- [x < y] <==> ![x >= x]+ LTT -> intComparison GE false true r1_lo r2_lo+ LU -> intComparison GEU false true r1_lo r2_lo+ where+ r1_hi = getHiVRegFromLo r1_lo+ r2_hi = getHiVRegFromLo r2_lo+ cmpExact :: OrdList Instr+ cmpExact =+ toOL+ [ XOR II32 (OpReg r2_hi) (OpReg r1_hi)+ , XOR II32 (OpReg r2_lo) (OpReg r1_lo)+ , OR II32 (OpReg r1_hi) (OpReg r1_lo)+ , JXX cond true+ , JXX ALWAYS false+ ]+ cmpGE = toOL+ [ CMP II32 (OpReg r2_lo) (OpReg r1_lo)+ , SBB II32 (OpReg r2_hi) (OpReg r1_hi)+ , JXX cond true+ , JXX ALWAYS false ] genCondBranch' _ bid id false bool = do CondCode is_float cond cond_code <- getCondCode bool
compiler/nativeGen/X86/Cond.hs view
@@ -13,22 +13,22 @@ data Cond = ALWAYS -- What's really used? ToDo- | EQQ- | GE- | GEU- | GTT- | GU- | LE- | LEU- | LTT- | LU- | NE- | NEG- | POS- | CARRY- | OFLO- | PARITY- | NOTPARITY+ | EQQ -- je/jz -> zf = 1+ | GE -- jge+ | GEU -- ae+ | GTT -- jg+ | GU -- ja+ | LE -- jle+ | LEU -- jbe+ | LTT -- jl+ | LU -- jb+ | NE -- jne+ | NEG -- js+ | POS -- jns+ | CARRY -- jc+ | OFLO -- jo+ | PARITY -- jp+ | NOTPARITY -- jnp deriving Eq condUnsigned :: Cond -> Bool
compiler/nativeGen/X86/Instr.hs view
@@ -819,13 +819,14 @@ -- In essense each allocation larger than a page size needs to be chunked and -- a probe emitted after each page allocation. You have to hit the guard -- page so the kernel can map in the next page, otherwise you'll segfault.+-- See Note [Windows stack allocations]. -- needs_probe_call :: Platform -> Int -> Bool needs_probe_call platform amount = case platformOS platform of OSMinGW32 -> case platformArch platform of ArchX86 -> amount > (4 * 1024)- ArchX86_64 -> amount > (8 * 1024)+ ArchX86_64 -> amount > (4 * 1024) _ -> False _ -> False @@ -849,7 +850,7 @@ -- -- We emit a call because the stack probes are quite involved and -- would bloat code size a lot. GHC doesn't really have an -Os.- -- __chkstk is guaranteed to leave all nonvolatile registers and AX+ -- ___chkstk is guaranteed to leave all nonvolatile registers and AX -- untouched. It's part of the standard prologue code for any Windows -- function dropping the stack more than a page. -- See Note [Windows stack layout]
compiler/typecheck/TcSigs.hs view
@@ -818,9 +818,13 @@ tcImpSpec :: (Name, Sig GhcRn) -> TcM [TcSpecPrag] tcImpSpec (name, prag) = do { id <- tcLookupId name- ; unless (isAnyInlinePragma (idInlinePragma id))- (addWarnTc NoReason (impSpecErr name))- ; tcSpecPrag id prag }+ ; if isAnyInlinePragma (idInlinePragma id)+ then tcSpecPrag id prag+ else do { addWarnTc NoReason (impSpecErr name)+ ; return [] } }+ -- If there is no INLINE/INLINABLE pragma there will be no unfolding. In+ -- that case, just delete the SPECIALISE pragma altogether, lest the+ -- desugarer fall over because it can't find the unfolding. See #18118. impSpecErr :: Name -> SDoc impSpecErr name
ghc-lib.cabal view
@@ -1,7 +1,7 @@ cabal-version: >=1.22 build-type: Simple name: ghc-lib-version: 8.10.2.20200916+version: 8.10.3.20201220 license: BSD3 license-file: LICENSE category: Development@@ -80,7 +80,7 @@ transformers == 0.5.*, process >= 1 && < 1.7, hpc == 0.6.*,- ghc-lib-parser == 8.10.2.20200916+ ghc-lib-parser == 8.10.3.20201220 build-tools: alex >= 3.1, happy >= 1.19.4 other-extensions: BangPatterns@@ -143,7 +143,6 @@ compiler/ghci compiler/main compiler/cmm- compiler/. compiler autogen-modules: Paths_ghc_lib
ghc-lib/stage0/lib/ghcversion.h view
@@ -5,7 +5,7 @@ # define __GLASGOW_HASKELL__ 810 #endif -#define __GLASGOW_HASKELL_PATCHLEVEL1__ 2+#define __GLASGOW_HASKELL_PATCHLEVEL1__ 3 #define MIN_VERSION_GLASGOW_HASKELL(ma,mi,pl1,pl2) (\ ((ma)*100+(mi)) < __GLASGOW_HASKELL__ || \
ghc-lib/stage0/lib/settings view
@@ -18,6 +18,8 @@ ,("ar flags", "qcls") ,("ar supports at file", "NO") ,("ranlib command", "ranlib")+,("otool command", "otool")+,("install_name_tool command", "install_name_tool") ,("touch command", "touch") ,("dllwrap command", "/bin/false") ,("windres command", "/bin/false")