This is the twenty-sixth edition of our GHC activities report, which describes the work Well-Typed are doing on GHC, Cabal, HLS and other parts of the core Haskell toolchain. The current edition covers roughly the months of December 2024 to February 2025. You can find the previous editions collected under the ghc-activities-report tag.
Sponsorship
We offer Haskell Ecosystem Support Packages to provide commercial users with support from Well-Typed’s experts, while investing in the Haskell community and its technical ecosystem. Clients who engage in these packages both fund the work described in this report and support the Haskell Foundation.
We are delighted to announce two new Bronze Haskell Ecosystem Supporters: Channable and QBayLogic. Many thanks also to our existing clients who also contribute to making this work possible: Anduril, Juspay and Mercury, and to the HLS Open Collective for supporting HLS release management.
However, Haskell’s core infrastructure is expansive; we need more funding to continue this essential maintenance work! Read more about our offer, or get in touch with us today.
Team
The Haskell toolchain team at Well-Typed currently includes:
- Andreas Klebinger
- Ben Gamari
- Matthew Pickering
- Rodrigo Mesquita
- Sam Derbyshire
- Hannes Siebenhandl
- Zubin Duggal
- Mikolaj Konarski
In addition, many others within Well-Typed contribute to GHC, Cabal and HLS occasionally, or contribute to other open source Haskell libraries and tools.
GHC
GHC Releases
We are currently overseeing releases of the GHC 9.10 and 9.12 release series.
Zubin oversaw the preparation and final release of GHC 9.12.1 on 16 December 2024. Unfortunately, it was found in mid-January that this release was affected by a regression affecting sub-word division (#25653). In response to this we scheduled a minimal 9.12.2 release fixing this issue, which was released on 14 March 2025. We anticipate that the next GHC 9.12 release will come in the summer.
Our current release engineering focus is 9.10.2, which is currently being worked on by Andreas and Ben. We expect that the release candidate for this will be out in late March.
In parallel, Zubin has been working towards cutting a corresponding release of HLS and introducing support for GHC 9.12.
Platform support
For many years, GHC’s FreeBSD support has been in a state of limbo: while the compiler has usually been functional on FreeBSD, we have never had proper CI support, meaning that we could neither systematically validate correctness nor produce binary distributions.
Late last year Ben fixed several issues that had been plaguing FreeBSD, allowing it to pass the testsuite and worked with a contributor to bring up a continuous integration runner for this platform (!13619, !13963). In response, we expect that GHC 9.14 will ship binary distributions for FreeBSD as a tier 2 platform.
However, supporting GHC’s compatibility matrix requires a real investment of time and energy. If you rely on FreeBSD or any other BSD, we would appreciate your help in looking after and improving GHC’s support of these platforms.
Frontend
Matthew, Adam, and Rodrigo wrote and proposed the now-accepted Explicit Level Imports proposal. This proposal represents a significant step forward in Haskell staged metaprogramming story, introducing syntax to distinguish imports needed at runtime from those only needed at compile-time (e.g. for TemplateHaskell splices). This distinction opens the door to compile-time improvements, more robust cross-compilation support, and a more expressive metaprogramming story.
Sam worked with Simon Peyton-Jones to implement GHC proposal #493 (Allow expressions in
SPECIALISE
pragmas) (!12319).Sam finished up work by GHC contributor Jade, giving GHCi error messages their own error codes (#23338, !13094).
Sam made several internal improvements to the typechecker, surrounding the function
checkTyEqRhs
which is responsible for skolem escape, occurs checks and representation-polymorphism checking (!13778, !13931).Sam implemented a simplification of the logic for solving of quantified constraints, both improving solver efficiency and simplifying specialization (!13958).
Sam refactored the GHC “error context” infrastructure, migrating it to a structured representation like for the error message contents (#23436, !10540).
Sam implemented defaulting of representational equalities, which allows GHC to accept several uses of
coerce
that used to be rejected with ambiguous types (#21003, !13834).Sam fixed GHC emitting spurious “incomplete record selectors” warnings due to missing long-distance information in the pattern-match checker (#25749, !13979).
Backend
Sam prevented GHC emitting LLVM code with incompatible vector types (e.g. the same variable being declared as
4xi32
and used as8xi16
) (!13936).Sam investigated CI failures with the LLVM backend, identifying several critical bugs such as #25771 and #25773.
Ben improved the naming of various compiler-generated binders, which will make it easier to make sense of
-ddump-simpl
output and runtime stacks (!13849, !13875).Rodrigo ensured that certain join-points inline, dramatically improving runtime allocations of certain programs (#25723, !13909).
In response to a serious correctness regression in 9.12.1, Ben improved the testing story for primops by adding Cmm surface syntax for the previously-untested
Mul2
operations and expanding the scope of thetest-primops
testsuite (!13843, test-primops!27).
Compiler performance
Matthew improved the performance of type family consistency checking by ensuring checks are run in topological order, significantly reducing redundant work (#25554, !13685).
Rodrigo made a variety of improvements in GHC’s memory consumption, including refactoring the
ModuleGraph
interface (!13658) and reducing the memory usage of module transitive closure calculations done when encountering Template Haskell splices (#25634, !13753).Rodrigo refactored the
HomePackageTable
andHomeUnitGraph
to avoid significant space leaks (#25511, !13675).Rodrigo improved the performance of compiling
deriving Show
andderiving Data
(!13739).
Runtime system
Ben fixed a few bugs in the linker’s object unloading implementation resulting in runtime crashes (#24935, !13704; #25039, !13714).
Ben removed some dead code in the IO manager which was causing some CI jobs to fail (!13678).
Ben lifted the runtime system’s limit of 256 capabilities, ensuring that the runtime system can scale to large multicore systems (#25560, !13692).
Ben fixed a bug in
mmapInRegion
which would cause it to loop indefinitely in certain circumstances on FreeBSD (#25492, !13618).
GHCi & bytecode interpreter
Matthew improved the error reporting of out-of-scope qualified names in GHCi (!13751).
Matthew fixed segfaults in the bytecode interpreter that were caused by the
FastString
table being loaded unoptimised (!13877).Matthew dramatically improved the performance of the bytecode interpreter
Matthew fixed the
INTERP_STATS
macro that is used for performance statistics of GHCi (!13879), and then proceeded to fix accounting errors in these statistics (!13956).Ben and Matthew improved the printing of BCOs to assist debugging the bytecode interpreter (!13570, !13878, !13955)
Ben fixed an incorrect assumption regarding which unlifted types can appear at the top-level (#25641, !13796).
Libraries
Ben re-introduced missing
{Enum/Show} IOSubSystem
instances that were accidentally removed in !9676 (#25549, !13683).Ben introduced
Data.Enum
andData.Bounded
as agreed in CLC Proposal #208, correcting an accidental inclusion ofData.Enum
in theghc-internal
refactor (#25320, !11347, !13790).Ben implemented CLC proposal #305, ensuring that threads created by GHC’s
base
library can be easily identified by their thread label (#25452, !13566).Rodrigo improved the implementation of
SomeException
forSomeAsyncException
, implementing CLC Proposal #309 (!13725).
Build system
Ben fixed #25501, ensuring that the
ld-override
logic is consistent between theconfigure
script andghc-toolchain
(!13617).Ben mitigated a race condition with
mktexfmt
in Hadrian (#25564, !13703).Ben allowed
i686
to be parsed as part of triples in the configure script (#25691, !13874).
Cabal
Matthew fixed two Cabal 3.14 regressions in which the current working directory was not correctly taken into account, when creating the build folder (#10772, #10800) and when running test executables (#10704, #10725).
Matthew fixed a Cabal 3.14 regression in which Cabal would erroneously pick versions of build tools (such as
alex
orhappy
) from the system environment rather than the versions specified inbuild-tool-depends
(#10692, #10731).
ghc-debug
Zubin implemented support in the ghc-debug
backend and Brick front-end for
streaming heap traversals, enabling constant-space analysis of large heaps
(!66).