[Git][ghc/ghc][wip/spj-reinstallable-base] Add documentation for new flags
by Simon Peyton Jones (@simonpj) 21 Mar '26
by Simon Peyton Jones (@simonpj) 21 Mar '26
21 Mar '26
Simon Peyton Jones pushed to branch wip/spj-reinstallable-base at Glasgow Haskell Compiler / GHC
Commits:
232a7d8a by Simon Peyton Jones at 2026-03-21T15:59:04+00:00
Add documentation for new flags
- - - - -
1 changed file:
- docs/users_guide/separate_compilation.rst
Changes:
=====================================
docs/users_guide/separate_compilation.rst
=====================================
@@ -1641,3 +1641,44 @@ using the :ghc-flag:`--show-iface ⟨file⟩` :ref:`mode <modes>`. If there is a
.. [1]
This is a change in behaviour relative to 6.2 and earlier.
+
+
+.. _known-key-names
+
+Known-key names
+----------------------------------------
+
+(This section is relevant only if you are a GHC developer, or you are
+modifying the ``base`` package.)
+
+GHC relies on a few hundred entities (types, classes, and functions)
+defined in the libraries ``ghc-internal`` or ``base``. These include the classes
+``Num``, ``Show``, etc, the types ``Rational``, ``Ratio`` etc, and much
+more. These entities have so-called "known-key" names.
+
+You can read ``Note [Overview of known-key names]`` in GHC's source code
+to understand more. The behaviour of known-key names is controlled by two
+flags:
+
+.. ghc-flag:: -frebindable-known-key-names
+ :shortdesc: Find known-key names in the current top-level scope
+ :type: dynamic
+ :category:
+
+ This flag is off by default. It is typically set when compiling modules
+ in ``ghc-internal`` or ``base``, and tells GHC to look for a known-key
+ entity in the current top-level scope. When the flag is un-set, GHC looks
+ for the module ``base:GHC.KnownKeyNames``, but this module does not exist
+ when compiling ``ghc-internal`` or ``base``, which is why the flag is needed.
+
+.. ghc-flag:: -fdefines-known-key-names
+ :shortdesc: This module defines a known-key name
+ :type: dynamic
+ :category:
+
+ This flag is off by default. It should be set when compiling a module
+ that *defines* a known-key entity. That is how GHC knows that the entity
+ called "Rational" in this module is *the* known-key ``Rational`` and not
+ some other random type or class that happens to be called "Rational".
+
+
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/232a7d8a15fee7365ed69e6897b88b8…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/232a7d8a15fee7365ed69e6897b88b8…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 8 commits: Add support for custom external interpreter commands
by Marge Bot (@marge-bot) 21 Mar '26
by Marge Bot (@marge-bot) 21 Mar '26
21 Mar '26
Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
18513365 by Matthew Pickering at 2026-03-21T04:43:26-04:00
Add support for custom external interpreter commands
It can be useful for GHC API clients to implement their own external
interpreter commands.
For example, the debugger may want an efficient way to inspect the
stacks of the running threads in the external interpreter.
- - - - -
4636d906 by mangoiv at 2026-03-21T04:44:10-04:00
ci: remove obsolete fallback for old debian and ubuntu versions
- - - - -
2e3a2805 by mangoiv at 2026-03-21T04:44:10-04:00
ci: drop ubuntu 18 and 20
Ubuntu 18 EOL: May 2023
Ubuntu 20 EOL: May 2025
We should probably not make another major release supporting these platforms.
Also updates the generator script.
Resolves #25876
- - - - -
e2ceef42 by Cheng Shao at 2026-03-21T11:26:29-04:00
rts: fix -Wcompare-distinct-pointer-types errors
This commit fixes `-Wcompare-distinct-pointer-types` errors in the RTS
which should have been caught by the `validate` flavour but was
warnings in CI due to the recent `+werror` regression.
- - - - -
a4d44ba6 by Cheng Shao at 2026-03-21T11:26:29-04:00
ghc-internal: fix unused imports
This commit fixes unused imports in `ghc-internal` which should have
been caught by the `validate` flavour but was warnings in CI due to
the recent `+werror` regression. Fixes #26987 #27059.
- - - - -
f343fd14 by Cheng Shao at 2026-03-21T11:26:29-04:00
compiler: fix unused imports in GHC.Tc.Types.Origin
This commit fixes unused imports in `GHC.Tc.Types.Origin` which should
have been caught by the `validate` flavour but was warnings in CI due
to the recent `+werror` regression. Fixes #27059.
- - - - -
3958513a by Cheng Shao at 2026-03-21T11:26:30-04:00
hadrian: fix missing +werror in validate flavour
This patch fixes missing `+werror` in validate flavour, which was an
oversight in bb3a2ba1eefadf0b2ef4f39b31337a23eec67f29. Fixes #27066.
- - - - -
55fb9b87 by Cheng Shao at 2026-03-21T11:26:30-04:00
ci: bump CACHE_REV and add the missing reminder
This patch bumps `CACHE_REV` to address recent `[Cabal-7159]` CI
errors due to stale cabal cache on some runners, and also adds a
reminder to remind future maintainers. Fixes #27075.
- - - - -
31 changed files:
- .gitlab-ci.yml
- .gitlab/generate-ci/flake.lock
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- .gitlab/rel_eng/fetch-gitlab-artifacts/fetch_gitlab.py
- .gitlab/rel_eng/mk-ghcup-metadata/mk_ghcup_metadata.py
- compiler/GHC/Tc/Types/Origin.hs
- docs/users_guide/utils.py
- hadrian/cabal.project
- hadrian/src/Settings/Flavours/Validate.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/IO.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Control.hs
- libraries/ghc-internal/src/GHC/Internal/Event/KQueue.hsc
- libraries/ghc-internal/src/GHC/Internal/Float.hs
- libraries/ghc-internal/src/GHC/Internal/Float/RealFracMethods.hs
- libraries/ghc-internal/src/GHC/Internal/IO/FD.hs
- libraries/ghc-internal/src/GHC/Internal/Int.hs
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags.hsc
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
- libraries/ghc-internal/src/GHC/Internal/System/Environment.hs
- libraries/ghc-internal/src/GHC/Internal/System/Environment/Blank.hsc
- libraries/ghc-internal/src/GHC/Internal/System/IO.hs
- libraries/ghc-internal/src/GHC/Internal/System/Posix/Internals.hs
- libraries/ghc-internal/src/GHC/Internal/TopHandler.hs
- libraries/ghci/GHCi/Message.hs
- libraries/ghci/GHCi/Run.hs
- libraries/ghci/GHCi/Server.hs
- rts/Interpreter.c
- + testsuite/tests/ghci/custom-external-interpreter-commands/Main.hs
- + testsuite/tests/ghci/custom-external-interpreter-commands/all.T
- + testsuite/tests/ghci/custom-external-interpreter-commands/custom-external-interpreter-commands.stdout
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/f6888f3780d98629ae831830a475fc…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/f6888f3780d98629ae831830a475fc…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc] Pushed new branch wip/ChickenProp/fix-werror-glibc-2.43
by Phil Hazelden (@ChickenProp) 21 Mar '26
by Phil Hazelden (@ChickenProp) 21 Mar '26
21 Mar '26
Phil Hazelden pushed new branch wip/ChickenProp/fix-werror-glibc-2.43 at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/ChickenProp/fix-werror-glibc-…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
21 Mar '26
Simon Jakobi pushed new branch wip/sjakobi/T11955 at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/sjakobi/T11955
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] 2 commits: ci: remove obsolete fallback for old debian and ubuntu versions
by Marge Bot (@marge-bot) 21 Mar '26
by Marge Bot (@marge-bot) 21 Mar '26
21 Mar '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
4636d906 by mangoiv at 2026-03-21T04:44:10-04:00
ci: remove obsolete fallback for old debian and ubuntu versions
- - - - -
2e3a2805 by mangoiv at 2026-03-21T04:44:10-04:00
ci: drop ubuntu 18 and 20
Ubuntu 18 EOL: May 2023
Ubuntu 20 EOL: May 2025
We should probably not make another major release supporting these platforms.
Also updates the generator script.
Resolves #25876
- - - - -
7 changed files:
- .gitlab-ci.yml
- .gitlab/generate-ci/flake.lock
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- .gitlab/rel_eng/fetch-gitlab-artifacts/fetch_gitlab.py
- .gitlab/rel_eng/mk-ghcup-metadata/mk_ghcup_metadata.py
- docs/users_guide/utils.py
Changes:
=====================================
.gitlab-ci.yml
=====================================
@@ -1212,10 +1212,6 @@ ghcup-metadata-nightly:
artifacts: false
- job: nightly-x86_64-linux-ubuntu22_04-validate
artifacts: false
- - job: nightly-x86_64-linux-ubuntu20_04-validate
- artifacts: false
- - job: nightly-x86_64-linux-ubuntu18_04-validate
- artifacts: false
- job: nightly-x86_64-linux-rocky8-validate
artifacts: false
- job: nightly-x86_64-darwin-validate
=====================================
.gitlab/generate-ci/flake.lock
=====================================
@@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -20,12 +20,10 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1724334015,
- "narHash": "sha256-5sfvc0MswIRNdRWioUhG58rGKGn2o90Ck6l6ClpwQqA=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "6d204f819efff3d552a88d0a44b5aaaee172b784",
- "type": "github"
+ "lastModified": 0,
+ "narHash": "sha256-M0yS4AafhKxPPmOHGqIV0iKxgNO8bHDWdl1kOwGBwRY=",
+ "path": "/nix/store/nbylyyw8k98a0an6p6nz0hvk5psygwb8-source",
+ "type": "path"
},
"original": {
"id": "nixpkgs",
=====================================
.gitlab/generate-ci/gen_ci.hs
=====================================
@@ -122,8 +122,6 @@ data LinuxDistro
| Ubuntu2404LoongArch64
| Ubuntu2404
| Ubuntu2204
- | Ubuntu2004
- | Ubuntu1804
| Alpine312
| Alpine323
| AlpineWasm
@@ -326,8 +324,6 @@ distroName Debian13Riscv = "deb13-riscv"
distroName Debian12Wine = "deb12-wine"
distroName Fedora43 = "fedora43"
distroName Ubuntu2404LoongArch64 = "ubuntu24_04-loongarch"
-distroName Ubuntu1804 = "ubuntu18_04"
-distroName Ubuntu2004 = "ubuntu20_04"
distroName Ubuntu2204 = "ubuntu22_04"
distroName Ubuntu2404 = "ubuntu24_04"
distroName Alpine312 = "alpine3_12"
@@ -1193,9 +1189,7 @@ debian_i386 =
ubuntu_x86 :: [JobGroup Job]
ubuntu_x86 =
- [ disableValidate (standardBuilds Amd64 (Linux Ubuntu1804))
- , disableValidate (standardBuilds Amd64 (Linux Ubuntu2004))
- , disableValidate (standardBuilds Amd64 (Linux Ubuntu2204))
+ [ disableValidate (standardBuilds Amd64 (Linux Ubuntu2204))
, disableValidate (standardBuilds Amd64 (Linux Ubuntu2404))
]
=====================================
.gitlab/jobs.yaml
=====================================
@@ -3385,132 +3385,6 @@
"XZ_OPT": "-9"
}
},
- "nightly-x86_64-linux-ubuntu18_04-validate": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "8 weeks",
- "paths": [
- "ghc-x86_64-linux-ubuntu18_04-validate.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu18_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu18_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "(\"true\" == \"true\") && ($RELEASE_JOB != \"yes\") && ($NIGHTLY)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu18_04-validate",
- "BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu18_04-validate",
- "XZ_OPT": "-9"
- }
- },
- "nightly-x86_64-linux-ubuntu20_04-validate": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "8 weeks",
- "paths": [
- "ghc-x86_64-linux-ubuntu20_04-validate.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu20_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu20_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "(\"true\" == \"true\") && ($RELEASE_JOB != \"yes\") && ($NIGHTLY)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu20_04-validate",
- "BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu20_04-validate",
- "XZ_OPT": "-9"
- }
- },
"nightly-x86_64-linux-ubuntu22_04-validate": {
"after_script": [
".gitlab/ci.sh save_cache",
@@ -5192,134 +5066,6 @@
"XZ_OPT": "-9"
}
},
- "release-x86_64-linux-ubuntu18_04-release": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "1 year",
- "paths": [
- "ghc-x86_64-linux-ubuntu18_04-release.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu18_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu18_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "(\"true\" == \"true\") && ($RELEASE_JOB == \"yes\") && ($NIGHTLY == null)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu18_04-release",
- "BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "IGNORE_PERF_FAILURES": "all",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu18_04-release",
- "XZ_OPT": "-9"
- }
- },
- "release-x86_64-linux-ubuntu20_04-release": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "1 year",
- "paths": [
- "ghc-x86_64-linux-ubuntu20_04-release.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu20_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu20_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "(\"true\" == \"true\") && ($RELEASE_JOB == \"yes\") && ($NIGHTLY == null)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu20_04-release",
- "BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "IGNORE_PERF_FAILURES": "all",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu20_04-release",
- "XZ_OPT": "-9"
- }
- },
"release-x86_64-linux-ubuntu22_04-release": {
"after_script": [
".gitlab/ci.sh save_cache",
@@ -7472,130 +7218,6 @@
"TEST_ENV": "x86_64-linux-rocky8-validate"
}
},
- "x86_64-linux-ubuntu18_04-validate": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "2 weeks",
- "paths": [
- "ghc-x86_64-linux-ubuntu18_04-validate.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu18_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu18_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "((($ONLY_JOBS) && ($ONLY_JOBS =~ /.*\\bx86_64-linux-ubuntu18_04-validate(\\s|$).*/)) || (($ONLY_JOBS == null) && (\"disabled\" != \"disabled\"))) && ($RELEASE_JOB != \"yes\") && ($NIGHTLY == null)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu18_04-validate",
- "BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu18_04-validate"
- }
- },
- "x86_64-linux-ubuntu20_04-validate": {
- "after_script": [
- ".gitlab/ci.sh save_cache",
- ".gitlab/ci.sh save_test_output",
- ".gitlab/ci.sh clean",
- "cat ci_timings.txt"
- ],
- "allow_failure": false,
- "artifacts": {
- "expire_in": "2 weeks",
- "paths": [
- "ghc-x86_64-linux-ubuntu20_04-validate.tar.xz",
- "junit.xml",
- "unexpected-test-output.tar.gz"
- ],
- "reports": {
- "junit": "junit.xml"
- },
- "when": "always"
- },
- "cache": {
- "key": "x86_64-linux-ubuntu20_04-$CACHE_REV",
- "paths": [
- "cabal-cache",
- "toolchain"
- ]
- },
- "dependencies": [],
- "image": "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu20_04:$DOCKER_…",
- "needs": [
- {
- "artifacts": false,
- "job": "hadrian-ghc-in-ghci"
- }
- ],
- "rules": [
- {
- "if": "((($ONLY_JOBS) && ($ONLY_JOBS =~ /.*\\bx86_64-linux-ubuntu20_04-validate(\\s|$).*/)) || (($ONLY_JOBS == null) && (\"disabled\" != \"disabled\"))) && ($RELEASE_JOB != \"yes\") && ($NIGHTLY == null)",
- "when": "on_success"
- }
- ],
- "script": [
- "sudo chown ghc:ghc -R .",
- ".gitlab/ci.sh setup",
- ".gitlab/ci.sh configure",
- ".gitlab/ci.sh build_hadrian",
- ".gitlab/ci.sh test_hadrian"
- ],
- "stage": "full-build",
- "tags": [
- "x86_64-linux"
- ],
- "variables": {
- "BIGNUM_BACKEND": "gmp",
- "BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu20_04-validate",
- "BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
- "RUNTEST_ARGS": "",
- "TEST_ENV": "x86_64-linux-ubuntu20_04-validate"
- }
- },
"x86_64-linux-ubuntu22_04-validate": {
"after_script": [
".gitlab/ci.sh save_cache",
=====================================
.gitlab/rel_eng/fetch-gitlab-artifacts/fetch_gitlab.py
=====================================
@@ -21,8 +21,6 @@ def job_triple(job_name):
'release-x86_64-linux-rocky8-release': 'x86_64-rocky8-linux',
'release-x86_64-linux-ubuntu24_04-release': 'x86_64-ubuntu24_04-linux',
'release-x86_64-linux-ubuntu22_04-release': 'x86_64-ubuntu22_04-linux',
- 'release-x86_64-linux-ubuntu20_04-release': 'x86_64-ubuntu20_04-linux',
- 'release-x86_64-linux-ubuntu18_04-release': 'x86_64-ubuntu18_04-linux',
'release-x86_64-linux-fedora43-release': 'x86_64-fedora43-linux',
'release-x86_64-linux-fedora43-release+debug_info': 'x86_64-fedora43-linux-dwarf',
'release-x86_64-linux-deb13-release': 'x86_64-deb13-linux',
=====================================
.gitlab/rel_eng/mk-ghcup-metadata/mk_ghcup_metadata.py
=====================================
@@ -195,8 +195,6 @@ def mk_new_yaml(release_mode, version, date, pipeline_type, job_map):
return mk_one_metadata(release_mode, version, job_map, mk_from_platform(pipeline_type, platform))
# Here are all the bindists we can distribute
- ubuntu1804 = mk(ubuntu("18_04"))
- ubuntu2004 = mk(ubuntu("20_04"))
ubuntu2204 = mk(ubuntu("22_04"))
ubuntu2404 = mk(ubuntu("24_04"))
rocky8 = mk(rocky("8"))
@@ -227,15 +225,13 @@ def mk_new_yaml(release_mode, version, date, pipeline_type, job_map):
, "( >= 12 && < 13 )": deb12
, ">= 13": deb13
, "unknown_versioning": deb11 }
- , "Linux_Ubuntu" : { "unknown_versioning": ubuntu2004
- , "( >= 18 && < 19 )": ubuntu1804
- , "( >= 19 && < 21 )": ubuntu2004
- , "( >= 21 && < 24 )": ubuntu2204
+ , "Linux_Ubuntu" : { "unknown_versioning": ubuntu2204
+ , "( < 24 )": ubuntu2204
, "( >= 24 )": ubuntu2404
}
- , "Linux_Mint" : { "< 20": ubuntu1804
- , ">= 20": ubuntu2004
- , "unknown_versioning": ubuntu2004 }
+ , "Linux_Mint" : { "< 24": ubuntu2204
+ , ">= 24": ubuntu2404
+ , "unknown_versioning": ubuntu2204 }
, "Linux_CentOS" : { "( >= 8 && < 9 )" : rocky8
, "unknown_versioning" : rocky8 }
, "Linux_Fedora" : { ">= 43": fedora43
=====================================
docs/users_guide/utils.py
=====================================
@@ -1,11 +1,6 @@
from docutils import nodes
-# N.B. `packaging` is not available in Ubuntu 18.04 or Debian 9
-# See #23818.
-try:
- from packaging.version import parse as parse_version
-except ImportError as e:
- from distutils.version import LooseVersion as parse_version
+from packaging.version import parse as parse_version
# Taken from Docutils source inside the ListTable class. We must bypass
# using the class itself, but this function comes in handy.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/1851336595243259a37eaac75aba17…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/1851336595243259a37eaac75aba17…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] Add support for custom external interpreter commands
by Marge Bot (@marge-bot) 21 Mar '26
by Marge Bot (@marge-bot) 21 Mar '26
21 Mar '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
18513365 by Matthew Pickering at 2026-03-21T04:43:26-04:00
Add support for custom external interpreter commands
It can be useful for GHC API clients to implement their own external
interpreter commands.
For example, the debugger may want an efficient way to inspect the
stacks of the running threads in the external interpreter.
- - - - -
6 changed files:
- libraries/ghci/GHCi/Message.hs
- libraries/ghci/GHCi/Run.hs
- libraries/ghci/GHCi/Server.hs
- + testsuite/tests/ghci/custom-external-interpreter-commands/Main.hs
- + testsuite/tests/ghci/custom-external-interpreter-commands/all.T
- + testsuite/tests/ghci/custom-external-interpreter-commands/custom-external-interpreter-commands.stdout
Changes:
=====================================
libraries/ghci/GHCi/Message.hs
=====================================
@@ -71,6 +71,7 @@ import qualified GHC.Boot.TH.Monad as TH
import System.Exit
import System.IO
import System.IO.Error
+import Data.Word (Word8)
-- -----------------------------------------------------------------------------
-- The RPC protocol between GHC and the interactive server
@@ -246,6 +247,11 @@ data Message a where
:: RemoteRef (ResumeContext ())
-> Message (EvalStatus ())
+ -- | User-defined request encoded as a tag/payload pair. This is left
+ -- uninterpreted by GHC and is meant for GHC API applications to be able to supply
+ -- their own interpreter which understands additional commands.
+ CustomMessage :: Word8 -> ByteString -> Message ByteString
+
deriving instance Show (Message a)
-- | Used to dynamically create a data constructor's info table at
@@ -602,6 +608,7 @@ getMessage = do
38 -> Msg <$> (ResumeSeq <$> get)
39 -> Msg <$> (LookupSymbolInDLL <$> get <*> get)
40 -> Msg <$> (WhereFrom <$> get)
+ 41 -> Msg <$> (CustomMessage <$> get <*> get)
_ -> error $ "Unknown Message code " ++ (show b)
putMessage :: Message a -> Put
@@ -648,6 +655,7 @@ putMessage m = case m of
ResumeSeq a -> putWord8 38 >> put a
LookupSymbolInDLL dll str -> putWord8 39 >> put dll >> put str
WhereFrom a -> putWord8 40 >> put a
+ CustomMessage tag payload -> putWord8 41 >> put tag >> put payload
{-
Note [Parallelize CreateBCOs serialization]
=====================================
libraries/ghci/GHCi/Run.hs
=====================================
@@ -125,6 +125,7 @@ run m = case m of
Shutdown -> unexpectedMessage m
RunTH {} -> unexpectedMessage m
RunModFinalizers {} -> unexpectedMessage m
+ CustomMessage {} -> unexpectedMessage m
unexpectedMessage :: Message a -> b
unexpectedMessage m = error ("GHCi.Run.Run: unexpected message: " ++ show m)
=====================================
libraries/ghci/GHCi/Server.hs
=====================================
@@ -1,7 +1,11 @@
{-# LANGUAGE CPP, RankNTypes, RecordWildCards, GADTs, ScopedTypeVariables #-}
module GHCi.Server
- ( serv
+ ( MessageHook
+ , CustomMessageHandler
+ , serv
+ , servWithCustom
, defaultServer
+ , defaultServerWithCustom
)
where
@@ -10,8 +14,8 @@ import GHCi.Run
import GHCi.Signals
import GHCi.TH
import GHCi.Message
-#if defined(wasm32_HOST_ARCH)
import Data.ByteString (ByteString)
+#if defined(wasm32_HOST_ARCH)
import qualified Data.ByteString.Builder as B
import qualified Data.ByteString.Internal as B
import qualified Data.ByteString.Unsafe as B
@@ -22,6 +26,7 @@ import GHC.Wasm.Prim
#else
import GHCi.Utils
#endif
+import Data.Word (Word8)
import Control.DeepSeq
import Control.Exception
@@ -36,11 +41,27 @@ import System.IO
type MessageHook = Msg -> IO Msg
+-- | How to interpret the 'CustomCommand'.
+type CustomMessageHandler = Word8 -> ByteString -> IO (Maybe ByteString)
+
+noCustomHandler :: CustomMessageHandler
+noCustomHandler _ _ = return Nothing
+
trace :: String -> IO ()
trace s = getProgName >>= \name -> hPrintf stderr "[%20s] %s\n" name s
serv :: Bool -> MessageHook -> Pipe -> (forall a .IO a -> IO a) -> IO ()
-serv verbose hook pipe restore = loop
+serv verbose hook pipe restore =
+ servWithCustom verbose hook pipe restore noCustomHandler
+
+servWithCustom
+ :: Bool
+ -> MessageHook
+ -> Pipe
+ -> (forall a .IO a -> IO a)
+ -> CustomMessageHandler
+ -> IO ()
+servWithCustom verbose hook pipe restore customHandler = loop
where
loop = do
when verbose $ trace "reading pipe..."
@@ -50,6 +71,7 @@ serv verbose hook pipe restore = loop
when verbose $ trace ("msg: " ++ (show msg))
case msg of
+ CustomMessage tag payload -> handleCustom tag payload
Shutdown -> return ()
RunTH st q ty loc -> wrapRunTH $ runTH pipe st q ty loc
RunModFinalizers st qrefs -> wrapRunTH $ runModFinalizerRefs pipe st qrefs
@@ -61,6 +83,13 @@ serv verbose hook pipe restore = loop
writePipe pipe (put r)
loop
+ handleCustom tag payload = do
+ mresp <- customHandler tag payload
+ case mresp of
+ Just resp -> reply resp
+ Nothing ->
+ error $ "GHCi.Server: unhandled CustomMessage with tag " ++ show tag
+
-- Run some TH code, which may interact with GHC by sending
-- THMessage requests, and then finally send RunTHDone followed by a
-- QResult. For an overview of how TH works with Remote GHCi, see
@@ -109,12 +138,24 @@ serv verbose hook pipe restore = loop
-- | Default server
#if defined(wasm32_HOST_ARCH)
defaultServer :: Callback (JSVal -> IO ()) -> Callback (IO JSUint8Array) -> Callback (JSUint8Array -> IO ()) -> IO ()
-defaultServer cb_sig cb_recv cb_send = do
+defaultServer cb_sig cb_recv cb_send =
+ defaultServerWithCustom cb_sig cb_recv cb_send noCustomHandler
+
+defaultServerWithCustom
+ :: Callback (JSVal -> IO ())
+ -> Callback (IO JSUint8Array)
+ -> Callback (JSUint8Array -> IO ())
+ -> CustomMessageHandler
+ -> IO ()
+defaultServerWithCustom cb_sig cb_recv cb_send customHandler = do
args <- getArgs
let rest = args
#else
defaultServer :: IO ()
-defaultServer = do
+defaultServer = defaultServerWithCustom noCustomHandler
+
+defaultServerWithCustom :: CustomMessageHandler -> IO ()
+defaultServerWithCustom customHandler = do
args <- getArgs
(outh, inh, rest) <-
case args of
@@ -152,7 +193,7 @@ defaultServer = do
putStrLn "Waiting 3s"
threadDelay 3000000
- uninterruptibleMask $ serv verbose hook pipe
+ uninterruptibleMask $ \restore -> servWithCustom verbose hook pipe restore customHandler
where hook = return -- empty hook
-- we cannot allow any async exceptions while communicating, because
=====================================
testsuite/tests/ghci/custom-external-interpreter-commands/Main.hs
=====================================
@@ -0,0 +1,202 @@
+{-# LANGUAGE OverloadedStrings, GADTs, TypeAbstractions #-}
+module Main (main) where
+
+import qualified Data.Binary as Bin
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Lazy as BL
+import Control.Exception (bracket)
+import Control.Monad (void)
+import Data.Word (Word8)
+import GHCi.Message
+ ( Message(..)
+ , mkPipeFromHandles
+ , remoteCall
+ , Pipe
+ )
+import GHCi.Server
+ ( CustomMessageHandler
+ , defaultServerWithCustom
+ )
+import System.Environment
+ ( getArgs
+ , getExecutablePath
+ , getProgName
+ , withArgs
+ )
+import System.Exit (exitFailure)
+import System.IO
+ ( Handle
+ , BufferMode(..)
+ , hSetBuffering
+ , hSetBinaryMode
+ , hClose
+ , hPutStrLn
+ , stderr
+ )
+import System.Posix.IO
+ ( createPipe
+ , fdToHandle
+ , setFdOption
+ , FdOption(CloseOnExec)
+ )
+import System.Process
+ ( createProcess
+ , proc
+ , std_in
+ , std_out
+ , std_err
+ , StdStream(Inherit)
+ , terminateProcess
+ , waitForProcess
+ , ProcessHandle
+ )
+import Text.Read (readMaybe)
+
+--------------------------------------------------------------------------------
+-- Shared request/response definitions and helpers
+
+data ClientCommand a where
+ SquareCommand :: Int -> ClientCommand Int
+ MulCommand :: Int -> Int -> ClientCommand Int
+
+deriving instance (Show (ClientCommand a))
+
+data Some c f where
+ Some :: c a => f a -> Some c f
+
+
+instance Bin.Binary (Some Bin.Binary ClientCommand) where
+ put (Some i) =
+ case i of
+ SquareCommand n -> Bin.put (0 :: Word8) >> Bin.put n
+ MulCommand m n -> Bin.put (1 :: Word8) >> Bin.put m >> Bin.put n
+
+ get = do
+ (tag :: Word8) <- Bin.get
+ fmap Some $ case tag of
+ 0 -> SquareCommand <$> Bin.get
+ 1 -> MulCommand <$> Bin.get <*> Bin.get
+
+
+customTag :: Word8
+customTag = 0x42
+
+encodeLazy :: Bin.Binary a => a -> BS.ByteString
+encodeLazy = BL.toStrict . Bin.encode
+
+decodeLazy :: Bin.Binary a => BS.ByteString -> Either String a
+decodeLazy bs =
+ case Bin.decodeOrFail (BL.fromStrict bs) of
+ Left (_, _, err) -> Left err
+ Right (_, _, a) -> Right a
+
+--------------------------------------------------------------------------------
+-- Mode selection
+
+data Mode
+ = RunClient Int
+ | RunServer [String] -- forwarded to GHCi.Server
+
+defaultInput :: Int
+defaultInput = 12
+
+parseMode :: [String] -> Either String Mode
+parseMode [] = Right (RunClient defaultInput)
+parseMode ["client"] = Right (RunClient defaultInput)
+parseMode ["client", nStr] =
+ case readMaybe nStr of
+ Just n -> Right (RunClient n)
+ Nothing -> Left $ "Unable to parse integer argument: " ++ nStr
+parseMode ("client":_) = Left "Too many arguments for client mode."
+parseMode ("server":rest) = Right (RunServer rest)
+parseMode args = Left "Unknown mode, use client/server"
+
+usage :: IO ()
+usage = do
+ prog <- getProgName
+ putStrLn $ unlines
+ [ "Usage:"
+ , " " ++ prog ++ " [client [n]] Run the client and square n (default 12)."
+ , " " ++ prog ++ " server <write-fd> <read-fd> Run as an iserv process."
+ ]
+
+--------------------------------------------------------------------------------
+-- Client/server drivers
+
+main :: IO ()
+main = do
+ args <- getArgs
+ case parseMode args of
+ Left err -> do
+ hPutStrLn stderr err
+ usage
+ exitFailure
+ Right (RunClient n) -> runClient n
+ Right (RunServer serverArgs) ->
+ withArgs serverArgs (defaultServerWithCustom (customHandler handleClientCommand))
+
+handleClientCommand :: ClientCommand a -> IO a
+handleClientCommand (SquareCommand n) = pure $ n * n
+handleClientCommand (MulCommand n m) = pure $ n * m
+
+
+customMessage :: (Show a, Bin.Binary a) => Pipe -> ClientCommand a -> IO a
+customMessage pipe c = do
+ let payload = encodeLazy (Some @Bin.Binary c)
+ putStrLn $ "Sending: " ++ show c
+ respBytes <- remoteCall pipe (CustomMessage customTag payload)
+ case decodeLazy respBytes of
+ Left err -> error $ "Decode error: " ++ err
+ Right res -> pure res
+
+
+runClient :: Int -> IO ()
+runClient input = do
+ serverExe <- getExecutablePath
+ withServer serverExe $ \hFromServer hToServer -> do
+ pipe <- mkPipeFromHandles hFromServer hToServer
+ res <- customMessage pipe (SquareCommand input)
+ putStrLn $ "Square returned: " ++ show res
+ res2 <- customMessage pipe (MulCommand 2 res)
+ putStrLn $ "Mul returned: " ++ show res2
+
+withServer :: FilePath -> (Handle -> Handle -> IO a) -> IO a
+withServer serverExe action = do
+ (ghcRead, serverWrite) <- createPipe
+ (serverRead, ghcWrite) <- createPipe
+ mapM_ (\h -> setFdOption h CloseOnExec False) [serverWrite, serverRead]
+ let args = ["server", show serverWrite, show serverRead]
+ (_, _, _, ph) <- createProcess (proc serverExe args)
+ { std_in = Inherit
+ , std_out = Inherit
+ , std_err = Inherit
+ }
+ bracket (mkHandles ghcRead ghcWrite)
+ (\(hFromServer, hToServer) -> do
+ hClose hFromServer
+ hClose hToServer
+ terminateProcess ph
+ void (waitForProcess ph))
+ (\(hFromServer, hToServer) -> action hFromServer hToServer)
+ where
+ mkHandles r w = do
+ hR <- fdToHandle r
+ hW <- fdToHandle w
+ mapM_ (`hSetBuffering` NoBuffering) [hR, hW]
+ mapM_ (`hSetBinaryMode` True) [hR, hW]
+ pure (hR, hW)
+
+--------------------------------------------------------------------------------
+-- Custom handler
+
+customHandler :: (Bin.Binary (Some Bin.Binary f)) => (forall a . f a -> IO a) -> CustomMessageHandler
+customHandler handler tag payload
+ | tag == customTag =
+ case decodeLazy payload of
+ Left err -> do
+ hPutStrLn stderr $ "Custom handler decode error: " ++ err
+ pure Nothing
+ Right (Some @Bin.Binary r) -> do
+ res <- handler r
+ pure . Just $ encodeLazy res
+ | otherwise = pure Nothing
=====================================
testsuite/tests/ghci/custom-external-interpreter-commands/all.T
=====================================
@@ -0,0 +1,10 @@
+test('custom-external-interpreter-commands',
+ [ extra_files(['Main.hs'])
+ , windows_skip
+ , when(config.cross, skip)
+ , req_process
+ , req_interp
+ , omit_ways(prof_ways)
+ ],
+ multimod_compile_and_run,
+ ['Main.hs', '-package ghci'])
=====================================
testsuite/tests/ghci/custom-external-interpreter-commands/custom-external-interpreter-commands.stdout
=====================================
@@ -0,0 +1,4 @@
+Sending: SquareCommand 12
+Square returned: 144
+Sending: MulCommand 2 144
+Mul returned: 288
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1851336595243259a37eaac75aba174…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1851336595243259a37eaac75aba174…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL] 43 commits: Configure: Fix check for --target support in stage0 CC
by Sven Tennie (@supersven) 21 Mar '26
by Sven Tennie (@supersven) 21 Mar '26
21 Mar '26
Sven Tennie pushed to branch wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL at Glasgow Haskell Compiler / GHC
Commits:
43638643 by Andreas Klebinger at 2026-03-15T18:15:48-04:00
Configure: Fix check for --target support in stage0 CC
The check FP_PROG_CC_LINKER_TARGET used $CC unconditionally to check for
--target support. However this fails for the stage0 config where the C
compiler used is not $CC but $CC_STAGE0.
Since we already pass the compiler under test into the macro I simply
changed it to use that instead.
Fixes #26999
- - - - -
18fd0df6 by Simon Hengel at 2026-03-15T18:16:33-04:00
Fix typo in recursive_do.rst
- - - - -
86bd9bfc by fendor at 2026-03-17T23:46:09-04:00
Introduce `-fimport-loaded-targets` GHCi flag
This new flag automatically adds all loaded targets to the GHCi session
by adding an `InteractiveImport` for the loaded targets.
By default, this flag is disabled, as it potentially increases memory-usage.
This interacts with the flag `-fno-load-initial-targets` as follows:
* If no module is loaded, no module is added as an interactive import.
* If a reload loads up to a module, all loaded modules are added as
interactive imports.
* Unloading modules removes them from the interactive context.
Fixes #26866 by rendering the use of a `-ghci-script` to achieve the
same thing redundant.
- - - - -
e3d4c1bb by mniip at 2026-03-17T23:47:03-04:00
ghc-internal: Remove GHC.Internal.Data.Eq
It served no purpose other than being a re-export.
- - - - -
6f4f6cf0 by mniip at 2026-03-17T23:47:03-04:00
ghc-internal: Refine GHC.Internal.Base imports
Removed re-exports from GHC.Internal.Base. This reveals some modules
that don't actually use anything *defined* in GHC.Internal.Base, and
that can be pushed down a little in the import graph.
Replaced most imports of GHC.Internal.Base with non-wildcard imports
from modules where the identifiers are actually defined.
Part of #26834
Metric Decrease:
T5321FD
- - - - -
7fb51f54 by mangoiv at 2026-03-17T23:48:00-04:00
ci: clone, don't copy when creating the cabal cache
Also removed WINDOWS_HOST variable detected via uname - we now just
check whether the CI job has windows in its name. This works because we
only ever care about it if the respective job is not a cross job. We
also statically detect darwin cross jobs in the same way. We only ever have
darwin -> darwin cross jobs so this is enough to detect the host
reliably.
- - - - -
f8817879 by mangoiv at 2026-03-17T23:48:44-04:00
ci: mark size_hello_artifact fragile on darwin x86
The size of the x86_64 hello artifact is not stable which results in flaky testruns.
Resolves #26814
- - - - -
e34cb6da by Adam Gundry at 2026-03-20T12:20:00-04:00
ghci: Mention active language edition in startup banner
Per GHC proposal 632, this makes the GHCi startup banner include
the active language edition, plus an indication of whether this
was the default (as opposed to being explicitly selected via an
option such as `-XGHC2024`). For example:
```
$ ghci
GHCi, version 9.14.1: https://www.haskell.org/ghc/ :? for help
Using default language edition: GHC2024
ghci>
```
Fixes #26037.
- - - - -
52c3e6ba by sheaf at 2026-03-20T12:21:09-04:00
Improve incomplete record selector warnings
This commit stops GHC from emitting spurious incomplete record selector
warnings for bare selectors/projections such as .fld
There are two places we currently emit incomplete record selector
warnings:
1. In the desugarer, when we see a record selector or an occurrence
of 'getField'. Here, we can use pattern matching information to
ensure we don't give false positives.
2. In the typechecker, which might sometimes give false positives but
can emit warnings in cases that the pattern match checker would
otherwise miss.
This is explained in Note [Detecting incomplete record selectors]
in GHC.HsToCore.Pmc.
Now, we obviously don't want to emit the same error twice, and generally
we prefer (1), as those messages contain fewer false positives. So we
suppress (2) when we are sure we are going to emit (1); the logic for
doing so is in GHC.Tc.Instance.Class.warnIncompleteRecSel,
and works by looking at the CtOrigin.
Now, the issue was that this logic handled explicit record selectors as
well as overloaded record field selectors such as "x.r" (which turns
into a simple GetFieldOrigin CtOrigin), but it didn't properly handle
record projectors like ".fld" or ".fld1.fld2" (which result in other
CtOrigins such as 'RecordFieldProjectionOrigin').
To solve this problem, we re-use the 'isHasFieldOrigin' introduced in
fbdc623a (slightly adjusted).
On the way, we also had to update the desugarer with special handling
for the 'ExpandedThingTc' case in 'ds_app', to make sure that
'ds_app_var' sees all the type arguments to 'getField' in order for it
to indeed emit warnings like in (1).
Fixes #26686
- - - - -
309d7e87 by Cheng Shao at 2026-03-20T12:21:53-04:00
rts: opportunistically grow the MutableByteArray# in-place in resizeMutableByteArray#
Following !15234, this patch improves `resizeMutableByteArray#` memory
efficiency by growing the `MutableByteArray#` in-place if possible,
addressing an old todo comment here. Also adds a new test case
`resizeMutableByteArrayInPlace` that stresses this behavior.
- - - - -
7d4ef162 by Matthew Craven at 2026-03-20T12:22:47-04:00
Change representation of floating point literals
This commit changes the representation of floating point literals
throughough the compiler, in particular in Core and Cmm.
The Rational type is deficient for this purpose, dealing poorly
with NaN, +/-Infinity, and negative zero. Instead, the new module
GHC.Types.Literal.Floating uses the host Float/Double type to represent
NaNs, infinities and negative zero. It also contains a Rational
constructor, for the benefit of -fexcess-precision.
Other changes:
- Remove Note [negative zero] and related code
This also removes the restrictions on constant-folding of division
by zero, and should make any problems with NaN/Infinity more obvious.
- Use -0.0 as the additive identity for Core constant folding rules
for floating-point addition, fixing #21227.
- Manual worker-wrapper for GHC.Float.rationalToDouble. This is
intended to prevent the compiler's WW on this function from
interfering with constant-folding. This change means that we now
avoid allocating a box for the result of a 'realToFrac' call in
T10359.
- Combine floatDecodeOp and doubleDecodeOp.
This change also fixes a bug in doubleDecodeOp wherein it
would incorrectly produce an Int# instead of an Int64#
literal for the mantissa component with 64-bit targets.
- Use Float/Double for assembly immediates, and update the X86 and
PowerPC backends to properly handle special values such as NaN and
infinity.
- Allow 'rational_to' to handle zero denominators, fixing a
TODO in GHC.Core.Opt.ConstantFold.
Fixes #8364 #9811 #18897 #21227
Progress towards #26919
Metric Decrease:
T10359
Co-authored-by: sheaf <sam.derbyshire(a)gmail.com>
-------------------------
Metric Decrease:
T1969
T5321FD
-------------------------
- - - - -
80e2dd4f by Zubin Duggal at 2026-03-20T12:23:33-04:00
compiler/ffi: Collapse void pointer chains in capi wrappers
New gcc/clang treat -Wincompatible-pointer-types as an error by
default. Since C only allows implicit conversion from void*, not void**,
capi wrappers for functions taking e.g. abstract** would fail to compile
when the Haskell type Ptr (Ptr Abstract) was naively translated to void**.
Collapse nested void pointers to a single void* when the pointee type
has no known C representation.
Fixes #26852
- - - - -
1c50bd7b by Luite Stegeman at 2026-03-20T12:24:37-04:00
Move some functions related to pointer tagging to a separate module
- - - - -
bfd7aafd by Luite Stegeman at 2026-03-20T12:24:37-04:00
Branchless unpacking for enumeration types
Change unpacking for enumeration types to go to Word8#/Word16#/Word#
directly instead of going through an intermediate unboxed sum. This
allows us to do a branchless conversion using DataToTag and TagToEnum.
Fixes #26970
- - - - -
72b20fc0 by Luite Stegeman at 2026-03-20T12:25:30-04:00
bytecode: Carefully SLIDE off the end of a stack chunk
The SLIDE bytecode instruction was not checking for stack chunk
boundaries and could corrupt the stack underflow frame, leading
to crashes.
We add a check to use safe writes if we cross the chunk boundary
and also handle stack underflow if Sp is advanced past the underflow
frame.
fix #27001
- - - - -
2e22b43c by Cheng Shao at 2026-03-20T12:26:14-04:00
ghci: serialize BCOByteArray buffer directly when possible
This patch changes the `Binary` instances of `BCOByteArray` to
directly serialize the underlying buffer when possible, while also
taking into account the issue of host-dependent `Word` width. See
added comments and amended `Note [BCOByteArray serialization]` for
detailed explanation. Closes #27020.
- - - - -
89d9ba37 by Sylvain Henry at 2026-03-20T12:27:34-04:00
JS: replace BigInt with Number arithmetic for 32/64-bit quot/rem (#23597)
Replace BigInt-based implementations of quotWord32, remWord32,
quotRemWord32, quotRem2Word32, quotWord64, remWord64, quotInt64, and
remInt64 with pure Number (double/integer) arithmetic to avoid the
overhead of BigInt promotion.
- - - - -
ae4ddd60 by Sylvain Henry at 2026-03-20T12:28:28-04:00
Core: add constant-folding rules for Addr# eq/ne (#18032)
- - - - -
3e767f98 by Matthew Pickering at 2026-03-20T12:29:11-04:00
Use OsPath rather than FilePath in Downsweep cache
This gets us one step closure to uniformly using `OsPath` in the
compiler.
- - - - -
2c57de29 by Cheng Shao at 2026-03-20T12:29:55-04:00
hadrian: fix ghc-in-ghci flavour stage0 shared libraries
This patch fixes missing stage0 shared libraries in hadrian
ghc-in-ghci flavour, which was accidentally dropped in
669d09f950a6e88b903d9fd8a7571531774d4d5d and resulted in a regression
in HLS support on linux/macos. Fixes #27057.
- - - - -
5b1be555 by Sylvain Henry at 2026-03-20T12:30:48-04:00
JS: install rts/Types.h header file (#27033)
It was an omission, making HsFFI.h not usable with GHC using the JS
backend.
- - - - -
b883f08f by Cheng Shao at 2026-03-20T12:31:33-04:00
hadrian: don't compile RTS with -Winline
This patch removes `-Winline` from cflags when compiling the RTS,
given that:
1. It generates a huge pile of spam and hurts developer experience
2. Whether inlining happens is highly dependent on toolchains,
flavours, etc, and it's not really an issue to fix if inlining
doesn't happen; it's a hint to the C compiler anyway.
Fixes #27060.
- - - - -
333387d6 by Cheng Shao at 2026-03-20T12:31:33-04:00
hadrian: compile libffi-clib with -Wno-deprecated-declarations
This patch adds `-Wno-deprecated-declarations` to cflags of
`libffi-clib`, given that it produces noise at compile-time that
aren't really our issue to fix anyway, it's from vendored libffi
source code.
- - - - -
67c47771 by Rodrigo Mesquita at 2026-03-20T12:32:17-04:00
Expose decodeStackWithIpe from ghc-experimental
This decoding is useful to the debugger and it wasn't originally
exported as an oversight.
- - - - -
d30c741b by Matthew Pickering at 2026-03-21T07:39:07+00:00
Add missing req_interp modifier to T18441fail3 and T18441fail19
These tests require the interpreter but they were failing in a different
way with the javascript backend because the interpreter was disabled and
stderr is ignored by the test.
- - - - -
f1566889 by Matthew Pickering at 2026-03-21T07:39:07+00:00
packaging: correctly propagate build/host/target to bindist configure script
At the moment the host and target which we will produce a compiler for
is fixed at the initial configure time. Therefore we need to persist
the choice made at this time into the installation bindist as well so we
look for the right tools, with the right prefixes at install time.
In the future, we want to provide a bit more control about what kind of
bindist we produce so the logic about what the host/target will have to
be written by hadrian rather than persisted by the configure script. In
particular with cross compilers we want to either build a normal stage 2
cross bindist or a stage 3 bindist, which creates a bindist which has a
native compiler for the target platform.
Fixes #21970
- - - - -
5558b428 by Matthew Pickering at 2026-03-21T07:39:07+00:00
hadrian: Fill in more of the default.host toolchain file
When you are building a cross compiler this file will be used to build
stage1 and it's libraries, so we need enough information here to work
accurately. There is still more work to be done (see for example, word
size is still fixed).
- - - - -
5181051c by Matthew Pickering at 2026-03-21T07:39:07+00:00
hadrian: Disable docs when cross compiling
Before there were a variety of ad-hoc places where doc building was
disabled when cross compiling.
* Some CI jobs sets --docs=none in gen_ci.hs
* Some CI jobs set --docs=none in .gitlab/ci.sh
* There was some logic in hadrian to not need the ["docs"] target when
making a bindist.
Now the situation is simple:
* If you are cross compiling then defaultDocsTargets is empty by
default.
In theory, there is no reason why we can't build documentation for cross
compiler bindists, but this is left to future work to generalise the
documentation building rules to allow this (#24289)
- - - - -
11252908 by Matthew Pickering at 2026-03-21T08:03:20+00:00
hadrian: Build stage 2 cross compilers
* Most of hadrian is abstracted over the stage in order to remove the
assumption that the target of all stages is the same platform. This
allows the RTS to be built for two different targets for example.
* Abstracts the bindist creation logic to allow building either normal
or cross bindists. Normal bindists use stage 1 libraries and a stage 2
compiler. Cross bindists use stage 2 libararies and a stage 2
compiler.
* hadrian: Make binary-dist-dir the default build target. This allows us
to have the logic in one place about which libraries/stages to build
with cross compilers. Fixes #24192
New hadrian target:
* `binary-dist-dir-cross`: Build a cross compiler bindist (compiler =
stage 1, libraries = stage 2)
This commit also contains various changes to make stage2 compilers
feasible.
-------------------------
Metric Decrease:
ManyAlternatives
MultiComponentModulesRecomp
MultiLayerModulesRecomp
T10421
T12425
T12707
T13035
T13379
T15703
T16577
T18698a
T18698b
T18923
T1969
T21839c
T3294
T4801
T5030
T5321Fun
T5642
T783
T9198
T9872d
T9961
parsing001
T5321FD
T6048
T12227
T18140
T18282
T9233
T5631
T9630
-------------------------
Co-authored-by: Sven Tennie <sven.tennie(a)gmail.com>
Fix rebase: settings-use-distro-mingw is now staged
- - - - -
15d0fd7c by Matthew Pickering at 2026-03-21T08:03:20+00:00
ci: Test cross bindists
We remove the special logic for testing in-tree cross
compilers and instead test cross compiler bindists, like we do for all
other platforms.
- - - - -
e9eac8f9 by Matthew Pickering at 2026-03-21T08:03:20+00:00
ci: Introduce CROSS_STAGE variable
In preparation for building and testing stage3 bindists we introduce the
CROSS_STAGE variable which is used by a CI job to determine what kind of
bindist the CI job should produce.
At the moment we are only using CROSS_STAGE=2 but in the future we will
have some jobs which set CROSS_STAGE=3 to produce native bindists for a
target, but produced by a cross compiler, which can be tested on by
another CI job on the native platform.
CROSS_STAGE=2: Build a normal cross compiler bindist
CROSS_STAGE=3: Build a stage 3 bindist, one which is a native compiler and library for the target
- - - - -
da8f04ff by Matthew Pickering at 2026-03-21T08:03:20+00:00
hadrian: Refactor system-cxx-std-lib rules0
I noticed a few things wrong with the hadrian rules for `system-cxx-std-lib` rules.
* For `text` there is an ad-hoc check to depend on `system-cxx-std-lib` outside of `configurePackage`.
* The `system-cxx-std-lib` dependency is not read from cabal files.
* Recache is not called on the packge database after the `.conf` file is generated, a more natural place for this rule is `registerRules`.
Treating this uniformly like other packages is complicated by it not having any source code or a cabal file. However we can do a bit better by reporting the dependency firstly in `PackageData` and then needing the `.conf` file in the same place as every other package in `configurePackage`.
Fixes #25303
- - - - -
386ab054 by Sven Tennie at 2026-03-21T08:03:20+00:00
ci: Increase timeout for emulators
Test runs with emulators naturally take longer than on native machines.
Generate jobs.yml
- - - - -
7832fb15 by Sven Tennie at 2026-03-21T08:03:20+00:00
ghc: Distinguish between having an interpreter and having an internal one
Otherwise, we fail with warnings when compiling tools. Actually, these
are related but different things:
- ghc can run an interpreter (either internal or external)
- ghc is compiled with an internal interpreter
- - - - -
82eb105e by Matthew Pickering at 2026-03-21T08:03:20+00:00
ci: Javascript don't set CROSS_EMULATOR
There is no CROSS_EMULATOR needed to run javascript binaries, so we
don't set the CROSS_EMULATOR to some dummy value.
Co-authored-by: Sven Tennie <sven.tennie(a)gmail.com>
- - - - -
df220e80 by Sven Tennie at 2026-03-21T08:03:20+00:00
Windows needs NM_STAGE0 as well
The stage0 always needs nm.
- - - - -
ab07d461 by Sven Tennie at 2026-03-21T08:03:20+00:00
Javascript skip T23697
See #22355 about how HSC2HS and the Javascript target don't play well
together.
- - - - -
993951f4 by Sven Tennie at 2026-03-21T08:03:20+00:00
Mark T24602 as fragile
It was skipped before (due to CROSS_EMULATOR being set, which changed
for JS), so we don't make things worse by marking it as fragile.
- - - - -
34edbfff by Sven Tennie at 2026-03-21T08:03:20+00:00
T17912 sometimes works for windows-validate
This seems to be timing related. However, just simply increasing the
timeout (sleep) statement of this test didn't help. Maybe, it has been
flaky on CI before.
- - - - -
af4f6492 by Sven Tennie at 2026-03-21T08:03:20+00:00
stripping: Not for >= Stage2 cross-compiled
Currently, we can only strip objects of the host target.
- - - - -
e8c42bd0 by Sven Tennie at 2026-03-21T08:03:20+00:00
hadrian: Improve readability of inTreeCompilerArgs
Refer to the stages of executables and libraries. This should express
the intention better.
- - - - -
a75a738c by Sven Tennie at 2026-03-21T08:03:20+00:00
hadrian: Fix difference between in-tree and out-of-tree GHC test args
Done by canonicalizing the package database path. (The issue was a not
fully reduced path.)
- - - - -
5bf5c7bb by Sven Tennie at 2026-03-21T08:03:20+00:00
Add a config flag for LibDir and derived values
For cross-compilers, we have to refer to the libs of the succeeding
stage. This also affects other files previously relying on top_dir in
GHC.
- - - - -
457 changed files:
- .gitlab/ci.sh
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- compiler/GHC/Builtin/Names.hs
- compiler/GHC/ByteCode/Asm.hs
- compiler/GHC/Cmm/CommonBlockElim.hs
- compiler/GHC/Cmm/Expr.hs
- compiler/GHC/Cmm/Opt.hs
- compiler/GHC/Cmm/Parser.y
- compiler/GHC/Cmm/Type.hs
- compiler/GHC/Cmm/Utils.hs
- compiler/GHC/CmmToAsm/AArch64/CodeGen.hs
- compiler/GHC/CmmToAsm/AArch64/Ppr.hs
- compiler/GHC/CmmToAsm/AArch64/Regs.hs
- compiler/GHC/CmmToAsm/LA64/CodeGen.hs
- compiler/GHC/CmmToAsm/LA64/Ppr.hs
- compiler/GHC/CmmToAsm/LA64/Regs.hs
- compiler/GHC/CmmToAsm/PPC/CodeGen.hs
- compiler/GHC/CmmToAsm/PPC/Ppr.hs
- compiler/GHC/CmmToAsm/PPC/Regs.hs
- compiler/GHC/CmmToAsm/RV64/CodeGen.hs
- compiler/GHC/CmmToAsm/RV64/Ppr.hs
- compiler/GHC/CmmToAsm/RV64/Regs.hs
- compiler/GHC/CmmToAsm/Wasm/FromCmm.hs
- compiler/GHC/CmmToAsm/X86/CodeGen.hs
- compiler/GHC/CmmToAsm/X86/Ppr.hs
- compiler/GHC/CmmToAsm/X86/Regs.hs
- compiler/GHC/CmmToC.hs
- compiler/GHC/CmmToLlvm/CodeGen.hs
- compiler/GHC/CmmToLlvm/Data.hs
- compiler/GHC/Core.hs
- compiler/GHC/Core/Make.hs
- compiler/GHC/Core/Opt/ConstantFold.hs
- compiler/GHC/Driver/Config/Interpreter.hs
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/DynFlags.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/HsToCore/Expr.hs
- compiler/GHC/HsToCore/Foreign/C.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Pmc.hs
- compiler/GHC/HsToCore/Pmc/Solver/Types.hs
- + compiler/GHC/Platform/Tag.hs
- compiler/GHC/Settings.hs
- compiler/GHC/Settings/IO.hs
- compiler/GHC/Stg/Unarise.hs
- compiler/GHC/StgToByteCode.hs
- compiler/GHC/StgToCmm/Closure.hs
- compiler/GHC/StgToCmm/Expr.hs
- compiler/GHC/StgToCmm/Lit.hs
- compiler/GHC/StgToCmm/Prim.hs
- compiler/GHC/StgToJS/Literal.hs
- compiler/GHC/Tc/Errors.hs
- compiler/GHC/Tc/Instance/Class.hs
- compiler/GHC/Tc/TyCl/Build.hs
- compiler/GHC/Tc/Types/Origin.hs
- compiler/GHC/Types/Id/Make.hs
- compiler/GHC/Types/Literal.hs
- + compiler/GHC/Types/Literal/Floating.hs
- compiler/GHC/Types/RepType.hs
- compiler/GHC/Utils/Binary.hs
- compiler/ghc.cabal.in
- configure.ac
- distrib/configure.ac.in
- docs/users_guide/9.16.1-notes.rst
- docs/users_guide/exts/recursive_do.rst
- docs/users_guide/ghci.rst
- ghc/GHC/Driver/Session/Mode.hs
- ghc/GHCi/UI.hs
- ghc/Main.hs
- ghc/ghc-bin.cabal.in
- hadrian/README.md
- hadrian/bindist/Makefile
- hadrian/bindist/config.mk.in
- hadrian/cfg/default.host.target.in
- + hadrian/cfg/system.config.host.in
- hadrian/cfg/system.config.in
- + hadrian/cfg/system.config.target.in
- hadrian/hadrian.cabal
- hadrian/src/Base.hs
- + hadrian/src/BindistConfig.hs
- hadrian/src/Builder.hs
- hadrian/src/Context.hs
- hadrian/src/Expression.hs
- hadrian/src/Flavour.hs
- hadrian/src/Flavour/Type.hs
- hadrian/src/Hadrian/Builder.hs
- hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
- hadrian/src/Hadrian/Haskell/Cabal/Type.hs
- hadrian/src/Hadrian/Haskell/Hash.hs
- hadrian/src/Hadrian/Oracles/TextFile.hs
- hadrian/src/Oracles/Flag.hs
- hadrian/src/Oracles/Flavour.hs
- hadrian/src/Oracles/Setting.hs
- hadrian/src/Oracles/TestSettings.hs
- hadrian/src/Packages.hs
- hadrian/src/Rules.hs
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/CabalReinstall.hs
- hadrian/src/Rules/Compile.hs
- hadrian/src/Rules/Documentation.hs
- hadrian/src/Rules/Generate.hs
- hadrian/src/Rules/Gmp.hs
- hadrian/src/Rules/Library.hs
- hadrian/src/Rules/Program.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Rules/Test.hs
- hadrian/src/Settings.hs
- hadrian/src/Settings/Builders/Cabal.hs
- hadrian/src/Settings/Builders/Common.hs
- hadrian/src/Settings/Builders/Configure.hs
- hadrian/src/Settings/Builders/DeriveConstants.hs
- hadrian/src/Settings/Builders/Ghc.hs
- hadrian/src/Settings/Builders/Hsc2Hs.hs
- hadrian/src/Settings/Builders/RunTest.hs
- hadrian/src/Settings/Builders/SplitSections.hs
- hadrian/src/Settings/Default.hs
- hadrian/src/Settings/Flavours/GhcInGhci.hs
- hadrian/src/Settings/Flavours/Performance.hs
- hadrian/src/Settings/Flavours/QuickCross.hs
- hadrian/src/Settings/Flavours/Validate.hs
- hadrian/src/Settings/Packages.hs
- hadrian/src/Settings/Program.hs
- hadrian/src/Settings/Warnings.hs
- libraries/base/src/Control/Applicative.hs
- libraries/base/src/Data/Char.hs
- libraries/base/src/Data/Eq.hs
- libraries/base/src/Data/Semigroup.hs
- libraries/base/src/GHC/Base.hs
- libraries/base/src/GHC/Weak/Finalize.hs
- libraries/base/src/Prelude.hs
- libraries/base/tests/IO/all.T
- libraries/base/tests/all.T
- libraries/ghc-experimental/ghc-experimental.cabal.in
- libraries/ghc-experimental/src/GHC/Profiling/Eras.hs
- + libraries/ghc-experimental/src/GHC/Stack/Decode/Experimental.hs
- libraries/ghc-internal/codepages/MakeTable.hs
- libraries/ghc-internal/ghc-internal.cabal.in
- libraries/ghc-internal/src/GHC/Internal/AllocationLimitHandler.hs
- libraries/ghc-internal/src/GHC/Internal/Arr.hs
- libraries/ghc-internal/src/GHC/Internal/Base.hs
- libraries/ghc-internal/src/GHC/Internal/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/ByteOrder.hs
- libraries/ghc-internal/src/GHC/Internal/Char.hs
- libraries/ghc-internal/src/GHC/Internal/Clock.hsc
- libraries/ghc-internal/src/GHC/Internal/ClosureTypes.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Bound.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/IO.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/POSIX.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Sync.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Windows.hs
- libraries/ghc-internal/src/GHC/Internal/ConsoleHandler.hsc
- libraries/ghc-internal/src/GHC/Internal/Control/Arrow.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Concurrent/MVar.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Exception/Base.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fail.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/IO/Class.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Data.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Dynamic.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Either.hs
- − libraries/ghc-internal/src/GHC/Internal/Data/Eq.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Foldable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Function.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Const.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Identity.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Utils.hs
- libraries/ghc-internal/src/GHC/Internal/Data/IORef.hs
- libraries/ghc-internal/src/GHC/Internal/Data/List.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Maybe.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Monoid.hs
- libraries/ghc-internal/src/GHC/Internal/Data/OldList.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Ord.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Proxy.hs
- libraries/ghc-internal/src/GHC/Internal/Data/STRef.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Semigroup/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Data/String.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Traversable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Bool.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Coercion.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Equality.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Ord.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Typeable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Typeable/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Unique.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Version.hs
- libraries/ghc-internal/src/GHC/Internal/Debug/Trace.hs
- libraries/ghc-internal/src/GHC/Internal/Debug/Trace.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Encoding/UTF8.hs
- libraries/ghc-internal/src/GHC/Internal/Enum.hs
- libraries/ghc-internal/src/GHC/Internal/Environment.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Array.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Control.hs
- libraries/ghc-internal/src/GHC/Internal/Event/EPoll.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/IntVar.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Internal/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Event/KQueue.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Manager.hs
- libraries/ghc-internal/src/GHC/Internal/Event/PSQ.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Poll.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Thread.hs
- libraries/ghc-internal/src/GHC/Internal/Event/TimeOut.hs
- libraries/ghc-internal/src/GHC/Internal/Event/TimerManager.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Unique.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/Clock.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/ConsoleEvent.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/FFI.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/ManagedThreadPool.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/Thread.hs
- libraries/ghc-internal/src/GHC/Internal/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Backtrace.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Backtrace.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Exception/Context.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Type.hs
- libraries/ghc-internal/src/GHC/Internal/ExecutionStack.hs
- libraries/ghc-internal/src/GHC/Internal/ExecutionStack/Internal.hsc
- libraries/ghc-internal/src/GHC/Internal/Exts.hs
- libraries/ghc-internal/src/GHC/Internal/Fingerprint.hs
- libraries/ghc-internal/src/GHC/Internal/Fingerprint.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Fingerprint/Type.hs
- libraries/ghc-internal/src/GHC/Internal/Float.hs
- libraries/ghc-internal/src/GHC/Internal/Float/ConversionUtils.hs
- libraries/ghc-internal/src/GHC/Internal/Float/RealFracMethods.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/ConstPtr.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/Error.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/String.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/String/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/ForeignPtr/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Alloc.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Array.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Error.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Pool.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Utils.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Ptr.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Storable.hs
- libraries/ghc-internal/src/GHC/Internal/ForeignPtr.hs
- libraries/ghc-internal/src/GHC/Internal/ForeignSrcLang.hs
- libraries/ghc-internal/src/GHC/Internal/Functor/ZipList.hs
- libraries/ghc-internal/src/GHC/Internal/GHCi.hs
- libraries/ghc-internal/src/GHC/Internal/GHCi/Helpers.hs
- libraries/ghc-internal/src/GHC/Internal/Generics.hs
- libraries/ghc-internal/src/GHC/Internal/Heap/Closures.hs
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTableProf.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/ProfInfo/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Buffer.hs
- libraries/ghc-internal/src/GHC/Internal/IO/BufferedIO.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Device.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage/API.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage/Table.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Failure.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Iconv.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Latin1.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF16.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF32.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF8.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Exception.hs-boot
- libraries/ghc-internal/src/GHC/Internal/IO/FD.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/FD.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Internals.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Flock.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/LinuxOFD.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/NoOp.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Windows.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Text.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Windows.hs
- libraries/ghc-internal/src/GHC/Internal/IO/IOMode.hs
- libraries/ghc-internal/src/GHC/Internal/IO/SubSystem.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Unsafe.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Windows/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Windows/Handle.hsc
- libraries/ghc-internal/src/GHC/Internal/IOArray.hs
- libraries/ghc-internal/src/GHC/Internal/IORef.hs
- libraries/ghc-internal/src/GHC/Internal/InfoProv.hs
- libraries/ghc-internal/src/GHC/Internal/InfoProv/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/Int.hs
- libraries/ghc-internal/src/GHC/Internal/IsList.hs
- libraries/ghc-internal/src/GHC/Internal/Ix.hs
- libraries/ghc-internal/src/GHC/Internal/JS/Foreign/Callback.hs
- libraries/ghc-internal/src/GHC/Internal/JS/Prim/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/JS/Prim/Internal/Build.hs
- libraries/ghc-internal/src/GHC/Internal/LanguageExtensions.hs
- libraries/ghc-internal/src/GHC/Internal/Lexeme.hs
- libraries/ghc-internal/src/GHC/Internal/List.hs
- libraries/ghc-internal/src/GHC/Internal/MVar.hs
- libraries/ghc-internal/src/GHC/Internal/Num.hs
- libraries/ghc-internal/src/GHC/Internal/Numeric.hs
- libraries/ghc-internal/src/GHC/Internal/OverloadedLabels.hs
- libraries/ghc-internal/src/GHC/Internal/Pack.hs
- libraries/ghc-internal/src/GHC/Internal/Profiling.hs
- libraries/ghc-internal/src/GHC/Internal/Ptr.hs
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags.hsc
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
- libraries/ghc-internal/src/GHC/Internal/Read.hs
- libraries/ghc-internal/src/GHC/Internal/Real.hs
- libraries/ghc-internal/src/GHC/Internal/ST.hs
- libraries/ghc-internal/src/GHC/Internal/STM.hs
- libraries/ghc-internal/src/GHC/Internal/STRef.hs
- libraries/ghc-internal/src/GHC/Internal/Show.hs
- libraries/ghc-internal/src/GHC/Internal/Stable.hs
- libraries/ghc-internal/src/GHC/Internal/StableName.hs
- libraries/ghc-internal/src/GHC/Internal/Stack.hs
- libraries/ghc-internal/src/GHC/Internal/Stack.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Stack/Annotation.hs
- libraries/ghc-internal/src/GHC/Internal/Stack/CCS.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/CloneStack.hs
- libraries/ghc-internal/src/GHC/Internal/Stack/Constants.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/ConstantsProf.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/Decode.hs
- libraries/ghc-internal/src/GHC/Internal/StaticPtr.hs
- libraries/ghc-internal/src/GHC/Internal/StaticPtr/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Stats.hsc
- libraries/ghc-internal/src/GHC/Internal/Storable.hs
- libraries/ghc-internal/src/GHC/Internal/System/Environment.hs
- libraries/ghc-internal/src/GHC/Internal/System/Environment/Blank.hsc
- libraries/ghc-internal/src/GHC/Internal/System/Environment/ExecutablePath.hsc
- libraries/ghc-internal/src/GHC/Internal/System/IO.hs
- libraries/ghc-internal/src/GHC/Internal/System/IO/Error.hs
- libraries/ghc-internal/src/GHC/Internal/System/Mem.hs
- libraries/ghc-internal/src/GHC/Internal/System/Posix/Internals.hs
- libraries/ghc-internal/src/GHC/Internal/System/Posix/Types.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Lib.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Lift.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Syntax.hs
- libraries/ghc-internal/src/GHC/Internal/Text/ParserCombinators/ReadP.hs
- libraries/ghc-internal/src/GHC/Internal/Text/ParserCombinators/ReadPrec.hs
- libraries/ghc-internal/src/GHC/Internal/Text/Read.hs
- libraries/ghc-internal/src/GHC/Internal/Text/Read/Lex.hs
- libraries/ghc-internal/src/GHC/Internal/TopHandler.hs
- libraries/ghc-internal/src/GHC/Internal/TypeLits.hs
- libraries/ghc-internal/src/GHC/Internal/TypeLits/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/TypeNats.hs
- libraries/ghc-internal/src/GHC/Internal/TypeNats/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/DerivedCoreProperties.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/GeneralCategory.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleLowerCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleTitleCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleUpperCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unsafe/Coerce.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Conc.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Conc/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Exports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Flag.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Imports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Weak.hs
- libraries/ghc-internal/src/GHC/Internal/Weak/Finalize.hs
- libraries/ghc-internal/src/GHC/Internal/Windows.hs
- libraries/ghc-internal/src/GHC/Internal/Word.hs
- libraries/ghc-internal/tools/ucd2haskell/exe/UCD2Haskell/ModuleGenerators.hs
- libraries/ghci/GHCi/CreateBCO.hs
- libraries/ghci/GHCi/ResolvedBCO.hs
- m4/fp_find_nm.m4
- m4/fp_prog_cc_linker_target.m4
- m4/fptools_set_platform_vars.m4
- m4/prep_target_file.m4
- rts/Interpreter.c
- rts/PrimOps.cmm
- rts/js/arith.js
- rts/rts.cabal
- testsuite/ghc-config/ghc-config.hs
- + testsuite/tests/bytecode/T27001.hs
- + testsuite/tests/bytecode/T27001.stdout
- testsuite/tests/bytecode/all.T
- + testsuite/tests/codeGen/should_run/T21227.hs
- + testsuite/tests/codeGen/should_run/T21227.stdout
- + testsuite/tests/codeGen/should_run/T9811.hs
- + testsuite/tests/codeGen/should_run/T9811.stdout
- testsuite/tests/codeGen/should_run/all.T
- testsuite/tests/count-deps/CountDepsAst.stdout
- testsuite/tests/count-deps/CountDepsParser.stdout
- + testsuite/tests/ffi/should_compile/T26852.h
- + testsuite/tests/ffi/should_compile/T26852.hs
- + testsuite/tests/ffi/should_compile/T26852.stderr
- testsuite/tests/ffi/should_compile/all.T
- testsuite/tests/ghc-e/should_fail/all.T
- testsuite/tests/ghci/prog-mhu005/Makefile
- testsuite/tests/ghci/prog-mhu005/all.T
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005b.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005b.stdout
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005c.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005c.stderr
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005c.stdout
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005d.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005d.stderr
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005d.stdout
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005e.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005e.stderr
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005e.stdout
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005f.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005f.stderr
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005f.stdout
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005g.script
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005g.stderr
- + testsuite/tests/ghci/prog-mhu005/prog-mhu005g.stdout
- testsuite/tests/ghci/prog022/Makefile
- testsuite/tests/ghci/prog022/all.T
- + testsuite/tests/ghci/prog022/ghci.prog022c.script
- + testsuite/tests/ghci/prog022/ghci.prog022c.stderr
- + testsuite/tests/ghci/prog022/ghci.prog022c.stdout
- + testsuite/tests/ghci/prog022/ghci.prog022d.script
- + testsuite/tests/ghci/prog022/ghci.prog022d.stderr
- + testsuite/tests/ghci/prog022/ghci.prog022d.stdout
- + testsuite/tests/ghci/prog022/ghci.prog022e.script
- + testsuite/tests/ghci/prog022/ghci.prog022e.stderr
- + testsuite/tests/ghci/prog022/ghci.prog022e.stdout
- + testsuite/tests/ghci/prog022/ghci.prog022f.script
- + testsuite/tests/ghci/prog022/ghci.prog022f.stderr
- + testsuite/tests/ghci/prog022/ghci.prog022f.stdout
- testsuite/tests/ghci/should_run/BinaryArray.hs
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- testsuite/tests/javascript/closure/all.T
- + testsuite/tests/javascript/js-c-sources/T27033.hs
- + testsuite/tests/javascript/js-c-sources/T27033.stdout
- + testsuite/tests/javascript/js-c-sources/T27033_c.c
- + testsuite/tests/javascript/js-c-sources/T27033_js.js
- testsuite/tests/javascript/js-c-sources/all.T
- testsuite/tests/numeric/should_run/T7014.hs
- + testsuite/tests/overloadedrecflds/should_compile/T26686.hs
- + testsuite/tests/overloadedrecflds/should_compile/T26686.stderr
- testsuite/tests/overloadedrecflds/should_compile/all.T
- testsuite/tests/perf/size/all.T
- testsuite/tests/profiling/should_run/callstack001.stdout
- testsuite/tests/profiling/should_run/callstack002.stderr
- testsuite/tests/profiling/should_run/callstack002.stdout
- testsuite/tests/rts/all.T
- + testsuite/tests/rts/resizeMutableByteArrayInPlace.hs
- + testsuite/tests/simplCore/should_compile/T18032.hs
- + testsuite/tests/simplCore/should_compile/T18032.stderr
- testsuite/tests/simplCore/should_compile/all.T
- testsuite/tests/simplStg/should_run/all.T
- + testsuite/tests/simplStg/should_run/unpack_enum.hs
- + testsuite/tests/simplStg/should_run/unpack_enum.stdout
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/11cc3783a9bd2914fca5c10c3cee79…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/11cc3783a9bd2914fca5c10c3cee79…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/faster-linkBCO] 2 commits: ghci: use SmallArray directly in ResolvedBCO
by Cheng Shao (@TerrorJack) 21 Mar '26
by Cheng Shao (@TerrorJack) 21 Mar '26
21 Mar '26
Cheng Shao pushed to branch wip/faster-linkBCO at Glasgow Haskell Compiler / GHC
Commits:
cdb6adc0 by Cheng Shao at 2026-03-21T01:45:30+00:00
ghci: use SmallArray directly in ResolvedBCO
This patch makes ghci use `SmallArray` directly in `ResolvedBCO` when
applicable, making the memory representation more compact and reducing
marshaling overhead. Closes #27058.
- - - - -
b09e372d by Cheng Shao at 2026-03-21T01:45:35+00:00
compiler: use SmallArray directly in UnlinkedBCO
This patch makes the compiler use `SmallArray` directly in
`UnlinkedBCO` when applicable, making the memory representation more
compact and reducing marshaling overhead.
- - - - -
5 changed files:
- compiler/GHC/ByteCode/Asm.hs
- compiler/GHC/ByteCode/Linker.hs
- compiler/GHC/ByteCode/Types.hs
- libraries/ghci/GHCi/CreateBCO.hs
- libraries/ghci/GHCi/ResolvedBCO.hs
Changes:
=====================================
compiler/GHC/ByteCode/Asm.hs
=====================================
@@ -88,9 +88,9 @@ bcoFreeNames bco
where
bco_refs (UnlinkedBCO _ _ _ _ nonptrs ptrs)
= unionManyUniqDSets (
- mkUniqDSet [ n | BCOPtrName n <- elemsFlatBag ptrs ] :
- mkUniqDSet [ n | BCONPtrItbl n <- elemsFlatBag nonptrs ] :
- map bco_refs [ bco | BCOPtrBCO bco <- elemsFlatBag ptrs ]
+ mkUniqDSet [ n | BCOPtrName n <- smallArrayToList ptrs ] :
+ mkUniqDSet [ n | BCONPtrItbl n <- smallArrayToList nonptrs ] :
+ map bco_refs [ bco | BCOPtrBCO bco <- smallArrayToList ptrs ]
)
-- -----------------------------------------------------------------------------
@@ -235,8 +235,8 @@ assembleBCO platform
, unlinkedBCOArity = arity
, unlinkedBCOInstrs = insns_arr
, unlinkedBCOBitmap = bitmap_arr
- , unlinkedBCOLits = fromSmallArray final_lit_array
- , unlinkedBCOPtrs = fromSmallArray final_ptr_array
+ , unlinkedBCOLits = final_lit_array
+ , unlinkedBCOPtrs = final_ptr_array
}
-- 8 Aug 01: Finalisers aren't safe when attached to non-primitive
=====================================
compiler/GHC/ByteCode/Linker.hs
=====================================
@@ -29,7 +29,7 @@ import GHC.Unit.Types
import GHC.Data.FastString
import GHC.Data.Maybe
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import GHC.Linker.Types
@@ -43,7 +43,8 @@ import GHC.Types.Unique.DFM
-- Standard libraries
import Control.Concurrent
-import Data.Array.Unboxed
+import Data.Array.Base
+import Data.Array.IO.Internals
import Foreign.Ptr
import GHC.Exts
@@ -62,15 +63,16 @@ linkBCO interp pkgs_loaded bytecode_state bco_ix
(UnlinkedBCO _ arity insns bitmap lits0 ptrs0) = do
-- fromIntegral Word -> Word64 should be a no op if Word is Word64
-- otherwise it will result in a cast to longlong on 32bit systems.
- (lits :: [Word]) <- mapM (fmap fromIntegral . lookupLiteral interp pkgs_loaded bytecode_state) (elemsFlatBag lits0)
- ptrs <- mapM (resolvePtr interp pkgs_loaded bytecode_state bco_ix) (elemsFlatBag ptrs0)
- let lits' = listArray (0 :: Int, fromIntegral (sizeFlatBag lits0)-1) lits
+ litsMut <- unsafeNewArray_ (0, sizeofSmallArray lits0 - 1)
+ flip imapSmallArrayM_ lits0 $ \i lit -> unsafeWrite litsMut i =<< lookupLiteral interp pkgs_loaded bytecode_state lit
+ lits <- unsafeFreezeIOUArray litsMut
+ ptrs <- mapSmallArrayIO (resolvePtr interp pkgs_loaded bytecode_state bco_ix) ptrs0
return $ ResolvedBCO { resolvedBCOIsLE = isLittleEndian
, resolvedBCOArity = arity
, resolvedBCOInstrs = insns
, resolvedBCOBitmap = bitmap
- , resolvedBCOLits = mkBCOByteArray lits'
- , resolvedBCOPtrs = addListToSS emptySS ptrs
+ , resolvedBCOLits = mkBCOByteArray lits
+ , resolvedBCOPtrs = ptrs
}
lookupLiteral :: Interp -> PkgsLoaded -> BytecodeLoaderState -> BCONPtr -> IO Word
=====================================
compiler/GHC/ByteCode/Types.hs
=====================================
@@ -32,6 +32,7 @@ import GHC.Prelude
import GHC.Data.FastString
import GHC.Data.FlatBag
+import GHC.Data.SmallArray
import GHC.Types.Name
import GHC.Types.Name.Env
import GHC.Utils.Binary
@@ -250,14 +251,14 @@ data UnlinkedBCO
unlinkedBCOArity :: {-# UNPACK #-} !Int,
unlinkedBCOInstrs :: !(BCOByteArray Word16), -- insns
unlinkedBCOBitmap :: !(BCOByteArray Word), -- bitmap
- unlinkedBCOLits :: !(FlatBag BCONPtr), -- non-ptrs
- unlinkedBCOPtrs :: !(FlatBag BCOPtr) -- ptrs
+ unlinkedBCOLits :: !(SmallArray BCONPtr), -- non-ptrs
+ unlinkedBCOPtrs :: !(SmallArray BCOPtr) -- ptrs
}
instance NFData UnlinkedBCO where
rnf UnlinkedBCO{..} =
- rnf unlinkedBCOLits `seq`
- rnf unlinkedBCOPtrs
+ rnfSmallArray unlinkedBCOLits `seq`
+ rnfSmallArray unlinkedBCOPtrs
data BCOPtr
= BCOPtrName !Name
@@ -293,11 +294,10 @@ instance NFData BCONPtr where
instance Outputable UnlinkedBCO where
ppr (UnlinkedBCO nm _arity _insns _bitmap lits ptrs)
= sep [text "BCO", ppr nm, text "with",
- ppr (sizeFlatBag lits), text "lits",
- ppr (sizeFlatBag ptrs), text "ptrs" ]
+ ppr (sizeofSmallArray lits), text "lits",
+ ppr (sizeofSmallArray ptrs), text "ptrs" ]
instance Binary FFIInfo where
get bh = FFIInfo <$> get bh <*> get bh
put_ bh FFIInfo {..} = put_ bh ffiInfoArgs *> put_ bh ffiInfoRet
-
=====================================
libraries/ghci/GHCi/CreateBCO.hs
=====================================
@@ -18,10 +18,9 @@ import Prelude -- See note [Why do we import Prelude here?]
import GHCi.ResolvedBCO
import GHCi.RemoteTypes
import GHCi.BreakArray
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import System.IO (fixIO)
-import Control.Monad
import Data.Array.Base
import Foreign hiding (newArray)
import Unsafe.Coerce (unsafeCoerce)
@@ -72,9 +71,6 @@ createBCO arr bco
linkBCO' :: Array Int HValue -> ResolvedBCO -> IO BCO
linkBCO' arr ResolvedBCO{..} = do
let
- ptrs = ssElts resolvedBCOPtrs
- n_ptrs = sizeSS resolvedBCOPtrs
-
!(I# arity#) = resolvedBCOArity
!(EmptyArr empty#) = emptyArr -- See Note [BCO empty array]
@@ -83,7 +79,7 @@ linkBCO' arr ResolvedBCO{..} = do
bitmap_barr = barr (getBCOByteArray resolvedBCOBitmap)
literals_barr = barr (getBCOByteArray resolvedBCOLits)
- PtrsArr marr <- mkPtrsArray arr n_ptrs ptrs
+ PtrsArr marr <- mkPtrsArray arr resolvedBCOPtrs
IO $ \s ->
case unsafeFreezeArray# marr s of { (# s, arr #) ->
case newBCO insns_barr literals_barr arr arity# bitmap_barr of { IO io ->
@@ -92,24 +88,25 @@ linkBCO' arr ResolvedBCO{..} = do
-- we recursively link any sub-BCOs while making the ptrs array
-mkPtrsArray :: Array Int HValue -> Word -> [ResolvedBCOPtr] -> IO PtrsArr
-mkPtrsArray arr n_ptrs ptrs = do
- marr <- newPtrsArray (fromIntegral n_ptrs)
+mkPtrsArray :: Array Int HValue -> SmallArray ResolvedBCOPtr -> IO PtrsArr
+mkPtrsArray arr ptrs = do
+ let n_ptrs = sizeofSmallArray ptrs
+ marr <- newPtrsArray n_ptrs
let
- fill (ResolvedBCORef n) i =
+ fill i (ResolvedBCORef n) =
writePtrsArrayHValue i (arr ! n) marr -- must be lazy!
- fill (ResolvedBCOPtr r) i = do
+ fill i (ResolvedBCOPtr r) = do
hv <- localRef r
writePtrsArrayHValue i hv marr
- fill (ResolvedBCOStaticPtr r) i = do
+ fill i (ResolvedBCOStaticPtr r) = do
writePtrsArrayPtr i (fromRemotePtr r) marr
- fill (ResolvedBCOPtrBCO bco) i = do
+ fill i (ResolvedBCOPtrBCO bco) = do
bco <- linkBCO' arr bco
writePtrsArrayBCO i bco marr
- fill (ResolvedBCOPtrBreakArray r) i = do
+ fill i (ResolvedBCOPtrBreakArray r) = do
BA mba <- localRef r
writePtrsArrayMBA i mba marr
- zipWithM_ fill ptrs [0..]
+ imapSmallArrayM_ fill ptrs
return marr
data PtrsArr = PtrsArr (MutableArray# RealWorld HValue)
=====================================
libraries/ghci/GHCi/ResolvedBCO.hs
=====================================
@@ -12,7 +12,7 @@ module GHCi.ResolvedBCO
#include "MachDeps.h"
import Prelude -- See note [Why do we import Prelude here?]
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import GHCi.RemoteTypes
import GHCi.BreakArray
@@ -51,13 +51,13 @@ isLittleEndian = True
--
data ResolvedBCO
= ResolvedBCO {
- resolvedBCOIsLE :: Bool,
+ resolvedBCOIsLE :: !Bool,
resolvedBCOArity :: {-# UNPACK #-} !Int,
- resolvedBCOInstrs :: BCOByteArray Word16, -- ^ insns
- resolvedBCOBitmap :: BCOByteArray Word, -- ^ bitmap
- resolvedBCOLits :: BCOByteArray Word,
+ resolvedBCOInstrs :: !(BCOByteArray Word16), -- ^ insns
+ resolvedBCOBitmap :: !(BCOByteArray Word), -- ^ bitmap
+ resolvedBCOLits :: !(BCOByteArray Word),
-- ^ non-ptrs - subword sized entries still take up a full (host) word
- resolvedBCOPtrs :: (SizedSeq ResolvedBCOPtr) -- ^ ptrs
+ resolvedBCOPtrs :: !(SmallArray ResolvedBCOPtr) -- ^ ptrs
}
deriving (Generic, Show)
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/42a854198805e8d0fa29133ef6e105…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/42a854198805e8d0fa29133ef6e105…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/faster-linkBCO] 2 commits: ghci: use SmallArray directly in ResolvedBCO
by Cheng Shao (@TerrorJack) 21 Mar '26
by Cheng Shao (@TerrorJack) 21 Mar '26
21 Mar '26
Cheng Shao pushed to branch wip/faster-linkBCO at Glasgow Haskell Compiler / GHC
Commits:
e8e07c64 by Cheng Shao at 2026-03-21T01:43:25+00:00
ghci: use SmallArray directly in ResolvedBCO
This patch makes ghci use `SmallArray` directly in `ResolvedBCO` when
applicable, making the memory representation more compact and reducing
marshaling overhead. Closes #27058.
- - - - -
42a85419 by Cheng Shao at 2026-03-21T01:43:33+00:00
compiler: use SmallArray directly in UnlinkedBCO
This patch makes the compiler use `SmallArray` directly in
`UnlinkedBCO` when applicable, making the memory representation more
compact and reducing marshaling overhead.
- - - - -
5 changed files:
- compiler/GHC/ByteCode/Asm.hs
- compiler/GHC/ByteCode/Linker.hs
- compiler/GHC/ByteCode/Types.hs
- libraries/ghci/GHCi/CreateBCO.hs
- libraries/ghci/GHCi/ResolvedBCO.hs
Changes:
=====================================
compiler/GHC/ByteCode/Asm.hs
=====================================
@@ -88,9 +88,9 @@ bcoFreeNames bco
where
bco_refs (UnlinkedBCO _ _ _ _ nonptrs ptrs)
= unionManyUniqDSets (
- mkUniqDSet [ n | BCOPtrName n <- elemsFlatBag ptrs ] :
- mkUniqDSet [ n | BCONPtrItbl n <- elemsFlatBag nonptrs ] :
- map bco_refs [ bco | BCOPtrBCO bco <- elemsFlatBag ptrs ]
+ mkUniqDSet [ n | BCOPtrName n <- smallArrayToList ptrs ] :
+ mkUniqDSet [ n | BCONPtrItbl n <- smallArrayToList nonptrs ] :
+ map bco_refs [ bco | BCOPtrBCO bco <- smallArrayToList ptrs ]
)
-- -----------------------------------------------------------------------------
@@ -235,8 +235,8 @@ assembleBCO platform
, unlinkedBCOArity = arity
, unlinkedBCOInstrs = insns_arr
, unlinkedBCOBitmap = bitmap_arr
- , unlinkedBCOLits = fromSmallArray final_lit_array
- , unlinkedBCOPtrs = fromSmallArray final_ptr_array
+ , unlinkedBCOLits = final_lit_array
+ , unlinkedBCOPtrs = final_ptr_array
}
-- 8 Aug 01: Finalisers aren't safe when attached to non-primitive
=====================================
compiler/GHC/ByteCode/Linker.hs
=====================================
@@ -29,7 +29,7 @@ import GHC.Unit.Types
import GHC.Data.FastString
import GHC.Data.Maybe
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import GHC.Linker.Types
@@ -43,7 +43,8 @@ import GHC.Types.Unique.DFM
-- Standard libraries
import Control.Concurrent
-import Data.Array.Unboxed
+import Data.Array.Base
+import Data.Array.IO.Internals
import Foreign.Ptr
import GHC.Exts
@@ -62,15 +63,16 @@ linkBCO interp pkgs_loaded bytecode_state bco_ix
(UnlinkedBCO _ arity insns bitmap lits0 ptrs0) = do
-- fromIntegral Word -> Word64 should be a no op if Word is Word64
-- otherwise it will result in a cast to longlong on 32bit systems.
- (lits :: [Word]) <- mapM (fmap fromIntegral . lookupLiteral interp pkgs_loaded bytecode_state) (elemsFlatBag lits0)
- ptrs <- mapM (resolvePtr interp pkgs_loaded bytecode_state bco_ix) (elemsFlatBag ptrs0)
- let lits' = listArray (0 :: Int, fromIntegral (sizeFlatBag lits0)-1) lits
+ litsMut <- unsafeNewArray_ (0, sizeofSmallArray lits0 - 1)
+ flip imapSmallArrayM_ lits0 $ \i lit -> unsafeWrite litsMut i =<< lookupLiteral interp pkgs_loaded bytecode_state lit
+ lits <- unsafeFreezeIOUArray litsMut
+ ptrs <- mapSmallArrayIO (resolvePtr interp pkgs_loaded bytecode_state bco_ix) ptrs0
return $ ResolvedBCO { resolvedBCOIsLE = isLittleEndian
, resolvedBCOArity = arity
, resolvedBCOInstrs = insns
, resolvedBCOBitmap = bitmap
- , resolvedBCOLits = mkBCOByteArray lits'
- , resolvedBCOPtrs = addListToSS emptySS ptrs
+ , resolvedBCOLits = mkBCOByteArray lits
+ , resolvedBCOPtrs = ptrs
}
lookupLiteral :: Interp -> PkgsLoaded -> BytecodeLoaderState -> BCONPtr -> IO Word
=====================================
compiler/GHC/ByteCode/Types.hs
=====================================
@@ -32,6 +32,7 @@ import GHC.Prelude
import GHC.Data.FastString
import GHC.Data.FlatBag
+import GHC.Data.SmallArray
import GHC.Types.Name
import GHC.Types.Name.Env
import GHC.Utils.Binary
@@ -250,14 +251,14 @@ data UnlinkedBCO
unlinkedBCOArity :: {-# UNPACK #-} !Int,
unlinkedBCOInstrs :: !(BCOByteArray Word16), -- insns
unlinkedBCOBitmap :: !(BCOByteArray Word), -- bitmap
- unlinkedBCOLits :: !(FlatBag BCONPtr), -- non-ptrs
- unlinkedBCOPtrs :: !(FlatBag BCOPtr) -- ptrs
+ unlinkedBCOLits :: !(SmallArray BCONPtr), -- non-ptrs
+ unlinkedBCOPtrs :: !(SmallArray BCOPtr) -- ptrs
}
instance NFData UnlinkedBCO where
rnf UnlinkedBCO{..} =
- rnf unlinkedBCOLits `seq`
- rnf unlinkedBCOPtrs
+ rnfSmallArray unlinkedBCOLits `seq`
+ rnfSmallArray unlinkedBCOPtrs
data BCOPtr
= BCOPtrName !Name
@@ -293,11 +294,10 @@ instance NFData BCONPtr where
instance Outputable UnlinkedBCO where
ppr (UnlinkedBCO nm _arity _insns _bitmap lits ptrs)
= sep [text "BCO", ppr nm, text "with",
- ppr (sizeFlatBag lits), text "lits",
- ppr (sizeFlatBag ptrs), text "ptrs" ]
+ ppr (sizeofSmallArray lits), text "lits",
+ ppr (sizeofSmallArray ptrs), text "ptrs" ]
instance Binary FFIInfo where
get bh = FFIInfo <$> get bh <*> get bh
put_ bh FFIInfo {..} = put_ bh ffiInfoArgs *> put_ bh ffiInfoRet
-
=====================================
libraries/ghci/GHCi/CreateBCO.hs
=====================================
@@ -18,10 +18,9 @@ import Prelude -- See note [Why do we import Prelude here?]
import GHCi.ResolvedBCO
import GHCi.RemoteTypes
import GHCi.BreakArray
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import System.IO (fixIO)
-import Control.Monad
import Data.Array.Base
import Foreign hiding (newArray)
import Unsafe.Coerce (unsafeCoerce)
@@ -72,9 +71,6 @@ createBCO arr bco
linkBCO' :: Array Int HValue -> ResolvedBCO -> IO BCO
linkBCO' arr ResolvedBCO{..} = do
let
- ptrs = ssElts resolvedBCOPtrs
- n_ptrs = sizeSS resolvedBCOPtrs
-
!(I# arity#) = resolvedBCOArity
!(EmptyArr empty#) = emptyArr -- See Note [BCO empty array]
@@ -83,7 +79,7 @@ linkBCO' arr ResolvedBCO{..} = do
bitmap_barr = barr (getBCOByteArray resolvedBCOBitmap)
literals_barr = barr (getBCOByteArray resolvedBCOLits)
- PtrsArr marr <- mkPtrsArray arr n_ptrs ptrs
+ PtrsArr marr <- mkPtrsArray arr resolvedBCOPtrs
IO $ \s ->
case unsafeFreezeArray# marr s of { (# s, arr #) ->
case newBCO insns_barr literals_barr arr arity# bitmap_barr of { IO io ->
@@ -92,24 +88,25 @@ linkBCO' arr ResolvedBCO{..} = do
-- we recursively link any sub-BCOs while making the ptrs array
-mkPtrsArray :: Array Int HValue -> Word -> [ResolvedBCOPtr] -> IO PtrsArr
-mkPtrsArray arr n_ptrs ptrs = do
- marr <- newPtrsArray (fromIntegral n_ptrs)
+mkPtrsArray :: Array Int HValue -> SmallArray ResolvedBCOPtr -> IO PtrsArr
+mkPtrsArray arr ptrs = do
+ let n_ptrs = sizeofSmallArray ptrs
+ marr <- newPtrsArray n_ptrs
let
- fill (ResolvedBCORef n) i =
+ fill i (ResolvedBCORef n) =
writePtrsArrayHValue i (arr ! n) marr -- must be lazy!
- fill (ResolvedBCOPtr r) i = do
+ fill i (ResolvedBCOPtr r) = do
hv <- localRef r
writePtrsArrayHValue i hv marr
- fill (ResolvedBCOStaticPtr r) i = do
+ fill i (ResolvedBCOStaticPtr r) = do
writePtrsArrayPtr i (fromRemotePtr r) marr
- fill (ResolvedBCOPtrBCO bco) i = do
+ fill i (ResolvedBCOPtrBCO bco) = do
bco <- linkBCO' arr bco
writePtrsArrayBCO i bco marr
- fill (ResolvedBCOPtrBreakArray r) i = do
+ fill i (ResolvedBCOPtrBreakArray r) = do
BA mba <- localRef r
writePtrsArrayMBA i mba marr
- zipWithM_ fill ptrs [0..]
+ flip imapSmallArrayM_ ptrs fill
return marr
data PtrsArr = PtrsArr (MutableArray# RealWorld HValue)
=====================================
libraries/ghci/GHCi/ResolvedBCO.hs
=====================================
@@ -12,7 +12,7 @@ module GHCi.ResolvedBCO
#include "MachDeps.h"
import Prelude -- See note [Why do we import Prelude here?]
-import GHC.Data.SizedSeq
+import GHC.Data.SmallArray
import GHCi.RemoteTypes
import GHCi.BreakArray
@@ -51,13 +51,13 @@ isLittleEndian = True
--
data ResolvedBCO
= ResolvedBCO {
- resolvedBCOIsLE :: Bool,
+ resolvedBCOIsLE :: !Bool,
resolvedBCOArity :: {-# UNPACK #-} !Int,
- resolvedBCOInstrs :: BCOByteArray Word16, -- ^ insns
- resolvedBCOBitmap :: BCOByteArray Word, -- ^ bitmap
- resolvedBCOLits :: BCOByteArray Word,
+ resolvedBCOInstrs :: !(BCOByteArray Word16), -- ^ insns
+ resolvedBCOBitmap :: !(BCOByteArray Word), -- ^ bitmap
+ resolvedBCOLits :: !(BCOByteArray Word),
-- ^ non-ptrs - subword sized entries still take up a full (host) word
- resolvedBCOPtrs :: (SizedSeq ResolvedBCOPtr) -- ^ ptrs
+ resolvedBCOPtrs :: !(SmallArray ResolvedBCOPtr) -- ^ ptrs
}
deriving (Generic, Show)
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e57d087b59a5a4d3394e8adb6a7d20…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e57d087b59a5a4d3394e8adb6a7d20…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/faster-linkBCO] 2 commits: ghci: use SmallArray directly in ResolvedBCO
by Cheng Shao (@TerrorJack) 21 Mar '26
by Cheng Shao (@TerrorJack) 21 Mar '26
21 Mar '26
Cheng Shao pushed to branch wip/faster-linkBCO at Glasgow Haskell Compiler / GHC
Commits:
1433ee49 by Cheng Shao at 2026-03-21T01:15:31+00:00
ghci: use SmallArray directly in ResolvedBCO
This patch makes ghci use `SmallArray` directly in `ResolvedBCO` when
applicable, making the memory representation more compact and reducing
marshaling overhead. Closes #27058.
- - - - -
e57d087b by Cheng Shao at 2026-03-21T01:40:59+00:00
compiler: use SmallArray directly in UnlinkedBCO
This patch makes the compiler use `SmallArray` directly in
`UnlinkedBCO` when applicable, making the memory representation more
compact and reducing marshaling overhead.
- - - - -
1 changed file:
- compiler/GHC/ByteCode/Types.hs
Changes:
=====================================
compiler/GHC/ByteCode/Types.hs
=====================================
@@ -251,8 +251,8 @@ data UnlinkedBCO
unlinkedBCOArity :: {-# UNPACK #-} !Int,
unlinkedBCOInstrs :: !(BCOByteArray Word16), -- insns
unlinkedBCOBitmap :: !(BCOByteArray Word), -- bitmap
- unlinkedBCOLits :: !(SmallArray BCONPtr), -- non-ptrs
- unlinkedBCOPtrs :: !(SmallArray BCOPtr) -- ptrs
+ unlinkedBCOLits :: !(SmallArray BCONPtr), -- non-ptrs
+ unlinkedBCOPtrs :: !(SmallArray BCOPtr) -- ptrs
}
instance NFData UnlinkedBCO where
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/8a2ee362943e56dd8aa79c67bbbfe9…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/8a2ee362943e56dd8aa79c67bbbfe9…
You're receiving this email because of your account on gitlab.haskell.org.
1
0