This is the twenty-eighth edition of our Haskell ecosystem 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 June 2025 to August 2025.

This is a change of name for our GHC activities report, to reflect the fact that it focuses on more than just GHC work. You can find the previous editions collected under the haskell-ecosystem-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 including through the work described in this report. To find out more, read our announcement of these packages in partnership with the Haskell Foundation. We need funding to continue this essential maintenance work!

Recently we will delighted to welcome Standard Chartered as a Gold Haskell Ecosystem Supporter. Many thanks to Standard Chartered; to our other Haskell Ecosystem Supporters: Channable and QBayLogic; 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.

Team

The Haskell toolchain team at Well-Typed currently includes:

In addition, many others within Well-Typed contribute to GHC, Cabal and HLS occasionally, or contribute to other open source Haskell libraries and tools. This report includes contributions from Alex Washburn and Wen Kokke in particular.

GHC

GHC Releases

  • Ben worked on the 9.14.1 release, preparing backports and releasing the first alpha.

  • Ben and Zubin worked on backports for GHC 9.12.3.

  • Zubin worked on the 9.10.3 release, preparing backports and publishing the rc1, rc2 and rc3 release candidates.

Frontend

  • Sam made several improvements to the implementation of deep subsumption, allowing GHC to accept programs that it previously rejected (#26225, !14577).

  • Matt refactored the treatment of nested Template Haskell splices in GHC, making the code paths more consistent and removing code duplication (!14377).

  • Matt fixed some bugs related to level checking (for the ExplicitLevelImports extension), including a crash in the presence of cyclic imports (#26087, !14478) and some missing level checks (#26088, !14479, #26090, !14550).

  • Andreas allowed the type-class specialiser to look through type families, exposing more opportunities for specialisation (#26051, !14272).

  • Sam identified and fixed a situation in which RULES which were not active could fire nonetheless (#26323, !14687).

  • Ben and Andreas investigated various performance issues in the opaque newtype dictionaries patch, in preparation for merging to 9.14 (!10479)

LLVM backend

  • Alex fixed incorrect sign-extension and narrowing of bitReverse, byteSwap and pdep primops in the LLVM backend (#20645, #26109, !14609).

  • Alex fixed the LLVM backend generating references to non-existent LLVM intrinsics llvm.x86.bmi.{pdep,pext}.{8,16}, replacing them with usage of the appropriate 32-bit operations (#26065, !14647).

  • Andreas made GHC allow LLVM versions outside of the supported range, emitting a warning rather than an error (#25915, !14531).

  • Ben fixed the treatment of built-in arrays with LLVM, which was necessary to support newer LLVM versions. This fixed a raft of failing tests with the LLVM backend (#25769, !14157).

  • Ben implemented a major rework of the Windows Clang toolchain (!14442), with help from long-time Windows contributor Tamar Christina. This was necessary to adapt to changes in newer LLVM versions, such as the use of API sets.

GHCi and bytecode interpreter

  • Rodrigo has been working to improve the GHCi debugger, as a step towards better debugger tooling for Haskell programs. In particular, he implemented support for stepping-out of a function when debugging in GHCi, with the new :stepout command (#26042, !14416). He also made breakpoint indices 32 bits instead of 16 bits, as loading large programs in GHCi could overflow the counter (#26325, !14691), and made various other improvements to breakpoints (!14461, !14480, !14534).

  • Andreas fixed some issues around endianness in the bytecode interpreter, which could cause the interpreter to produce incorrect results from primitive operations on some platforms (#25791, #23387, !14172).

  • Hannes added a new GHCi flag -fno-load-initial-targets, allowing GHCi to be started without immediately loading all the target modules, so the user can selectively load the modules they are interested in with :reload (#26144, !14448). This can significantly reduce GHCi startup times when working on part of a large project.

  • Hannes fixed the remaining issues in the interaction of the GHCi :reload command with multiple home units (#26128, !14427).

  • Matt fixed some bugs in interpreter statistics calculations (#25756, !13956, #25695, !13879).

Documentation

  • Hannes updated the user’s guide to advertise full support for multiple home units (#20889, !14426).

  • Wen improved the documentation of eventlog cost centres and sample labels (!14499), and of heap profile IDs (!14506).

  • Andreas added @since annotations for the -fexpose-overloaded-unfolding and -fdo-clever-arg-eta-expansion GHC flags (#26112, #26113, !14517).

Runtime system and linker

  • Andreas added support for COFF BigObj files in the linker (!14582).

  • Ben made the linker less reliant on file extensions to identify archive members (#13103, #24230, !14405).

  • Hannes fixed an oversight in the hashing function used in the RTS (#26274, !14651).

Profiling and debugging

  • Hannes added a new primop and ghc-experimental API which allows annotating the call stack with arbitrary data, in pursuit of better backtraces (#26218, !14538). See his recent blog post Better Haskell stack traces via user annotations for a more detailed explanation of the new features.

  • Hannes improved the implementation of the Backtraces type and extended the backtrace mechanism to allow configuring stack decoders (#26211, !14532). He also reverted a change that would have exposed the internal implementation of the Backtraces type from base, as this needs a CLC proposal (!14587).

  • Andreas disabled the -fprof-late-overloaded-calls functionality for join points, as this could cause GHC crashes (#26138, !14460). This is a temporary fix before the root problem can be addressed in full.

  • Matt allowed info table entries used for profiling to be distributed separately (#21766, !14465).

  • Wen disabled the usage of --eventlog-flush-interval in the non-threaded RTS, to avoid eventlog corruption (#26222, !14547).

  • Wen removed the unused hard-coded profile_id from eventlog traces (!14507).

  • Ben factored out the constructor ctoi tuple info tables into a data section for re-usability (!14508).

  • Ben fixed a regression in zstd compression support for info-table provenance tables (#26312)

Core libraries and ghc library

  • Zubin added newNameCache, a version of initNameCache that isn’t prone to being misused (!14446).

    This was in response to a bug in which the weeder library (weeder #194, #26055) was using initNameCache incorrectly.

  • Rodrigo added an export of displayExceptionWithInfo to base, implementing CLC proposal #344 (!14419).

  • Hannes implemented CLC proposal #212, removing some deprecated heap representation details from GHC.Exts (!14544).

  • Ben removed IOPort, an internal datatype that could be replaced by MVar, implementing CLC proposal #213 (!8776).

Build system and packaging

  • Zubin fixed an issue in which the user’s guide PDF would not be included in a binary distribution (#24093, !14469).

  • Ben added support for otool, install-name-tool and LLVM utilies such as llc, opt to ghc-toolchain (#23675, !14050).

  • Ben allowed the CrossCompiling predicate to be overridden (#26236, !14568).

  • Ben dropped build-system logic for preferring the now-deprecated ld.gold linker (#25716, !14324).

CI and testing

  • Hannes and Zubin upgraded the bootstrap compiler to 9.10.1 on MacOS (!14601), Windows (!14622) and FreeBSD (!14666). This allowed Hannes to update the test-bootstrap job to use 9.10.1 (!14676).

  • Zubin improved how the testsuite driver filters out certain spurious linker warnings (#26249, !14615).

Haddock

  • Zubin fixed Haddock emitting spurious warnings for undocumented type family axioms (which cannot have documentation attached to them) (#26114, !14447).

Cabal

  • Matt helped the Cabal project adopt a formal proposal process by writing up the Cabal Proposals Process. This document was discussed in Cabal #11006, and eventually agreed upon by the existing Cabal maintainers.

  • Matt opened a Cabal proposal to add support for bytecode artifacts, which would speed up GHCi usage and allow the GHCi debugger to step through dependencies such as code in base (Cabal Proposals #2).

  • Matt helped finish up work by Cabal contributor Julian G (@jgotoh) to migrate the cabal.project parser to use Parsec (Cabal #8889).

  • Matt updated the CI release scripts, bumping the boot compiler version and updating platforms (Cabal #11032).

  • Matt adapted the Cabal library to the change in exception contexts in base-4.21 (Cabal #11125). This issue arose when helping Phil de Joux investigate a mysterious issue on Cabal #10684.

  • Matt made Cabal use response files when starting multi-repl sessions, rather than passing long command-line invocations (Cabal #10995). These changes were subsequently reverted for the Cabal 3.16 release, in order to preserve compatibility with released HLS bindists (Cabal #11101). The plan is to go forward with response files in Cabal 3.18, giving HLS the time to adapt.

  • Matt, with help from Hannes, added the --with-repl flag to the cabal-install repl command, allowing external tools such as hie-bios and doctest to easily figure out the correct options for starting a GHCi session (Cabal #10996).

Haskell Language Server

  • Hannes made hie-bios use Cabal’s --with-repl command to load the session, which greatly simplifies the implementation and its treatment of multiple home units (hie-bios #466).

ghc-debug

  • Hannes made the IPE information display inline for stack closures (ghc-debug #73).

  • Matthew allowed the ghc-debug-brick terminal interface to be incrementally updated while a query is run (ghc-debug #68).

  • Hannes restructured the ghc-debug-brick module hierarchy (ghc-debug #72), and made it available as a separate library (ghc-debug #74).

  • Hannes added support for custom stack annotations (ghc-debug #69).

Infrastructure

  • Ben migrated the haskell.org mail delivery and mailing list infrastructure to a more maintainable hosting situation. This involved rebuilding the mail delivery configuration on NixOS, migrating two decades of mailing list data to from mailman-2 to mailman-3, and implementing a scheme to ensure that the previous mailman-2 archives remain available.

  • In response to user feedback, Ben carried out a variety of improvements to the Hackage documentation builder, allowing a greater breadth of packages to build.

  • Ben coordinated with the Haskell Foundation to provision a set of new CI runners for AArch64/Linux to replace capacity lost to the end of Azure’s open-source program.

Libraries