[Git][ghc/ghc] Deleted branch wip/jeltsch/querying-newline-modes
by Wolfgang Jeltsch (@jeltsch) 08 Jan '26
by Wolfgang Jeltsch (@jeltsch) 08 Jan '26
08 Jan '26
Wolfgang Jeltsch deleted branch wip/jeltsch/querying-newline-modes at Glasgow Haskell Compiler / GHC
--
You're receiving this email because of your account on gitlab.haskell.org.
1
0
07 Jan '26
Cheng Shao pushed new branch wip/iserv-keep-cafs-comment at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/iserv-keep-cafs-comment
You're receiving this email because of your account on gitlab.haskell.org.
1
0
07 Jan '26
Oleg Grenrus pushed new branch wip/labelThread-export at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/labelThread-export
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/T26724] 10 commits: Add missing InVar->OutVar lookup in SetLevels
by Simon Peyton Jones (@simonpj) 07 Jan '26
by Simon Peyton Jones (@simonpj) 07 Jan '26
07 Jan '26
Simon Peyton Jones pushed to branch wip/T26724 at Glasgow Haskell Compiler / GHC
Commits:
52d00c05 by Simon Peyton Jones at 2026-01-07T10:24:21-05:00
Add missing InVar->OutVar lookup in SetLevels
As #26681 showed, the SetLevels pass was failing to map an InVar to
an OutVar. Very silly! I'm amazed it hasn't broken before now.
I have improved the type singatures (to mention InVar and OutVar)
so it's more obvious what needs to happen.
- - - - -
ab0a5594 by Cheng Shao at 2026-01-07T10:25:04-05:00
hadrian: drop deprecated pkgHashSplitObjs code path
This patch drops deprecated `pkgHashSplitObjs` code path from hadrian,
since GHC itself has removed split objs support many versions ago and
this code path is unused.
- - - - -
bb3a2ba1 by Cheng Shao at 2026-01-07T10:25:44-05:00
hadrian: remove linting/assertion in quick-validate flavour
The `quick-validate` flavour is meant for testing ghc and passing the
testsuite locally with similar settings to `validate` but faster. This
patch removes the linting/assertion overhead in `quick-validate` to
improve developer experience. I also took the chance to simplify
redundant logic of rts/library way definition in `validate` flavour.
- - - - -
7971f5dd by Cheng Shao at 2026-01-07T10:26:26-05:00
deriveConstants: clean up unused constants
This patch cleans up unused constants from `deriveConstants`, they are
not used by C/Cmm code in the RTS, nor compiler-generated code.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
4df96993 by Cheng Shao at 2026-01-07T10:27:08-05:00
hadrian: pass -fno-omit-frame-pointer with +debug_info
This patch adds `-fno-omit-frame-pointer` as C/C++ compilation flag
when compiling with `+debug_info` flavour transformer. It's a sane
default when you care about debugging and reliable backtraces, and
makes debugging/profiling with bpf easier.
- - - - -
8a3900a3 by Aaron Allen at 2026-01-07T10:27:57-05:00
[26705] Include TyCl instances in data fam iface entry
Ensures dependent modules are recompiled when the class instances for a
data family instance change.
resolves #26705
- - - - -
a0b980af by Cheng Shao at 2026-01-07T10:28:38-05:00
hadrian: remove unused Hp2Ps/Hpc builders
This patch removes the Hp2Ps/Hpc builders from hadrian, they are
unused in the build system. Note that the hp2ps/hpc programs are still
built and not affected.
- - - - -
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
6a7b9938 by Simon Peyton Jones at 2026-01-07T17:43:30+00:00
Try harder to keep the substitution empty
Avoid unnecessary cloning of variables in the Simplifier.
Addresses #26724,
See Note [Keeping the substitution empty]
We get some big wins in compile time
Metrics: compile_time/bytes allocated
-------------------------------------
Baseline
Test Metric value New value Change
----------------------------------------------------------------------------
CoOpt_Singletons(normal) ghc/alloc 721,544,088 692,174,216 -4.1% GOOD
LargeRecord(normal) ghc/alloc 1,268,031,157 1,265,168,448 -0.2%
T14766(normal) ghc/alloc 918,218,533 688,432,296 -25.0% GOOD
T15703(normal) ghc/alloc 318,103,629 306,638,016 -3.6% GOOD
T17836(normal) ghc/alloc 419,174,584 418,400,824 -0.2%
T18478(normal) ghc/alloc 471,042,976 470,261,376 -0.2%
T20261(normal) ghc/alloc 573,387,162 563,663,336 -1.7%
T24984(normal) ghc/alloc 87,832,666 87,636,168 -0.2%
T25196(optasm) ghc/alloc 1,103,284,040 1,101,376,992 -0.2%
hard_hole_fits(normal) ghc/alloc 224,981,413 224,608,208 -0.2%
geo. mean -0.3%
minimum -25.0%
maximum +0.1%
Metric Decrease:
CoOpt_Singletons
T14766
T15703
- - - - -
21 changed files:
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Core/Subst.hs
- compiler/GHC/Core/TyCo/Subst.hs
- compiler/GHC/Iface/Recomp.hs
- hadrian/doc/flavours.md
- hadrian/src/Base.hs
- hadrian/src/Builder.hs
- hadrian/src/Flavour.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Settings/Flavours/Validate.hs
- + testsuite/tests/driver/recomp26705/M.hs
- + testsuite/tests/driver/recomp26705/M2A.hs
- + testsuite/tests/driver/recomp26705/M2B.hs
- + testsuite/tests/driver/recomp26705/Makefile
- + testsuite/tests/driver/recomp26705/all.T
- + testsuite/tests/driver/recomp26705/recomp26705.stderr
- + testsuite/tests/simplCore/should_compile/T26681.hs
- testsuite/tests/simplCore/should_compile/all.T
- utils/deriveConstants/Main.hs
Changes:
=====================================
compiler/GHC/Core/Opt/SetLevels.hs
=====================================
@@ -91,6 +91,7 @@ import GHC.Core.Utils
import GHC.Core.Opt.Arity ( exprBotStrictness_maybe, isOneShotBndr )
import GHC.Core.FVs -- all of it
import GHC.Core.Subst
+import GHC.Core.TyCo.Subst( lookupTyVar )
import GHC.Core.Make ( sortQuantVars )
import GHC.Core.Type ( Type, tyCoVarsOfType
, mightBeUnliftedType, closeOverKindsDSet
@@ -466,8 +467,8 @@ lvlCase env scrut_fvs scrut' case_bndr ty alts
ty' = substTyUnchecked (le_subst env) ty
incd_lvl = incMinorLvl (le_ctxt_lvl env)
- dest_lvl = maxFvLevel (const True) env scrut_fvs
- -- Don't abstract over type variables, hence const True
+ dest_lvl = maxFvLevel includeTyVars env scrut_fvs
+ -- Don't abstract over type variables, hence includeTyVars
lvl_alt alts_env (AnnAlt con bs rhs)
= do { rhs' <- lvlMFE new_env True rhs
@@ -719,8 +720,11 @@ hasFreeJoin :: LevelEnv -> DVarSet -> Bool
-- (In the latter case it won't be a join point any more.)
-- Not treating top-level ones specially had a massive effect
-- on nofib/minimax/Prog.prog
-hasFreeJoin env fvs
- = not (maxFvLevel isJoinId env fvs == tOP_LEVEL)
+hasFreeJoin env fvs = anyDVarSet bad_join fvs
+ where
+ bad_join v = isJoinId v &&
+ maxIn True env v tOP_LEVEL /= tOP_LEVEL
+
{- Note [Saving work]
~~~~~~~~~~~~~~~~~~~~~
@@ -1607,10 +1611,10 @@ destLevel env fvs fvs_ty is_function is_bot
| otherwise = max_fv_id_level
where
- max_fv_id_level = maxFvLevel isId env fvs -- Max over Ids only; the
- -- tyvars will be abstracted
+ max_fv_id_level = maxFvLevel idsOnly env fvs -- Max over Ids only; the
+ -- tyvars will be abstracted
- as_far_as_poss = maxFvLevel' isId env fvs_ty
+ as_far_as_poss = maxFvLevel' idsOnly env fvs_ty
-- See Note [Floating and kind casts]
{- Note [Floating and kind casts]
@@ -1768,28 +1772,47 @@ extendCaseBndrEnv le@(LE { le_subst = subst, le_env = id_env })
, le_env = add_id id_env (case_bndr, scrut_var) }
extendCaseBndrEnv env _ _ = env
-maxFvLevel :: (Var -> Bool) -> LevelEnv -> DVarSet -> Level
-maxFvLevel max_me env var_set
- = nonDetStrictFoldDVarSet (maxIn max_me env) tOP_LEVEL var_set
+includeTyVars, idsOnly :: Bool
+idsOnly = False
+includeTyVars = True
+
+maxFvLevel :: Bool -> LevelEnv -> DVarSet -> Level
+maxFvLevel include_tyvars env var_set
+ = nonDetStrictFoldDVarSet (maxIn include_tyvars env) tOP_LEVEL var_set
-- It's OK to use a non-deterministic fold here because maxIn commutes.
-maxFvLevel' :: (Var -> Bool) -> LevelEnv -> TyCoVarSet -> Level
+maxFvLevel' :: Bool -> LevelEnv -> TyCoVarSet -> Level
-- Same but for TyCoVarSet
-maxFvLevel' max_me env var_set
- = nonDetStrictFoldUniqSet (maxIn max_me env) tOP_LEVEL var_set
+maxFvLevel' include_tyvars env var_set
+ = nonDetStrictFoldUniqSet (maxIn include_tyvars env) tOP_LEVEL var_set
-- It's OK to use a non-deterministic fold here because maxIn commutes.
-maxIn :: (Var -> Bool) -> LevelEnv -> InVar -> Level -> Level
-maxIn max_me (LE { le_lvl_env = lvl_env, le_env = id_env }) in_var lvl
+maxIn :: Bool -> LevelEnv -> InVar -> Level -> Level
+-- True <=> include tyvars
+maxIn include_tyvars env@(LE { le_subst = subst, le_env = id_env }) in_var lvl
+ | isId in_var
= case lookupVarEnv id_env in_var of
+ Nothing -> maxOut env in_var lvl
Just (abs_vars, _) -> foldr max_out lvl abs_vars
- Nothing -> max_out in_var lvl
- where
- max_out out_var lvl
- | max_me out_var = case lookupVarEnv lvl_env out_var of
- Just lvl' -> maxLvl lvl' lvl
- Nothing -> lvl
- | otherwise = lvl -- Ignore some vars depending on max_me
+ where
+ max_out out_var lvl
+ | isTyVar out_var && not include_tyvars
+ = lvl
+ | otherwise = maxOut env out_var lvl
+
+ | include_tyvars -- TyVars
+ = case lookupTyVar subst in_var of
+ Just ty -> nonDetStrictFoldVarSet (maxOut env) lvl (tyCoVarsOfType ty)
+ Nothing -> maxOut env in_var lvl
+
+ | otherwise -- Ignore free tyvars
+ = lvl
+
+maxOut :: LevelEnv -> OutVar -> Level -> Level
+maxOut (LE { le_lvl_env = lvl_env }) out_var lvl
+ = case lookupVarEnv lvl_env out_var of
+ Just lvl' -> maxLvl lvl' lvl
+ Nothing -> lvl
lookupVar :: LevelEnv -> Id -> LevelledExpr
lookupVar le v = case lookupVarEnv (le_env le) v of
=====================================
compiler/GHC/Core/Subst.hs
=====================================
@@ -380,8 +380,10 @@ substIdBndr _doc rec_subst subst@(Subst in_scope env tvs cvs) old_id
old_ty = idType old_id
old_w = idMult old_id
- no_type_change = (isEmptyVarEnv tvs && isEmptyVarEnv cvs) ||
+ no_type_change = isEmptyTCvSubst subst ||
(noFreeVarsOfType old_ty && noFreeVarsOfType old_w)
+ -- isEmptyTCvSubst: see Note [Keeping the substitution empty]
+ -- in GHC.Core.TyCo.Subst
-- new_id has the right IdInfo
-- The lazy-set is because we're in a loop here, with
=====================================
compiler/GHC/Core/TyCo/Subst.hs
=====================================
@@ -960,7 +960,8 @@ substTyVarBndrUsing subst_fn subst@(Subst in_scope idenv tenv cenv) old_var
-- Assertion check that we are not capturing something in the substitution
old_ki = tyVarKind old_var
- no_kind_change = noFreeVarsOfType old_ki -- verify that kind is closed
+ no_kind_change = isEmptyTCvSubst subst || noFreeVarsOfType old_ki
+ -- isEmptyTCvSubst: see Note [Keeping the substitution empty]
no_change = no_kind_change && (new_var == old_var)
-- no_change means that the new_var is identical in
-- all respects to the old_var (same unique, same kind)
@@ -988,7 +989,8 @@ substCoVarBndrUsing subst_fn subst@(Subst in_scope idenv tenv cenv) old_var
(Subst (in_scope `extendInScopeSet` new_var) idenv tenv new_cenv, new_var)
where
new_co = mkCoVarCo new_var
- no_kind_change = noFreeVarsOfTypes [t1, t2]
+ no_kind_change = isEmptyTCvSubst subst || noFreeVarsOfTypes [t1, t2]
+ -- isEmptyTCvSubst: see Note [Keeping the substitution empty]
no_change = new_var == old_var && no_kind_change
new_cenv | no_change = delVarEnv cenv old_var
@@ -1034,3 +1036,22 @@ substTyCoBndr subst (Anon ty af) = (subst, Anon (substScaledTy subst ty
substTyCoBndr subst (Named (Bndr tv vis)) = (subst', Named (Bndr tv' vis))
where
(subst', tv') = substVarBndr subst tv
+
+{- Note [Keeping the substitution empty]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+A very common situation is where we run over a term doing no cloning,
+no substitution, nothing. In that case the TCvSubst will be empty, and
+it is /very/ valuable to /keep/ it empty:
+
+* It's wasted effort to build up an identity substitution mapping
+ [x:->x, y:->y].
+
+* When we come to a binder, if the incoming substitution is empty,
+ we can avoid substituting its type; and that in turn may mean that
+ the binder itself does not change and we don't need to extend the
+ substitution.
+
+* In the Simplifier we substitute over both types and coercions.
+ If the substitution is empty, this is a no-op -- but only if it
+ is empty!
+-}
=====================================
compiler/GHC/Iface/Recomp.hs
=====================================
@@ -1797,7 +1797,9 @@ declExtras fix_fn ann_fn rule_env inst_env fi_env dm_env complete_env decl
IfaceSynonym{} -> IfaceSynonymExtras (fix_fn n)
(ann_fn (AnnOccName n))
IfaceFamily{} -> IfaceFamilyExtras (fix_fn n)
- (map ifFamInstAxiom (lookupOccEnvL fi_env n))
+ (map ifFamInstAxiom (lookupOccEnvL fi_env n)
+ ++ map ifDFun (lookupOccEnvL inst_env n)
+ )
(ann_fn (AnnOccName n))
IfacePatSyn{} -> IfacePatSynExtras (fix_fn n) (lookup_complete_match n)
_other -> IfaceOtherDeclExtras
=====================================
hadrian/doc/flavours.md
=====================================
@@ -297,7 +297,11 @@ The supported transformers are listed below:
</tr>
<tr>
<td><code>assertions</code></td>
- <td>Build the stage2 compiler with assertions enabled. </td>
+ <td>Build the stage2 compiler with <code>-DDEBUG</code> assertions enabled. </td>
+ </tr>
+ <tr>
+ <td><code>assertions_stage1</code></td>
+ <td>Build the stage1 compiler with <code>-DDEBUG</code> assertions enabled. </td>
</tr>
<tr>
<td><code>fully_static</code></td>
=====================================
hadrian/src/Base.hs
=====================================
@@ -149,14 +149,10 @@ ghcLibDeps stage iplace = do
ps <- mapM (\f -> stageLibPath stage <&> (-/- f))
[ "llvm-targets"
, "llvm-passes"
- , "ghc-interp.js"
, "settings"
, "targets" -/- "default.target"
, "ghc-usage.txt"
, "ghci-usage.txt"
- , "dyld.mjs"
- , "post-link.mjs"
- , "prelude.mjs"
]
cxxStdLib <- systemCxxStdLibConfPath (PackageDbLoc stage iplace)
return (cxxStdLib : ps)
=====================================
hadrian/src/Builder.hs
=====================================
@@ -170,8 +170,6 @@ data Builder = Alex
| GhcPkg GhcPkgMode Stage
| Haddock HaddockMode
| Happy
- | Hp2Ps
- | Hpc
| HsCpp
| JsCpp
| Hsc2Hs Stage
@@ -211,10 +209,6 @@ builderProvenance = \case
Haddock _ -> context Stage1 haddock
Hsc2Hs _ -> context stage0Boot hsc2hs
Unlit -> context stage0Boot unlit
-
- -- Never used
- Hpc -> context Stage1 hpcBin
- Hp2Ps -> context stage0Boot hp2ps
_ -> Nothing
where
context s p = Just $ vanillaContext s p
=====================================
hadrian/src/Flavour.hs
=====================================
@@ -70,7 +70,8 @@ flavourTransformers = M.fromList
, "fully_static" =: fullyStatic
, "host_fully_static" =: hostFullyStatic
, "collect_timings" =: collectTimings
- , "assertions" =: enableAssertions
+ , "assertions" =: enableAssertions Stage2
+ , "assertions_stage1" =: enableAssertions Stage1
, "debug_ghc" =: debugGhc Stage2
, "debug_stage1_ghc" =: debugGhc Stage1
, "lint" =: enableLinting
@@ -169,10 +170,10 @@ werror =
-- | Build C and Haskell objects with debugging information.
enableDebugInfo :: Flavour -> Flavour
enableDebugInfo = addArgs $ notStage0 ? mconcat
- [ builder (Ghc CompileHs) ? pure ["-g3"]
- , builder (Ghc CompileCWithGhc) ? pure ["-optc-g3"]
- , builder (Ghc CompileCppWithGhc) ? pure ["-optcxx-g3"]
- , builder (Cc CompileC) ? arg "-g3"
+ [ builder (Ghc CompileHs) ? pure ["-g3", "-optc-fno-omit-frame-pointer"]
+ , builder (Ghc CompileCWithGhc) ? pure ["-optc-g3", "-optc-fno-omit-frame-pointer"]
+ , builder (Ghc CompileCppWithGhc) ? pure ["-optcxx-g3", "-optcxx-fno-omit-frame-pointer"]
+ , builder (Cc CompileC) ? pure ["-g3", "-fno-omit-frame-pointer"]
, builder (Cabal Setup) ? arg "--disable-library-stripping"
, builder (Cabal Setup) ? arg "--disable-executable-stripping"
]
@@ -393,12 +394,12 @@ enableLateCCS = addArgs
? ((Profiling `wayUnit`) <$> getWay)
? arg "-fprof-late"
--- | Enable assertions for the stage2 compiler
-enableAssertions :: Flavour -> Flavour
-enableAssertions flav = flav { ghcDebugAssertions = f }
+-- | Enable -DDEBUG assertions in the compiler, at a specified stage
+enableAssertions :: Stage -> Flavour -> Flavour
+enableAssertions stage flav = flav { ghcDebugAssertions = f }
where
- f Stage2 = True
- f st = ghcDebugAssertions flav st
+ f s | s == stage = True
+ | otherwise = ghcDebugAssertions flav s
-- | Build the stage3 compiler using the non-moving GC.
enableBootNonmovingGc :: Flavour -> Flavour
=====================================
hadrian/src/Hadrian/Haskell/Hash.hs
=====================================
@@ -84,7 +84,6 @@ data PackageHashConfigInputs = PackageHashConfigInputs {
pkgHashDynExe :: Bool,
pkgHashProfLib :: Bool,
pkgHashProfExe :: Bool,
- pkgHashSplitObjs :: Bool,
pkgHashSplitSections :: Bool,
pkgHashStripLibs :: Bool,
pkgHashStripExes :: Bool,
@@ -140,7 +139,6 @@ pkgHashOracle = void $ addOracleCache $ \(PkgHashKey (stag, pkg)) -> do
pkgHashDynExe = dyn_ghc
pkgHashProfLib = profiling `Set.member` libWays
pkgHashProfExe = pkg == ghc && ghcProfiled flav stag
- pkgHashSplitObjs = False -- Deprecated
pkgHashSplitSections = ghcSplitSections flav
pkgHashStripExes = False
pkgHashStripLibs = False
@@ -239,7 +237,6 @@ renderPackageHashInputs PackageHashInputs{
, opt "dynamic-exe" False show pkgHashDynExe
, opt "prof-lib" False show pkgHashProfLib
, opt "prof-exe" False show pkgHashProfExe
- , opt "split-objs" False show pkgHashSplitObjs
, opt "split-sections" False show pkgHashSplitSections
, opt "stripped-lib" False show pkgHashStripLibs
, opt "stripped-exe" True show pkgHashStripExes
=====================================
hadrian/src/Oracles/Setting.hs
=====================================
@@ -9,7 +9,7 @@ module Oracles.Setting (
-- ** Target platform things
anyTargetOs, anyTargetArch, anyHostOs,
- isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isArmTarget,
+ isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isWasmTarget, isArmTarget,
isWinHost,
targetArmVersion
) where
@@ -128,6 +128,9 @@ isWinTarget = anyTargetOs [OSMinGW32]
isJsTarget :: Action Bool
isJsTarget = anyTargetArch [ArchJavaScript]
+isWasmTarget :: Action Bool
+isWasmTarget = anyTargetArch [ArchWasm32]
+
isOsxTarget :: Action Bool
isOsxTarget = anyTargetOs [OSDarwin]
=====================================
hadrian/src/Rules/Register.hs
=====================================
@@ -118,7 +118,18 @@ registerPackageRules rs stage iplace = do
pkgName <- getPackageNameFromConfFile conf
let pkg = unsafeFindPackageByName pkgName
- when (pkg == compiler) $ need =<< ghcLibDeps stage iplace
+ when (pkg == compiler) $ do
+ baseDeps <- ghcLibDeps stage iplace
+ jsTarget <- isJsTarget
+ wasmTarget <- isWasmTarget
+ libPath <- stageLibPath stage
+ let jsDeps
+ | jsTarget = ["ghc-interp.js"]
+ | otherwise = []
+ wasmDeps
+ | wasmTarget = ["dyld.mjs", "post-link.mjs", "prelude.mjs"]
+ | otherwise = []
+ need (baseDeps ++ map (libPath -/-) (jsDeps ++ wasmDeps))
-- Only used in guard when Stage0 {} but can be GlobalLibs or InTreeLibs
isBoot <- (pkg `notElem`) <$> stagePackages stage
=====================================
hadrian/src/Settings/Flavours/Validate.hs
=====================================
@@ -1,31 +1,16 @@
module Settings.Flavours.Validate (validateFlavour, slowValidateFlavour,
quickValidateFlavour) where
-import qualified Data.Set as Set
import Expression
import Flavour
-import Oracles.Flag
import {-# SOURCE #-} Settings.Default
-- Please update doc/flavours.md when changing this file.
validateFlavour :: Flavour
-validateFlavour = enableLinting $ werror $ defaultFlavour
+validateFlavour = enableLinting $ quickValidateFlavour
{ name = "validate"
, extraArgs = validateArgs <> defaultHaddockExtraArgs
- , libraryWays = Set.fromList <$>
- mconcat [ pure [vanilla]
- , notStage0 ? platformSupportsSharedLibs ? pure [dynamic]
- ]
- , rtsWays = Set.fromList <$>
- mconcat [ pure [vanilla, debug]
- , targetSupportsThreadedRts ? pure [threaded, threadedDebug]
- , notStage0 ? platformSupportsSharedLibs ? pure
- [ dynamic, debugDynamic
- ]
- , notStage0 ? platformSupportsSharedLibs ? targetSupportsThreadedRts ? pure
- [ threadedDynamic, threadedDebugDynamic ]
- ]
, ghcDebugAssertions = (<= Stage1)
}
@@ -59,6 +44,6 @@ quickValidateArgs = sourceArgs SourceArgs
}
quickValidateFlavour :: Flavour
-quickValidateFlavour = werror $ validateFlavour
+quickValidateFlavour = werror $ disableProfiledLibs $ defaultFlavour
{ name = "quick-validate"
, extraArgs = quickValidateArgs }
=====================================
testsuite/tests/driver/recomp26705/M.hs
=====================================
@@ -0,0 +1,5 @@
+module M where
+import M2
+
+x :: TD () -> String
+x = show
=====================================
testsuite/tests/driver/recomp26705/M2A.hs
=====================================
@@ -0,0 +1,7 @@
+{-# LANGUAGE TypeFamilies #-}
+module M2 where
+
+data family TD a
+
+data instance TD () = TDI
+ deriving Show
=====================================
testsuite/tests/driver/recomp26705/M2B.hs
=====================================
@@ -0,0 +1,6 @@
+{-# LANGUAGE TypeFamilies #-}
+module M2 where
+
+data family TD a
+
+data instance TD () = TDI
=====================================
testsuite/tests/driver/recomp26705/Makefile
=====================================
@@ -0,0 +1,13 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+# Recompilation tests
+
+recomp26705:
+ cp M2A.hs M2.hs
+ '$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs
+ sleep 1
+ cp M2B.hs M2.hs
+ # This should fail
+ if '$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs; then false; fi
=====================================
testsuite/tests/driver/recomp26705/all.T
=====================================
@@ -0,0 +1,3 @@
+test('recomp26705', [extra_files(['M2A.hs', 'M.hs', 'M2B.hs']),
+ when(fast(), skip), ignore_stdout],
+ makefile_test, [])
=====================================
testsuite/tests/driver/recomp26705/recomp26705.stderr
=====================================
@@ -0,0 +1,5 @@
+M.hs:5:5: error: [GHC-39999]
+ • No instance for ‘Show (TD ())’ arising from a use of ‘show’
+ • In the expression: show
+ In an equation for ‘x’: x = show
+
=====================================
testsuite/tests/simplCore/should_compile/T26681.hs
=====================================
@@ -0,0 +1,47 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneKindSignatures #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module T26681 where
+
+import Data.Kind (Type)
+import Data.Type.Equality
+import GHC.TypeLits
+import qualified Unsafe.Coerce
+
+
+{-# NOINLINE unsafeCoerceRefl #-}
+unsafeCoerceRefl :: a :~: b
+unsafeCoerceRefl = Unsafe.Coerce.unsafeCoerce Refl
+
+type family MapJust l where
+ MapJust '[] = '[]
+ MapJust (x : xs) = Just x : MapJust xs
+
+type family Tail l where
+ Tail (_ : xs) = xs
+
+lemMapJustCons :: MapJust sh :~: Just n : sh' -> sh :~: n : Tail sh
+lemMapJustCons Refl = unsafeCoerceRefl
+
+
+type ListX :: [Maybe Nat] -> (Maybe Nat -> Type) -> Type
+data ListX sh f where
+ ConsX :: !(f n) -> ListX (n : sh) f
+
+
+data JustN n where
+ JustN :: JustN (Just n)
+
+data UnconsListSRes f sh1 = forall n sh. (n : sh ~ sh1) => UnconsListSRes
+
+listsUncons :: forall sh1 f. ListX (MapJust sh1) JustN -> UnconsListSRes f sh1
+listsUncons (ConsX JustN)
+ | Refl <- lemMapJustCons @sh1 Refl
+ = UnconsListSRes
=====================================
testsuite/tests/simplCore/should_compile/all.T
=====================================
@@ -563,3 +563,4 @@ test('T26115', [grep_errmsg(r'DFun')], compile, ['-O -ddump-simpl -dsuppress-uni
test('T26116', normal, compile, ['-O -ddump-rules'])
test('T26117', [grep_errmsg(r'==')], compile, ['-O -ddump-simpl -dsuppress-uniques'])
test('T26349', normal, compile, ['-O -ddump-rules'])
+test('T26681', normal, compile, ['-O'])
=====================================
utils/deriveConstants/Main.hs
=====================================
@@ -397,7 +397,6 @@ wanteds os = concat
,fieldOffset Both "StgRegTable" "rHpAlloc"
,structField C "StgRegTable" "rCurrentAlloc"
,structField C "StgRegTable" "rRet"
- ,structField C "StgRegTable" "rNursery"
,defIntOffset Both "stgEagerBlackholeInfo"
"FUN_OFFSET(stgEagerBlackholeInfo)"
@@ -405,7 +404,6 @@ wanteds os = concat
,defIntOffset Both "stgGCFun" "FUN_OFFSET(stgGCFun)"
,fieldOffset Both "Capability" "r"
- ,fieldOffset C "Capability" "lock"
,structField C "Capability" "no"
,structField C "Capability" "mut_lists"
,structField C "Capability" "context_switch"
@@ -424,18 +422,11 @@ wanteds os = concat
,structField C "bdescr" "link"
,structField Both "bdescr" "flags"
- ,structSize C "generation"
,structField C "generation" "n_new_large_words"
- ,structField C "generation" "weak_ptr_list"
,structSize Both "CostCentreStack"
- ,structField C "CostCentreStack" "ccsID"
,structFieldH Both "CostCentreStack" "mem_alloc"
,structFieldH Both "CostCentreStack" "scc_count"
- ,structField C "CostCentreStack" "prevStack"
-
- ,structField C "CostCentre" "ccID"
- ,structField C "CostCentre" "link"
,structField C "StgHeader" "info"
,structField_ Both "StgHeader_ccs" "StgHeader" "prof.ccs"
@@ -472,18 +463,14 @@ wanteds os = concat
,closurePayload C "StgArrBytes" "payload"
,closureField C "StgTSO" "_link"
- ,closureField C "StgTSO" "global_link"
,closureField C "StgTSO" "what_next"
,closureField C "StgTSO" "why_blocked"
,closureField C "StgTSO" "block_info"
,closureField C "StgTSO" "blocked_exceptions"
,closureField C "StgTSO" "id"
,closureField C "StgTSO" "cap"
- ,closureField C "StgTSO" "saved_errno"
,closureField C "StgTSO" "trec"
,closureField C "StgTSO" "flags"
- ,closureField C "StgTSO" "dirty"
- ,closureField C "StgTSO" "bq"
,closureField C "StgTSO" "label"
,closureField C "StgTSO" "bound"
,closureField Both "StgTSO" "alloc_limit"
@@ -496,8 +483,6 @@ wanteds os = concat
,closureField C "StgStack" "dirty"
,closureField C "StgStack" "marking"
- ,structSize C "StgTSOProfInfo"
-
,closureField Both "StgUpdateFrame" "updatee"
,closureField Both "StgOrigThunkInfoFrame" "info_ptr"
@@ -519,19 +504,15 @@ wanteds os = concat
,closureFieldGcptr C "StgAP" "fun"
,closurePayload C "StgAP" "payload"
- ,thunkSize C "StgAP_STACK"
,closureField C "StgAP_STACK" "size"
,closureFieldGcptr C "StgAP_STACK" "fun"
,closurePayload C "StgAP_STACK" "payload"
- ,closureSize C "StgContinuation"
,closureField C "StgContinuation" "apply_mask_frame"
,closureField C "StgContinuation" "mask_frame_offset"
,closureField C "StgContinuation" "stack_size"
,closurePayload C "StgContinuation" "stack"
- ,thunkSize C "StgSelector"
-
,closureFieldGcptr C "StgInd" "indirectee"
,closureSize C "StgMutVar"
@@ -552,10 +533,6 @@ wanteds os = concat
,closureField C "StgCatchRetryFrame" "first_code"
,closureField C "StgCatchRetryFrame" "alt_code"
- ,closureField C "StgTVarWatchQueue" "closure"
- ,closureField C "StgTVarWatchQueue" "next_queue_entry"
- ,closureField C "StgTVarWatchQueue" "prev_queue_entry"
-
,closureSize C "StgTVar"
,closureField C "StgTVar" "current_value"
,closureField C "StgTVar" "first_watch_queue_entry"
@@ -595,29 +572,19 @@ wanteds os = concat
,closureSize C "StgStableName"
,closureField C "StgStableName" "sn"
- ,closureSize C "StgBlockingQueue"
- ,closureField C "StgBlockingQueue" "bh"
- ,closureField C "StgBlockingQueue" "owner"
- ,closureField C "StgBlockingQueue" "queue"
- ,closureField C "StgBlockingQueue" "link"
-
,closureSize C "MessageBlackHole"
,closureField C "MessageBlackHole" "link"
,closureField C "MessageBlackHole" "tso"
,closureField C "MessageBlackHole" "bh"
- ,closureSize C "StgCompactNFData"
,closureField C "StgCompactNFData" "totalW"
- ,closureField C "StgCompactNFData" "autoBlockW"
,closureField C "StgCompactNFData" "nursery"
- ,closureField C "StgCompactNFData" "last"
,closureField C "StgCompactNFData" "hp"
,closureField C "StgCompactNFData" "hpLim"
,closureField C "StgCompactNFData" "hash"
,closureField C "StgCompactNFData" "result"
,structSize C "StgCompactNFDataBlock"
- ,structField C "StgCompactNFDataBlock" "self"
,structField C "StgCompactNFDataBlock" "owner"
,structField C "StgCompactNFDataBlock" "next"
@@ -635,10 +602,7 @@ wanteds os = concat
"RTS_FLAGS" "DebugFlags.zero_on_gc"
,structField_ C "RtsFlags_GcFlags_initialStkSize"
"RTS_FLAGS" "GcFlags.initialStkSize"
- ,structField_ C "RtsFlags_MiscFlags_tickInterval"
- "RTS_FLAGS" "MiscFlags.tickInterval"
- ,structSize C "StgFunInfoExtraFwd"
,structField C "StgFunInfoExtraFwd" "slow_apply"
,structField C "StgFunInfoExtraFwd" "fun_type"
,structFieldH Both "StgFunInfoExtraFwd" "arity"
@@ -652,11 +616,9 @@ wanteds os = concat
,structField_ C "StgFunInfoExtraRev_bitmap_offset" "StgFunInfoExtraRev" "b.bitmap_offset"
,structField C "StgLargeBitmap" "size"
- ,fieldOffset C "StgLargeBitmap" "bitmap"
,structSize C "snEntry"
,structField C "snEntry" "sn_obj"
- ,structField C "snEntry" "addr"
,structSize C "spEntry"
,structField C "spEntry" "addr"
@@ -672,51 +634,15 @@ wanteds os = concat
else []
-- struct HsIface
- ,structField C "HsIface" "processRemoteCompletion_closure"
- ,structField C "HsIface" "runIO_closure"
- ,structField C "HsIface" "runNonIO_closure"
,structField C "HsIface" "Z0T_closure"
,structField C "HsIface" "True_closure"
,structField C "HsIface" "False_closure"
- ,structField C "HsIface" "unpackCString_closure"
- ,structField C "HsIface" "runFinalizzerBatch_closure"
- ,structField C "HsIface" "stackOverflow_closure"
,structField C "HsIface" "heapOverflow_closure"
- ,structField C "HsIface" "allocationLimitExceeded_closure"
- ,structField C "HsIface" "blockedIndefinitelyOnMVar_closure"
- ,structField C "HsIface" "blockedIndefinitelyOnSTM_closure"
,structField C "HsIface" "cannotCompactFunction_closure"
,structField C "HsIface" "cannotCompactPinned_closure"
,structField C "HsIface" "cannotCompactMutable_closure"
- ,structField C "HsIface" "nonTermination_closure"
,structField C "HsIface" "nestedAtomically_closure"
,structField C "HsIface" "noMatchingContinuationPrompt_closure"
- ,structField C "HsIface" "blockedOnBadFD_closure"
- ,structField C "HsIface" "runSparks_closure"
- ,structField C "HsIface" "ensureIOManagerIsRunning_closure"
- ,structField C "HsIface" "interruptIOManager_closure"
- ,structField C "HsIface" "ioManagerCapabilitiesChanged_closure"
- ,structField C "HsIface" "runHandlersPtr_closure"
- ,structField C "HsIface" "flushStdHandles_closure"
- ,structField C "HsIface" "runMainIO_closure"
- ,structField C "HsIface" "Czh_con_info"
- ,structField C "HsIface" "Izh_con_info"
- ,structField C "HsIface" "Fzh_con_info"
- ,structField C "HsIface" "Dzh_con_info"
- ,structField C "HsIface" "Wzh_con_info"
- ,structField C "HsIface" "runAllocationLimitHandler_closure"
- ,structField C "HsIface" "Ptr_con_info"
- ,structField C "HsIface" "FunPtr_con_info"
- ,structField C "HsIface" "I8zh_con_info"
- ,structField C "HsIface" "I16zh_con_info"
- ,structField C "HsIface" "I32zh_con_info"
- ,structField C "HsIface" "I64zh_con_info"
- ,structField C "HsIface" "W8zh_con_info"
- ,structField C "HsIface" "W16zh_con_info"
- ,structField C "HsIface" "W32zh_con_info"
- ,structField C "HsIface" "W64zh_con_info"
- ,structField C "HsIface" "StablePtr_con_info"
- ,structField C "HsIface" "StackSnapshot_closure"
,structField C "HsIface" "divZZeroException_closure"
,structField C "HsIface" "underflowException_closure"
,structField C "HsIface" "overflowException_closure"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/edf9ed5f83093b0243929f7bb4974a…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/edf9ed5f83093b0243929f7bb4974a…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/T26682] 17 commits: compiler: add targetHasRTSWays function
by Simon Peyton Jones (@simonpj) 07 Jan '26
by Simon Peyton Jones (@simonpj) 07 Jan '26
07 Jan '26
Simon Peyton Jones pushed to branch wip/T26682 at Glasgow Haskell Compiler / GHC
Commits:
69e0ab59 by Cheng Shao at 2026-01-06T19:37:56-05:00
compiler: add targetHasRTSWays function
This commit adds a `targetHasRTSWays` util function in
`GHC.Driver.Session` to query if the target RTS has a given Ways (e.g.
WayThreaded).
- - - - -
25a0ab94 by Cheng Shao at 2026-01-06T19:37:56-05:00
compiler: link on-demand external interpreter with threaded RTS
This commit makes the compiler link the on-demand external interpreter
program with threaded RTS if it is available in the target RTS ways.
This is a better default than the previous single-threaded RTS, and it
enables the external interpreter to benefit from parallelism when
deserializing CreateBCOs messages.
- - - - -
92404a2b by Cheng Shao at 2026-01-06T19:37:56-05:00
hadrian: link iserv with threaded RTS
This commit makes hadrian link iserv with threaded RTS if it's
available in the RTS ways. Also cleans up the iserv main C program
which can be replaced by the `-fkeep-cafs` link-time option.
- - - - -
a20542d2 by Cheng Shao at 2026-01-06T19:38:38-05:00
ghc-internal: remove unused GMP macros
This patch removes unused GMP related macros from `ghc-internal`. The
in-tree GMP version was hard coded and outdated, but it was not used
anywhere anyway.
- - - - -
4079dcd6 by Cheng Shao at 2026-01-06T19:38:38-05:00
hadrian: fix in-tree gmp configure error on newer c compilers
Building in-tree gmp on newer c compilers that default to c23 fails at
configure stage, this patch fixes it, see added comment for
explanation.
- - - - -
414d1fe1 by Cheng Shao at 2026-01-06T19:39:20-05:00
compiler: fix LLVM backend pdep/pext handling for i386 target
This patch fixes LLVM backend's pdep/pext handling for i386 target,
and also removes non-existent 128/256/512 bit hs_pdep/hs_pext callees.
See amended note for more explanation. Fixes #26450.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
c7f6fba3 by Cheng Shao at 2026-01-06T19:39:20-05:00
ci: remove allow_failure flag for i386 alpine job
The LLVM codegen issue for i386 has been fixed, and the i386 alpine
job should pass now. This commit removes the allow_failure flag so
that other i386 regressions in the future are signaled more timely.
- - - - -
52d00c05 by Simon Peyton Jones at 2026-01-07T10:24:21-05:00
Add missing InVar->OutVar lookup in SetLevels
As #26681 showed, the SetLevels pass was failing to map an InVar to
an OutVar. Very silly! I'm amazed it hasn't broken before now.
I have improved the type singatures (to mention InVar and OutVar)
so it's more obvious what needs to happen.
- - - - -
ab0a5594 by Cheng Shao at 2026-01-07T10:25:04-05:00
hadrian: drop deprecated pkgHashSplitObjs code path
This patch drops deprecated `pkgHashSplitObjs` code path from hadrian,
since GHC itself has removed split objs support many versions ago and
this code path is unused.
- - - - -
bb3a2ba1 by Cheng Shao at 2026-01-07T10:25:44-05:00
hadrian: remove linting/assertion in quick-validate flavour
The `quick-validate` flavour is meant for testing ghc and passing the
testsuite locally with similar settings to `validate` but faster. This
patch removes the linting/assertion overhead in `quick-validate` to
improve developer experience. I also took the chance to simplify
redundant logic of rts/library way definition in `validate` flavour.
- - - - -
7971f5dd by Cheng Shao at 2026-01-07T10:26:26-05:00
deriveConstants: clean up unused constants
This patch cleans up unused constants from `deriveConstants`, they are
not used by C/Cmm code in the RTS, nor compiler-generated code.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
4df96993 by Cheng Shao at 2026-01-07T10:27:08-05:00
hadrian: pass -fno-omit-frame-pointer with +debug_info
This patch adds `-fno-omit-frame-pointer` as C/C++ compilation flag
when compiling with `+debug_info` flavour transformer. It's a sane
default when you care about debugging and reliable backtraces, and
makes debugging/profiling with bpf easier.
- - - - -
8a3900a3 by Aaron Allen at 2026-01-07T10:27:57-05:00
[26705] Include TyCl instances in data fam iface entry
Ensures dependent modules are recompiled when the class instances for a
data family instance change.
resolves #26705
- - - - -
a0b980af by Cheng Shao at 2026-01-07T10:28:38-05:00
hadrian: remove unused Hp2Ps/Hpc builders
This patch removes the Hp2Ps/Hpc builders from hadrian, they are
unused in the build system. Note that the hp2ps/hpc programs are still
built and not affected.
- - - - -
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
69549c37 by Simon Peyton Jones at 2026-01-07T17:28:44+00:00
Fix scoping errors in specialisation
Using -fspecialise-aggressively in #26682 showed up a couple of
subtle errors in the type-class specialiser.
* dumpBindUDs failed to call `deleteCallsMentioning`, resulting in a
call that mentioned a dictionary that was not in scope. This call
has been missing since 2009!
commit c43c981705ec33da92a9ce91eb90f2ecf00be9fe
Author: Simon Peyton Jones <simonpj(a)microsoft.com>
Date: Fri Oct 23 16:15:51 2009 +0000
Fixed by re-combining `dumpBindUDs` and `dumpUDs`.
* I think there was another bug involving the quantified type
variables in polymorphic specialisation. In any case I refactored
`specHeader` and `spec_call` so that the former looks for the
extra quantified type variables rather than the latter. This
is quite a worthwhile simplification: less code, easier to grok.
Test case in simplCore/should_compile/T26682,
brilliantly minimised by @sheaf.
- - - - -
36 changed files:
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- compiler/GHC.hs
- compiler/GHC/CmmToLlvm/CodeGen.hs
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Core/Opt/Specialise.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Iface/Recomp.hs
- compiler/GHC/Runtime/Interpreter/C.hs
- compiler/GHC/Runtime/Interpreter/Init.hs
- hadrian/doc/flavours.md
- hadrian/src/Base.hs
- hadrian/src/Builder.hs
- hadrian/src/Flavour.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Packages.hs
- hadrian/src/Rules/Gmp.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Settings/Flavours/Validate.hs
- hadrian/src/Settings/Packages.hs
- libraries/ghc-internal/configure.ac
- libraries/ghc-internal/include/HsIntegerGmp.h.in
- + testsuite/tests/driver/recomp26705/M.hs
- + testsuite/tests/driver/recomp26705/M2A.hs
- + testsuite/tests/driver/recomp26705/M2B.hs
- + testsuite/tests/driver/recomp26705/Makefile
- + testsuite/tests/driver/recomp26705/all.T
- + testsuite/tests/driver/recomp26705/recomp26705.stderr
- + testsuite/tests/simplCore/should_compile/T26681.hs
- + testsuite/tests/simplCore/should_compile/T26682.hs
- + testsuite/tests/simplCore/should_compile/T26682a.hs
- testsuite/tests/simplCore/should_compile/all.T
- utils/deriveConstants/Main.hs
- − utils/iserv/cbits/iservmain.c
- utils/iserv/iserv.cabal.in
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/d30e826189299dbe8320dcf6a40da0…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/d30e826189299dbe8320dcf6a40da0…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/T26709] 18 commits: compiler: add targetHasRTSWays function
by Simon Peyton Jones (@simonpj) 07 Jan '26
by Simon Peyton Jones (@simonpj) 07 Jan '26
07 Jan '26
Simon Peyton Jones pushed to branch wip/T26709 at Glasgow Haskell Compiler / GHC
Commits:
69e0ab59 by Cheng Shao at 2026-01-06T19:37:56-05:00
compiler: add targetHasRTSWays function
This commit adds a `targetHasRTSWays` util function in
`GHC.Driver.Session` to query if the target RTS has a given Ways (e.g.
WayThreaded).
- - - - -
25a0ab94 by Cheng Shao at 2026-01-06T19:37:56-05:00
compiler: link on-demand external interpreter with threaded RTS
This commit makes the compiler link the on-demand external interpreter
program with threaded RTS if it is available in the target RTS ways.
This is a better default than the previous single-threaded RTS, and it
enables the external interpreter to benefit from parallelism when
deserializing CreateBCOs messages.
- - - - -
92404a2b by Cheng Shao at 2026-01-06T19:37:56-05:00
hadrian: link iserv with threaded RTS
This commit makes hadrian link iserv with threaded RTS if it's
available in the RTS ways. Also cleans up the iserv main C program
which can be replaced by the `-fkeep-cafs` link-time option.
- - - - -
a20542d2 by Cheng Shao at 2026-01-06T19:38:38-05:00
ghc-internal: remove unused GMP macros
This patch removes unused GMP related macros from `ghc-internal`. The
in-tree GMP version was hard coded and outdated, but it was not used
anywhere anyway.
- - - - -
4079dcd6 by Cheng Shao at 2026-01-06T19:38:38-05:00
hadrian: fix in-tree gmp configure error on newer c compilers
Building in-tree gmp on newer c compilers that default to c23 fails at
configure stage, this patch fixes it, see added comment for
explanation.
- - - - -
414d1fe1 by Cheng Shao at 2026-01-06T19:39:20-05:00
compiler: fix LLVM backend pdep/pext handling for i386 target
This patch fixes LLVM backend's pdep/pext handling for i386 target,
and also removes non-existent 128/256/512 bit hs_pdep/hs_pext callees.
See amended note for more explanation. Fixes #26450.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
c7f6fba3 by Cheng Shao at 2026-01-06T19:39:20-05:00
ci: remove allow_failure flag for i386 alpine job
The LLVM codegen issue for i386 has been fixed, and the i386 alpine
job should pass now. This commit removes the allow_failure flag so
that other i386 regressions in the future are signaled more timely.
- - - - -
52d00c05 by Simon Peyton Jones at 2026-01-07T10:24:21-05:00
Add missing InVar->OutVar lookup in SetLevels
As #26681 showed, the SetLevels pass was failing to map an InVar to
an OutVar. Very silly! I'm amazed it hasn't broken before now.
I have improved the type singatures (to mention InVar and OutVar)
so it's more obvious what needs to happen.
- - - - -
ab0a5594 by Cheng Shao at 2026-01-07T10:25:04-05:00
hadrian: drop deprecated pkgHashSplitObjs code path
This patch drops deprecated `pkgHashSplitObjs` code path from hadrian,
since GHC itself has removed split objs support many versions ago and
this code path is unused.
- - - - -
bb3a2ba1 by Cheng Shao at 2026-01-07T10:25:44-05:00
hadrian: remove linting/assertion in quick-validate flavour
The `quick-validate` flavour is meant for testing ghc and passing the
testsuite locally with similar settings to `validate` but faster. This
patch removes the linting/assertion overhead in `quick-validate` to
improve developer experience. I also took the chance to simplify
redundant logic of rts/library way definition in `validate` flavour.
- - - - -
7971f5dd by Cheng Shao at 2026-01-07T10:26:26-05:00
deriveConstants: clean up unused constants
This patch cleans up unused constants from `deriveConstants`, they are
not used by C/Cmm code in the RTS, nor compiler-generated code.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
4df96993 by Cheng Shao at 2026-01-07T10:27:08-05:00
hadrian: pass -fno-omit-frame-pointer with +debug_info
This patch adds `-fno-omit-frame-pointer` as C/C++ compilation flag
when compiling with `+debug_info` flavour transformer. It's a sane
default when you care about debugging and reliable backtraces, and
makes debugging/profiling with bpf easier.
- - - - -
8a3900a3 by Aaron Allen at 2026-01-07T10:27:57-05:00
[26705] Include TyCl instances in data fam iface entry
Ensures dependent modules are recompiled when the class instances for a
data family instance change.
resolves #26705
- - - - -
a0b980af by Cheng Shao at 2026-01-07T10:28:38-05:00
hadrian: remove unused Hp2Ps/Hpc builders
This patch removes the Hp2Ps/Hpc builders from hadrian, they are
unused in the build system. Note that the hp2ps/hpc programs are still
built and not affected.
- - - - -
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
07bcc72e by Simon Peyton Jones at 2026-01-07T17:20:07+00:00
Refactor srutOkForBinderSwap
This MR does a small refactor:
* Moves `scrutOkForBinderSwap` and `BinderSwapDecision`
to GHC.Core.Utils
* Inverts the sense of the coercion it returns, which makes
more sense
No effect on behaviour
- - - - -
a1b49381 by Simon Peyton Jones at 2026-01-07T17:20:40+00:00
Improve case merging
This small MR makes case merging happen a bit more often than
it otherwise could, by getting join points out of the way.
See #26709 and GHC.Core.Utils
Note [Floating join points out of DEFAULT alternatives]
- - - - -
40 changed files:
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- compiler/GHC.hs
- compiler/GHC/CmmToLlvm/CodeGen.hs
- compiler/GHC/Core/Opt/OccurAnal.hs
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Core/Opt/Simplify/Iteration.hs
- compiler/GHC/Core/Opt/Simplify/Utils.hs
- compiler/GHC/Core/Opt/SpecConstr.hs
- compiler/GHC/Core/Utils.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Iface/Recomp.hs
- compiler/GHC/Runtime/Interpreter/C.hs
- compiler/GHC/Runtime/Interpreter/Init.hs
- hadrian/doc/flavours.md
- hadrian/src/Base.hs
- hadrian/src/Builder.hs
- hadrian/src/Flavour.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Packages.hs
- hadrian/src/Rules/Gmp.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Settings/Flavours/Validate.hs
- hadrian/src/Settings/Packages.hs
- libraries/ghc-internal/configure.ac
- libraries/ghc-internal/include/HsIntegerGmp.h.in
- + testsuite/tests/driver/recomp26705/M.hs
- + testsuite/tests/driver/recomp26705/M2A.hs
- + testsuite/tests/driver/recomp26705/M2B.hs
- + testsuite/tests/driver/recomp26705/Makefile
- + testsuite/tests/driver/recomp26705/all.T
- + testsuite/tests/driver/recomp26705/recomp26705.stderr
- + testsuite/tests/simplCore/should_compile/T26681.hs
- + testsuite/tests/simplCore/should_compile/T26709.hs
- + testsuite/tests/simplCore/should_compile/T26709.stderr
- testsuite/tests/simplCore/should_compile/all.T
- utils/deriveConstants/Main.hs
- − utils/iserv/cbits/iservmain.c
- utils/iserv/iserv.cabal.in
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a6ca9f049b3aa8eb23881c1170b768…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a6ca9f049b3aa8eb23881c1170b768…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 11 commits: Add missing InVar->OutVar lookup in SetLevels
by Marge Bot (@marge-bot) 07 Jan '26
by Marge Bot (@marge-bot) 07 Jan '26
07 Jan '26
Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
52d00c05 by Simon Peyton Jones at 2026-01-07T10:24:21-05:00
Add missing InVar->OutVar lookup in SetLevels
As #26681 showed, the SetLevels pass was failing to map an InVar to
an OutVar. Very silly! I'm amazed it hasn't broken before now.
I have improved the type singatures (to mention InVar and OutVar)
so it's more obvious what needs to happen.
- - - - -
ab0a5594 by Cheng Shao at 2026-01-07T10:25:04-05:00
hadrian: drop deprecated pkgHashSplitObjs code path
This patch drops deprecated `pkgHashSplitObjs` code path from hadrian,
since GHC itself has removed split objs support many versions ago and
this code path is unused.
- - - - -
bb3a2ba1 by Cheng Shao at 2026-01-07T10:25:44-05:00
hadrian: remove linting/assertion in quick-validate flavour
The `quick-validate` flavour is meant for testing ghc and passing the
testsuite locally with similar settings to `validate` but faster. This
patch removes the linting/assertion overhead in `quick-validate` to
improve developer experience. I also took the chance to simplify
redundant logic of rts/library way definition in `validate` flavour.
- - - - -
7971f5dd by Cheng Shao at 2026-01-07T10:26:26-05:00
deriveConstants: clean up unused constants
This patch cleans up unused constants from `deriveConstants`, they are
not used by C/Cmm code in the RTS, nor compiler-generated code.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
4df96993 by Cheng Shao at 2026-01-07T10:27:08-05:00
hadrian: pass -fno-omit-frame-pointer with +debug_info
This patch adds `-fno-omit-frame-pointer` as C/C++ compilation flag
when compiling with `+debug_info` flavour transformer. It's a sane
default when you care about debugging and reliable backtraces, and
makes debugging/profiling with bpf easier.
- - - - -
8a3900a3 by Aaron Allen at 2026-01-07T10:27:57-05:00
[26705] Include TyCl instances in data fam iface entry
Ensures dependent modules are recompiled when the class instances for a
data family instance change.
resolves #26705
- - - - -
a0b980af by Cheng Shao at 2026-01-07T10:28:38-05:00
hadrian: remove unused Hp2Ps/Hpc builders
This patch removes the Hp2Ps/Hpc builders from hadrian, they are
unused in the build system. Note that the hp2ps/hpc programs are still
built and not affected.
- - - - -
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
3bb5a349 by Cheng Shao at 2026-01-07T11:33:37-05:00
make: remove unused Makefiles from legacy make build system
This patch removes unused Makefiles from legacy make build system; now
they are never used by hadrian in any way, and they already include
common boilerplate mk files that are long gone in the make build
system removal, hence the housecleaning.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
c5a82ba6 by Cheng Shao at 2026-01-07T11:33:38-05:00
compiler: use -O3 as LLVM optimization level for ghc -O2
The GHC driver clamps LLVM optimization level to `-O2` due to LLVM
crashes, but those were historical issues many years ago that are no
longer relevant for LLVM versions we support today. This patch changes
the driver to use `-O3` as LLVM optimization level when compiling with
`-O2`, which is a better default when we're willing to trade
compilation time for faster generated code.
- - - - -
36 changed files:
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Driver/Pipeline/Execute.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Iface/Recomp.hs
- − docs/Makefile
- − docs/storage-mgt/Makefile
- − docs/users_guide/Makefile
- − driver/Makefile
- − driver/ghc/Makefile
- − driver/ghci/Makefile
- − driver/haddock/Makefile
- − ghc/Makefile
- hadrian/doc/flavours.md
- hadrian/src/Base.hs
- hadrian/src/Builder.hs
- hadrian/src/Flavour.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Settings/Flavours/Validate.hs
- − libraries/Makefile
- − libraries/doc/Makefile
- − linters/lint-codes/Makefile
- − linters/lint-notes/Makefile
- llvm-passes
- − rts/Makefile
- − rts/include/Makefile
- + testsuite/tests/driver/recomp26705/M.hs
- + testsuite/tests/driver/recomp26705/M2A.hs
- + testsuite/tests/driver/recomp26705/M2B.hs
- + testsuite/tests/driver/recomp26705/Makefile
- + testsuite/tests/driver/recomp26705/all.T
- + testsuite/tests/driver/recomp26705/recomp26705.stderr
- + testsuite/tests/simplCore/should_compile/T26681.hs
- testsuite/tests/simplCore/should_compile/all.T
- utils/deriveConstants/Main.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/0cf5958285a9ffd97a6b4831e8f239…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/0cf5958285a9ffd97a6b4831e8f239…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/fix-darwin-toolchain-cruft] 10 commits: Add missing InVar->OutVar lookup in SetLevels
by Cheng Shao (@TerrorJack) 07 Jan '26
by Cheng Shao (@TerrorJack) 07 Jan '26
07 Jan '26
Cheng Shao pushed to branch wip/fix-darwin-toolchain-cruft at Glasgow Haskell Compiler / GHC
Commits:
52d00c05 by Simon Peyton Jones at 2026-01-07T10:24:21-05:00
Add missing InVar->OutVar lookup in SetLevels
As #26681 showed, the SetLevels pass was failing to map an InVar to
an OutVar. Very silly! I'm amazed it hasn't broken before now.
I have improved the type singatures (to mention InVar and OutVar)
so it's more obvious what needs to happen.
- - - - -
ab0a5594 by Cheng Shao at 2026-01-07T10:25:04-05:00
hadrian: drop deprecated pkgHashSplitObjs code path
This patch drops deprecated `pkgHashSplitObjs` code path from hadrian,
since GHC itself has removed split objs support many versions ago and
this code path is unused.
- - - - -
bb3a2ba1 by Cheng Shao at 2026-01-07T10:25:44-05:00
hadrian: remove linting/assertion in quick-validate flavour
The `quick-validate` flavour is meant for testing ghc and passing the
testsuite locally with similar settings to `validate` but faster. This
patch removes the linting/assertion overhead in `quick-validate` to
improve developer experience. I also took the chance to simplify
redundant logic of rts/library way definition in `validate` flavour.
- - - - -
7971f5dd by Cheng Shao at 2026-01-07T10:26:26-05:00
deriveConstants: clean up unused constants
This patch cleans up unused constants from `deriveConstants`, they are
not used by C/Cmm code in the RTS, nor compiler-generated code.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
4df96993 by Cheng Shao at 2026-01-07T10:27:08-05:00
hadrian: pass -fno-omit-frame-pointer with +debug_info
This patch adds `-fno-omit-frame-pointer` as C/C++ compilation flag
when compiling with `+debug_info` flavour transformer. It's a sane
default when you care about debugging and reliable backtraces, and
makes debugging/profiling with bpf easier.
- - - - -
8a3900a3 by Aaron Allen at 2026-01-07T10:27:57-05:00
[26705] Include TyCl instances in data fam iface entry
Ensures dependent modules are recompiled when the class instances for a
data family instance change.
resolves #26705
- - - - -
a0b980af by Cheng Shao at 2026-01-07T10:28:38-05:00
hadrian: remove unused Hp2Ps/Hpc builders
This patch removes the Hp2Ps/Hpc builders from hadrian, they are
unused in the build system. Note that the hp2ps/hpc programs are still
built and not affected.
- - - - -
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
d3c67758 by Cheng Shao at 2026-01-07T17:26:17+01:00
ci: update darwin boot ghc to 9.10.3
This patch updates darwin boot ghc to 9.10.3, along with other related
updates, and pays off some technical debt here:
- Update `nixpkgs` and use the `nixpkgs-25.05-darwin` channel.
- Update the `niv` template.
- Update LLVM to 21 and update `llvm-targets` to reflect LLVM 21
layout changes for arm64/x86_64 darwin targets.
- Use `stdenvNoCC` to prevent nix packaged apple sdk from being used
by boot ghc, and manually set `DEVELOPER_DIR`/`SDKROOT` to enforce
the usage of system-wide command line sdk for macos.
- When building nix derivation for boot ghc, run `configure` via the
`arch` command so that `configure` and its subprocesses pick up the
manually specified architecture.
- Remove the previous horrible hack that obliterates `configure` to
make every autoconf test result in true. `configure` now properly
does its job.
- Remove the now obsolete configure args and post install settings
file patching logic.
- Use `scheme-small` for texlive to avoid build failures in certain
unused texlive packages, especially on x86_64-darwin.
- - - - -
23 changed files:
- .gitlab/darwin/nix/sources.json
- .gitlab/darwin/nix/sources.nix
- .gitlab/darwin/toolchain.nix
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Iface/Recomp.hs
- hadrian/doc/flavours.md
- hadrian/src/Base.hs
- hadrian/src/Builder.hs
- hadrian/src/Flavour.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Settings/Flavours/Validate.hs
- llvm-targets
- + testsuite/tests/driver/recomp26705/M.hs
- + testsuite/tests/driver/recomp26705/M2A.hs
- + testsuite/tests/driver/recomp26705/M2B.hs
- + testsuite/tests/driver/recomp26705/Makefile
- + testsuite/tests/driver/recomp26705/all.T
- + testsuite/tests/driver/recomp26705/recomp26705.stderr
- + testsuite/tests/simplCore/should_compile/T26681.hs
- testsuite/tests/simplCore/should_compile/all.T
- utils/deriveConstants/Main.hs
Changes:
=====================================
.gitlab/darwin/nix/sources.json
=====================================
@@ -1,26 +1,14 @@
{
- "niv": {
- "branch": "master",
- "description": "Easy dependency management for Nix projects",
- "homepage": "https://github.com/nmattia/niv",
- "owner": "nmattia",
- "repo": "niv",
- "rev": "e0ca65c81a2d7a4d82a189f1e23a48d59ad42070",
- "sha256": "1pq9nh1d8nn3xvbdny8fafzw87mj7gsmp6pxkdl65w2g18rmcmzx",
- "type": "tarball",
- "url": "https://github.com/nmattia/niv/archive/e0ca65c81a2d7a4d82a189f1e23a48d59ad4…",
- "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
- },
"nixpkgs": {
- "branch": "nixos-unstable",
+ "branch": "nixpkgs-25.05-darwin",
"description": "Nix Packages collection",
"homepage": "",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60",
- "sha256": "1anwxmjpm21msnnlrjdz19w31bxnbpn4kgf93sn3npihi7wf4a8h",
+ "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d",
+ "sha256": "0v6bd1xk8a2aal83karlvc853x44dg1n4nk08jg3dajqyy0s98np",
"type": "tarball",
- "url": "https://github.com/nixos/nixpkgs/archive/2893f56de08021cffd9b6b6dfc70fd9ccd…",
+ "url": "https://github.com/nixos/nixpkgs/archive/ac62194c3917d5f474c1a844b6fd6da2db…",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
}
}
=====================================
.gitlab/darwin/nix/sources.nix
=====================================
@@ -10,29 +10,50 @@ let
let
name' = sanitizeName name + "-src";
in
- if spec.builtin or true then
- builtins_fetchurl { inherit (spec) url sha256; name = name'; }
- else
- pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
+ if spec.builtin or true then
+ builtins_fetchurl { inherit (spec) url sha256; name = name'; }
+ else
+ pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
fetch_tarball = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
- if spec.builtin or true then
- builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
- else
- pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
+ if spec.builtin or true then
+ builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
+ else
+ pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
fetch_git = name: spec:
let
ref =
- if spec ? ref then spec.ref else
+ spec.ref or (
if spec ? branch then "refs/heads/${spec.branch}" else
- if spec ? tag then "refs/tags/${spec.tag}" else
- abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
+ if spec ? tag then "refs/tags/${spec.tag}" else
+ abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"
+ );
+ submodules = spec.submodules or false;
+ submoduleArg =
+ let
+ nixSupportsSubmodules = builtins.compareVersions builtins.nixVersion "2.4" >= 0;
+ emptyArgWithWarning =
+ if submodules
+ then
+ builtins.trace
+ (
+ "The niv input \"${name}\" uses submodules "
+ + "but your nix's (${builtins.nixVersion}) builtins.fetchGit "
+ + "does not support them"
+ )
+ { }
+ else { };
+ in
+ if nixSupportsSubmodules
+ then { inherit submodules; }
+ else emptyArgWithWarning;
in
- builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; };
+ builtins.fetchGit
+ ({ url = spec.repo; inherit (spec) rev; inherit ref; } // submoduleArg);
fetch_local = spec: spec.path;
@@ -66,16 +87,16 @@ let
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
in
- if builtins.hasAttr "nixpkgs" sources
- then sourcesNixpkgs
- else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
- import <nixpkgs> {}
- else
- abort
- ''
- Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
- add a package called "nixpkgs" to your sources.json.
- '';
+ if builtins.hasAttr "nixpkgs" sources
+ then sourcesNixpkgs
+ else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
+ import <nixpkgs> { }
+ else
+ abort
+ ''
+ Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
+ add a package called "nixpkgs" to your sources.json.
+ '';
# The actual fetching function.
fetch = pkgs: name: spec:
@@ -95,13 +116,13 @@ let
# the path directly as opposed to the fetched source.
replace = name: drv:
let
- saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
+ saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name;
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
in
- if ersatz == "" then drv else
- # this turns the string into an actual Nix path (for both absolute and
- # relative paths)
- if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
+ if ersatz == "" then drv else
+ # this turns the string into an actual Nix path (for both absolute and
+ # relative paths)
+ if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
# Ports of functions for older nix versions
@@ -112,7 +133,7 @@ let
);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fece…
- range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1);
+ range = first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fece…
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
@@ -123,43 +144,46 @@ let
concatStrings = builtins.concatStringsSep "";
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d…
- optionalAttrs = cond: as: if cond then as else {};
+ optionalAttrs = cond: as: if cond then as else { };
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchTarball;
in
- if lessThan nixVersion "1.12" then
- fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
- else
- fetchTarball attrs;
+ if lessThan nixVersion "1.12" then
+ fetchTarball ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
+ else
+ fetchTarball attrs;
# fetchurl version that is compatible between all the versions of Nix
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchurl;
in
- if lessThan nixVersion "1.12" then
- fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
- else
- fetchurl attrs;
+ if lessThan nixVersion "1.12" then
+ fetchurl ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
+ else
+ fetchurl attrs;
# Create the final "sources" from the config
mkSources = config:
- mapAttrs (
- name: spec:
- if builtins.hasAttr "outPath" spec
- then abort
- "The values in sources.json should not have an 'outPath' attribute"
- else
- spec // { outPath = replace name (fetch config.pkgs name spec); }
- ) config.sources;
+ mapAttrs
+ (
+ name: spec:
+ if builtins.hasAttr "outPath" spec
+ then
+ abort
+ "The values in sources.json should not have an 'outPath' attribute"
+ else
+ spec // { outPath = replace name (fetch config.pkgs name spec); }
+ )
+ config.sources;
# The "config" used by the fetchers
mkConfig =
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
- , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
+ , sources ? if sourcesFile == null then { } else builtins.fromJSON (builtins.readFile sourcesFile)
, system ? builtins.currentSystem
, pkgs ? mkPkgs sources system
}: rec {
@@ -171,4 +195,4 @@ let
};
in
-mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
+mkSources (mkConfig { }) // { __functor = _: settings: mkSources (mkConfig settings); }
=====================================
.gitlab/darwin/toolchain.nix
=====================================
@@ -11,69 +11,67 @@ let
hsPkgs = pkgs.haskellPackages;
alex = hsPkgs.alex;
happy = hsPkgs.happy;
- targetTriple = pkgs.stdenv.targetPlatform.config;
+ targetTriple = pkgs.stdenvNoCC.targetPlatform.config;
ghcBindists = let version = ghc.version; in {
- aarch64-darwin = hostPkgs.fetchurl {
+ aarch64-darwin = hostPkgs.fetchzip {
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-aarch64-apple-d…";
- sha256 = "sha256-/6+DtdeossBJIMbjkJwL4h3eJ7rzgNCV+ifoQKOi6AQ=";
+ hash = "sha512-xUlt7zc/OT3a1SR0BxmFFgrabPkWUENATdw4NbQwEi5+nH5yPau+HSrGI5UUoKdO4gdpgZlPaxtI7eSk0fx1+g==";
};
- x86_64-darwin = hostPkgs.fetchurl {
+ x86_64-darwin = hostPkgs.fetchzip {
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-x86_64-apple-da…";
- sha256 = "sha256-jPIhiJMOENesUnDUJeIaPatgavc6ZVSTY5NFIAxlC+k=";
+ hash = "sha512-4/INeJwPPGbOj9MepwnIvIg2lvFkqS8w/3U/I8f6gCsoNlgwPr78iyY9vd6vfMONR1GxNQU3L/lxE07F3P0Qag==";
};
-
};
- ghc = pkgs.stdenv.mkDerivation rec {
- version = "9.10.1";
+ ghc = pkgs.stdenvNoCC.mkDerivation rec {
+ version = "9.10.3";
name = "ghc";
- src = ghcBindists.${pkgs.stdenv.hostPlatform.system};
+ src = ghcBindists.${pkgs.stdenvNoCC.hostPlatform.system};
+
+ dontUpdateAutotoolsGnuConfigScripts = true;
+
configureFlags = [
- "CC=/usr/bin/clang"
- "CLANG=/usr/bin/clang"
"AR=/usr/bin/ar"
- "LLC=${llvm}/bin/llc"
- "OPT=${llvm}/bin/opt"
- "LLVMAS=${llvm_clang}/bin/clang"
- "CONF_CC_OPTS_STAGE2=--target=${targetTriple}"
- "CONF_CXX_OPTS_STAGE2=--target=${targetTriple}"
- "CONF_GCC_LINKER_OPTS_STAGE2=--target=${targetTriple}"
+ "CC=/usr/bin/clang"
+ "CXX=/usr/bin/clang++"
+ "INSTALL=/usr/bin/install"
+ "INSTALL_NAME_TOOL=/usr/bin/install_name_tool"
+ "MergeObjsCmd=/usr/bin/ld"
+ "NM=/usr/bin/nm"
+ "OTOOL=/usr/bin/otool"
+ "RANLIB=/usr/bin/ranlib"
];
- buildPhase = "true";
-
- # This is a horrible hack because the configure script invokes /usr/bin/clang
- # without a `--target` flag. Then depending on whether the `nix` binary itself is
- # a native x86 or arm64 binary means that /usr/bin/clang thinks it needs to run in
- # x86 or arm64 mode.
-
- # The correct answer for the check in question is the first one we try, so by replacing
- # the condition to true; we select the right C++ standard library still.
- preConfigure = ''
- sed "s/\"\$CC\" -o actest actest.o \''${1} 2>\/dev\/null/true/i" configure > configure.new
- mv configure.new configure
- chmod +x configure
- cat configure
+ # Use the arch command to explicitly specify architecture, so that
+ # configure and its subprocesses would pick up the architecture we
+ # choose via the system argument.
+ preConfigure = pkgs.lib.optionalString (system == "aarch64-darwin") ''
+ substituteInPlace configure \
+ --replace-fail "#! /bin/sh" "#!/usr/bin/env -S /usr/bin/arch -arm64 /bin/sh"
+ '' + pkgs.lib.optionalString (system == "x86_64-darwin") ''
+ substituteInPlace configure \
+ --replace-fail "#! /bin/sh" "#!/usr/bin/env -S /usr/bin/arch -x86_64 /bin/sh"
+ '' + ''
+ unset DEVELOPER_DIR SDKROOT
+ export DEVELOPER_DIR="$(/usr/bin/xcode-select --print-path)"
+ export SDKROOT="$(/usr/bin/xcrun --sdk macosx --show-sdk-path)"
'';
+ dontPatchShebangsInConfigure = true;
+
# N.B. Work around #20253.
nativeBuildInputs = [ pkgs.gnused ];
- postInstallPhase = ''
- settings="$out/lib/ghc-${version}/settings"
- sed -i -e "s%\"llc\"%\"${llvm}/bin/llc\"%" $settings
- sed -i -e "s%\"opt\"%\"${llvm}/bin/opt\"%" $settings
- sed -i -e "s%\"clang\"%\"/usr/bin/clang\"%" $settings
- sed -i -e 's%("C compiler command", "")%("C compiler command", "/usr/bin/clang")%' $settings
- sed -i -e 's%("C compiler flags", "")%("C compiler flags", "--target=${targetTriple}")%' $settings
- sed -i -e 's%("C++ compiler flags", "")%("C++ compiler flags", "--target=${targetTriple}")%' $settings
- sed -i -e 's%("C compiler link flags", "")%("C compiler link flags", "--target=${targetTriple}")%' $settings
- '';
+
+ dontBuild = true;
+
+ enableParallelInstalling = true;
+
+ dontFixup = true;
# Sanity check: verify that we can compile hello world.
doInstallCheck = true;
installCheckPhase = ''
- unset DYLD_LIBRARY_PATH
$out/bin/ghc --info
cd $TMP
mkdir test-ghc; cd test-ghc
@@ -91,13 +89,13 @@ let
ourtexlive = with pkgs;
texlive.combine {
inherit (texlive)
- scheme-medium collection-xetex fncychap titlesec tabulary varwidth
+ scheme-small collection-xetex fncychap tex-gyre titlesec tabulary varwidth
framed capt-of wrapfig needspace dejavu-otf helvetic upquote;
};
fonts = with pkgs; makeFontsConf { fontDirectories = [ dejavu_fonts ]; };
- llvm = pkgs.llvm_15;
- llvm_clang = pkgs.llvmPackages_15.clang-unwrapped;
+ llvm = pkgs.llvm_21;
+ llvm_clang = pkgs.llvmPackages_21.clang-unwrapped;
in
pkgs.writeTextFile {
name = "toolchain";
=====================================
compiler/GHC/Core/Opt/SetLevels.hs
=====================================
@@ -91,6 +91,7 @@ import GHC.Core.Utils
import GHC.Core.Opt.Arity ( exprBotStrictness_maybe, isOneShotBndr )
import GHC.Core.FVs -- all of it
import GHC.Core.Subst
+import GHC.Core.TyCo.Subst( lookupTyVar )
import GHC.Core.Make ( sortQuantVars )
import GHC.Core.Type ( Type, tyCoVarsOfType
, mightBeUnliftedType, closeOverKindsDSet
@@ -466,8 +467,8 @@ lvlCase env scrut_fvs scrut' case_bndr ty alts
ty' = substTyUnchecked (le_subst env) ty
incd_lvl = incMinorLvl (le_ctxt_lvl env)
- dest_lvl = maxFvLevel (const True) env scrut_fvs
- -- Don't abstract over type variables, hence const True
+ dest_lvl = maxFvLevel includeTyVars env scrut_fvs
+ -- Don't abstract over type variables, hence includeTyVars
lvl_alt alts_env (AnnAlt con bs rhs)
= do { rhs' <- lvlMFE new_env True rhs
@@ -719,8 +720,11 @@ hasFreeJoin :: LevelEnv -> DVarSet -> Bool
-- (In the latter case it won't be a join point any more.)
-- Not treating top-level ones specially had a massive effect
-- on nofib/minimax/Prog.prog
-hasFreeJoin env fvs
- = not (maxFvLevel isJoinId env fvs == tOP_LEVEL)
+hasFreeJoin env fvs = anyDVarSet bad_join fvs
+ where
+ bad_join v = isJoinId v &&
+ maxIn True env v tOP_LEVEL /= tOP_LEVEL
+
{- Note [Saving work]
~~~~~~~~~~~~~~~~~~~~~
@@ -1607,10 +1611,10 @@ destLevel env fvs fvs_ty is_function is_bot
| otherwise = max_fv_id_level
where
- max_fv_id_level = maxFvLevel isId env fvs -- Max over Ids only; the
- -- tyvars will be abstracted
+ max_fv_id_level = maxFvLevel idsOnly env fvs -- Max over Ids only; the
+ -- tyvars will be abstracted
- as_far_as_poss = maxFvLevel' isId env fvs_ty
+ as_far_as_poss = maxFvLevel' idsOnly env fvs_ty
-- See Note [Floating and kind casts]
{- Note [Floating and kind casts]
@@ -1768,28 +1772,47 @@ extendCaseBndrEnv le@(LE { le_subst = subst, le_env = id_env })
, le_env = add_id id_env (case_bndr, scrut_var) }
extendCaseBndrEnv env _ _ = env
-maxFvLevel :: (Var -> Bool) -> LevelEnv -> DVarSet -> Level
-maxFvLevel max_me env var_set
- = nonDetStrictFoldDVarSet (maxIn max_me env) tOP_LEVEL var_set
+includeTyVars, idsOnly :: Bool
+idsOnly = False
+includeTyVars = True
+
+maxFvLevel :: Bool -> LevelEnv -> DVarSet -> Level
+maxFvLevel include_tyvars env var_set
+ = nonDetStrictFoldDVarSet (maxIn include_tyvars env) tOP_LEVEL var_set
-- It's OK to use a non-deterministic fold here because maxIn commutes.
-maxFvLevel' :: (Var -> Bool) -> LevelEnv -> TyCoVarSet -> Level
+maxFvLevel' :: Bool -> LevelEnv -> TyCoVarSet -> Level
-- Same but for TyCoVarSet
-maxFvLevel' max_me env var_set
- = nonDetStrictFoldUniqSet (maxIn max_me env) tOP_LEVEL var_set
+maxFvLevel' include_tyvars env var_set
+ = nonDetStrictFoldUniqSet (maxIn include_tyvars env) tOP_LEVEL var_set
-- It's OK to use a non-deterministic fold here because maxIn commutes.
-maxIn :: (Var -> Bool) -> LevelEnv -> InVar -> Level -> Level
-maxIn max_me (LE { le_lvl_env = lvl_env, le_env = id_env }) in_var lvl
+maxIn :: Bool -> LevelEnv -> InVar -> Level -> Level
+-- True <=> include tyvars
+maxIn include_tyvars env@(LE { le_subst = subst, le_env = id_env }) in_var lvl
+ | isId in_var
= case lookupVarEnv id_env in_var of
+ Nothing -> maxOut env in_var lvl
Just (abs_vars, _) -> foldr max_out lvl abs_vars
- Nothing -> max_out in_var lvl
- where
- max_out out_var lvl
- | max_me out_var = case lookupVarEnv lvl_env out_var of
- Just lvl' -> maxLvl lvl' lvl
- Nothing -> lvl
- | otherwise = lvl -- Ignore some vars depending on max_me
+ where
+ max_out out_var lvl
+ | isTyVar out_var && not include_tyvars
+ = lvl
+ | otherwise = maxOut env out_var lvl
+
+ | include_tyvars -- TyVars
+ = case lookupTyVar subst in_var of
+ Just ty -> nonDetStrictFoldVarSet (maxOut env) lvl (tyCoVarsOfType ty)
+ Nothing -> maxOut env in_var lvl
+
+ | otherwise -- Ignore free tyvars
+ = lvl
+
+maxOut :: LevelEnv -> OutVar -> Level -> Level
+maxOut (LE { le_lvl_env = lvl_env }) out_var lvl
+ = case lookupVarEnv lvl_env out_var of
+ Just lvl' -> maxLvl lvl' lvl
+ Nothing -> lvl
lookupVar :: LevelEnv -> Id -> LevelledExpr
lookupVar le v = case lookupVarEnv (le_env le) v of
=====================================
compiler/GHC/Iface/Recomp.hs
=====================================
@@ -1797,7 +1797,9 @@ declExtras fix_fn ann_fn rule_env inst_env fi_env dm_env complete_env decl
IfaceSynonym{} -> IfaceSynonymExtras (fix_fn n)
(ann_fn (AnnOccName n))
IfaceFamily{} -> IfaceFamilyExtras (fix_fn n)
- (map ifFamInstAxiom (lookupOccEnvL fi_env n))
+ (map ifFamInstAxiom (lookupOccEnvL fi_env n)
+ ++ map ifDFun (lookupOccEnvL inst_env n)
+ )
(ann_fn (AnnOccName n))
IfacePatSyn{} -> IfacePatSynExtras (fix_fn n) (lookup_complete_match n)
_other -> IfaceOtherDeclExtras
=====================================
hadrian/doc/flavours.md
=====================================
@@ -297,7 +297,11 @@ The supported transformers are listed below:
</tr>
<tr>
<td><code>assertions</code></td>
- <td>Build the stage2 compiler with assertions enabled. </td>
+ <td>Build the stage2 compiler with <code>-DDEBUG</code> assertions enabled. </td>
+ </tr>
+ <tr>
+ <td><code>assertions_stage1</code></td>
+ <td>Build the stage1 compiler with <code>-DDEBUG</code> assertions enabled. </td>
</tr>
<tr>
<td><code>fully_static</code></td>
=====================================
hadrian/src/Base.hs
=====================================
@@ -149,14 +149,10 @@ ghcLibDeps stage iplace = do
ps <- mapM (\f -> stageLibPath stage <&> (-/- f))
[ "llvm-targets"
, "llvm-passes"
- , "ghc-interp.js"
, "settings"
, "targets" -/- "default.target"
, "ghc-usage.txt"
, "ghci-usage.txt"
- , "dyld.mjs"
- , "post-link.mjs"
- , "prelude.mjs"
]
cxxStdLib <- systemCxxStdLibConfPath (PackageDbLoc stage iplace)
return (cxxStdLib : ps)
=====================================
hadrian/src/Builder.hs
=====================================
@@ -170,8 +170,6 @@ data Builder = Alex
| GhcPkg GhcPkgMode Stage
| Haddock HaddockMode
| Happy
- | Hp2Ps
- | Hpc
| HsCpp
| JsCpp
| Hsc2Hs Stage
@@ -211,10 +209,6 @@ builderProvenance = \case
Haddock _ -> context Stage1 haddock
Hsc2Hs _ -> context stage0Boot hsc2hs
Unlit -> context stage0Boot unlit
-
- -- Never used
- Hpc -> context Stage1 hpcBin
- Hp2Ps -> context stage0Boot hp2ps
_ -> Nothing
where
context s p = Just $ vanillaContext s p
=====================================
hadrian/src/Flavour.hs
=====================================
@@ -70,7 +70,8 @@ flavourTransformers = M.fromList
, "fully_static" =: fullyStatic
, "host_fully_static" =: hostFullyStatic
, "collect_timings" =: collectTimings
- , "assertions" =: enableAssertions
+ , "assertions" =: enableAssertions Stage2
+ , "assertions_stage1" =: enableAssertions Stage1
, "debug_ghc" =: debugGhc Stage2
, "debug_stage1_ghc" =: debugGhc Stage1
, "lint" =: enableLinting
@@ -169,10 +170,10 @@ werror =
-- | Build C and Haskell objects with debugging information.
enableDebugInfo :: Flavour -> Flavour
enableDebugInfo = addArgs $ notStage0 ? mconcat
- [ builder (Ghc CompileHs) ? pure ["-g3"]
- , builder (Ghc CompileCWithGhc) ? pure ["-optc-g3"]
- , builder (Ghc CompileCppWithGhc) ? pure ["-optcxx-g3"]
- , builder (Cc CompileC) ? arg "-g3"
+ [ builder (Ghc CompileHs) ? pure ["-g3", "-optc-fno-omit-frame-pointer"]
+ , builder (Ghc CompileCWithGhc) ? pure ["-optc-g3", "-optc-fno-omit-frame-pointer"]
+ , builder (Ghc CompileCppWithGhc) ? pure ["-optcxx-g3", "-optcxx-fno-omit-frame-pointer"]
+ , builder (Cc CompileC) ? pure ["-g3", "-fno-omit-frame-pointer"]
, builder (Cabal Setup) ? arg "--disable-library-stripping"
, builder (Cabal Setup) ? arg "--disable-executable-stripping"
]
@@ -393,12 +394,12 @@ enableLateCCS = addArgs
? ((Profiling `wayUnit`) <$> getWay)
? arg "-fprof-late"
--- | Enable assertions for the stage2 compiler
-enableAssertions :: Flavour -> Flavour
-enableAssertions flav = flav { ghcDebugAssertions = f }
+-- | Enable -DDEBUG assertions in the compiler, at a specified stage
+enableAssertions :: Stage -> Flavour -> Flavour
+enableAssertions stage flav = flav { ghcDebugAssertions = f }
where
- f Stage2 = True
- f st = ghcDebugAssertions flav st
+ f s | s == stage = True
+ | otherwise = ghcDebugAssertions flav s
-- | Build the stage3 compiler using the non-moving GC.
enableBootNonmovingGc :: Flavour -> Flavour
=====================================
hadrian/src/Hadrian/Haskell/Hash.hs
=====================================
@@ -84,7 +84,6 @@ data PackageHashConfigInputs = PackageHashConfigInputs {
pkgHashDynExe :: Bool,
pkgHashProfLib :: Bool,
pkgHashProfExe :: Bool,
- pkgHashSplitObjs :: Bool,
pkgHashSplitSections :: Bool,
pkgHashStripLibs :: Bool,
pkgHashStripExes :: Bool,
@@ -140,7 +139,6 @@ pkgHashOracle = void $ addOracleCache $ \(PkgHashKey (stag, pkg)) -> do
pkgHashDynExe = dyn_ghc
pkgHashProfLib = profiling `Set.member` libWays
pkgHashProfExe = pkg == ghc && ghcProfiled flav stag
- pkgHashSplitObjs = False -- Deprecated
pkgHashSplitSections = ghcSplitSections flav
pkgHashStripExes = False
pkgHashStripLibs = False
@@ -239,7 +237,6 @@ renderPackageHashInputs PackageHashInputs{
, opt "dynamic-exe" False show pkgHashDynExe
, opt "prof-lib" False show pkgHashProfLib
, opt "prof-exe" False show pkgHashProfExe
- , opt "split-objs" False show pkgHashSplitObjs
, opt "split-sections" False show pkgHashSplitSections
, opt "stripped-lib" False show pkgHashStripLibs
, opt "stripped-exe" True show pkgHashStripExes
=====================================
hadrian/src/Oracles/Setting.hs
=====================================
@@ -9,7 +9,7 @@ module Oracles.Setting (
-- ** Target platform things
anyTargetOs, anyTargetArch, anyHostOs,
- isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isArmTarget,
+ isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isWasmTarget, isArmTarget,
isWinHost,
targetArmVersion
) where
@@ -128,6 +128,9 @@ isWinTarget = anyTargetOs [OSMinGW32]
isJsTarget :: Action Bool
isJsTarget = anyTargetArch [ArchJavaScript]
+isWasmTarget :: Action Bool
+isWasmTarget = anyTargetArch [ArchWasm32]
+
isOsxTarget :: Action Bool
isOsxTarget = anyTargetOs [OSDarwin]
=====================================
hadrian/src/Rules/Register.hs
=====================================
@@ -118,7 +118,18 @@ registerPackageRules rs stage iplace = do
pkgName <- getPackageNameFromConfFile conf
let pkg = unsafeFindPackageByName pkgName
- when (pkg == compiler) $ need =<< ghcLibDeps stage iplace
+ when (pkg == compiler) $ do
+ baseDeps <- ghcLibDeps stage iplace
+ jsTarget <- isJsTarget
+ wasmTarget <- isWasmTarget
+ libPath <- stageLibPath stage
+ let jsDeps
+ | jsTarget = ["ghc-interp.js"]
+ | otherwise = []
+ wasmDeps
+ | wasmTarget = ["dyld.mjs", "post-link.mjs", "prelude.mjs"]
+ | otherwise = []
+ need (baseDeps ++ map (libPath -/-) (jsDeps ++ wasmDeps))
-- Only used in guard when Stage0 {} but can be GlobalLibs or InTreeLibs
isBoot <- (pkg `notElem`) <$> stagePackages stage
=====================================
hadrian/src/Settings/Flavours/Validate.hs
=====================================
@@ -1,31 +1,16 @@
module Settings.Flavours.Validate (validateFlavour, slowValidateFlavour,
quickValidateFlavour) where
-import qualified Data.Set as Set
import Expression
import Flavour
-import Oracles.Flag
import {-# SOURCE #-} Settings.Default
-- Please update doc/flavours.md when changing this file.
validateFlavour :: Flavour
-validateFlavour = enableLinting $ werror $ defaultFlavour
+validateFlavour = enableLinting $ quickValidateFlavour
{ name = "validate"
, extraArgs = validateArgs <> defaultHaddockExtraArgs
- , libraryWays = Set.fromList <$>
- mconcat [ pure [vanilla]
- , notStage0 ? platformSupportsSharedLibs ? pure [dynamic]
- ]
- , rtsWays = Set.fromList <$>
- mconcat [ pure [vanilla, debug]
- , targetSupportsThreadedRts ? pure [threaded, threadedDebug]
- , notStage0 ? platformSupportsSharedLibs ? pure
- [ dynamic, debugDynamic
- ]
- , notStage0 ? platformSupportsSharedLibs ? targetSupportsThreadedRts ? pure
- [ threadedDynamic, threadedDebugDynamic ]
- ]
, ghcDebugAssertions = (<= Stage1)
}
@@ -59,6 +44,6 @@ quickValidateArgs = sourceArgs SourceArgs
}
quickValidateFlavour :: Flavour
-quickValidateFlavour = werror $ validateFlavour
+quickValidateFlavour = werror $ disableProfiledLibs $ defaultFlavour
{ name = "quick-validate"
, extraArgs = quickValidateArgs }
=====================================
llvm-targets
=====================================
@@ -44,8 +44,8 @@
,("riscv64-unknown-linux", ("e-m:e-p:64:64-i64:64-i128:128-n64-S128", "", "+m +a +f +d +c +relax"))
,("loongarch64-unknown-linux-gnu", ("e-m:e-p:64:64-i64:64-i128:128-n64-S128", "", "+f +d"))
,("loongarch64-unknown-linux", ("e-m:e-p:64:64-i64:64-i128:128-n64-S128", "", "+f +d"))
-,("x86_64-apple-darwin", ("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", "penryn", ""))
-,("arm64-apple-darwin", ("e-m:o-i64:64-i128:128-n32:64-S128", "generic", "+v8.3a +fp-armv8 +neon +crc +crypto +fullfp16 +ras +lse +rdm +rcpc +zcm +zcz +sha2 +aes"))
+,("x86_64-apple-darwin", ("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", "core2", ""))
+,("arm64-apple-darwin", ("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32", "apple-m1", "+v8.4a +aes +altnzcv +ccdp +ccpp +complxnum +crc +dotprod +flagm +fp-armv8 +fp16fml +fptoint +fullfp16 +jsconv +lse +neon +pauth +perfmon +predres +ras +rcpc +rdm +sb +sha2 +sha3 +specrestrict +ssbs"))
,("aarch64-apple-ios", ("e-m:o-i64:64-i128:128-n32:64-S128", "apple-a7", "+fp-armv8 +neon +crypto +zcm +zcz +sha2 +aes"))
,("x86_64-apple-ios", ("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", "core2", ""))
,("amd64-portbld-freebsd", ("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))
=====================================
testsuite/tests/driver/recomp26705/M.hs
=====================================
@@ -0,0 +1,5 @@
+module M where
+import M2
+
+x :: TD () -> String
+x = show
=====================================
testsuite/tests/driver/recomp26705/M2A.hs
=====================================
@@ -0,0 +1,7 @@
+{-# LANGUAGE TypeFamilies #-}
+module M2 where
+
+data family TD a
+
+data instance TD () = TDI
+ deriving Show
=====================================
testsuite/tests/driver/recomp26705/M2B.hs
=====================================
@@ -0,0 +1,6 @@
+{-# LANGUAGE TypeFamilies #-}
+module M2 where
+
+data family TD a
+
+data instance TD () = TDI
=====================================
testsuite/tests/driver/recomp26705/Makefile
=====================================
@@ -0,0 +1,13 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+# Recompilation tests
+
+recomp26705:
+ cp M2A.hs M2.hs
+ '$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs
+ sleep 1
+ cp M2B.hs M2.hs
+ # This should fail
+ if '$(TEST_HC)' $(TEST_HC_OPTS) --make M.hs; then false; fi
=====================================
testsuite/tests/driver/recomp26705/all.T
=====================================
@@ -0,0 +1,3 @@
+test('recomp26705', [extra_files(['M2A.hs', 'M.hs', 'M2B.hs']),
+ when(fast(), skip), ignore_stdout],
+ makefile_test, [])
=====================================
testsuite/tests/driver/recomp26705/recomp26705.stderr
=====================================
@@ -0,0 +1,5 @@
+M.hs:5:5: error: [GHC-39999]
+ • No instance for ‘Show (TD ())’ arising from a use of ‘show’
+ • In the expression: show
+ In an equation for ‘x’: x = show
+
=====================================
testsuite/tests/simplCore/should_compile/T26681.hs
=====================================
@@ -0,0 +1,47 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneKindSignatures #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module T26681 where
+
+import Data.Kind (Type)
+import Data.Type.Equality
+import GHC.TypeLits
+import qualified Unsafe.Coerce
+
+
+{-# NOINLINE unsafeCoerceRefl #-}
+unsafeCoerceRefl :: a :~: b
+unsafeCoerceRefl = Unsafe.Coerce.unsafeCoerce Refl
+
+type family MapJust l where
+ MapJust '[] = '[]
+ MapJust (x : xs) = Just x : MapJust xs
+
+type family Tail l where
+ Tail (_ : xs) = xs
+
+lemMapJustCons :: MapJust sh :~: Just n : sh' -> sh :~: n : Tail sh
+lemMapJustCons Refl = unsafeCoerceRefl
+
+
+type ListX :: [Maybe Nat] -> (Maybe Nat -> Type) -> Type
+data ListX sh f where
+ ConsX :: !(f n) -> ListX (n : sh) f
+
+
+data JustN n where
+ JustN :: JustN (Just n)
+
+data UnconsListSRes f sh1 = forall n sh. (n : sh ~ sh1) => UnconsListSRes
+
+listsUncons :: forall sh1 f. ListX (MapJust sh1) JustN -> UnconsListSRes f sh1
+listsUncons (ConsX JustN)
+ | Refl <- lemMapJustCons @sh1 Refl
+ = UnconsListSRes
=====================================
testsuite/tests/simplCore/should_compile/all.T
=====================================
@@ -563,3 +563,4 @@ test('T26115', [grep_errmsg(r'DFun')], compile, ['-O -ddump-simpl -dsuppress-uni
test('T26116', normal, compile, ['-O -ddump-rules'])
test('T26117', [grep_errmsg(r'==')], compile, ['-O -ddump-simpl -dsuppress-uniques'])
test('T26349', normal, compile, ['-O -ddump-rules'])
+test('T26681', normal, compile, ['-O'])
=====================================
utils/deriveConstants/Main.hs
=====================================
@@ -397,7 +397,6 @@ wanteds os = concat
,fieldOffset Both "StgRegTable" "rHpAlloc"
,structField C "StgRegTable" "rCurrentAlloc"
,structField C "StgRegTable" "rRet"
- ,structField C "StgRegTable" "rNursery"
,defIntOffset Both "stgEagerBlackholeInfo"
"FUN_OFFSET(stgEagerBlackholeInfo)"
@@ -405,7 +404,6 @@ wanteds os = concat
,defIntOffset Both "stgGCFun" "FUN_OFFSET(stgGCFun)"
,fieldOffset Both "Capability" "r"
- ,fieldOffset C "Capability" "lock"
,structField C "Capability" "no"
,structField C "Capability" "mut_lists"
,structField C "Capability" "context_switch"
@@ -424,18 +422,11 @@ wanteds os = concat
,structField C "bdescr" "link"
,structField Both "bdescr" "flags"
- ,structSize C "generation"
,structField C "generation" "n_new_large_words"
- ,structField C "generation" "weak_ptr_list"
,structSize Both "CostCentreStack"
- ,structField C "CostCentreStack" "ccsID"
,structFieldH Both "CostCentreStack" "mem_alloc"
,structFieldH Both "CostCentreStack" "scc_count"
- ,structField C "CostCentreStack" "prevStack"
-
- ,structField C "CostCentre" "ccID"
- ,structField C "CostCentre" "link"
,structField C "StgHeader" "info"
,structField_ Both "StgHeader_ccs" "StgHeader" "prof.ccs"
@@ -472,18 +463,14 @@ wanteds os = concat
,closurePayload C "StgArrBytes" "payload"
,closureField C "StgTSO" "_link"
- ,closureField C "StgTSO" "global_link"
,closureField C "StgTSO" "what_next"
,closureField C "StgTSO" "why_blocked"
,closureField C "StgTSO" "block_info"
,closureField C "StgTSO" "blocked_exceptions"
,closureField C "StgTSO" "id"
,closureField C "StgTSO" "cap"
- ,closureField C "StgTSO" "saved_errno"
,closureField C "StgTSO" "trec"
,closureField C "StgTSO" "flags"
- ,closureField C "StgTSO" "dirty"
- ,closureField C "StgTSO" "bq"
,closureField C "StgTSO" "label"
,closureField C "StgTSO" "bound"
,closureField Both "StgTSO" "alloc_limit"
@@ -496,8 +483,6 @@ wanteds os = concat
,closureField C "StgStack" "dirty"
,closureField C "StgStack" "marking"
- ,structSize C "StgTSOProfInfo"
-
,closureField Both "StgUpdateFrame" "updatee"
,closureField Both "StgOrigThunkInfoFrame" "info_ptr"
@@ -519,19 +504,15 @@ wanteds os = concat
,closureFieldGcptr C "StgAP" "fun"
,closurePayload C "StgAP" "payload"
- ,thunkSize C "StgAP_STACK"
,closureField C "StgAP_STACK" "size"
,closureFieldGcptr C "StgAP_STACK" "fun"
,closurePayload C "StgAP_STACK" "payload"
- ,closureSize C "StgContinuation"
,closureField C "StgContinuation" "apply_mask_frame"
,closureField C "StgContinuation" "mask_frame_offset"
,closureField C "StgContinuation" "stack_size"
,closurePayload C "StgContinuation" "stack"
- ,thunkSize C "StgSelector"
-
,closureFieldGcptr C "StgInd" "indirectee"
,closureSize C "StgMutVar"
@@ -552,10 +533,6 @@ wanteds os = concat
,closureField C "StgCatchRetryFrame" "first_code"
,closureField C "StgCatchRetryFrame" "alt_code"
- ,closureField C "StgTVarWatchQueue" "closure"
- ,closureField C "StgTVarWatchQueue" "next_queue_entry"
- ,closureField C "StgTVarWatchQueue" "prev_queue_entry"
-
,closureSize C "StgTVar"
,closureField C "StgTVar" "current_value"
,closureField C "StgTVar" "first_watch_queue_entry"
@@ -595,29 +572,19 @@ wanteds os = concat
,closureSize C "StgStableName"
,closureField C "StgStableName" "sn"
- ,closureSize C "StgBlockingQueue"
- ,closureField C "StgBlockingQueue" "bh"
- ,closureField C "StgBlockingQueue" "owner"
- ,closureField C "StgBlockingQueue" "queue"
- ,closureField C "StgBlockingQueue" "link"
-
,closureSize C "MessageBlackHole"
,closureField C "MessageBlackHole" "link"
,closureField C "MessageBlackHole" "tso"
,closureField C "MessageBlackHole" "bh"
- ,closureSize C "StgCompactNFData"
,closureField C "StgCompactNFData" "totalW"
- ,closureField C "StgCompactNFData" "autoBlockW"
,closureField C "StgCompactNFData" "nursery"
- ,closureField C "StgCompactNFData" "last"
,closureField C "StgCompactNFData" "hp"
,closureField C "StgCompactNFData" "hpLim"
,closureField C "StgCompactNFData" "hash"
,closureField C "StgCompactNFData" "result"
,structSize C "StgCompactNFDataBlock"
- ,structField C "StgCompactNFDataBlock" "self"
,structField C "StgCompactNFDataBlock" "owner"
,structField C "StgCompactNFDataBlock" "next"
@@ -635,10 +602,7 @@ wanteds os = concat
"RTS_FLAGS" "DebugFlags.zero_on_gc"
,structField_ C "RtsFlags_GcFlags_initialStkSize"
"RTS_FLAGS" "GcFlags.initialStkSize"
- ,structField_ C "RtsFlags_MiscFlags_tickInterval"
- "RTS_FLAGS" "MiscFlags.tickInterval"
- ,structSize C "StgFunInfoExtraFwd"
,structField C "StgFunInfoExtraFwd" "slow_apply"
,structField C "StgFunInfoExtraFwd" "fun_type"
,structFieldH Both "StgFunInfoExtraFwd" "arity"
@@ -652,11 +616,9 @@ wanteds os = concat
,structField_ C "StgFunInfoExtraRev_bitmap_offset" "StgFunInfoExtraRev" "b.bitmap_offset"
,structField C "StgLargeBitmap" "size"
- ,fieldOffset C "StgLargeBitmap" "bitmap"
,structSize C "snEntry"
,structField C "snEntry" "sn_obj"
- ,structField C "snEntry" "addr"
,structSize C "spEntry"
,structField C "spEntry" "addr"
@@ -672,51 +634,15 @@ wanteds os = concat
else []
-- struct HsIface
- ,structField C "HsIface" "processRemoteCompletion_closure"
- ,structField C "HsIface" "runIO_closure"
- ,structField C "HsIface" "runNonIO_closure"
,structField C "HsIface" "Z0T_closure"
,structField C "HsIface" "True_closure"
,structField C "HsIface" "False_closure"
- ,structField C "HsIface" "unpackCString_closure"
- ,structField C "HsIface" "runFinalizzerBatch_closure"
- ,structField C "HsIface" "stackOverflow_closure"
,structField C "HsIface" "heapOverflow_closure"
- ,structField C "HsIface" "allocationLimitExceeded_closure"
- ,structField C "HsIface" "blockedIndefinitelyOnMVar_closure"
- ,structField C "HsIface" "blockedIndefinitelyOnSTM_closure"
,structField C "HsIface" "cannotCompactFunction_closure"
,structField C "HsIface" "cannotCompactPinned_closure"
,structField C "HsIface" "cannotCompactMutable_closure"
- ,structField C "HsIface" "nonTermination_closure"
,structField C "HsIface" "nestedAtomically_closure"
,structField C "HsIface" "noMatchingContinuationPrompt_closure"
- ,structField C "HsIface" "blockedOnBadFD_closure"
- ,structField C "HsIface" "runSparks_closure"
- ,structField C "HsIface" "ensureIOManagerIsRunning_closure"
- ,structField C "HsIface" "interruptIOManager_closure"
- ,structField C "HsIface" "ioManagerCapabilitiesChanged_closure"
- ,structField C "HsIface" "runHandlersPtr_closure"
- ,structField C "HsIface" "flushStdHandles_closure"
- ,structField C "HsIface" "runMainIO_closure"
- ,structField C "HsIface" "Czh_con_info"
- ,structField C "HsIface" "Izh_con_info"
- ,structField C "HsIface" "Fzh_con_info"
- ,structField C "HsIface" "Dzh_con_info"
- ,structField C "HsIface" "Wzh_con_info"
- ,structField C "HsIface" "runAllocationLimitHandler_closure"
- ,structField C "HsIface" "Ptr_con_info"
- ,structField C "HsIface" "FunPtr_con_info"
- ,structField C "HsIface" "I8zh_con_info"
- ,structField C "HsIface" "I16zh_con_info"
- ,structField C "HsIface" "I32zh_con_info"
- ,structField C "HsIface" "I64zh_con_info"
- ,structField C "HsIface" "W8zh_con_info"
- ,structField C "HsIface" "W16zh_con_info"
- ,structField C "HsIface" "W32zh_con_info"
- ,structField C "HsIface" "W64zh_con_info"
- ,structField C "HsIface" "StablePtr_con_info"
- ,structField C "HsIface" "StackSnapshot_closure"
,structField C "HsIface" "divZZeroException_closure"
,structField C "HsIface" "underflowException_closure"
,structField C "HsIface" "overflowException_closure"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e4c20ab7f99dc624eaf0ce6a7253fe…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e4c20ab7f99dc624eaf0ce6a7253fe…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] Add flavour transformer assertions_stage1
by Marge Bot (@marge-bot) 07 Jan '26
by Marge Bot (@marge-bot) 07 Jan '26
07 Jan '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
da40e553 by Simon Peyton Jones at 2026-01-07T10:30:00-05:00
Add flavour transformer assertions_stage1
This allows us to enable -DDEBUG assertions in the stage1 compiler
- - - - -
2 changed files:
- hadrian/doc/flavours.md
- hadrian/src/Flavour.hs
Changes:
=====================================
hadrian/doc/flavours.md
=====================================
@@ -297,7 +297,11 @@ The supported transformers are listed below:
</tr>
<tr>
<td><code>assertions</code></td>
- <td>Build the stage2 compiler with assertions enabled. </td>
+ <td>Build the stage2 compiler with <code>-DDEBUG</code> assertions enabled. </td>
+ </tr>
+ <tr>
+ <td><code>assertions_stage1</code></td>
+ <td>Build the stage1 compiler with <code>-DDEBUG</code> assertions enabled. </td>
</tr>
<tr>
<td><code>fully_static</code></td>
=====================================
hadrian/src/Flavour.hs
=====================================
@@ -70,7 +70,8 @@ flavourTransformers = M.fromList
, "fully_static" =: fullyStatic
, "host_fully_static" =: hostFullyStatic
, "collect_timings" =: collectTimings
- , "assertions" =: enableAssertions
+ , "assertions" =: enableAssertions Stage2
+ , "assertions_stage1" =: enableAssertions Stage1
, "debug_ghc" =: debugGhc Stage2
, "debug_stage1_ghc" =: debugGhc Stage1
, "lint" =: enableLinting
@@ -393,12 +394,12 @@ enableLateCCS = addArgs
? ((Profiling `wayUnit`) <$> getWay)
? arg "-fprof-late"
--- | Enable assertions for the stage2 compiler
-enableAssertions :: Flavour -> Flavour
-enableAssertions flav = flav { ghcDebugAssertions = f }
+-- | Enable -DDEBUG assertions in the compiler, at a specified stage
+enableAssertions :: Stage -> Flavour -> Flavour
+enableAssertions stage flav = flav { ghcDebugAssertions = f }
where
- f Stage2 = True
- f st = ghcDebugAssertions flav st
+ f s | s == stage = True
+ | otherwise = ghcDebugAssertions flav s
-- | Build the stage3 compiler using the non-moving GC.
enableBootNonmovingGc :: Flavour -> Flavour
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/da40e55359732f175a6502e32695240…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/da40e55359732f175a6502e32695240…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] hadrian: only install js files to libdir for wasm/js targets
by Marge Bot (@marge-bot) 07 Jan '26
by Marge Bot (@marge-bot) 07 Jan '26
07 Jan '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
50a58757 by Cheng Shao at 2026-01-07T10:29:20-05:00
hadrian: only install js files to libdir for wasm/js targets
There are certain js files required for wasm/js targets to work, and
previously hadrian would install those js files to libdir
unconditionally on other targets as well. This could be a minor
annoyance for packagers especially when the unused js files contain
shebangs that interfere with the packaging process. This patch makes
hadrian only selectively install the right js files for the right
targets.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
3 changed files:
- hadrian/src/Base.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Rules/Register.hs
Changes:
=====================================
hadrian/src/Base.hs
=====================================
@@ -149,14 +149,10 @@ ghcLibDeps stage iplace = do
ps <- mapM (\f -> stageLibPath stage <&> (-/- f))
[ "llvm-targets"
, "llvm-passes"
- , "ghc-interp.js"
, "settings"
, "targets" -/- "default.target"
, "ghc-usage.txt"
, "ghci-usage.txt"
- , "dyld.mjs"
- , "post-link.mjs"
- , "prelude.mjs"
]
cxxStdLib <- systemCxxStdLibConfPath (PackageDbLoc stage iplace)
return (cxxStdLib : ps)
=====================================
hadrian/src/Oracles/Setting.hs
=====================================
@@ -9,7 +9,7 @@ module Oracles.Setting (
-- ** Target platform things
anyTargetOs, anyTargetArch, anyHostOs,
- isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isArmTarget,
+ isElfTarget, isOsxTarget, isWinTarget, isJsTarget, isWasmTarget, isArmTarget,
isWinHost,
targetArmVersion
) where
@@ -128,6 +128,9 @@ isWinTarget = anyTargetOs [OSMinGW32]
isJsTarget :: Action Bool
isJsTarget = anyTargetArch [ArchJavaScript]
+isWasmTarget :: Action Bool
+isWasmTarget = anyTargetArch [ArchWasm32]
+
isOsxTarget :: Action Bool
isOsxTarget = anyTargetOs [OSDarwin]
=====================================
hadrian/src/Rules/Register.hs
=====================================
@@ -118,7 +118,18 @@ registerPackageRules rs stage iplace = do
pkgName <- getPackageNameFromConfFile conf
let pkg = unsafeFindPackageByName pkgName
- when (pkg == compiler) $ need =<< ghcLibDeps stage iplace
+ when (pkg == compiler) $ do
+ baseDeps <- ghcLibDeps stage iplace
+ jsTarget <- isJsTarget
+ wasmTarget <- isWasmTarget
+ libPath <- stageLibPath stage
+ let jsDeps
+ | jsTarget = ["ghc-interp.js"]
+ | otherwise = []
+ wasmDeps
+ | wasmTarget = ["dyld.mjs", "post-link.mjs", "prelude.mjs"]
+ | otherwise = []
+ need (baseDeps ++ map (libPath -/-) (jsDeps ++ wasmDeps))
-- Only used in guard when Stage0 {} but can be GlobalLibs or InTreeLibs
isBoot <- (pkg `notElem`) <$> stagePackages stage
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/50a5875763d8dc38e880ca8e67e635e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/50a5875763d8dc38e880ca8e67e635e…
You're receiving this email because of your account on gitlab.haskell.org.
1
0