[Git][ghc/ghc][wip/mangoiv/improve-linker-discovery] 88 commits: hadrian: fix HLS support
by Magnus (@MangoIV) 30 Jul '26
by Magnus (@MangoIV) 30 Jul '26
30 Jul '26
Magnus pushed to branch wip/mangoiv/improve-linker-discovery at Glasgow Haskell Compiler / GHC
Commits:
ed261a7e by Cheng Shao at 2026-07-14T17:59:38-04:00
hadrian: fix HLS support
This patch fixes hadrian's HLS support so one can rely on HLS when
working on the hadrian codebase. Fixes #27480.
Not building/linking shared libraries for hadrian is a severely
premature optimization; this top-level setting in `cabal.project` only
affects home packages while the dependencies in the cabal store are
built with vanilla/dynamic anyway, and even adding dynamic builds to
home packages would not be costly due to cabal's usage of
`-dynamic-too`.
- - - - -
eee8ec5b by Cheng Shao at 2026-07-14T18:00:20-04:00
compiler: fix miscompiled %load_relaxed, add missing %store_relaxed
This patch fixes the %load_relaxed cmm primop compilation logic to
correctly use relaxed memory ordering, and adds the missing
%store_relaxed primop. Parsing logic of %load/%store with explicit
ordering is covered in the AtomicFetch test case. Fixes #27483.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
1718230f by Alan Zimmerman at 2026-07-14T18:01:06-04:00
EPA: Keep binds and sigs together in HsValBindsLR
We combine them into a single list for GhcPs, wrapped in the
ValBind data type, which is the bind equivalent of ValD, having
constructors for binds and sigs.
This simplifies exact print processing, especially when using it to
update the contents of local binds, as we no longer need AnnSortKey
BindTag
- - - - -
6bd1ad2a by Andreas Klebinger at 2026-07-14T18:01:49-04:00
Bump nofib submodule to account for MonoLocalBinds.
New versions of GHC enable MonoLocalBinds by default.
This breaks some of the benchmarks. I've fixed this and
this bump pulls in that fix.
- - - - -
7eb0f1c9 by Cheng Shao at 2026-07-14T18:02:31-04:00
testsuite: fix bytecodeIPE test under +ipe flavours
This patch fixes the bytecodeIPE test under +ipe flavours. It used to
fail under +ipe because the RTS is built with IPE info, then
stg_AP_info in RTS carries IPE info, so whereFrom wouldn't return
Nothing. Now the test checks IPE info of a datacon in the ghci-loaded
module which is not affected by whether the RTS is built with IPE info
or not. Fixes #27498.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
ef038aae by cydparser at 2026-07-15T04:35:41-04:00
Reduce bytes allocated for `capabilities` in RTS (fixes #27487)
In rts/Capability.c, `capabilities` is an array of pointers, but it was allocated as if it were an
array of Capability's.
- - - - -
d377e83e by Cheng Shao at 2026-07-15T04:36:27-04:00
rts: fix missing UNTAG in stg_readTVarIOzh
This patch fixes missing UNTAG on the current value closure read from
StgTVar. UNTAG is a no-op when it's stg_TREC_HEADER_info which is word
aligned; it may be a tagged closure, and reading info table from the
tagged address is an unaligned load which may cause issues on
platforms with strict alignment requirements.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
8ed03842 by Cheng Shao at 2026-07-15T04:36:27-04:00
rts: fix missing UNTAG in stg_control0zh_ll
This patch fixes missing UNTAG on the cont closure returned by
captureContinuationAndAbort. In case it's not NULL,
captureContinuationAndAbort returns a tagged StgContinuation closure,
in which case it must be untagged before accessing the
apply_mask_frame field.
In the past it worked out of luck: when apply_mask_frame was NULL then
mask_frame_offset is also 0 so the control flow didn't diverge to a
wrong path. Still, this is horribly wrong and will crash once
StgContinuation struct is refactored and fields are shuffled around.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
5aa7000a by Cheng Shao at 2026-07-15T04:37:08-04:00
compiler: fix redundant AP thunk codegen when not using -ticky-ap-thunk
This patch fixes a double negation confusion in !7525 that results in
some redundant AP thunk code generation when not using
-ticky-ap-thunk. Now, we use `stgToCmmUseStdApThunk` to indicate
whether precomputed AP thunks in the RTS should be used, which
defaults to `True`, unless `-ticky-ap-thunk` is passed.
`-finfo-table-map` now also implies `-ticky-ap-thunk`, since when
doing IPE profiling we want the generated AP thunks to be unique.
Fixes #27502.
-------------------------
Metric Decrease:
T3064
-------------------------
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
d43a7b7a by Brian McKenna at 2026-07-15T20:10:04+02:00
Strip ticks when desugaring bool guards
The special `considerAccessible` pattern was broken when compiling
with debug info. Compiling with debug info wraps expressions with
`SourceNote` ticks, which broke the internals of the
`desugarBoolGuard` function. Ticks are now ignored within this
function.
Fixes #27360
- - - - -
ede4b17b by Ben Gamari at 2026-07-15T22:59:53-04:00
base: Display ExceptionContext in WhileHandling's textual description
As originally-implemented the implementation for
`WhileHandling(displayExceptionAnnotation)` would display the
`ExceptionContext` of the exception which it carries (as this was the
behavior of `displayException`, in terms of which
`displayExceptionAnnotation` was implemented).
However, in 284ffab3 the definition of `SomeException(displayException)`
was changed to exclude the `ExceptionContext`. This means that
`WhileHandling(displayExceptionAnnotation)` fails to describe the
provenance of the exception which it captures, greatly limiting its
utility.
Return the implementation to its originally-specified behavior by
implementing `WhileHandling(displayExceptionAnnotation)` in terms of
`displayExceptionWithInfo`.
Fixes #27456.
- - - - -
0f64f348 by Cheng Shao at 2026-07-16T15:41:08+00:00
ci: add missing docker permission workaround in abi-test job
- - - - -
660cb239 by Cheng Shao at 2026-07-16T19:37:48+00:00
bindist: Fix make install -j race condition on macos/freebsd
This patch fixes make install -j race condition on macos/freebsd. BSD
install fails with EEXIST when multiple install processes concurrently
create the same prefix directory. So we add an `install_dirs`
prerequisite job that sequentially creates the directories for
subsequent jobs to work with. Fixes #27499.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
08130257 by Cheng Shao at 2026-07-16T19:37:48+00:00
ci: run bindist make install with -j
This patch makes the ci scripts run `make install` with `-j` to reduce
wall clock time when installing the bindist, see related issue for
benchmark numbers. This only affects ghc ci logic, the user-facing
default is up to distributors and is still `-j1`. Closes #27029.
- - - - -
d5ae6906 by Adam Gundry at 2026-07-17T04:57:43-04:00
Mark various language extension flags as deprecated (see #27329)
The following language extensions are now deprecated:
- AlternativeLayoutRule
- AlternativeLayoutRuleTransitional
- ParallelArrays
- PolymorphicComponents
- Rank2Types
In addition, the warning `-Walternative-layout-rule-transitional`
has been marked as deprecated, as it is emitted only under the
deprecated extension `XAlternativeLayoutRuleTransitional`.
- - - - -
fe3b059c by Andrew Lelechenko at 2026-07-17T04:58:26-04:00
base: re-export GHC.Environment.getFullArgs from System.Environment
CLC proposal https://github.com/haskell/core-libraries-committee/issues/431
- - - - -
722236dd by sheaf at 2026-07-18T08:48:31-04:00
Coercion optimisation: avoid double-Sym for InstCo
Ticket #27374 pointed out an issue with GHC.Core.Coercion.Opt.optCoercion's
handling of InstCo: it contravened (LC2) in Note [The LiftingContext in optCoercion]
because it applied the ambient 'sym' to a coercion that was then added
to the lifting context substitution.
Fixes #27374
Co-authored-by: Simon Jakobi <simon.jakobi(a)gmail.com>
- - - - -
ff70fc75 by sheaf at 2026-07-18T08:48:31-04:00
Coercion optimisation: avoid exponential behaviour
The change to coercion optimisation of 'InstCo' in the previous commit
introduces exponential behaviour to the coercion optimiser. To avoid
this, this commit provides a way to push in 'Sym' of an already-optimised
coercion: GHC.Core.Coercion.Opt.mkDeepSymCo.
See Note [Pushing Sym without re-optimising] in GHC.Core.Coercion.Opt.
- - - - -
dfef27f0 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Move THREADED_RTS-conditional struct members to end of Capability
Accessing members of the Capability struct from CMM code rely on
accessor macros. (The macros are generated by deriveConstants).
These macros have a single definition. This means that the offsets of
all struct members must *not* vary based on THREADED_RTS vs
!THREADED_RTS. This requires that any struct members that are
conditional on THREADED_RTS must occur after the unconditional struct
members. Hence we move all the ones that are conditional on
THREADED_RTS to the end.
Add a deriveConstants entry for the iomgr member of the Capability
struct, which was the motivation for this change.
Add warning messages to help our future selves. Debugging this took me
a couple hours in gdb!
- - - - -
c254e022 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Make the IOManager API use CapIOManager rather than Capability
This makes the API somewhat more self-contained and more consistent.
Now the IOManager API and each of the backends takes just the I/O
manager structure. Previously we had a bit of a mixture, depending on
whether the function needed access to the Capability or just the
CapIOManager.
We still need access to the cap, so we introduce a back reference to
reach the capability, via iomgr->cap.
Convert all uses in select and poll backends, but not win32 ones.
Convert callers in the scheduler and elsewhere.
Also convert the three CMM primops that call IOManager APIs. They just
need to use Capability_iomgr(MyCapability()).
- - - - -
4f3d8f31 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Split posix/MIO.c out of posix/Signals.c
The MIO I/O manager was secretly living inside the Signals file.
Now it gets its own file, like any other self-respecting I/O manager.
- - - - -
52ce04a9 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Rationalise some scheduler run queue utilities
Move them all to the same place in the file.
Make some static that were used only internally.
Also remove a redundant assignment after calling truncateRunQueue that
is already done within truncateRunQueue.
- - - - -
75bbdebc by Duncan Coutts at 2026-07-18T08:49:12-04:00
Rename initIOManager{AfterFork} to {re}startIOManager
These are more accurate names, since these actions happen after
initialisation and are really about starting (or restarting) background
threads.
- - - - -
724c0517 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Free per-cap I/O managers during shutdown and forkProcess
Historically this was not strictly necessary. The select and win32
legacy I/O managers did not maintain any dynamically allocated
resources. The new poll one does (an auxillary table), and so this
should be freed.
After forkProcess, all threads get deleted. This includes threads
waiting on I/O or timers. So as of this patch, resetting the I/O
manager is just about tidying things up. For example, for the poll
I/O manager this will reset the size of the AIOP table (which
otherwise grows but never shrinks).
In future however the re-initialising will become neeecessary for
functionality, since some I/O managers will need to re-initialise
wakeup fds that are set CLOEXEC.
- - - - -
c007d122 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Add a TODO to the MIO I/O manager
The direction of travel is to make I/O managers per-capability and have
all their state live in the struct CapIOManager. The MIO I/O manager
however still has a number of global variables.
It's not obvious how handle these globals however.
- - - - -
b65ab7b3 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Add a FIXME note in the Poll I/O manager
- - - - -
daf2bd6f by Duncan Coutts at 2026-07-18T08:49:12-04:00
Add missing updateRemembSetPushClosure in poll I/O manager
For the non-moving GC.
- - - - -
e33ca830 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Minor doc improvement to struct StgAsyncIOOp member outcome
Mention the enumeration names, as well as their numeric values. The rest
of the code uses the enum names.
- - - - -
4edd2579 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Minor doc improvements for StgTSOBlockInfo
Clarify that certain union members are used only by certain legacy
I/O managers. Hopefully we will be able to remove these at some point.
- - - - -
536bedbb by Duncan Coutts at 2026-07-18T08:49:12-04:00
Avoid exporting various win32-specific rts symbols
The BeginPrivate.h / EndPrivate.h scheme works perfectly well on
Windows, but all of the rts/win32/*.h files were not using it.
- - - - -
8139b5ac by Duncan Coutts at 2026-07-18T08:49:12-04:00
Remove wakeupIOManager, ioManagerWakeup and setIOManagerWakeupFd
We no longer need wakeupIOManager for the threaded RTS case, so we can
remove it and the bits only needed to support it. This includes the
pipe/eventfd fd shared between the RTS and the in-library I/O manager
used for waking up the I/O manager thread. The pipe/eventfd still
exists, but it no longer has to be communicated to the RTS, since the
RTS no longer needs to use it.
So we remove the RTS API export setIOManagerWakeupFd, and remove uses of
it within the I/O managers in ghc-internal.
- - - - -
74fe7c66 by Duncan Coutts at 2026-07-18T08:49:12-04:00
Add a new interruptIOManager API for the I/O managers
It will be used to interrupt awaitCompletedTimeoutsOrIO. Also update the
return type and docs for awaitCompletedTimeoutsOrIO to have it return
false when it gets interrupted, and have no useful post condition in
that case.
- - - - -
38792843 by Duncan Coutts at 2026-07-18T08:49:13-04:00
Add interruptIOManager support for select I/O manager
Uses the FdWakup mechanism.
- - - - -
2f3b00aa by Duncan Coutts at 2026-07-18T08:49:13-04:00
Add interruptIOManager support for poll I/O manager
Uses the FdWakup mechanism.
A quirk we have to cope with is that we now need to poll one more fd --
the wakeup_fd_r -- but this fd has no corresponding entry in the
aiop_table. This is awkward since we have set up our aiop_poll_table to
be an auxilliary table with matching indicies.
The solution this patch uses (and described in the comments) is to have
two tables: struct pollfd *aiop_poll_table, *full_poll_table;
and to have the aiop_poll_table alias the tail of the full_poll_table.
The head entry in the full_poll_table is the extra fd. So we poll the
full_poll_table, while the aiop_poll_table still has matching indicies
with the aiop_table.
Hurrah for C aliasing rules.
- - - - -
cee50131 by Duncan Coutts at 2026-07-18T08:49:13-04:00
Add interruptIOManager support for win32 legacy I/O manager
And remove unused related helper resetAbandonRequestWait. It is not
called because the event is created in auto-reset mode, so never needs
to be reset manually.
- - - - -
cf453143 by Duncan Coutts at 2026-07-18T08:49:13-04:00
Note lack of interruptIOManager support for WinIO I/O manager
Though there's a plausible design, we can't sanely test it at the moment
due to related WinIO bugs. Filed as issue #27403.
- - - - -
1b74a0ad by Duncan Coutts at 2026-07-18T08:49:13-04:00
Be more explicit about enum IOReadOrWrite values, and type within cmm
Belt and braces.
- - - - -
b388d093 by Brian McKenna at 2026-07-18T17:51:50-04:00
Ignore ticks in the pattern-match term oracle
The term-oracle in the pattern-match checker is keyed by a canonical
form of the scrutinee, computed by `makeDictsCoherent`. That canonical
form was tick-sensitive: two occurrences of an otherwise identical
expression that happened to carry different ticks were treated as
distinct values, breaking long-distance information.
This shows up in practice under `-finfo-table-map`, because the
desugarer wraps every record-selector use site in a `SourceNote`
carrying that site's span. For example:
data Box = Box { unBox :: Maybe Int }
f b = case unBox b of
Nothing -> 0
Just _ -> let Just x = unBox b in x
The two `unBox b` expressionss carry different SourceNote spans, the
pattern-match checker sees them as different, the long-distance
information from the outer `Just _` branch never reaches the
let-pattern, and `Just x = unBox b` is wrongly reported as
non-exhaustive.
We now strip all ticks in `makeDictsCoherent`. This is documented as
Wrinkle (UD1) of Note [Unique dictionaries in the TmOracle CoreMap].
Fixes #27314
- - - - -
c23e1acb by Mrjtjmn at 2026-07-18T17:52:45-04:00
Add explanations for unsolved Typeable constraints
This commit adds explanations for unsolved 'Typeable' constraints.
GHC will now provide additional explanations for an unsolved constraint
of the form 'Typeable ty', explain why GHC did not solve Typeable constraint.
e.g.:
- 'ty' is a polymorphic type (e.g. forall a. a -> a)
- 'ty' is a qualified type (e.g. Eq Int => Int)
- 'ty' is an unboxed sum type
- 'ty' is an unreduced type family application
- 'ty' whose kind is not typeable
Fixes #26532
- - - - -
cbef021e by Artem Pelenitsyn at 2026-07-19T07:49:55-04:00
ghc-internal: Lock.hs: fix typo and indentation
- - - - -
42918646 by Duncan Coutts at 2026-07-19T07:50:36-04:00
Fix failing test GcStaticPointers for non-moving GC
Minor mistake in asserting something before checking for that same
thing.
Specifically, Bdescr asserts HEAP_ALLOCED_GC, but Bdescr was being used
prior to a guard that checks HEAP_ALLOCED_GC. The solution is just to
move the use of Bdescr after the guard.
Thanks to Simon Jakobi for identifying the problem.
- - - - -
c2f6dcd4 by Sasha Bogicevic at 2026-07-20T10:31:56+02:00
Improve error messages for invalid record wildcards
Record wildcard hints are now shown in more contexts and include
constructor arity; matching with `..` on a fieldless constructor
now produces a dedicated error message.
Fixes #21101
- - - - -
4c02e76b by Duncan Coutts at 2026-07-21T10:37:21-04:00
Mark test T27105 as fragile, citing issue #27522
Scheduler fairness is fine, except when it isn't. And it isn't on CI
machines surprisingly often! See the issue for details.
- - - - -
43dd2b15 by Recursion Ninja at 2026-07-21T17:09:53-04:00
Resolving many TTG related orphan type-class instances
This is part a technical debt removal effort made possible now
that separating out the AST via TTG has come to a close.
As the AST in 'L.H.S' has been incrementally separated from the GHC internals,
there are many accumulated orphan instance of 'Binary', 'NFData', 'Outputable',
and 'Uniquable'. The orphan instance of data-types from within 'L.H.S' have had
their orphan instances moved to either:
1. The module which defines the data-type
2. The module which defines the type-class;
i.e. moving an orphan 'Binary' instance to 'GHC.Utils.Binary'
Orphan instances resolved (37):
| Data-type | Resolved instance(s) | Former orphan module(s) |
| -------------------- | -------------------------- | ------------------------- |
| Role | Binary, NFData, Outputable | GHC.Core.Coercion.Axiom |
| SrcStrictness | Binary, NFData, Outputable | GHC.Core.DataCon |
| SrcUnpackedness | Binary, NFData, Outputable | GHC.Core.DataCon |
| Fixity | Binary, Outputable | GHC.Hs.Basic |
| FixityDirection | Binary, Outputable | GHC.Hs.Basic |
| LexicalFixity | Outputable | GHC.Hs.Basic |
| CCallTarget | NFData | GHC.Hs.Decls.Foreign |
| CType | NFData | GHC.Hs.Decls.Foreign |
| Header | NFData | GHC.Hs.Decls.Foreign |
| OverlapMode | Binary, NFData | GHC.Hs.Decls.Overlap |
| WithHsDocIdentifiers | NFData, Outputable | GHC.Hs.Doc |
| HsDocString | NFData | GHC.Hs.DocString |
| HsDocStringChunk | Binary, Outputable | GHC.Hs.DocString |
| HsDocStringDecorator | Binary, Outputable | GHC.Hs.DocString |
| NamespaceSpecifier | Outputable | GHC.Hs.ImpExp |
| ForAllTyFlag | Binary, NFData, Outputable | GHC.Hs.Specificity |
| Specificity | Binary, NFData | GHC.Hs.Specificity |
| PromotionFlag | Binary, Outputable | GHC.Types.Basic |
| FieldLabelString | Outputable, Uniquable | GHC.Types.FieldLabel |
| InlinePragma | Binary | GHC.Types.InlinePragma |
-------------------------
Metric Decrease:
hard_hole_fits
-------------------------
Closes #21262, #27469
- - - - -
ab9ab895 by Cheng Shao at 2026-07-21T17:10:53-04:00
rts: always use StgInt to represent cost center id
Currently cost center id is modeled as `Int` and it should be `StgInt`
uniformly in the RTS, hence this patch. Fixes #27524.
- - - - -
94d8f83b by Cheng Shao at 2026-07-22T11:30:40-04:00
hadrian: clean up stale cabal package flags in the tree
This patch cleans up stale cabal package flags in the tree and related
hadrian/autoconf logic. Closes #27474.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
0bf1d8c9 by Sasha Bogicevic at 2026-07-22T11:31:21-04:00
parser: don't suggest ImportQualifiedPost when it is already enabled
-Wprepositive-qualified-module unconditionally attached a hint to
enable ImportQualifiedPost, even when the extension was already on
(as it is by default under GHC2021). Record the extension's state in
the PsWarnImportPreQualified diagnostic and drop the hint when it is
already enabled.
Fixes #27380
- - - - -
700a1dd1 by Simon Jakobi at 2026-07-23T11:21:20-04:00
ci: Reduce lint job setup costs
Avoid fetching unnecessary history and submodules for lightweight lint
jobs. Run changelog validation without Hadrian.
Because the lint-author job is now based on the .lint template directly,
we enhance it to allow Git to read from the runner-owned checkouts,
In the previously used .lint-params template, this permissions issue was
addressed via `chown`.
Closes #27521.
Assisted-by: gpt-5.6-sol via Codex CLI
- - - - -
26a44fb0 by ARATA Mizuki at 2026-07-23T11:22:10-04:00
testsuite: Fix memory issues of doublex2_* and simd010
doublex2_* had reads from uninitialized memory.
simd010 had out-of-bounds array access.
Fixes #27544
- - - - -
4d798b17 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Eliminate STM_AWOKEN
It was used as nullary closure for the block_info.closure in the case of
a thread being awoken after an STM transaction.
However, while it was written, it was never read, so contributed nothing
to the behaviour. Furthermore, in the only place it was set (in
tryWakeupThread) the why_blocked was immediately overwritten by the
NotBlocked status, and the block_info was updated accordingly (by
appendToRunQueue).
So it didn't even serve a purpose of clarifying an intermediate state,
there really was no such intermediate state.
Cleaning this up will allow the BlockedOnSTM case to follow the same
pattern as the other why_blocked cases that do not use the block_info,
and in turn this reduces the number of different categories.
- - - - -
e1cece79 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Document that eventlog thread stop code ThreadBlocked is no longer used
It has not been used since GHC 7.0.x (2011). In 7.2 all the BlockedOn*
codes were added, and these were and are used instead of ThreadBlocked.
- - - - -
795db115 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Add a proper mapping to eventlog external thread stop status
That is the mapping from rts-internal codes, to the coes used in the
status field in the eventlog EVENT_STOP_THREAD event.
See issue #9003 for what goes wrong when we mess this up. In that
ticket, people note that we should really not require the internal
tso->why_blocked codes to leak into the external eventlog thread stop
codes. The same principle applies to the StgThreadReturnCode.
This change properly separates them, and explicitly maps between them
using a pair of (compact, constant) tables. These tables are pretty
small (with no alignment constraints) and will soon shrink so it seems
a sensible tradeoff.
We also introduce and use proper EVENT_STOP_THREAD constants in the
event log format header. Previously there was not specification in the
code for these (only in the docs): the values were encoded into the
conversion code.
This will allow us to renumber the internal why_blockd codes without
breaking the eventlog output.
- - - - -
6f1c8efa by Duncan Coutts at 2026-07-23T17:26:18-04:00
Remove unused tso->block_info.wakeup member
Presumably it was used once, but not now.
- - - - -
740b88a9 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Document StgTSOBlockInfo to say what cases use what members
In principle, tso->why_blocked is the tag for the StgTSOBlockInfo union,
so we should be able to say for each union member the why_blocked cases
that use that member.
- - - - -
5b92eae2 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Add a tso->block_info.mvar member and use it
in preference to the generic block_info.closure union member, with
casts.
The plan is that when we know what case we're in (via tso->why_blocked)
then we can always access the correct union member, and so we will only
need to access block_info.closure for generic cases where we don't know
or don't care.
- - - - -
d931715f by Duncan Coutts at 2026-07-23T17:26:18-04:00
Add a tso->block_info.unused member and use it
in preference to the generic block_info.closure union member, with
casts.
The plan is that when we know what case we're in (via tso->why_blocked)
then we can always access the correct union member, and so we will only
need to access block_info.closure for generic cases where we don't know
or don't care.
- - - - -
47e28ebb by Duncan Coutts at 2026-07-23T17:26:18-04:00
Avoid storing to tso->block_info.closure
In one case we can use a specific union member (.prev) instead. In
several cases the stores were in fact redundant because of subsequent
overwrites.
In scavengeTSO we replace setting tso->block_info.closure to a valid
closure, with an assertion that the block_info.unused is already set to
END_TSO_QUEUE which is a valid (static) closure.
- - - - -
96e4749d by Duncan Coutts at 2026-07-23T17:26:18-04:00
Renumber the tso->why_blocked constants
We can do this now because we have separated the internal values from
the external ones used in the eventlog.
This lets us put them back into a deliberate order and consolodate some
gaps.
More importantly, it is a prepation for a slightly more sophisticated
encoding.
- - - - -
8f62661c by Duncan Coutts at 2026-07-23T17:26:18-04:00
Define constants for the existing stg_threadStatuszh return codes
The stg_threadStatuszh reuses the internal tso->why_blocked codes but
also extends them with a couple previously magic values. This is awkward
since we need to know what those magic values are so we don't
accidentally use those values to mean something else. By pulling a
definition up to where the why_blocked codes are defined we will be able
to avoid mistakenly assining those codes some meaning (or just changing
the BlockedThreadComplete, BlockedThreadKilled code if necessary).
- - - - -
42c69ae2 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Extend the tso->why_blocked encoding to indicate block_info closures
We use some bit tricks to cheaply and generically test if a
tso->why_blocked tag implies that the corresponding tso->block_info will
contain a non-trivial valid closure (i.e. not just block_info.unused set
to END_TSO_QUEUE).
In particular we arrange for most why_blocked values to naturally have a
distinguishing bit, but for the BlockedOn{Read,Write,Delay} cases, they
can come in either non-closure or closure forms. We allow an additional
bit to distinguish these cases. The non-closure forms are only from
legacy I/O managers: select and win32-legacy. So this extra bit
mechanism will be able to be retired once the legacy I/O managers are
themselves retired.
This means in a few places we need to untag the why_blocked value before
inspecting it, but in most places we do not.
- - - - -
7c64632b by Duncan Coutts at 2026-07-23T17:26:18-04:00
Use BlockInfoForceNonClosure in the select I/O manager
- - - - -
8fd7104a by Duncan Coutts at 2026-07-23T17:26:18-04:00
Use BlockInfoForceNonClosure in the win32-legacy I/O manager
for the BlockedOn{Read,Write} since these use the non-heap allocated
StgAsyncIOResult.
- - - - -
e0da603b by Duncan Coutts at 2026-07-23T17:26:18-04:00
Enforce the why_blocked and block_info rules in checkTSO
We now check the cases wher IsBlockInfoClosure should hold, the cases
that are supposed to use block_info.unused == END_TSO_QUEUE, and which
cases are allowed to use BlockInfoForceNonClosure.
This partially enforces the use of why_blocked as a tag for the
block_info union. We could be stricter and check for the correct
expected info table for the closure cases.
- - - - -
1dd0f381 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Use IsBlockInfoClosure to simplify several tests
In GC and generic traversal we need to know if we should look at the
block_info.closure or not. Now we can do just that using a cheap bit
test on the why_blocked tag.
This fixes issue 26717, where the problem was that some GC modes did not
know when to look at block_info.closure, because the poll I/O manager
uses a closure for BlockedOn{Read,Write} while the select I/O manager
uses a non-closure. Now this information is in the why_blocked tag
itself.
- - - - -
7a00ffbc by Duncan Coutts at 2026-07-23T17:26:18-04:00
Remove the now-unused scavengeTSOIOManager
The GC no longer has to delegate to the I/O manager, since it can use
IsBlockInfoClosure to decide things itself.
- - - - -
522a481f by Duncan Coutts at 2026-07-23T17:26:18-04:00
Remove duplicate assertion
- - - - -
0874d965 by Duncan Coutts at 2026-07-23T17:26:18-04:00
Follow atomic access rules more consistently for tso->why_blocked
The rule is this:
store block_info *before* why_blocked
store why_blocked using store release
load why_blocked using load acquire
load block_info *after* why_blocked
This is a an atomic store release / load acquire pair and (if the reads
are in a separate thread to the writes, and the read receives the value
stored) then this guarantees a full "happens before" relationship of
these stores and loads.
In some cases, we do not need a full load acquire, because we don't read
the block_info at all and so do not need any ordering. In this case we
just need an atomic relaxed load.
This was being followed in most places, but not all. If there's good
reason in any case that we don't need atomic access, then we should
document that in a comment. In the absence of that I think it's easier
to follow the rule everywhere.
- - - - -
8f0bdbe1 by Duncan Coutts at 2026-07-23T17:26:19-04:00
Add a changelog entry
- - - - -
4fdfe757 by Alan Zimmerman at 2026-07-23T17:27:06-04:00
EPA: Keep decls together in ClassDecl
Similar to 1718230f4d3d19d8c49c0e5d496cb0fb6f399528 for HsValBindsLR,
this commit updates ClassDecl so that it no longer splits out the
assorted `LHsDecl GhcPs` until the renamer.
It does this by inserting a type family (separate from the classic TTG one) for this.
So
data TyClDecl
...
| ClassDecl {
...
tcdDecls :: XClassDecls pass
with
type instance XClassDecls GhcPs = [LHsDecl GhcPs]
type instance XClassDecls GhcRn = ClassDeclX GhcRn
type instance XClassDecls GhcTc = ClassDeclX GhcTc
data ClassDeclX pass
= ClassDeclX { tcdSigs :: [LSig pass], -- ^ Methods' signatures
tcdMeths :: LHsBinds pass, -- ^ Default methods
tcdATs :: [LFamilyDecl pass], -- ^ Associated types;
tcdATDefs :: [LTyFamDefltDecl pass], -- ^ Associated type defaults
tcdDocs :: [LDocDecl pass] -- ^ Haddock docs
}
- - - - -
f586c885 by Simon Jakobi at 2026-07-24T18:05:00-04:00
ci: Use shallow submodule clones by default
Limit submodule clones to depth one to reduce CI checkout costs. Keep
fetching full submodule history for the submodule lint jobs, which
inspect commits across a range.
Assisted-by: gpt-5.6-sol via Codex CLI
- - - - -
306120d2 by Duncan Coutts at 2026-07-24T18:05:43-04:00
Fix flaky test T3994 on FreeBSD
On current FreeBSD versions, calling getpgid on a zombie process fails.
In T3994, if we're really unlucky with delays and scheduling then we can
end up in exactly that situation.
Just catch that specific exception and ignore it. It's rare, and not our
fault.
- - - - -
7b116a0b by Cheng Shao at 2026-07-24T18:06:24-04:00
ci: add missing workaround for docker permissions in lint jobs
Some lint jobs use ci-images with default user `ghc`, and the gitlab
ci docker executor requires the `sudo chown` workaround to fix
workspace directory permission issue. This patch adds the missing
workarounds for the lint jobs. Fixes #27554.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
815149f3 by Andrzej Rybczak at 2026-07-25T15:06:43+00:00
Add -Wdefaulted-callstack
Adds a new warning, -Wdefaulted-callstack, which warns when an implicit
CallStack parameter is defaulted to the empty stack. In particular, this
includes call sites where a function with a HasCallStack constraint is called
from a definition that does *not* provide one. At such call sites the call stack
is cut off and does not include the enclosing definition's callers, which can be
a source of surprise if the user wants complete call stacks.
Closes #27077.
- - - - -
f6f2343f by Zubin Duggal at 2026-07-25T17:40:51-04:00
UniqueDFM: alter should preserve insertion order
Before it always inserting new elements at the end.
This is problematic because instances get inserted into the map with
`alterF`, which can change ordering of how instances are printed
with `:info` depending on the order in which we consult interfaces
I expect `alter id k = id` and `alter (fmap f) k = adjust f k`. Moving keys to
the end breaks that (`adjust` already preserves position).
Fixes #27532
- - - - -
5d0ab71a by fendor at 2026-07-27T17:31:05-04:00
Introduce global unit database cache
As a first step for better sharing of `UnitInfo` across `UnitEnv`,
we introduce a new datatype called `ExternalUnitDatabases`.
It primarily serves as an in-memory representation of *all*
`UnitDatabase`s across `UnitEnv`. This means, if multiple `HomeUnitEnv`s
depend on the same database, one way or another, we make sure that we
don't parse from disk every time.
Instead, we store the in-memory representation in `ExternalUnitDatabases`.
`ExternalUnitDatabaseCache` is the equivalent of `ExternalUnitState` in
the `UnitEnv`. It is a mutable variable wrapping `ExternalUnitDatabases`.
The mutable `ExternalUnitDatabaseCache` is used in `initUnits` to make
sure we don't parse the same unit database multiple times.
Almost by accident, we change the semantics of `initUnits` to honour
modifications to `packageDBFlags`.
The inability to change `packageDBFlags` while also reusing the already
parsed `UnitDatabase`s was reported in #26423 as a bug.
Hence, we think this behaviour change is warranted and acceptable,
especially since it comes with a breaking change to the `initUnits` API.
Add regression test for #26423
Closes #26423
- - - - -
6cce494a by fendor at 2026-07-27T17:31:05-04:00
Introduce UnitIndex for global external unit caching
`UnitInfo`s have been observed to cause a lot of memory usage in #27500.
Especially with multiple home units, as the same (external) units are
processed from scratch, even though most of the time we end up with
exactly the same `UnitInfo`.
We introduce a `UnitEnv` global cache that allows us to store external
unit information that is used across all `HomeUnitEnv`s.
The most important change in this commit is the introduction of the `UnitIndex`.
It stores a global mapping of `UnitId` -> `UnitInfo`, and `initUnits`
always uses the cached `UnitInfo` entry to populate each
`HomeUnitEnv`'s `UnitState`.
This allows us to ensure the following property:
> Each `UnitInfo` should be alive exactly once in GHC.
All `UnitState`s should reference 'UnitInfo's stored in the 'UnitIndex'.
This ensured by calling 'initUnits' with the 'UnitIndex'.
In addition, the `ExternalUnitDatabases` may also hold a reference
to each on-disk representation of `UnitInfo`.
This means, we impose an hard upper bound on the number of `UnitInfo`s
alive in the GHC session:
> The number of alive `UnitInfo`s closure objects must be the
> sum of all loaded unit database times two.
We add performance regression tests that make sure the number of live
`UnitInfo` cannot exceed this threshold.
Closes #27500
-------------------------
Metric Decrease:
MultiComponentModules
MultiComponentModulesRecomp
MultiComponentModulesRecomp100
mhu-perf
LinkableUsage02
-------------------------
These metrics increases are especially notable, as we are not even
sharing anything big but merely the global package database with 50
entries.
It shows how careful sharing of `UnitInfo` can improve memory usage.
We expect this to be much more notable when the whole cabal package
database is shared across multiple home units.
`LinkableUsage02` metric decreases on unreg and i386 platform, only.
---
Technical details
To share the `UnitInfo`s correctly, it is important that we extract
the `WireMap` into the `UnitIndex`. At the moment of writing, `WireMap`
must be globally the same for all `HomeUnitEnv`s.
This is important, as we could otherwise not cache the "fully-resolved"
`UnitInfo`, as we don't change the `UnitId` or `unitAbiHash` when
resolving wired-in units. Thus, there could be ambiguities, when the
`WireMap` is not the same for all `UnitState`s across the `UnitEnv`.
We consider a `UnitInfo` fully-resolved, if wired-in units have been
updated, the `UnitInfo` has been validated and variables in the unit
config, such as `${pkgroot}` have been resolved.
Updating the wired-in units requires the `WireMap` to be globally the
same.
- - - - -
f8e3bee9 by Zubin Duggal at 2026-07-27T17:31:49-04:00
testsuite: skip runtime stats tests on debugged compilers
Debugged flavours build the boot libraries without optimisation, so the
runtime numbers do not match the baselines.
- - - - -
1e326770 by Zubin Duggal at 2026-07-27T17:31:50-04:00
testsuite: mark #20706 tests fragile rather than broken
Whether the static linux linker issues manifest depends on the host
toolchain.
- - - - -
c0b13cbe by Zubin Duggal at 2026-07-27T17:31:50-04:00
testsuite: exclude libnuma from mostly-static
It needs static system libraries (libnuma.a) that many platforms do not
ship.
Fixes #26914
- - - - -
bee1913d by Alan Zimmerman at 2026-07-28T16:42:29-04:00
EPA: ClsInstDecl with decls as [LHsDecl GhcPs] in GhcPs
Similar to 4fdfe75731e01dad7d7fa474c2703d0d3965afb1, this commit
changes the as-parsed representation of class instance declarations to
[LHsDecl GhcPs], and only separates them by type from the renamer onward.
This also allows us to remove all the AnnSortKey machinery for exact
printing, as it is now no longer needed.
- - - - -
72c55eee by Cheng Shao at 2026-07-28T16:43:11-04:00
hadrian: implement and use writeFileAtomic to fix race condition
This patch implements `writeFileAtomic` in hadrian and change all
invocations of shake non-atomic `writeFile'` to use `writeFileAtomic`,
to avoid multiple hadrian concurrent invocations overwriting the same
in-tree generated file not in the build root directory. Fixes #27536.
Additional notes:
- `writeFileChanged`/`writeFileChangedBS` cannot be made atomic since
it involves reading the file's older version, so their uses are left
alone. It doesn't affect #27536 given their outputs are contained in
the build root directory.
- It's possible to shrink this patch by only making writes outside the
build root directory atomic. But I think it's not worth the effort
for fine grained distinction here, and atomic writes within the
build root directory should also improve robustness of a hadrian
build.
- In the longer term we do want to make a ghc build only generate
files within the build root directory, though that's a lot of work
and outside the scope of this particular bugfix.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
46d4f963 by Sylvain Henry at 2026-07-29T06:38:40-04:00
RTS: correctly mark slop bytes when shrinking large arrays (#19048)
Correctly mark slop bytes even when profiling is off so that heap census
doesn't traverse garbage-collected closures.
- - - - -
4762a8bf by Simon Jakobi at 2026-07-29T06:39:23-04:00
Add -XLazyFieldAnnotations (GHC proposal 752)
Unbundle the prefix `~` lazy field annotation syntax from StrictData. The
new LazyFieldAnnotations extension controls whether `~` is accepted on
constructor fields. StrictData (and Strict, transitively) imply the new
extension.
See https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0752-l….
Closes #24455.
Assisted-by: Claude Opus 4.8
- - - - -
0b6dcc84 by Simon Jakobi at 2026-07-29T06:40:04-04:00
testsuite: Relax T24471 residency tolerance
T24471 peak residency fluctuates enough on i386 to cause spurious
failures. Use the standard residency tolerance while retaining the
existing allocation threshold.
See https://gitlab.haskell.org/ghc/ghc/-/work_items/24471#note_682303.
Assisted-by: gpt-5.6-sol via Codex CLI
- - - - -
90e95b34 by Cheng Shao at 2026-07-29T06:40:45-04:00
compiler: fix missing top-level procedure labels in cmm dumps
This patch fixes missing top-level procedure labels in some
intermediate Cmm pass dumps. Fixes #27553.
Co-authored-by: Codex <codex(a)openai.com>
- - - - -
360a5946 by sheaf at 2026-07-29T06:41:35-04:00
Add some type-family-heavy performance tests
FamAppCachePerf stress-tests the performance of lookups in the
type family application cache.
T27336 is a minimisation extracted from the reported reproducer.
SimplCastPerf is a measure of coercion growth due to the simplifier
calling mkTransCo without re-optimising the result.
- - - - -
1463d42b by mangoiv at 2026-07-30T21:16:34+02:00
configure: implement a saner linker discovery algorithm in dist/configure
- - - - -
15adf34e by mangoiv at 2026-07-30T21:16:34+02:00
ci/revert: don't do strict toolchain check for now
- - - - -
421 changed files:
- .gitlab-ci.yml
- .gitlab/ci.sh
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- + changelog.d/21101
- + changelog.d/27380
- + changelog.d/27532
- + changelog.d/T26423
- + changelog.d/T26532
- + changelog.d/T26716
- + changelog.d/T27314.md
- + changelog.d/T27329
- + changelog.d/T27360
- + changelog.d/T27374
- + changelog.d/T27456
- + changelog.d/fix-cmm-atomic-load-store
- + changelog.d/fix-cmm-dump-labels
- + changelog.d/fix-heap-census-large-arrays-19048
- + changelog.d/fix-make-install-j
- + changelog.d/fix-use-std-ap-thunk
- + changelog.d/lazy-field-annotations
- + changelog.d/unit-index
- + changelog.d/warn-defaulted-callstack
- compiler/GHC.hs
- compiler/GHC/Cmm/Parser.y
- compiler/GHC/Cmm/Pipeline.hs
- compiler/GHC/Core/Coercion/Axiom.hs
- compiler/GHC/Core/Coercion/Opt.hs
- compiler/GHC/Core/DataCon.hs
- compiler/GHC/Driver/Backpack.hs
- compiler/GHC/Driver/Config/StgToCmm.hs
- compiler/GHC/Driver/Env.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Main/Hsc.hs
- compiler/GHC/Driver/Main/Interactive.hs
- compiler/GHC/Driver/Main/Passes.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Driver/Session/Units.hs
- compiler/GHC/Hs/Basic.hs
- compiler/GHC/Hs/Binds.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Decls/Overlap.hs
- compiler/GHC/Hs/Doc.hs
- compiler/GHC/Hs/DocString.hs
- compiler/GHC/Hs/ImpExp.hs
- compiler/GHC/Hs/Instances.hs
- − compiler/GHC/Hs/Specificity.hs
- compiler/GHC/Hs/Stats.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore/Docs.hs
- compiler/GHC/HsToCore/Pmc/Desugar.hs
- compiler/GHC/HsToCore/Pmc/Solver.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/HsToCore/Ticks.hs
- compiler/GHC/Iface/Ext/Ast.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/Annotation.hs
- compiler/GHC/Parser/Errors/Ppr.hs
- compiler/GHC/Parser/Errors/Types.hs
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Parser/PostProcess/Haddock.hs
- compiler/GHC/Rename/Bind.hs
- compiler/GHC/Rename/Env.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Names.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Runtime/Eval.hs
- compiler/GHC/StgToCmm/Bind.hs
- compiler/GHC/StgToCmm/Config.hs
- compiler/GHC/Tc/Deriv.hs
- compiler/GHC/Tc/Errors.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Instance/Typeable.hs
- compiler/GHC/Tc/Solver/Default.hs
- compiler/GHC/Tc/Solver/Dict.hs
- compiler/GHC/Tc/TyCl.hs
- compiler/GHC/Tc/TyCl/Class.hs
- compiler/GHC/Tc/TyCl/Instance.hs
- compiler/GHC/Tc/Types/Evidence.hs
- compiler/GHC/Tc/Types/Origin.hs
- compiler/GHC/Tc/Types/Rank.hs
- compiler/GHC/Tc/Utils/Env.hs
- compiler/GHC/Tc/Utils/Unify.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/Basic.hs
- compiler/GHC/Types/Error/Codes.hs
- compiler/GHC/Types/FieldLabel.hs
- compiler/GHC/Types/Fixity.hs
- compiler/GHC/Types/ForeignCall.hs
- compiler/GHC/Types/GREInfo.hs
- compiler/GHC/Types/Hint.hs
- compiler/GHC/Types/Hint/Ppr.hs
- compiler/GHC/Types/InlinePragma.hs
- compiler/GHC/Types/Unique.hs
- compiler/GHC/Types/Unique/DFM.hs
- compiler/GHC/Types/Var.hs
- compiler/GHC/Unit/Env.hs
- + compiler/GHC/Unit/External/Database.hs
- + compiler/GHC/Unit/External/Index.hs
- + compiler/GHC/Unit/External/ModuleOrigin.hs
- + compiler/GHC/Unit/External/Providers.hs
- + compiler/GHC/Unit/External/Query.hs
- + compiler/GHC/Unit/External/Substitution.hs
- + compiler/GHC/Unit/External/Validate.hs
- + compiler/GHC/Unit/External/Visibility.hs
- + compiler/GHC/Unit/External/Wired.hs
- compiler/GHC/Unit/Home/Graph.hs
- compiler/GHC/Unit/Info.hs
- compiler/GHC/Unit/State.hs
- compiler/GHC/Unit/State.hs-boot
- compiler/GHC/Unit/Types.hs
- compiler/GHC/Utils/Binary.hs
- compiler/GHC/Utils/Outputable.hs
- compiler/Language/Haskell/Syntax/Basic.hs
- compiler/Language/Haskell/Syntax/Binds.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Decls/Foreign.hs
- compiler/Language/Haskell/Syntax/Doc.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/Language/Haskell/Syntax/ImpExp.hs
- compiler/Language/Haskell/Syntax/Specificity.hs
- compiler/ghc.cabal.in
- configure.ac
- distrib/configure.ac.in
- docs/users_guide/eventlog-formats.rst
- docs/users_guide/expected-undocumented-flags.txt
- docs/users_guide/exts/rank_polymorphism.rst
- docs/users_guide/exts/static_pointers.rst
- docs/users_guide/exts/strict.rst
- docs/users_guide/using-warnings.rst
- ghc/GHCi/UI.hs
- hadrian/bindist/Makefile
- hadrian/cabal.project
- hadrian/cfg/system.config.host.in
- hadrian/cfg/system.config.target.in
- hadrian/src/Hadrian/Builder/Ar.hs
- hadrian/src/Hadrian/Utilities.hs
- hadrian/src/Oracles/Flag.hs
- hadrian/src/Rules/BinaryDist.hs
- hadrian/src/Rules/CabalReinstall.hs
- hadrian/src/Rules/Documentation.hs
- hadrian/src/Rules/Generate.hs
- hadrian/src/Rules/Library.hs
- hadrian/src/Rules/Nofib.hs
- hadrian/src/Rules/Program.hs
- hadrian/src/Rules/Register.hs
- hadrian/src/Rules/Rts.hs
- hadrian/src/Rules/SourceDist.hs
- hadrian/src/Rules/Test.hs
- hadrian/src/Rules/ToolArgs.hs
- hadrian/src/Settings/Packages.hs
- libraries/base/changelog.md
- libraries/base/src/GHC/Stack.hs
- libraries/base/src/System/Environment.hs
- libraries/base/tests/T15349.stderr
- libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingDisabled.hsc
- libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc
- libraries/ghc-internal/ghc-internal.cabal.in
- libraries/ghc-internal/src/GHC/Internal/Conc/Sync.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Control.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Manager.hs
- libraries/ghc-internal/src/GHC/Internal/Event/TimerManager.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Type.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock.hs
- libraries/ghc-internal/src/GHC/Internal/LanguageExtensions.hs
- libraries/ghc-internal/src/GHC/Internal/Stack.hs
- libraries/ghc-internal/tests/backtraces/T14532b.stdout
- + m4/bindist_determine_linker.m4
- m4/find_merge_objects.m4
- m4/fp_check_pthreads.m4
- nofib
- rts/Apply.cmm
- rts/Capability.c
- rts/Capability.h
- rts/ContinuationOps.cmm
- rts/IOManager.c
- rts/IOManager.h
- rts/IOManagerInternals.h
- rts/ZeroSlop.c → rts/MarkSlop.c
- rts/Messages.c
- rts/PrimOps.cmm
- rts/Printer.c
- rts/ProfHeap.c
- rts/Profiling.c
- rts/RaiseAsync.c
- rts/RaiseAsync.h
- rts/RtsFlags.c
- rts/RtsStartup.c
- rts/RtsSymbols.c
- rts/STM.c
- rts/Schedule.c
- rts/Schedule.h
- rts/StgMiscClosures.cmm
- rts/ThreadPaused.c
- rts/Threads.c
- rts/Trace.c
- rts/Trace.h
- rts/TraverseHeap.c
- rts/eventlog/EventLog.c
- rts/eventlog/EventLog.h
- rts/include/Cmm.h
- rts/include/rts/Constants.h
- rts/include/rts/EventLogFormat.h
- rts/include/rts/IOInterface.h
- rts/include/rts/storage/ClosureMacros.h
- rts/include/rts/storage/Closures.h
- rts/include/rts/storage/TSO.h
- rts/include/stg/MiscClosures.h
- rts/posix/FdWakeup.h
- + rts/posix/MIO.c
- + rts/posix/MIO.h
- rts/posix/Poll.c
- rts/posix/Poll.h
- rts/posix/Select.c
- rts/posix/Select.h
- rts/posix/Signals.c
- rts/posix/Signals.h
- rts/posix/Timeout.c
- rts/posix/Timeout.h
- rts/rts.cabal
- rts/sm/Compact.c
- rts/sm/NonMovingMark.c
- rts/sm/Sanity.c
- rts/sm/Scav.c
- rts/sm/Storage.c
- rts/win32/AsyncMIO.c
- rts/win32/AsyncMIO.h
- rts/win32/AsyncWinIO.h
- rts/win32/AwaitEvent.c
- rts/win32/AwaitEvent.h
- rts/win32/ConsoleHandler.h
- rts/win32/MIOManager.h
- rts/win32/ThrIOManager.h
- rts/win32/WorkQueue.h
- rts/win32/veh_excn.h
- testsuite/driver/testlib.py
- testsuite/tests/backpack/should_compile/T13149.bkp
- testsuite/tests/cmm/should_run/AtomicFetch.hs
- testsuite/tests/cmm/should_run/AtomicFetch_cmm.cmm
- testsuite/tests/codeGen/should_run/cgrun025.stderr
- testsuite/tests/concurrent/should_run/T27105.hs
- testsuite/tests/concurrent/should_run/all.T
- + testsuite/tests/corelint/T27374.hs
- testsuite/tests/corelint/all.T
- testsuite/tests/count-deps/CountDepsParser.stdout
- + testsuite/tests/deSugar/should_run/LazyFieldAnnotationsSemantics.hs
- + testsuite/tests/deSugar/should_run/LazyFieldAnnotationsSemantics.stdout
- testsuite/tests/deSugar/should_run/all.T
- testsuite/tests/determinism/determ017/A.hs
- + testsuite/tests/driver/T26423/Hello.hs
- + testsuite/tests/driver/T26423/Makefile
- + testsuite/tests/driver/T26423/T26423.hs
- + testsuite/tests/driver/T26423/T26423.stderr
- + testsuite/tests/driver/T26423/T26423.stdout
- + testsuite/tests/driver/T26423/all.T
- + testsuite/tests/driver/T26423/test/Test.hs
- + testsuite/tests/driver/T26423/test/test.pkg
- testsuite/tests/driver/T4437.hs
- + testsuite/tests/driver/TUnitInfo/Foo.hs
- + testsuite/tests/driver/TUnitInfo/Makefile
- + testsuite/tests/driver/TUnitInfo/all.T
- + testsuite/tests/driver/TUnitInfo/genMhu.sh
- + testsuite/tests/driver/TUnitInfo/generic-unit-info-space-mhu.stdout
- + testsuite/tests/driver/TUnitInfo/generic-unit-info-space-single.stdout
- + testsuite/tests/driver/TUnitInfo/generic-unit-info-space.hs
- + testsuite/tests/driver/TUnitInfo/generic-unit-info-space.stdout
- testsuite/tests/driver/all.T
- testsuite/tests/driver/mostly-static/Makefile
- testsuite/tests/exceptions/T26759.stderr
- testsuite/tests/ghc-e/should_fail/T18441fail7.stderr
- testsuite/tests/ghci/T13786/all.T
- testsuite/tests/ghci/T16793/T16793.stdout
- testsuite/tests/ghci/T18060/T18060.stdout
- + testsuite/tests/ghci/T27532/Makefile
- + testsuite/tests/ghci/T27532/T27532.stdout
- + testsuite/tests/ghci/T27532/T27532j4.stdout
- + testsuite/tests/ghci/T27532/a.script
- + testsuite/tests/ghci/T27532/all.T
- + testsuite/tests/ghci/T27532/b.script
- + testsuite/tests/ghci/T27532/genT27532Modules
- testsuite/tests/ghci/linking/all.T
- testsuite/tests/ghci/linking/dyn/all.T
- testsuite/tests/ghci/scripts/ListTuplePunsPpr.stdout
- testsuite/tests/ghci/scripts/T12005.script
- testsuite/tests/ghci/scripts/T4175.stdout
- testsuite/tests/ghci/scripts/T8469.stdout
- testsuite/tests/ghci/scripts/T8535.stdout
- testsuite/tests/ghci/scripts/T9881.stdout
- testsuite/tests/ghci/scripts/bytecodeIPE.hs
- testsuite/tests/ghci/scripts/ghci020.stdout
- testsuite/tests/ghci/scripts/ghci064.stdout
- testsuite/tests/ghci/should_run/T10145.stdout
- testsuite/tests/ghci/should_run/T18594.stdout
- testsuite/tests/haddock/haddock_examples/haddock.Test.stderr
- testsuite/tests/haddock/perf/Fold.hs
- testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr
- testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
- testsuite/tests/indexed-types/should_fail/T7354.hs
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- testsuite/tests/layout/layout001.stdout
- testsuite/tests/layout/layout002.stdout
- testsuite/tests/layout/layout003.stdout
- testsuite/tests/layout/layout004.stdout
- testsuite/tests/layout/layout005.stdout
- testsuite/tests/layout/layout006.stdout
- testsuite/tests/layout/layout007.stdout
- testsuite/tests/layout/layout008.stdout
- testsuite/tests/layout/layout009.stdout
- testsuite/tests/linear/should_compile/T1735Min.hs
- testsuite/tests/mdo/should_fail/mdofail006.stderr
- + testsuite/tests/module/T27380.hs
- + testsuite/tests/module/T27380.stderr
- testsuite/tests/module/all.T
- testsuite/tests/module/mod184.stderr
- testsuite/tests/package/T20010/all.T
- testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
- testsuite/tests/parser/should_compile/DumpSemis.stderr
- + testsuite/tests/parser/should_compile/T13087.stderr
- testsuite/tests/parser/should_compile/T20452.stderr
- testsuite/tests/parser/should_fail/T8431.stderr
- testsuite/tests/parser/should_fail/readFail038.stderr
- testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr
- + testsuite/tests/perf/compiler/FamAppCachePerf.hs
- + testsuite/tests/perf/compiler/SimplCastPerf.hs
- + testsuite/tests/perf/compiler/T27336.hs
- testsuite/tests/perf/compiler/T3064.hs
- testsuite/tests/perf/compiler/all.T
- testsuite/tests/plugins/all.T
- + testsuite/tests/pmcheck/should_compile/T27314.hs
- + testsuite/tests/pmcheck/should_compile/T27360.hs
- testsuite/tests/pmcheck/should_compile/all.T
- testsuite/tests/polykinds/T7594.hs
- testsuite/tests/printer/Test20297.stdout
- testsuite/tests/printer/Test24533.stdout
- testsuite/tests/process/T3994.hs
- testsuite/tests/programs/thurston-modular-arith/Main.hs
- + testsuite/tests/rename/should_fail/T21101.hs
- + testsuite/tests/rename/should_fail/T21101.stderr
- testsuite/tests/rename/should_fail/T9815.stderr
- testsuite/tests/rename/should_fail/T9815b.stderr
- testsuite/tests/rename/should_fail/T9815bghci.stderr
- testsuite/tests/rename/should_fail/T9815ghci.stderr
- testsuite/tests/rename/should_fail/all.T
- testsuite/tests/roles/should_compile/Roles14.stderr
- testsuite/tests/roles/should_compile/Roles3.stderr
- testsuite/tests/roles/should_compile/Roles4.stderr
- testsuite/tests/roles/should_compile/T8958.stderr
- + testsuite/tests/rts/T19048.hs
- + testsuite/tests/rts/T19048.stdout
- testsuite/tests/rts/all.T
- testsuite/tests/rts/ipe/IpeStats/Fold.hs
- testsuite/tests/rts/linker/all.T
- testsuite/tests/runghc/T7859.stderr-mingw32
- testsuite/tests/simd/should_run/doublex2_arith.hs
- testsuite/tests/simd/should_run/doublex2_arith.stdout
- testsuite/tests/simd/should_run/doublex2_arith_baseline.hs
- testsuite/tests/simd/should_run/doublex2_arith_baseline.stdout
- testsuite/tests/simd/should_run/doublex2_fma.hs
- testsuite/tests/simd/should_run/doublex2_fma.stdout
- testsuite/tests/simd/should_run/simd010.hs
- testsuite/tests/simplCore/should_compile/T11562.hs
- testsuite/tests/simplCore/should_run/T3591.hs
- testsuite/tests/typecheck/should_compile/DeepSubsumption02.hs
- + testsuite/tests/typecheck/should_compile/LazyFieldAnnotations.hs
- testsuite/tests/typecheck/should_compile/T12507.hs
- testsuite/tests/typecheck/should_compile/T13951.hs
- testsuite/tests/typecheck/should_compile/T18406b.stderr
- testsuite/tests/typecheck/should_compile/T18529.stderr
- testsuite/tests/typecheck/should_compile/T18920.hs
- testsuite/tests/typecheck/should_compile/T2595.hs
- testsuite/tests/typecheck/should_compile/T7541.hs
- + testsuite/tests/typecheck/should_compile/WarnDefaultedCallStack.hs
- + testsuite/tests/typecheck/should_compile/WarnDefaultedCallStack.stderr
- testsuite/tests/typecheck/should_compile/all.T
- testsuite/tests/typecheck/should_fail/LazyFieldsDisabled.stderr
- + testsuite/tests/typecheck/should_fail/LazyFieldsDisabledStrictData.hs
- + testsuite/tests/typecheck/should_fail/LazyFieldsDisabledStrictData.stderr
- testsuite/tests/typecheck/should_fail/T15067.stderr
- + testsuite/tests/typecheck/should_fail/T26532.hs
- + testsuite/tests/typecheck/should_fail/T26532.stderr
- testsuite/tests/typecheck/should_fail/T5300.stderr
- testsuite/tests/typecheck/should_fail/T6069.stderr
- testsuite/tests/typecheck/should_fail/T7368a.hs
- testsuite/tests/typecheck/should_fail/T9858b.stderr
- testsuite/tests/typecheck/should_fail/TcStaticPointersFail02.stderr
- testsuite/tests/typecheck/should_fail/all.T
- testsuite/tests/typecheck/should_run/T1735_Help/Basics.hs
- testsuite/tests/typecheck/should_run/T3731-short.hs
- testsuite/tests/typecheck/should_run/T3731.hs
- testsuite/tests/typecheck/should_run/church.hs
- testsuite/tests/typecheck/should_run/tcrun008.hs
- testsuite/tests/typecheck/should_run/tcrun017.hs
- testsuite/tests/typecheck/should_run/tcrun026.hs
- testsuite/tests/typecheck/should_run/tcrun035.hs
- testsuite/tests/typecheck/should_run/tcrun036.hs
- utils/check-exact/ExactPrint.hs
- utils/check-exact/Main.hs
- utils/check-exact/Transform.hs
- utils/check-exact/Utils.hs
- utils/deriveConstants/Main.hs
- utils/ghc-toolchain/exe/Main.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Lens.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Monad.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cc.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Utils.hs
- utils/haddock/haddock-api/src/Haddock.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Hoogle.hs
- utils/haddock/haddock-api/src/Haddock/Backends/LaTeX.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
- utils/haddock/haddock-api/src/Haddock/Convert.hs
- utils/haddock/haddock-api/src/Haddock/GhcUtils.hs
- utils/haddock/haddock-api/src/Haddock/Interface/Create.hs
- utils/haddock/haddock-api/src/Haddock/Interface/Rename.hs
- utils/haddock/haddock-api/src/Haddock/Types.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/9ae215596c5a6dd523a9da5e7960a1…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/9ae215596c5a6dd523a9da5e7960a1…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/mangoiv/improve-linker-discovery] ci/revert: don't do strict toolchain check for now
by Magnus (@MangoIV) 30 Jul '26
by Magnus (@MangoIV) 30 Jul '26
30 Jul '26
Magnus pushed to branch wip/mangoiv/improve-linker-discovery at Glasgow Haskell Compiler / GHC
Commits:
9ae21559 by mangoiv at 2026-07-30T18:14:40+02:00
ci/revert: don't do strict toolchain check for now
- - - - -
2 changed files:
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
Changes:
=====================================
.gitlab/generate-ci/gen_ci.hs
=====================================
@@ -182,7 +182,7 @@ configureArgsStr bc = unwords $
++ ["--with-intree-gmp" | Just _ <- [crossTarget bc] ]
++ ["--with-system-libffi" | crossTarget bc == Just "wasm32-wasi" ]
++ ["--enable-ipe-data-compression" | withZstd bc ]
- ++ ["--enable-strict-ghc-toolchain-check"]
+ -- ++ ["--enable-strict-ghc-toolchain-check"]
-- Compute the hadrian flavour from the BuildConfig
mkJobFlavour :: BuildConfig -> Flavour
=====================================
.gitlab/jobs.yaml
=====================================
@@ -56,7 +56,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-darwin-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LANG": "en_US.UTF-8",
@@ -124,7 +124,7 @@
"BIN_DIST_NAME": "ghc-aarch64-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-alpine3_23-validate",
@@ -187,7 +187,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb11-validate",
@@ -250,7 +250,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb12-validate",
@@ -316,7 +316,7 @@
"BUILD_FLAVOUR": "validate",
"CC": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang",
"CFLAGS": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
"CROSS_STAGE": "2",
@@ -400,7 +400,7 @@
"BUILD_FLAVOUR": "validate+llvm",
"CC": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang",
"CFLAGS": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
"CROSS_STAGE": "2",
@@ -481,7 +481,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb13-validate",
@@ -544,7 +544,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb13-validate+llvm",
"BUILD_FLAVOUR": "validate+llvm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb13-validate+llvm",
@@ -608,7 +608,7 @@
"BIN_DIST_NAME": "ghc-i386-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458 simd009 T25169",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-alpine3_23-validate",
@@ -671,7 +671,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb11-validate",
@@ -734,7 +734,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb12-validate",
@@ -797,7 +797,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb13-validate",
@@ -860,7 +860,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-darwin-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LANG": "en_US.UTF-8",
@@ -929,7 +929,7 @@
"BIN_DIST_NAME": "ghc-aarch64-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-alpine3_23-validate",
@@ -993,7 +993,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb11-validate",
@@ -1057,7 +1057,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb12-validate",
@@ -1124,7 +1124,7 @@
"BUILD_FLAVOUR": "validate",
"CC": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang",
"CFLAGS": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
"CROSS_STAGE": "2",
@@ -1209,7 +1209,7 @@
"BUILD_FLAVOUR": "validate+llvm",
"CC": "/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-clang",
"CFLAGS": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONF_CC_OPTS_STAGE2": "-fuse-ld=/opt/llvm-mingw-linux/bin/aarch64-w64-mingw32-ld --rtlib=compiler-rt",
"CROSS_EMULATOR": "/opt/wine-arm64ec-msys2-deb12/bin/wine",
"CROSS_STAGE": "2",
@@ -1291,7 +1291,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb13-validate",
@@ -1355,7 +1355,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb13-validate+llvm",
"BUILD_FLAVOUR": "validate+llvm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "aarch64-linux-deb13-validate+llvm",
@@ -1420,7 +1420,7 @@
"BIN_DIST_NAME": "ghc-i386-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458 simd009 T25169",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-alpine3_23-validate",
@@ -1484,7 +1484,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb11-validate",
@@ -1548,7 +1548,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb12-validate",
@@ -1612,7 +1612,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "i386-linux-deb13-validate",
@@ -1676,7 +1676,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-darwin-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LANG": "en_US.UTF-8",
@@ -1748,7 +1748,7 @@
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
"CC": "cc",
- "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib ",
"CXX": "c++",
"FETCH_GHC_VERSION": "9.10.3",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -1815,7 +1815,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-int_native-validate+fully_static",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "validate+fully_static",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_12-int_native-validate+fully_static",
@@ -1880,7 +1880,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-validate+fully_static",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "validate+fully_static",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_12-validate+fully_static",
@@ -1945,7 +1945,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_23-validate",
@@ -2009,7 +2009,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -2076,7 +2076,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-int_native-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -2143,7 +2143,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-unreg-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -2210,7 +2210,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-emsdk-closure-int_native-cross_javascript-unknown-ghcjs-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONFIGURE_WRAPPER": "emconfigure",
"CROSS_STAGE": "2",
"CROSS_TARGET": "javascript-unknown-ghcjs",
@@ -2277,7 +2277,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb11-validate",
@@ -2341,7 +2341,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-validate+debug_info",
"BUILD_FLAVOUR": "validate+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb11-validate+debug_info",
@@ -2405,7 +2405,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb12-validate",
@@ -2469,7 +2469,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-cross_aarch64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-linux-gnu",
@@ -2536,7 +2536,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-int_native-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-int_native-validate",
@@ -2600,7 +2600,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-no_tntc-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-tables-next-to-code --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-tables-next-to-code",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-no_tntc-validate",
@@ -2664,7 +2664,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-numa-slow-validate",
"BUILD_FLAVOUR": "slow-validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"ENABLE_NUMA": "1",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -2729,7 +2729,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": " --config perf_path=perf",
"TEST_ENV": "x86_64-linux-deb13-release",
@@ -2793,7 +2793,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-riscv64 -L /usr/riscv64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "riscv64-linux-gnu",
@@ -2860,7 +2860,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-unreg-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-unregisterised --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-unregisterised",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-unreg-validate",
@@ -2924,7 +2924,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-validate",
@@ -2988,7 +2988,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+boot_nonmoving_gc",
"BUILD_FLAVOUR": "validate+boot_nonmoving_gc",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "--way=nonmoving --way=nonmoving_thr --way=nonmoving_thr_sanity",
"TEST_ENV": "x86_64-linux-deb13-validate+boot_nonmoving_gc",
@@ -3052,7 +3052,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+llvm",
"BUILD_FLAVOUR": "validate+llvm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-validate+llvm",
@@ -3116,7 +3116,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+thread_sanitizer_cmm",
"BUILD_FLAVOUR": "validate+thread_sanitizer_cmm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -3182,7 +3182,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-zstd-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-ipe-data-compression --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-ipe-data-compression",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-zstd-validate",
@@ -3246,7 +3246,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-release",
@@ -3310,7 +3310,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--haddock-for-hackage",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -3375,7 +3375,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-validate",
@@ -3439,7 +3439,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate+debug_info",
"BUILD_FLAVOUR": "validate+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-validate+debug_info",
@@ -3503,7 +3503,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate+debug_info+ubsan",
"BUILD_FLAVOUR": "validate+debug_info+ubsan",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -3569,7 +3569,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-rocky8-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-rocky8-validate",
@@ -3633,7 +3633,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu22_04-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-ubuntu22_04-validate",
@@ -3697,7 +3697,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu24_04-loongarch-cross_loongarch64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-loongarch64 -L /usr/loongarch64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "loongarch64-linux-gnu",
@@ -3764,7 +3764,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu24_04-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-ubuntu24_04-validate",
@@ -3824,7 +3824,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-int_native-validate",
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -3888,7 +3888,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-validate",
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -3956,7 +3956,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-darwin-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -4026,7 +4026,7 @@
"BIN_DIST_NAME": "ghc-aarch64-linux-alpine3_23-release+no_split_sections",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override --enable-ignore-build-platform-mismatch --build=aarch64-unknown-linux --host=aarch64-unknown-linux --target=aarch64-unknown-linux ",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4091,7 +4091,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb11-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4156,7 +4156,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb12-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4221,7 +4221,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-aarch64-linux-deb13-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4287,7 +4287,7 @@
"BIN_DIST_NAME": "ghc-i386-linux-alpine3_23-release+no_split_sections",
"BROKEN_TESTS": "encoding004 T10458 simd009 T25169",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4352,7 +4352,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb11-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4417,7 +4417,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb12-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4482,7 +4482,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-i386-linux-deb13-release+no_split_sections",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4547,7 +4547,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-darwin-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -4620,7 +4620,7 @@
"BUILD_FLAVOUR": "release+no_split_sections",
"CABAL_INSTALL_VERSION": "3.14.2.0",
"CC": "cc",
- "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib ",
"CXX": "c++",
"FETCH_GHC_VERSION": "9.10.3",
"IGNORE_PERF_FAILURES": "all",
@@ -4688,7 +4688,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-int_native-release+fully_static",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "release+fully_static",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4754,7 +4754,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-release+fully_static+no_split_sections",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "release+fully_static+no_split_sections",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4820,7 +4820,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-release+no_split_sections",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "release+no_split_sections",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4885,7 +4885,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -4950,7 +4950,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-release+debug_info",
"BUILD_FLAVOUR": "release+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5015,7 +5015,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb12-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5080,7 +5080,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5145,7 +5145,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5210,7 +5210,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release+debug_info",
"BUILD_FLAVOUR": "release+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5275,7 +5275,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--haddock-for-hackage",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -5341,7 +5341,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-rocky8-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5406,7 +5406,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu22_04-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5471,7 +5471,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu24_04-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"IGNORE_PERF_FAILURES": "all",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -5532,7 +5532,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-int_native-release",
"BUILD_FLAVOUR": "release",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"IGNORE_PERF_FAILURES": "all",
@@ -5597,7 +5597,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-release",
"BUILD_FLAVOUR": "release",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"IGNORE_PERF_FAILURES": "all",
@@ -5666,7 +5666,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-darwin-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi ",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"LANG": "en_US.UTF-8",
@@ -5737,7 +5737,7 @@
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
"CC": "cc",
- "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-iconv-includes=/usr/local/include --with-iconv-libraries=/usr/local/lib --with-system-libffi --with-ffi-includes=/usr/local/include --with-ffi-libraries=/usr/local/lib --with-gmp-includes=/usr/local/include --with-gmp-libraries=/usr/local/lib ",
"CXX": "c++",
"FETCH_GHC_VERSION": "9.10.3",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -5803,7 +5803,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-int_native-validate+fully_static",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "validate+fully_static",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_12-int_native-validate+fully_static",
@@ -5867,7 +5867,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_12-validate+fully_static",
"BROKEN_TESTS": "ghcilink002 linker_unload_native encoding004 T10458",
"BUILD_FLAVOUR": "validate+fully_static",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_12-validate+fully_static",
@@ -5931,7 +5931,7 @@
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-validate",
"BROKEN_TESTS": "encoding004 T10458",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-ld-override ",
"INSTALL_CONFIGURE_ARGS": "--disable-ld-override --enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-alpine3_23-validate",
@@ -5994,7 +5994,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -6061,7 +6061,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-int_native-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -6128,7 +6128,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-alpine3_23-wasm-unreg-cross_wasm32-wasi-release+host_fully_static+text_simdutf",
"BUILD_FLAVOUR": "release+host_fully_static+text_simdutf",
- "CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-unregisterised --with-intree-gmp --with-system-libffi",
"CROSS_STAGE": "2",
"CROSS_TARGET": "wasm32-wasi",
"FIREFOX_LAUNCH_OPTS": "{\"browser\":\"firefox\",\"executablePath\":\"/usr/bin/firefox\"}",
@@ -6194,7 +6194,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-emsdk-closure-int_native-cross_javascript-unknown-ghcjs-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CONFIGURE_WRAPPER": "emconfigure",
"CROSS_STAGE": "2",
"CROSS_TARGET": "javascript-unknown-ghcjs",
@@ -6260,7 +6260,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb11-validate",
@@ -6323,7 +6323,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb11-validate+debug_info",
"BUILD_FLAVOUR": "validate+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb11-validate+debug_info",
@@ -6386,7 +6386,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb12-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb12-validate",
@@ -6449,7 +6449,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-cross_aarch64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "aarch64-linux-gnu",
@@ -6515,7 +6515,7 @@
"BIGNUM_BACKEND": "native",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-int_native-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-int_native-validate",
@@ -6579,7 +6579,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-no_tntc-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--disable-tables-next-to-code --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--disable-tables-next-to-code",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-no_tntc-validate",
@@ -6642,7 +6642,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-numa-slow-validate",
"BUILD_FLAVOUR": "slow-validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"ENABLE_NUMA": "1",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -6706,7 +6706,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": " --config perf_path=perf",
"TEST_ENV": "x86_64-linux-deb13-release",
@@ -6769,7 +6769,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-riscv-cross_riscv64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-riscv64 -L /usr/riscv64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "riscv64-linux-gnu",
@@ -6835,7 +6835,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-unreg-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-unregisterised --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-unregisterised",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-unreg-validate",
@@ -6898,7 +6898,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-validate",
@@ -6961,7 +6961,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+boot_nonmoving_gc",
"BUILD_FLAVOUR": "validate+boot_nonmoving_gc",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "--way=nonmoving --way=nonmoving_thr --way=nonmoving_thr_sanity",
"TEST_ENV": "x86_64-linux-deb13-validate+boot_nonmoving_gc",
@@ -7024,7 +7024,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+llvm",
"BUILD_FLAVOUR": "validate+llvm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-validate+llvm",
@@ -7088,7 +7088,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-validate+thread_sanitizer_cmm",
"BUILD_FLAVOUR": "validate+thread_sanitizer_cmm",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -7153,7 +7153,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-deb13-zstd-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-ipe-data-compression --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--enable-ipe-data-compression",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-deb13-zstd-validate",
@@ -7216,7 +7216,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-release",
@@ -7279,7 +7279,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-release",
"BUILD_FLAVOUR": "release",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--haddock-for-hackage",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -7343,7 +7343,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-validate",
@@ -7406,7 +7406,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate+debug_info",
"BUILD_FLAVOUR": "validate+debug_info",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-fedora43-validate+debug_info",
@@ -7469,7 +7469,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-fedora43-validate+debug_info+ubsan",
"BUILD_FLAVOUR": "validate+debug_info+ubsan",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"HADRIAN_ARGS": "--docs=none",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
@@ -7534,7 +7534,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-rocky8-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-rocky8-validate",
@@ -7597,7 +7597,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu22_04-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-ubuntu22_04-validate",
@@ -7660,7 +7660,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu24_04-loongarch-cross_loongarch64-linux-gnu-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--with-intree-gmp --enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "--with-intree-gmp",
"CROSS_EMULATOR": "qemu-loongarch64 -L /usr/loongarch64-linux-gnu",
"CROSS_STAGE": "2",
"CROSS_TARGET": "loongarch64-linux-gnu",
@@ -7726,7 +7726,7 @@
"BIGNUM_BACKEND": "gmp",
"BIN_DIST_NAME": "ghc-x86_64-linux-ubuntu24_04-validate",
"BUILD_FLAVOUR": "validate",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
"RUNTEST_ARGS": "",
"TEST_ENV": "x86_64-linux-ubuntu24_04-validate",
@@ -7785,7 +7785,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-int_native-validate",
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
@@ -7848,7 +7848,7 @@
"BIN_DIST_NAME": "ghc-x86_64-windows-validate",
"BUILD_FLAVOUR": "validate",
"CABAL_INSTALL_VERSION": "3.14.2.0",
- "CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
+ "CONFIGURE_ARGS": "",
"FETCH_GHC_VERSION": "9.10.3",
"HADRIAN_ARGS": "--docs=no-sphinx-pdfs",
"INSTALL_CONFIGURE_ARGS": "--enable-strict-ghc-toolchain-check",
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9ae215596c5a6dd523a9da5e7960a17…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9ae215596c5a6dd523a9da5e7960a17…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/mangoiv/improve-linker-discovery] ci: disable strict toolchain check for now, revert this
by Magnus (@MangoIV) 30 Jul '26
by Magnus (@MangoIV) 30 Jul '26
30 Jul '26
Magnus pushed to branch wip/mangoiv/improve-linker-discovery at Glasgow Haskell Compiler / GHC
Commits:
96f2a18b by mangoiv at 2026-07-30T18:06:07+02:00
ci: disable strict toolchain check for now, revert this
- - - - -
1 changed file:
- .gitlab/generate-ci/gen_ci.hs
Changes:
=====================================
.gitlab/generate-ci/gen_ci.hs
=====================================
@@ -182,7 +182,7 @@ configureArgsStr bc = unwords $
++ ["--with-intree-gmp" | Just _ <- [crossTarget bc] ]
++ ["--with-system-libffi" | crossTarget bc == Just "wasm32-wasi" ]
++ ["--enable-ipe-data-compression" | withZstd bc ]
- ++ ["--enable-strict-ghc-toolchain-check"]
+ -- ++ ["--enable-strict-ghc-toolchain-check"]
-- Compute the hadrian flavour from the BuildConfig
mkJobFlavour :: BuildConfig -> Flavour
@@ -886,7 +886,7 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} }
, "BUILD_FLAVOUR" =: flavourString jobFlavour
, "BIGNUM_BACKEND" =: bignumString (bignumBackend buildConfig)
, "CONFIGURE_ARGS" =: configureArgsStr buildConfig
- , "INSTALL_CONFIGURE_ARGS" =: "--enable-strict-ghc-toolchain-check"
+ -- , "INSTALL_CONFIGURE_ARGS" =: "--enable-strict-ghc-toolchain-check"
, maybe mempty ("CONFIGURE_WRAPPER" =:) (configureWrapper buildConfig)
, maybe mempty ("CROSS_TARGET" =:) (crossTarget buildConfig)
, maybe mempty (("CROSS_STAGE" =:) . show) (crossStage buildConfig)
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/96f2a18bc51105808383500e04684e0…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/96f2a18bc51105808383500e04684e0…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc] Pushed new branch wip/torsten.schmits/mwb-26-01/unload
by Torsten Schmits (@torsten.schmits) 30 Jul '26
by Torsten Schmits (@torsten.schmits) 30 Jul '26
30 Jul '26
Torsten Schmits pushed new branch wip/torsten.schmits/mwb-26-01/unload at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/torsten.schmits/mwb-26-01/unl…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/mangoiv/improve-linker-discovery] configure: implement a saner linker discovery algorithm in dist/configure
by Magnus (@MangoIV) 30 Jul '26
by Magnus (@MangoIV) 30 Jul '26
30 Jul '26
Magnus pushed to branch wip/mangoiv/improve-linker-discovery at Glasgow Haskell Compiler / GHC
Commits:
9fd0f84e by mangoiv at 2026-07-30T17:02:08+02:00
configure: implement a saner linker discovery algorithm in dist/configure
- - - - -
9 changed files:
- distrib/configure.ac.in
- + m4/bindist_determine_linker.m4
- m4/find_merge_objects.m4
- utils/ghc-toolchain/exe/Main.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Lens.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Monad.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cc.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Utils.hs
Changes:
=====================================
distrib/configure.ac.in
=====================================
@@ -175,7 +175,11 @@ AC_SUBST([CmmCPPSupportsG0])
dnl ** Which ld to use?
dnl --------------------------------------------------------------
-FIND_LD([$target],[GccUseLdOpt])
+dnl currently if you pass $LD=foo, merge objs command will be set to $(which foo)
+dnl which is not required by GHC and also wrong.
+BINDIST_DETERMINE_LINKER([$target],[GccUseLdOpt])
+dnl at this point, we should have set LD in all cases, so FIND_MERGE_OBJECTS command can
+dnl go off and do it's thing
FIND_MERGE_OBJECTS()
CONF_GCC_LINKER_OPTS_STAGE1="$CONF_GCC_LINKER_OPTS_STAGE1 $GccUseLdOpt"
CONF_GCC_LINKER_OPTS_STAGE2="$CONF_GCC_LINKER_OPTS_STAGE2 $GccUseLdOpt"
@@ -427,6 +431,7 @@ checkMake380 make
checkMake380 gmake
# Toolchain target files
+USER_LD="$LD"
FIND_GHC_TOOLCHAIN_BIN([YES])
PREP_TARGET_FILE
FIND_GHC_TOOLCHAIN([.])
=====================================
m4/bindist_determine_linker.m4
=====================================
@@ -0,0 +1,133 @@
+# BINDIST_DETERMINE_LINKER
+# ------------------------
+#
+# This is used to determine the linker within the bindists configure
+#
+# Notes:
+# - usually, linking works by invoking $CC
+# - objects are merged using $LD directly
+# - $LD is a configure variable and is meaningless to $CC
+# - gcc only knows linker *flavours*, it cannot use paths
+# which means that the linker path should not be an absolute path
+# - clang konws --ld-path which means that it can be passed that
+# flag and also merge objs can be an absolute path
+#
+# Algorithm:
+# if $LD is set
+# then if $CC accepts --ld-path=$(which $LD)
+# then set --ld-path=$(which $LD), MergeObjsCommand=$(which $LD)
+# else if $CC accepts --fuse-ld=$LD ($LD is a linker flavour, not an absolute path)
+# then set -fuse-ld=$LD, MergeObjsCommand=$LD (not $(which ld))
+# else Reject with
+# "$LD is not compatible with $CC you chose. This means that $LD is either
+# an unsupported linker flavour or your $CC does not support absolute linker
+# paths"
+# else if --disable-ld-override is set or $target is macos
+# then if $CC accepts --ld-path=$(which ld)
+# then set --ld-path=$(which ld), set MergeObjsCommand=$(which ld)
+# else set *no* flag (equivalent to --fuse-ld=ld, if you will), set MergeObjsCommand=ld
+# else if $CC accepts --ld-path=$(which ld.lld)
+# then set --ld-path=$(which ld.lld), MergeObjsCommand=$(which ld.lld)
+# else if $CC accepts -fuse-ld=lld
+# then set -fuse-ld=lld, MergeObjsCommand=ld.lld
+# else set *no* flag (equivalent to --fuse-ld=ld), set MergeObjsCommand=ld
+#
+# $1 = the platform
+# $2 = the variable to set with GHC options to configure gcc to use the chosen linker
+#
+AC_DEFUN([BINDIST_DETERMINE_LINKER],[
+ AC_ARG_ENABLE(ld-override,
+ [AS_HELP_STRING([--disable-ld-override],
+ [Prevent GHC from overriding the default linker used by gcc. If ld-override is enabled GHC will try to tell gcc to use whichever linker is selected by the LD environment variable. [default=override enabled]])],
+ [],
+ [enable_ld_override=yes])
+
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_TARGET])
+
+ check_ld_path() {
+ AC_MSG_CHECKING([whether C compiler supports --ld-path=[$]1])
+ ld_path="[$]1"
+ echo 'int main(void) { return 0; }' > conftest.c
+ if $CC -o conftest.o "--ld-path=$ld_path" $LDFLAGS conftest.c > /dev/null 2>&1
+ then
+ AC_MSG_RESULT([yes])
+ ld_path_ok=yes
+ else
+ AC_MSG_RESULT([no])
+ ld_path_ok=no
+ fi
+ rm -f conftest.c conftest.o
+ }
+
+ check_fuse_ld() {
+ AC_MSG_CHECKING([whether C compiler supports -fuse-ld=[$]1])
+ ld="[$]1"
+ echo 'int main(void) {return 0;}' > conftest.c
+ if $CC -o conftest.o -fuse-ld=[$]1 $LDFLAGS conftest.c > /dev/null 2>&1
+ then
+ AC_MSG_RESULT([yes])
+ fuse_ld_ok=yes
+ else
+ AC_MSG_RESULT([no])
+ fuse_ld_ok=no
+ fi
+ rm -f conftest.c conftest.o
+ }
+
+ try_set_linker_to() {
+ AC_MSG_CHECKING([whether linker can be set to [$]1])
+ tmp_ld=[$]1
+ ld_path_ok="no"
+ if test "z$tmp_ld" != "z" && check_ld_path "$tmp_ld" && test "x$ld_path_ok" = "xyes";
+ then $2="--ld-path=$tmp_ld"
+ AC_CHECK_TARGET_TOOL([LD], [$tmp_ld])
+ linker_set_successfully=yes
+ else # --ld-path does not work or $LD cannot be resolved to an absolute path
+ fuse_ld_ok=no
+ if check_fuse_ld "$tmp_ld" && test "x$fuse_ld_ok" = "xyes";
+ then $2="-fuse-ld=$tmp_ld"
+ AC_CHECK_TARGET_TOOL([LD], [$tmp_ld])
+ linker_set_successfully=yes
+ else AC_MSG_WARN(["$tmp_ld could not be set via either '--ld-path' or '-fuse-ld"])
+ linker_set_successfully=no
+ fi
+ fi
+ }
+
+ # we are lenient when $LD=ld and just act as if $LD wasn't set and
+ # enable-ld-override is off
+ if test "z$LD" != "z" && test "z$LD" != "zld";
+ then linker_set_successfully=no
+ try_set_linker_to "$LD"
+ if test "z$linker_set_successfully" != "zyes";
+ then AC_MSG_FAILURE([ $tmp_ld is an invalid linker. If your C compiler accepts the '--ld-path' flag,
+ \$LD can be either of an executable name that is in \$PATH *or* a path to an executable.
+ If your C compiler only supports the '--fuse-ld' flag, \$LD can only be one of the linker flavours supported
+ by it. Mind that if your C compiler supports '--ld-path', 'configure' will always prefer using an absolute path
+ to your linker as that is less error-prone.])
+ fi
+
+ else # $LD is not set -- we will do the ld-override non-sense
+ if test "x$enable_ld_override" = "xyes" && test "z$LD" != "zld" && case "$1" in
+ *-darwin) false ;; # don't do the ld override thing on macos
+ *) true ;;
+ esac;
+ then
+ AC_MSG_NOTICE(["enable ld override was set and no more specific linker was chosen by setting \$LD, trying to find best possible linker"])
+ try_set_linker_to "lld"
+ if test "z$linker_set_successfully" != "zyes";
+ then # ... bail out, just use ld in path
+ $2=""
+ AC_CHECK_TARGET_TOOL([LD], [ld])
+ fi
+ else # ld override is not set and $LD not set either
+ $2=""
+ AC_CHECK_TARGET_TOOL([LD], [ld])
+ fi
+ fi
+
+ AC_MSG_NOTICE([linker discovery set $2 set to $$2])
+
+ CHECK_LD_COPY_BUG([$1])
+])
=====================================
m4/find_merge_objects.m4
=====================================
@@ -22,7 +22,6 @@ AC_DEFUN([CHECK_MERGE_OBJECTS],[
])
AC_DEFUN([FIND_MERGE_OBJECTS],[
- AC_REQUIRE([FIND_LD])
if test -z ${MergeObjsCmd+x}; then
AC_MSG_NOTICE([Setting cmd])
=====================================
utils/ghc-toolchain/exe/Main.hs
=====================================
@@ -1,6 +1,8 @@
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE ViewPatterns #-}
module Main where
@@ -11,7 +13,7 @@ import System.Exit
import System.Console.GetOpt
import System.Environment
import System.FilePath ((</>))
-import qualified System.IO (readFile, writeFile)
+import qualified System.IO (writeFile, readFile')
import GHC.Platform.ArchOS
@@ -33,6 +35,10 @@ import GHC.Toolchain.Tools.MergeObjs
import GHC.Toolchain.Tools.Readelf
import GHC.Toolchain.NormaliseTriple (normaliseTriple)
import Text.Read (readMaybe)
+import System.IO (hPutStrLn, stderr)
+import Control.Exception (try, IOException, catch, displayException)
+import GHC.Stack (HasCallStack)
+import Data.Foldable (traverse_)
data Opts = Opts
{ optTriple :: Maybe String
@@ -72,6 +78,8 @@ data Opts = Opts
, optTablesNextToCode :: Maybe Bool
, optUseLibFFIForAdjustors :: Maybe Bool
, optLdOverride :: Maybe Bool
+ -- ^ whether or not to not use ld in $PATH and instead search for a
+ -- linker that GHC deems "better"
, optVerbosity :: Int
, optKeepTemp :: Bool
}
@@ -200,7 +208,7 @@ options =
[ enableDisable "unregisterised" "unregisterised backend" _optUnregisterised
, enableDisable "tables-next-to-code" "info-tables-next-to-code optimisation" _optTablesNextToCode
, enableDisable "libffi-adjustors" "the use of libffi for adjustors, even on platforms which have support for more efficient, native adjustor implementations." _optUseLibFFIForAdjustors
- , enableDisable "ld-override" "override gcc's default linker" _optLdOvveride
+ , enableDisable "ld-override" "search for a more efficient linker than your default linker" _optLdOvveride
, enableDisable "locally-executable" "the use of a target prefix which will be added to all tool names when searching for toolchain components" _optLocallyExecutable
, enableDisable "dwarf-unwind" "Enable DWARF unwinding support in the runtime system via elfutils' libdw" _optDwarfUnwind
] ++
@@ -280,12 +288,11 @@ options =
"The output path for the generated target toolchain configuration"
formatOpts :: [OptDescr (FormatOpts -> FormatOpts)]
-formatOpts = [
- (Option ['o'] ["output"] (ReqArg (set _formatOptOutput) "OUTPUT")
+formatOpts =
+ [ (Option ['o'] ["output"] (ReqArg (set _formatOptOutput) "OUTPUT")
"The output path for the formatted target toolchain configuration")
, (Option ['i'] ["input"] (ReqArg (set _formatOptInput) "INPUT")
- "The target file to format")
- ]
+ "The target file to format") ]
validateOpts :: Opts -> [String]
validateOpts opts = mconcat
@@ -297,30 +304,38 @@ main :: IO ()
main = do
argv <- getArgs
case argv of
- ("format": args) -> doFormat args
+ ("format" : args) -> doFormat args
_ -> doConfigure argv
-- The format mode is very useful for normalising paths and newlines on windows.
-doFormat :: [String] -> IO ()
+doFormat :: HasCallStack => [String] -> IO ()
doFormat args = do
let (opts0, _nonopts, errs) = getOpt RequireOrder formatOpts args
case errs of
[] -> do
let opts = foldr (.) id opts0 emptyFormatOpts
- tgtFile <- System.IO.readFile (view _formatOptInput opts)
- case readMaybe @Target tgtFile of
- Nothing -> error $ "Failed to read a valid Target value from " ++ view _formatOptInput opts ++ ":\n" ++ tgtFile
- Just tgt -> do
+ tgtFile <- try @IOException $ System.IO.readFile' (view _formatOptInput opts)
+ case tgtFile of
+ Right (readMaybe @Target -> Just tgt) -> do
let file = formatOptOutput opts
System.IO.writeFile file (show tgt)
+ `catch` \(e :: IOException) -> do
+ hPutStrLn stderr $ "Failed to write the formatted Target file to" ++ file ++ ". Writing caused the following IOException:\n"
+ ++ displayException e
+ Right contents -> do
+ hPutStrLn stderr $ "Failed to read a valid Target value from " ++ view _formatOptInput opts ++ "invalid file was:\n" ++ contents
+ exitWith (ExitFailure 1)
+ Left reason -> do
+ hPutStrLn stderr $ "Failed to read a valid Target value from " ++ view _formatOptInput opts ++ ", because an IOException occured:\n" ++ displayException reason
+ exitWith (ExitFailure 1)
_ -> do
- mapM_ putStrLn errs
- putStrLn $ usageInfo "ghc-toolchain" formatOpts
+ mapM_ (hPutStrLn stderr) errs
+ hPutStrLn stderr $ usageInfo "ghc-toolchain" formatOpts
exitWith (ExitFailure 1)
-doConfigure :: [String] -> IO ()
+doConfigure :: HasCallStack => [String] -> IO ()
doConfigure args = do
let (opts0, _nonopts, parseErrs) = getOpt RequireOrder options args
let opts = foldr (.) id opts0 emptyOpts
@@ -329,18 +344,22 @@ doConfigure args = do
let env = Env { verbosity = optVerbosity opts
, targetPrefix = case optTargetPrefix opts of
Just prefix -> Just prefix
+ -- TODO: why is this `fromMaybe (error _)`? that seems wrong (ah okay, because that would already mean that `errs` is not null; seems bad that we have this here though)
Nothing -> Just $ fromMaybe (error "undefined triple") (optTriple opts) ++ "-"
, keepTemp = optKeepTemp opts
, canLocallyExecute = fromMaybe True (optLocallyExecutable opts)
, logContexts = []
}
r <- runM env (run opts)
+ `catch` \(e :: IOException) -> pure $ Left [Error {errorLogContexts = [], errorMessage = displayException e}]
case r of
- Left err -> print err >> exitWith (ExitFailure 2)
+ Left errs -> do
+ traverse_ (hPutStrLn stderr . formatError) errs
+ exitWith (ExitFailure 1)
Right () -> return ()
errs -> do
- mapM_ putStrLn errs
- putStrLn $ usageInfo "ghc-toolchain" options
+ mapM_ (hPutStrLn stderr) errs
+ hPutStrLn stderr $ usageInfo "ghc-toolchain" options
exitWith (ExitFailure 1)
run :: Opts -> M ()
@@ -449,15 +468,15 @@ mkTarget opts = do
cc0 <- findBasicCc (optCc opts)
parseTriple cc0 normalised_triple
- cc0 <- findCc archOs tgtLlvmTarget (optCc opts)
+ cc <- findCc archOs tgtLlvmTarget (optCc opts)
cxx <- findCxx archOs tgtLlvmTarget (optCxx opts)
- cpp <- findCpp (optCpp opts) cc0
- hsCpp <- findHsCpp (optHsCpp opts) cc0
+ cpp <- findCpp (optCpp opts) cc
+ hsCpp <- findHsCpp (optHsCpp opts) cc
-- TODO: same case as ranlib below
-- TODO: we need it really only for javascript target (maybe wasm target as well)
- jsCpp <- Just <$> findJsCpp (optJsCpp opts) cc0
- cmmCpp <- findCmmCpp (optCmmCpp opts) cc0
- cc <- addPlatformDepCcFlags archOs cc0
+ jsCpp <- Just <$> findJsCpp (optJsCpp opts) cc
+ cmmCpp <- findCmmCpp (optCmmCpp opts) cc
+ ccWithPlatformFlags <- addPlatformDepCcFlags archOs cc
readelf <- optional $ findReadelf (optReadelf opts)
-- TODO: We could have
-- ranlib <- if arNeedsRanlib ar
@@ -466,11 +485,21 @@ mkTarget opts = do
-- but in order to match the configure output, for now we do
ranlib <- findRanlib (optRanlib opts)
ar <- findAr tgtVendor (optAr opts)
- ccLink <- findCcLink tgtLlvmTarget (optLd opts) (optCcLink opts) (ldOverrideWhitelist archOs && fromMaybe True (optLdOverride opts)) archOs cc readelf ar ranlib
-
+ ccLink <- findCcLink
+ tgtLlvmTarget
+ (optLd opts)
+ (optCcLink opts)
+ (ldOverrideWhitelist archOs
+ -- ld-override is enabled by default
+ && fromMaybe True (optLdOverride opts))
+ archOs
+ ccWithPlatformFlags
+ readelf
+ ar
+ ranlib
nm <- findNm (optNm opts)
- mergeObjs <- optional $ findMergeObjs (optMergeObjs opts) cc ccLink nm
+ mergeObjs <- optional $ findMergeObjs (optMergeObjs opts) ccWithPlatformFlags ccLink nm
when (isNothing mergeObjs && not (arSupportsDashL ar)) $
throwE "Neither a object-merging tool (e.g. ld -r) nor an ar that supports -L is available"
@@ -494,15 +523,15 @@ mkTarget opts = do
_ -> return (Nothing, Nothing)
-- various other properties of the platform
- tgtWordSize <- checkWordSize cc
- tgtEndianness <- checkEndianness cc
- tgtSymbolsHaveLeadingUnderscore <- checkLeadingUnderscore cc nm
- tgtSupportsSubsectionsViaSymbols <- checkSubsectionsViaSymbols archOs cc
- tgtSupportsIdentDirective <- checkIdentDirective cc
- tgtSupportsGnuNonexecStack <- checkGnuNonexecStack archOs cc
- tgtHasLibm <- checkTargetHasLibm cc
+ tgtWordSize <- checkWordSize ccWithPlatformFlags
+ tgtEndianness <- checkEndianness ccWithPlatformFlags
+ tgtSymbolsHaveLeadingUnderscore <- checkLeadingUnderscore ccWithPlatformFlags nm
+ tgtSupportsSubsectionsViaSymbols <- checkSubsectionsViaSymbols archOs ccWithPlatformFlags
+ tgtSupportsIdentDirective <- checkIdentDirective ccWithPlatformFlags
+ tgtSupportsGnuNonexecStack <- checkGnuNonexecStack archOs ccWithPlatformFlags
+ tgtHasLibm <- checkTargetHasLibm ccWithPlatformFlags
tgtRTSWithLibdw <- case optDwarfUnwind opts of
- Just True -> checkTargetHasLibdw cc (optLibdwIncludes opts) (optLibdwLibraries opts)
+ Just True -> checkTargetHasLibdw ccWithPlatformFlags (optLibdwIncludes opts) (optLibdwLibraries opts)
_ -> pure Nothing
-- code generator configuration
@@ -515,14 +544,14 @@ mkTarget opts = do
let prog = "int main(int argc, char** argv) { return 0; }"
via_c_args = ["-fwrapv", "-fno-builtin"]
forM_ via_c_args $ \arg -> checking ("support of "++arg) $ withTempDir $ \dir -> do
- let cc' = over (_ccProgram % _prgFlags) (++ [arg]) cc
+ let cc' = over (_ccProgram % _prgFlags) (++ [arg]) ccWithPlatformFlags
compileC cc' (dir </> "test.o") prog
return ()
let t = Target { tgtArchOs = archOs
, tgtVendor
, tgtLocallyExecutable = fromMaybe True (optLocallyExecutable opts)
- , tgtCCompiler = cc
+ , tgtCCompiler = ccWithPlatformFlags
, tgtCxxCompiler = cxx
, tgtCPreprocessor = cpp
, tgtHsCPreprocessor = hsCpp
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Lens.hs
=====================================
@@ -1,3 +1,4 @@
+{-# LANGUAGE DataKinds #-}
-- | A very simple Lens implementation
module GHC.Toolchain.Lens
( Lens(..)
@@ -7,11 +8,15 @@ module GHC.Toolchain.Lens
, (&)
) where
-import Prelude ((.), ($), (++))
+import Prelude ((.), ($), (++), Monoid, (<>))
import Data.Function ((&))
+import GHC.Records
data Lens a b = Lens { view :: (a -> b), set :: (b -> a -> a) }
+instance HasField "over" (Lens a b) ((b -> b) -> a -> a) where
+ getField = over
+
(%) :: Lens a b -> Lens b c -> Lens a c
a % b = Lens { view = view b . view a
, set = \y x -> set a (set b y (view a x)) x
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Monad.hs
=====================================
@@ -1,5 +1,6 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE NamedFieldPuns #-}
module GHC.Toolchain.Monad
( Env(..)
@@ -21,6 +22,10 @@ module GHC.Toolchain.Monad
, logDebug
, checking
, withLogContext
+
+ -- * Errors
+ , Error (..)
+ , formatError
) where
import Prelude hiding (readFile, writeFile, appendFile)
@@ -63,6 +68,9 @@ data Error = Error { errorMessage :: String
}
deriving (Show)
+formatError :: Error -> String
+formatError Error {errorMessage, errorLogContexts} = unlines $ errorMessage : errorLogContexts
+
throwE :: String -> M a
throwE msg = throwEs [msg]
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cc.hs
=====================================
@@ -1,5 +1,6 @@
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE MultiWayIf #-}
module GHC.Toolchain.Tools.Cc
( Cc(..)
@@ -23,6 +24,7 @@ import GHC.Platform.ArchOS
import GHC.Toolchain.Prelude
import GHC.Toolchain.Utils
import GHC.Toolchain.Program
+import System.Exit (ExitCode(..))
newtype Cc = Cc { ccProgram :: Program
}
@@ -109,11 +111,12 @@ checkCcSupportsExtraViaCFlags cc = checking "whether cc supports extra via-c fla
, "-fwrapv", "-fno-builtin"
, "-Werror", "-x", "c"
, "-o", test_o, test_c]
- when (not (isSuccess code)
- || "unrecognized" `isInfixOf` out
- || "unrecognized" `isInfixOf` err
- ) $
- throwE "Your C compiler must support the -fwrapv and -fno-builtin flags"
+
+ if | ExitSuccess <- code
+ , not $ "unrecognized" `isInfixOf` out
+ , not $ "unrecognized" `isInfixOf` err
+ -> pure ()
+ | otherwise -> throwE "Your C compiler must support the -fwrapv and -fno-builtin flags"
-- | Preprocess the given program.
preprocess
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
=====================================
@@ -1,7 +1,8 @@
-{-# OPTIONS_GHC -Wno-name-shadowing #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE CPP #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedRecordDot #-}
module GHC.Toolchain.Tools.Link ( CcLink(..), findCcLink ) where
@@ -18,6 +19,8 @@ import GHC.Toolchain.Tools.Cc
import GHC.Toolchain.Tools.Ar
import GHC.Toolchain.Tools.Ranlib
import GHC.Toolchain.Tools.Readelf
+import System.Exit (ExitCode(..))
+import Control.Applicative
-- | Configuration on how the C compiler can be used to link
data CcLink = CcLink { ccLinkProgram :: Program
@@ -47,61 +50,97 @@ instance Show CcLink where
_ccLinkProgram :: Lens CcLink Program
_ccLinkProgram = Lens ccLinkProgram (\x o -> o{ccLinkProgram=x})
-findCcLink :: String -- ^ The llvm target to use if CcLink supports --target
- -> ProgOpt
- -> ProgOpt
- -> Bool -- ^ Whether we should search for a more efficient linker
- -> ArchOS -> Cc -> Maybe Readelf -> Ar -> Ranlib -> M CcLink
-findCcLink target ld progOpt ldOverride archOs cc readelf ar ranlib = checking "for C compiler for linking command" $ do
+-- | tries to add flags to the c compiler to run as a linker
+findCcLink :: String -- ^ The llvm target to use if CcLink supports --target
+ -> ProgOpt -- ^ The contents of $LD
+ -> ProgOpt -- ^ The c compiler intended for invoking the linker
+ -> Bool -- ^ Whether GHC should disregard ld and search for a linker it considers better
+ -> ArchOS
+ -> Cc -- ^ the c compiler used for compiling c programs, used as a fallback
+ -> Maybe Readelf -> Ar -> Ranlib -> M CcLink
+findCcLink target ld progOpt userLdOverride archOs cc readelf ar ranlib = checking "for C compiler for linking command" $ do
-- Use the specified linker or try using the C compiler
rawCcLink <- findProgram "C compiler for linking" progOpt [] <|> pure (programFromOpt progOpt (prgPath $ ccProgram cc) [])
- -- See #23857 for why we check to see if LD is set here
- -- TLDR: If the user explicitly sets LD then in ./configure
- -- we don't perform a linker search (and set -fuse-ld), so
- -- we do the same here for consistency.
- ccLinkProgram <- case (poPath ld, poFlags progOpt) of
- (_, Just _) ->
- -- If the user specified linker flags don't second-guess them
- pure rawCcLink
- (Just {}, _) ->
- pure rawCcLink
- _ -> do
- -- If not then try to find decent linker flags
- findLinkFlags ldOverride cc rawCcLink <|> pure rawCcLink
- ccLinkProgram <- linkSupportsTarget archOs cc target ccLinkProgram
- ccLinkSupportsNoPie <- checkSupportsNoPie cc ccLinkProgram
- ccLinkSupportsCompactUnwind <- checkSupportsCompactUnwind archOs cc ccLinkProgram
- ccLinkSupportsFilelist <- checkSupportsFilelist cc ccLinkProgram
- ccLinkSupportsSingleModule <- checkSupportsSingleModule archOs cc ccLinkProgram
- ccLinkIsGnu <- checkLinkIsGnu archOs ccLinkProgram
- checkBfdCopyBug archOs cc readelf ccLinkProgram
- ccLinkProgram <- addPlatformDepLinkFlags archOs cc ccLinkProgram
- ccLinkSupportsVerbatimNamespace <- linkSupportsVerbatimNamespace cc ar ranlib ccLinkProgram
- let ccLink = CcLink {ccLinkProgram, ccLinkSupportsNoPie,
- ccLinkSupportsCompactUnwind, ccLinkSupportsFilelist,
- ccLinkSupportsSingleModule, ccLinkIsGnu, ccLinkSupportsVerbatimNamespace}
- ccLink <- linkRequiresNoFixupChains archOs cc ccLink
- ccLink <- linkRequiresNoWarnDuplicateLibraries archOs cc ccLink
- return ccLink
-
-
--- | Try to convince @cc@ to use a more efficient linker than @bfd.ld@
-findLinkFlags :: Bool -> Cc -> Program -> M Program
-findLinkFlags enableOverride cc ccLink
- | enableOverride && doLinkerSearch =
- oneOf "this can't happen"
- [ -- Annoyingly, gcc silently falls back to vanilla ld (typically bfd
- -- ld) if @-fuse-ld@ is given with a non-existent linker.
- -- Consequently, we must first check that the desired ld
- -- executable exists before trying cc.
- do _ <- findProgram (linker ++ " linker") emptyProgOpt ["ld."++linker]
- prog <$ checkLinkWorks cc prog
- | linker <- ["lld", "bfd"]
- , let prog = over _prgFlags (++["-fuse-ld="++linker]) ccLink
- ]
- <|> (ccLink <$ checkLinkWorks cc ccLink)
- | otherwise =
- return ccLink
+ ccLinkProgram <- if
+ -- A cc with linker was already specified, don't doubt the user's proficiency,
+ -- autonomy and right to segmentation faults
+ | Just _ <- progOpt.poFlags -> pure rawCcLink
+ -- we get a $LD; now figure out how to pass it to the $CC
+ | Just ldPathOrFlavour <- ld.poPath
+ -- even though $LD=ld doesn't really mean anything to C compilers,
+ -- we are lenient and just act as if $LD wasn't set and enable-ld-override
+ -- is off
+ , ldPathOrFlavour /= "ld" -> do
+ flip oneOf'
+
+ [ do
+ -- first check if the c compiler supports --ld-path, which goes best with $LD
+ ldPath <- findProgram (ldPathOrFlavour <> " linker") emptyProgOpt $ tryLdPrefix [ldPathOrFlavour]
+ -- findProgram takes a userSpec but in our case this is emptyProgOpt, so we just
+ -- extract the path that it found and ignore the (empty) arguments
+ checkLink rawCcLink [ fLdPath ldPath.prgPath ]
+ , -- second, check if the c compiler instead understands -fuse-ld (linker "flavour");
+ -- do not try to expand the path first since absolute paths are not valid linker flavours
+ checkLink rawCcLink [ fUseLd ldPathOrFlavour] ]
+
+ -- $LD was set but we couldn't figure out how to pass it to $CC. This is a hard failure,
+ -- we report it.
+ [ ldPathOrFlavour <> " is an invalid linker."
+ , "$LD can be either of an executable name that is in $PATH *or* a"
+ <> " path to an executable."
+ , "If your C compiler only supports the '-fuse-ld' flag, $LD can"
+ <> " only be one of the linker flavours supported by it."
+ , "Mind that if your C compiler supports '--ld-path', 'configure'"
+ <> " will always prefer using an absolute path to your linker as"
+ <> " that is less error-prone." ]
+
+ -- $LD is not set or $LD=ld (see above)
+ -- Try to convince @cc@ to use a more efficient linker than @bfd.ld@
+ | let ldOverride
+ | Just "ld" <- ld.poPath = False
+ | otherwise = userLdOverride
+ , ldOverride ->
+ asum
+ [ -- Annoyingly, gcc silently falls back to vanilla ld
+ -- if @-fuse-ld@ is given passed a non-existent linker.
+ -- Consequently, we must first check that the desired ld
+ -- executable exists before trying cc.
+ do linkerPath <- findProgram (linker ++ " linker") emptyProgOpt [ linker ]
+ checkLink rawCcLink [ fLdPath linkerPath.prgPath]
+ <|> checkLink rawCcLink [ fUseLd linker]
+ | linker <- tryLdPrefix ["lld", "bfd"]
+ ]
+ -- fall back to raw ld
+ <|> checkLink rawCcLink []
+
+ -- we can't help the user
+ | otherwise -> checkLink rawCcLink []
+
+ targetedCcLink <- linkSupportsTarget archOs cc target ccLinkProgram
+ ccLinkSupportsNoPie <- checkSupportsNoPie cc targetedCcLink
+ ccLinkSupportsCompactUnwind <- checkSupportsCompactUnwind archOs cc targetedCcLink
+ ccLinkSupportsFilelist <- checkSupportsFilelist cc targetedCcLink
+ ccLinkSupportsSingleModule <- checkSupportsSingleModule archOs cc targetedCcLink
+ ccLinkIsGnu <- checkLinkIsGnu archOs targetedCcLink
+ checkedCcLink <- addPlatformDepLinkFlags archOs cc targetedCcLink
+ ccLinkSupportsVerbatimNamespace <- linkSupportsVerbatimNamespace cc ar ranlib checkedCcLink
+
+ checkBfdCopyBug archOs cc readelf targetedCcLink
+
+ let finalCcLink = CcLink
+ { ccLinkProgram = checkedCcLink, ccLinkSupportsNoPie
+ , ccLinkSupportsCompactUnwind, ccLinkSupportsFilelist
+ , ccLinkSupportsSingleModule, ccLinkIsGnu, ccLinkSupportsVerbatimNamespace }
+
+ linkRequiresNoFixupChains archOs cc finalCcLink
+ >>= linkRequiresNoWarnDuplicateLibraries archOs cc
+ where
+ checkLink ccLink extraFlags =
+ let prog = over _prgFlags (extraFlags <>) ccLink
+ in prog <$ checkLinkWorks cc prog
+ tryLdPrefix progs = [id, ("ld." <>)] <*> progs
+ fUseLd flavour = "-fuse-ld=" <> flavour
+ fLdPath path = "--ld-path=" <> path
-- | Test whether the linker supports the verbatim '-l:libfoo.a' syntax, allowing
-- us better control over partial static linking.
@@ -150,20 +189,6 @@ linkSupportsTarget archOs cc target link =
checking "whether cc linker supports --target" $
supportsTarget archOs (Lens id const) (checkLinkWorks cc) target link
--- | Should we attempt to find a more efficient linker on this platform?
---
--- N.B. On Darwin it is quite important that we use the system linker
--- unchanged as it is very easy to run into broken setups (e.g. unholy mixtures
--- of Homebrew and the Apple toolchain).
---
--- See #21712.
-doLinkerSearch :: Bool
-#if defined(linux_HOST_OS)
-doLinkerSearch = True
-#else
-doLinkerSearch = False
-#endif
-
-- | See Note [No PIE when linking] in GHC.Driver.Session
checkSupportsNoPie :: Cc -> Program -> M Bool
checkSupportsNoPie cc ccLink = checking "whether the cc linker supports -no-pie" $
@@ -174,7 +199,11 @@ checkSupportsNoPie cc ccLink = checking "whether the cc linker supports -no-pie"
-- Check output as some GCC versions only warn and don't respect -Werror
-- when passed an unrecognized flag.
(code, out, err) <- readProgram ccLink ["-no-pie", "-Werror", test_o, "-o", test]
- return (isSuccess code && not ("unrecognized" `isInfixOf` out) && not ("unrecognized" `isInfixOf` err))
+ return if
+ | ExitSuccess <- code
+ , not ("unrecognized" `isInfixOf` out)
+ , not ("unrecognized" `isInfixOf` err) -> True
+ | otherwise -> False
-- ROMES:TODO: This check is wrong here and in configure because with ld.gold parses "-n" "o_compact_unwind"
-- TODO:
@@ -191,7 +220,8 @@ checkSupportsCompactUnwind archOs cc ccLink
compileC cc test_o "int foo() { return 0; }"
exitCode <- runProgram ccLink ["-r", "-Wl,-no_compact_unwind", "-o", test2_o, test_o]
- return $ isSuccess exitCode
+ return if | ExitSuccess <- exitCode -> True
+ | otherwise -> False
| otherwise = return False
checkSupportsFilelist :: Cc -> Program -> M Bool
@@ -210,7 +240,8 @@ checkSupportsFilelist cc ccLink = checking "whether the cc linker understands -f
exitCode <- runProgram ccLink ["-r", "-Wl,-filelist", test_ofiles, "-o", test_o]
- return (isSuccess exitCode)
+ return if | ExitSuccess <- exitCode -> True
+ | otherwise -> False
-- | Check that the (darwin) linker supports @-single_module@.
--
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Utils.hs
=====================================
@@ -7,19 +7,18 @@ module GHC.Toolchain.Utils
, withTempDir
, oneOf
, oneOf'
- , isSuccess
, lastLine
, findM
) where
-import Control.Exception
+import Control.Applicative (asum)
+import Control.Exception ( throwIO, bracket, try )
import Control.Monad
import Control.Monad.IO.Class
import Data.List (unsnoc)
import System.Directory
import System.FilePath
import System.IO.Error
-import System.Exit
import GHC.Toolchain.Prelude
@@ -61,12 +60,7 @@ oneOf err = oneOf' [err]
-- | Like 'oneOf' but takes a multi-line error message if none of the checks
-- succeed.
oneOf' :: [String] -> [M b] -> M b
-oneOf' err = foldr (<|>) (throwEs err)
-
-isSuccess :: ExitCode -> Bool
-isSuccess = \case
- ExitSuccess -> True
- ExitFailure _ -> False
+oneOf' err as = asum $ as <> [throwEs err]
lastLine :: String -> String
lastLine = maybe "" snd . unsnoc . lines
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9fd0f84ec49c0ec5c92475bf3edc89c…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/9fd0f84ec49c0ec5c92475bf3edc89c…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/sjakobi/T16720] 2 commits: testsuite: Note that dropping redundant output also affects the JUnit report
by Simon Jakobi (@sjakobi) 30 Jul '26
by Simon Jakobi (@sjakobi) 30 Jul '26
30 Jul '26
Simon Jakobi pushed to branch wip/sjakobi/T16720 at Glasgow Haskell Compiler / GHC
Commits:
0cc5a523 by Simon Jakobi at 2026-07-30T16:40:43+02:00
testsuite: Note that dropping redundant output also affects the JUnit report
The mismatching stream is dropped from the TestResult at construction, so
the JUnit XML now carries only the diff where it previously also had the
raw stream. Record in Note [Redundant output in test results] that this
is intended, and switch the Note to the usual comment style.
Assisted-by: Claude Fable 5
- - - - -
997fbe2e by Simon Jakobi at 2026-07-30T16:45:27+02:00
testsuite: Don't crash on non-UTF-8 test output in failure results
read_stdout, read_stderr_for and read_comp_stderr decoded with strict
UTF-8, so a test emitting invalid UTF-8 (binary output, or a crash
truncating a multi-byte character) raised UnicodeDecodeError and was
reported as a framework failure. Newly reachable from the bad-exit-code
branch of simple_run, which now attaches the captured output to the
result even under -v0 and for expect-fail ways.
Decode with errors='replace', like read_no_crs and safe_print.
Assisted-by: Claude Fable 5
- - - - -
1 changed file:
- testsuite/driver/testlib.py
Changes:
=====================================
testsuite/driver/testlib.py
=====================================
@@ -2651,7 +2651,7 @@ async def stdout_ok(name: TestName, way: WayName) -> CompareOutput:
def read_stdout( name: TestName ) -> str:
path = in_testdir(name, 'run.stdout')
if path.exists():
- return path.read_text(encoding='UTF-8')
+ return path.read_text(encoding='UTF-8', errors='replace')
else:
return ''
@@ -2681,14 +2681,14 @@ async def stderr_ok(name: TestName, way: WayName) -> CompareOutput:
def read_comp_stderr( name: TestName ) -> str:
path = in_testdir(name, 'comp.stderr')
if path.exists():
- return path.read_text(encoding='UTF-8')
+ return path.read_text(encoding='UTF-8', errors='replace')
else:
return ''
def read_stderr_for( phase: str, name: TestName ) -> str:
path = in_testdir(name, phase + '.stderr')
if path.exists():
- return path.read_text(encoding='UTF-8')
+ return path.read_text(encoding='UTF-8', errors='replace')
else:
return ''
@@ -3692,20 +3692,21 @@ MAX_SUMMARY_OUTPUT_LINES = 100
# would drown out the summary.
MAX_SUMMARY_OUTPUT_TESTS = 20
-"""
-Note [Redundant output in test results]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-A failing test result carries up to three pieces of output: `diff`, `stdout`
-and `stderr`. For an output mismatch these overlap: the diff's `+` lines are
-the very stream that mismatched, normalised. Reporting both would print the
-same text twice, so the mismatching stream is dropped at the call sites in
-favour of the diff, which additionally shows what was expected. The *other*
-stream is kept: on a stdout mismatch, stderr is independent context.
-
-The drop is conditional on there being a diff at all: compare_outputs only
-runs `diff` when config.verbose >= 1, so under -v0 the stream is the only
-output there is.
-"""
+# Note [Redundant output in test results]
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# A failing test result carries up to three pieces of output: `diff`, `stdout`
+# and `stderr`. For an output mismatch these overlap: the diff's `+` lines are
+# the very stream that mismatched, normalised. Reporting both would print the
+# same text twice, so the mismatching stream is dropped at the call sites in
+# favour of the diff, which additionally shows what was expected. The *other*
+# stream is kept: on a stdout mismatch, stderr is independent context.
+#
+# The drop is conditional on there being a diff at all: compare_outputs only
+# runs `diff` when config.verbose >= 1, so under -v0 the stream is the only
+# output there is.
+#
+# Note that, since the drop happens at result construction, it also affects the
+# JUnit report (junit.py).
def strip_diff_header(diff: Optional[str]) -> Optional[str]:
# Drop diff(1)'s ---/+++ lines: they name normalised files in the test
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3647ba9bb729f2f56f3c5da2da2a61…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3647ba9bb729f2f56f3c5da2da2a61…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/romes/27461] Organize and clean-up GHC.Driver.Downsweep
by Hannes Siebenhandl (@fendor) 30 Jul '26
by Hannes Siebenhandl (@fendor) 30 Jul '26
30 Jul '26
Hannes Siebenhandl pushed to branch wip/romes/27461 at Glasgow Haskell Compiler / GHC
Commits:
5bfee53a by Rodrigo Mesquita at 2026-07-30T10:28:39+02:00
Organize and clean-up GHC.Driver.Downsweep
Simply some cosmetic changes, moving definitions around to structure the
module better into its relevant sections
(In go (ns ++ ss), it's not a problem to use ++ because it's a good
producer and we won't have to append fully before processing the next
item in go)
- - - - -
4 changed files:
- + changelog.d/downsweep-refactor
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/Env.hs
- compiler/GHC/Unit/Env.hs
Changes:
=====================================
changelog.d/downsweep-refactor
=====================================
@@ -0,0 +1,9 @@
+section: compiler
+synopsis: Significantly improve the performance of downsweep
+issues: #27461
+mrs: !16330
+description: {
+ Rewrite the downsweep pass to make the control flow clearer and fix the
+ caching strategy. Allocations during downsweep in multi-home-unit-heavy and
+ module-heavy tests are reduced by -30% to -60%
+}
=====================================
compiler/GHC/Driver/Downsweep.hs
=====================================
@@ -5,8 +5,8 @@
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ViewPatterns #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE FunctionalDependencies #-}
+
+-- | See Note [The ModuleGraph]
module GHC.Driver.Downsweep
( downsweep
, downsweepThunk
@@ -117,17 +117,35 @@ import Data.IORef
import qualified Data.List.NonEmpty as NE
{-
-Note [Downsweep and the ModuleGraph]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Note [The ModuleGraph]
+~~~~~~~~~~~~~~~~~~~~~~
+The 'ModuleGraph' stores the relationship between all the modules, units, and
+instantiations in the current session, allowing e.g. to answer questions about
+the transitive closure of the imports.
+
+* A /node/ of the `ModuleGraph`, of type `ModuleGraphNode`, corresponds
+ 1-1 with a home-package module of source code, N.hs or N.hs-boot.
+ See the haddocks of `ModuleGraphNode`.
+
+ The `ModuleNodeInfo` field of the `ModuleGraphNode` contains a `ModSummary`
+ that in turn describes where the source file is (its `ModLocation`), when it
+ was read, its contents etc. See Note [Module Types in the ModuleGraph].
+
+ Each node has a distinct `NodeKey` (an instance of Ord); the function
+ mkNodeKey :: ModuleGraphNode -> NodeKey
+ get the `NodeKey` of a node
-The ModuleGraph stores the relationship between all the modules, units, and
-instantiations in the current session.
+* An /edge/ of the `ModuleGraph` from N1 to N2 typically corresponds to a
+ direct import of module N2 in module N1: one edge for each import.
+ Imports of modules from non-home-packages are featured in the `ModuleGraph`
+ as `UnitNode`s, or `InstantiationNodes` when backpack is involved.
-When we do downsweep, we build up a new ModuleGraph, starting from the root
-modules. By following all the dependencies we construct a graph which allows
-us to answer questions about the transitive closure of the imports.
+ Each node contains a list of all its out-edges or, more precisely, of the
+ `NodeKey`s of its direct dependencies.
-The module graph is accessible in the HscEnv.
+Because a node in the `ModuleGraph` describes the precise dependencies of the module, each node has its
+own `UnitId`. Remember, a single module can be compiled against many different versions of a library; but
+once we fix its dependencies we can compile it, and give it a `UnitId`. See Note [About units] in GHC.Unit.
When is this graph constructed?
@@ -144,10 +162,54 @@ When is this graph constructed?
The result is having a uniform graph available for the whole compilation pipeline.
-See also Note [Downsweep Control Flow and Caching]
+See Note [Downsweep Control Flow and Caching] for implementation details of
+the algorithm and caching.
+
+Note [Downsweep: building and maintaining the module graph]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The module graph can be built from scratch by starting from a set of /root nodes/
+and exploring their dependencies. This is done by `GHC.Driver.Downsweep.downsweep`.
+
+Another scenario is when we already /have/ a `ModuleGraph` and want to update
+it (e.g. to reflect any file-system changes that have taken place since the
+last invocation of `downsweep`) or augment it by exploring new roots (e.g. for
+incrementally constructing a ModuleGraph using the GHC API; See #27054). So
+`downsweep` takes a `Maybe ModuleGraph` as one of its arguments.
+
+Downsweep iteratively *expands* each so-called 'DownsweepNode' into a list of
+its dependencies, and recursively traverses all reachable nodes in a
+depth-first order using 'dfsBuild'. A 'DownsweepNode' is *expanded* by 'dsNodeExpand':
+
+ dsNodeExpand :: DownsweepNode -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
+
+Most notably:
+
+ - 'DSMod' (Module-based) nodes can be expanded by preprocessing and
+ parsing the module header, then listing the imports (direct and SOURCE imports)
+ (see 'expandModuleSummary' and 'expandFixedModuleNode')
+
+ - 'DSUnit' is expanded by finding the unit dependencies of that unit by id
+ (see 'expandUnitNode').
+
+Besides its dependencies, expanding a 'DownsweepNode' produces a
+'ModuleGraphNode'. The final 'ModuleGraph' is constructed from the list of
+'ModuleGraphNode's accumulated by expanding all reachable 'DownsweepNode's.
+
+A 'ModuleGraphNode' is essentially the resolved version of 'DownsweepNode':
+it records the payload (e.g. a Module) *and* its dependencies, unlike
+'DownsweepNode' which has the just the payload that is used as a seed (and
+potentially some context information, like the current home-unit)
+
+TL;DR: We recursively traverse 'DownsweepNodes' to discover and build the 'ModuleGraph'.
+
+See also Note [Downsweep Control Flow and Caching] for implementation details.
+See Note [The ModuleGraph] for an overview when we do downsweep.
-}
-----------------------------------------------------------------------------
+-- * Top-level entry to downsweep
+-----------------------------------------------------------------------------
+
--
-- | Downsweep (dependency analysis) for --make mode
--
@@ -159,7 +221,7 @@ See also Note [Downsweep Control Flow and Caching]
-- cache to avoid recalculating a module summary if the source is
-- unchanged.
--
--- Downsweeping can start from scratch for from a given module graph. In the
+-- Downsweeping can start from scratch or from a given module graph. In the
-- latter case, the given graph is fully included in the resulting graph, even
-- if parts of it are not reachable from any of the given roots. When an import
-- is processed, the source of the imported module is not consulted if this
@@ -175,6 +237,8 @@ See also Note [Downsweep Control Flow and Caching]
--
-- It will also turn on code generation for any modules that need it by calling
-- 'enableCodeGenForTH'.
+--
+-- See also Note [The ModuleGraph]
downsweep :: HscEnv
-> (GhcMessage -> AnyGhcDiagnostic)
-> Maybe Messager
@@ -231,6 +295,35 @@ downsweep hsc_env diag_wrapper msg old_summaries maybe_base_graph excl_mods allo
unitModuleNodes summaries uid hue =
maybeToList (linkNodes summaries uid hue)
+ -- The linking plan for each module. If we need to do linking for a home unit
+ -- then this function returns a graph node which depends on all the modules in the home unit.
+
+ -- At the moment nothing can depend on these LinkNodes.
+ linkNodes :: [ModuleGraphNode] -> UnitId -> HomeUnitEnv -> Maybe (Either (Messages DriverMessage) ModuleGraphNode)
+ linkNodes summaries uid hue =
+ let dflags = homeUnitEnv_dflags hue
+ ofile = outputFile_ dflags
+
+ unit_nodes :: [NodeKey]
+ unit_nodes = map mkNodeKey (filter ((== uid) . mgNodeUnitId) summaries)
+ -- Issue a warning for the confusing case where the user
+ -- said '-o foo' but we're not going to do any linking.
+ -- We attempt linking if either (a) one of the modules is
+ -- called Main, or (b) the user said -no-hs-main, indicating
+ -- that main() is going to come from somewhere else.
+ --
+ no_hs_main = gopt Opt_NoHsMain dflags
+
+ main_sum = any (== NodeKey_Module (ModNodeKeyWithUid (GWIB (mainModuleNameIs dflags) NotBoot) uid)) unit_nodes
+
+ do_linking = main_sum || no_hs_main || ghcLink dflags == LinkDynLib || ghcLink dflags == LinkStaticLib || ghcLink dflags == LinkBytecodeLib
+
+ in if | isExecutableLink (ghcLink dflags) && isJust ofile && not do_linking ->
+ Just (Left $ singleMessage $ mkPlainErrorMsgEnvelope noSrcSpan (DriverRedirectedNoMain $ mainModuleNameIs dflags))
+ -- This should be an error, not a warning (#10895).
+ | ghcLink dflags /= NoLink, do_linking -> Just (Right (LinkNode unit_nodes uid))
+ | otherwise -> Nothing
+
-- | Calculate the module graph starting from a single ModSummary. The result is a
-- thunk, which when forced will perform the downsweep. This is useful in oneshot
-- mode where the module graph may never be needed.
@@ -322,7 +415,35 @@ downsweepInstalledModules hsc_env mods = do
return (mkModuleGraph mg)
+-----------------------------------------------------------------------------
+-- * Orchestrator: downsweepFromRootNodes
+-----------------------------------------------------------------------------
+
+type ModSummaryCache = IORef ModSummaryCacheMap
+type ImportsCache = IORef ImportsCacheMap
+
+-- | A cache from file paths to the already summarised modules. The same file
+-- can be used in multiple units so the map is actually also keyed by which
+-- unit the file was used in.
+--
+-- We want to reuse ModSummaries as far as possible because the most expensive
+-- part of downsweep is reading and parsing the headers.
+--
+-- See Note [Downsweep Control Flow and Caching]
+type ModSummaryCacheMap
+ -- The cache can't be keyed by 'Module' because that isn't sufficient to
+ -- distinguish .hs from .hs-boot files. Use path+unit instead.
+ = ( M.Map (UnitId, OsPath) (Either DriverMessages (ModSummary, SummProvenance)) )
+-- | A 'ModSummary's provenance during downsweep: an old previously constructed
+-- ModSummary, that might be potentially outdated, or a freshly constructed one
+-- during this downsweep which is certainly up to date?
+data SummProvenance
+ -- | Constructed during this downsweep: trivially up to date
+ = SummFresh
+ -- | Carried over from a previous run: may be stale, must be hash-checked
+ -- (and considered by -fforce-recomp)
+ | SummOld
-- | Whether downsweep should use compiler or fixed nodes. Compile nodes are used
-- by --make mode, and fixed nodes by oneshot mode.
@@ -381,20 +502,15 @@ downsweepFromRootNodes hsc_env summ_cache imps_cache maybe_base_graph excl_mods
[ ((moduleNodeInfoUnitId s, moduleNodeInfoMnwib s), [s])
| s <- root_nodes ]
- moduleGraphNodeMap :: ModuleGraph -> M.Map NodeKey (MGRes ModuleGraphNode)
+ moduleGraphNodeMap :: ModuleGraph -> M.Map NodeKey (NodeRes ModuleGraphNode)
moduleGraphNodeMap graph
= M.fromList [(mkNodeKey node, NSuccess node) | node <- mgModSummaries' graph]
sec = initSourceErrorContext (hsc_dflags hsc_env)
-calcDeps :: ModSummary -> [(ImportLevel, PkgQual, GenWithIsBoot (Located ModuleName))]
-calcDeps ms =
- -- Add a dependency on the HsBoot file if it exists
- -- This gets passed to the loopImports function which just ignores it if it
- -- can't be found.
- [(NormalLevel, NoPkgQual, GWIB (noLoc $ ms_mod_name ms) IsBoot) | NotBoot <- [isBootSummary ms] ] ++
- [(lvl, b, c) | (lvl, b, c) <- msDeps ms ]
-
+--------------------------------------------------------------------------------
+-- ** 'DownsweepM'
+--------------------------------------------------------------------------------
type DownsweepM a = ReaderT DownsweepEnv IO a
data DownsweepEnv = DownsweepEnv {
@@ -405,29 +521,6 @@ data DownsweepEnv = DownsweepEnv {
, _downsweep_excl_mods :: [ModuleName]
}
-type ModSummaryCache = IORef ModSummaryCacheMap
-type ImportsCache = IORef ImportsCacheMap
-
--- | A cache from file paths to the already summarised modules. The same file
--- can be used in multiple units so the map is actually also keyed by which
--- unit the file was used in.
---
--- We want to reuse ModSummaries as far as possible because the most expensive
--- part of downsweep is reading and parsing the headers.
---
--- See Note [Downsweep Control Flow and Caching]
-type ModSummaryCacheMap
- -- The cache can't be keyed by 'Module' because that isn't sufficient to
- -- distinguish .hs from .hs-boot files. Use path+unit instead.
- = ( M.Map (UnitId, OsPath) (Either DriverMessages (ModSummary, SummProvenance)) )
-
-data SummProvenance
- -- | Constructed during this downsweep: trivially up to date
- = SummFresh
- -- | Carried over from a previous run: may be stale, must be hash-checked
- -- (and considered by -fforce-recomp)
- | SummOld
-
mkModSummaryCache :: [(ModSummary, SummProvenance)] -> ModSummaryCacheMap
mkModSummaryCache summs = foldl' (flip (uncurry addModSummaryCache)) M.empty summs
@@ -460,17 +553,19 @@ mkRootMap summaries = Map.fromList
runDownsweepM :: DownsweepEnv -> DownsweepM a -> IO a
runDownsweepM env act = runReaderT act env
-loopDownsweepNodes :: M.Map NodeKey (MGRes ModuleGraphNode) -> [DownsweepNode] -> DownsweepM (M.Map NodeKey (MGRes ModuleGraphNode))
-loopModuleNodeInfos :: M.Map NodeKey (MGRes ModuleGraphNode) -> [ModuleNodeInfo] -> DownsweepM (M.Map NodeKey (MGRes ModuleGraphNode))
-loopUnits :: M.Map NodeKey (MGRes ModuleGraphNode) -> UnitId -> [UnitId] -> DownsweepM (M.Map NodeKey (MGRes ModuleGraphNode))
-loopInstantiations :: M.Map NodeKey (MGRes ModuleGraphNode) -> [(UnitId, InstantiatedUnit)] -> DownsweepM (M.Map NodeKey (MGRes ModuleGraphNode))
-loopFromInteractive :: M.Map NodeKey (MGRes ModuleGraphNode) -> Module -> [InteractiveImport] -> DownsweepM (M.Map NodeKey (MGRes ModuleGraphNode))
+loopDownsweepNodes :: M.Map NodeKey (NodeRes ModuleGraphNode) -> [DownsweepNode] -> DownsweepM (M.Map NodeKey (NodeRes ModuleGraphNode))
+loopModuleNodeInfos :: M.Map NodeKey (NodeRes ModuleGraphNode) -> [ModuleNodeInfo] -> DownsweepM (M.Map NodeKey (NodeRes ModuleGraphNode))
+loopUnits :: M.Map NodeKey (NodeRes ModuleGraphNode) -> UnitId -> [UnitId] -> DownsweepM (M.Map NodeKey (NodeRes ModuleGraphNode))
+loopInstantiations :: M.Map NodeKey (NodeRes ModuleGraphNode) -> [(UnitId, InstantiatedUnit)] -> DownsweepM (M.Map NodeKey (NodeRes ModuleGraphNode))
+loopFromInteractive :: M.Map NodeKey (NodeRes ModuleGraphNode) -> Module -> [InteractiveImport] -> DownsweepM (M.Map NodeKey (NodeRes ModuleGraphNode))
loopDownsweepNodes base_map nodes = dfsBuild (Just base_map) nodes dsNodeInfoKey dsNodeExpand
loopModuleNodeInfos base_map = loopDownsweepNodes base_map . map DSMod
loopUnits base_map homud = loopDownsweepNodes base_map . map (DSUnit homud)
loopInstantiations base_map = loopDownsweepNodes base_map . map (uncurry DSInst)
loopFromInteractive base_map m = loopDownsweepNodes base_map . (:[]) . DSInteractive m
+--------------------------------------------------------------------------------
+-- * Expanding 'DownsweepNode's into payload and node dependencies
--------------------------------------------------------------------------------
-- | A 'DownsweepNode' is the basic block of the downsweep algorithm which
@@ -516,7 +611,7 @@ dsNodeInfoKey = \case
DSInst{instantiated_ud} -> NodeKey_Unit instantiated_ud
DSInteractive mod _imps -> NodeKey_Module $ moduleToMnk mod NotBoot
-dsNodeExpand :: DownsweepNode -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+dsNodeExpand :: DownsweepNode -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
dsNodeExpand = \case
DSMod (ModuleNodeCompile ms) -> expandModuleSummary ms
DSMod (ModuleNodeFixed key loc) -> expandFixedModuleNode key loc
@@ -525,12 +620,29 @@ dsNodeExpand = \case
, home_context_uid } -> expandInstantiatedUnit instantiated_ud home_context_uid
DSInteractive imod iis -> expandInteractiveImports imod iis
-expandModuleSummary :: ModSummary -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+expandModuleSummary :: ModSummary -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
expandModuleSummary ms = do -- Didn't work out what the imports mean yet, now do that.
hsc_env <- asks downsweep_hsc_env
let home_uid = ms_unitid ms
home_unit = ue_unitHomeUnit home_uid (hsc_unit_env hsc_env)
- (final_deps, todo) <- fmap unzip $ forM (calcDeps ms) $ \(imp,mb_pkg,gwib) -> do
+ (final_deps, todo) <- unzip <$> mapM (expandModImport home_uid home_unit) (calcDeps ms)
+
+ -- This has the effect of finding a .hs file if we are looking at the .hs-boot file.
+ boot_todo <-
+ if | HsBootFile <- ms_hsc_src ms
+ -> do
+ r <- downsweepSummarise home_unit NotBoot (noLoc $ ms_mod_name ms) NoPkgQual Nothing
+ case r of
+ FoundHome s -> pure [DSMod s]
+ _ -> pure []
+ | otherwise -> pure []
+
+ return $ NSuccess
+ ( ModuleNode (catMaybes final_deps) (ModuleNodeCompile ms)
+ , boot_todo ++ concat todo
+ )
+ where
+ expandModImport home_uid home_unit (imp,mb_pkg,gwib) = do
let GWIB { gwib_mod = L loc mod, gwib_isBoot = is_boot } = gwib
wanted_mod = L loc mod
mb_s <- downsweepSummarise home_unit is_boot wanted_mod mb_pkg Nothing
@@ -552,24 +664,17 @@ expandModuleSummary ms = do -- Didn't work out what the imports mean yet, now do
( Just $ mkModuleEdge imp (NodeKey_Module (mnKey s))
, [DSMod s] )
- -- This has the effect of finding a .hs file if we are looking at the .hs-boot file.
- boot_todo <-
- if | HsBootFile <- ms_hsc_src ms
- -> do
- r <- downsweepSummarise home_unit NotBoot (noLoc $ ms_mod_name ms) NoPkgQual Nothing
- case r of
- FoundHome s -> pure [DSMod s]
- _ -> pure []
- | otherwise -> pure []
-
- return $ NSuccess
- ( ModuleNode (catMaybes final_deps) (ModuleNodeCompile ms)
- , boot_todo ++ concat todo
- )
+ calcDeps :: ModSummary -> [(ImportLevel, PkgQual, GenWithIsBoot (Located ModuleName))]
+ calcDeps ms =
+ -- Add a dependency on the HsBoot file if it exists
+ -- This gets passed to the loopImports function which just ignores it if it
+ -- can't be found.
+ [(NormalLevel, NoPkgQual, GWIB (noLoc $ ms_mod_name ms) IsBoot) | NotBoot <- [isBootSummary ms] ] ++
+ [(lvl, b, c) | (lvl, b, c) <- msDeps ms ]
-- | Expand a 'ModuleNodeFixed' node
-- NB: If you ever reach a Fixed node, everything under that also must be fixed.
-expandFixedModuleNode :: ModNodeKeyWithUid -> ModLocation -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+expandFixedModuleNode :: ModNodeKeyWithUid -> ModLocation -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
expandFixedModuleNode key loc = do
hsc_env <- asks downsweep_hsc_env
-- MP: TODO, we should just read the dependency info from the interface rather than either
@@ -603,7 +708,7 @@ expandFixedModuleNode key loc = do
pure $ Just $ DSMod (ModuleNodeFixed key loc)
_otherwise ->
-- If the finder fails, just keep going, there will be another
- -- error later.
+ -- error later when we try to expand this dependency.
pure Nothing
mk_dep _ (Right uid_dep) = do
-- Set active unit so that looking loopUnit finds the correct
@@ -611,9 +716,22 @@ expandFixedModuleNode key loc = do
let home_uid = mnkUnitId key
pure (Just DSUnit{node_uid=uid_dep, home_context_uid=home_uid})
+ mkFixedEdge :: Either (ImportLevel, ModNodeKeyWithUid) (ImportLevel, UnitId) -> ModuleNodeEdge
+ mkFixedEdge (Left (lvl, key)) = mkModuleEdge lvl (NodeKey_Module key)
+ mkFixedEdge (Right (lvl, uid)) = mkModuleEdge lvl (NodeKey_ExternalUnit uid)
+
+ ifaceDeps :: Dependencies -> [Either (ImportLevel, ModNodeKeyWithUid) (ImportLevel, UnitId)]
+ ifaceDeps deps =
+ [ Left (tcImportLevel lvl, ModNodeKeyWithUid dep uid)
+ | (lvl, uid, dep) <- Set.toList (dep_direct_mods deps)
+ ] ++
+ [ Right (tcImportLevel lvl, uid)
+ | (lvl, uid) <- Set.toList (dep_direct_pkgs deps)
+ ]
+
-- | Expand a unit id under the context of a certain home unit
expandUnitNode :: UnitId {-^ @node_uid@ -} -> UnitId {-^ Home unit from where @node_uid@ was introduced -}
- -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+ -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
expandUnitNode node_uid home_context_uid = do
-- Set active unit so that looking loopUnit finds the correct
-- -package flags in the unit state.
@@ -623,12 +741,12 @@ expandUnitNode node_uid home_context_uid = do
Just us -> pure $ NSuccess ((UnitNode us node_uid), map (\u -> DSUnit{node_uid=u, home_context_uid{-inherit-}}) us)
Nothing -> pprPanic "loopUnit" (text "Malformed package database, missing " <+> ppr node_uid)
-expandInstantiatedUnit :: InstantiatedUnit -> UnitId {-^ Home unit -} -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+expandInstantiatedUnit :: InstantiatedUnit -> UnitId {-^ Home unit -} -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
expandInstantiatedUnit iud home_uid = pure $ NSuccess
( InstantiationNode home_uid iud
, [DSUnit{node_uid=instUnitInstanceOf iud, home_context_uid=home_uid}] )
-expandInteractiveImports :: Module -> [InteractiveImport] -> DownsweepM (MGRes (ModuleGraphNode, [DownsweepNode]))
+expandInteractiveImports :: Module -> [InteractiveImport] -> DownsweepM (NodeRes (ModuleGraphNode, [DownsweepNode]))
expandInteractiveImports imod imps = do
hsc_env <- asks downsweep_hsc_env
imps_cache <- asks downsweep_imports_cache
@@ -686,19 +804,8 @@ expandInteractiveImports imod imps = do
node_type = ModuleNodeFixed key ml
--------------------------------------------------------------------------------
-
-mkFixedEdge :: Either (ImportLevel, ModNodeKeyWithUid) (ImportLevel, UnitId) -> ModuleNodeEdge
-mkFixedEdge (Left (lvl, key)) = mkModuleEdge lvl (NodeKey_Module key)
-mkFixedEdge (Right (lvl, uid)) = mkModuleEdge lvl (NodeKey_ExternalUnit uid)
-
-ifaceDeps :: Dependencies -> [Either (ImportLevel, ModNodeKeyWithUid) (ImportLevel, UnitId)]
-ifaceDeps deps =
- [ Left (tcImportLevel lvl, ModNodeKeyWithUid dep uid)
- | (lvl, uid, dep) <- Set.toList (dep_direct_mods deps)
- ] ++
- [ Right (tcImportLevel lvl, uid)
- | (lvl, uid) <- Set.toList (dep_direct_pkgs deps)
- ]
+-- * Constructing Module Summaries
+--------------------------------------------------------------------------------
downsweepSummarise :: HomeUnit
-> IsBootInterface
@@ -745,35 +852,6 @@ instantiationNodes uid unit_state = map (uid,) iuids_to_check
, recur <- (indef :) $ goUnitId $ moduleUnit $ snd inst
]
--- The linking plan for each module. If we need to do linking for a home unit
--- then this function returns a graph node which depends on all the modules in the home unit.
-
--- At the moment nothing can depend on these LinkNodes.
-linkNodes :: [ModuleGraphNode] -> UnitId -> HomeUnitEnv -> Maybe (Either (Messages DriverMessage) ModuleGraphNode)
-linkNodes summaries uid hue =
- let dflags = homeUnitEnv_dflags hue
- ofile = outputFile_ dflags
-
- unit_nodes :: [NodeKey]
- unit_nodes = map mkNodeKey (filter ((== uid) . mgNodeUnitId) summaries)
- -- Issue a warning for the confusing case where the user
- -- said '-o foo' but we're not going to do any linking.
- -- We attempt linking if either (a) one of the modules is
- -- called Main, or (b) the user said -no-hs-main, indicating
- -- that main() is going to come from somewhere else.
- --
- no_hs_main = gopt Opt_NoHsMain dflags
-
- main_sum = any (== NodeKey_Module (ModNodeKeyWithUid (GWIB (mainModuleNameIs dflags) NotBoot) uid)) unit_nodes
-
- do_linking = main_sum || no_hs_main || ghcLink dflags == LinkDynLib || ghcLink dflags == LinkStaticLib || ghcLink dflags == LinkBytecodeLib
-
- in if | isExecutableLink (ghcLink dflags) && isJust ofile && not do_linking ->
- Just (Left $ singleMessage $ mkPlainErrorMsgEnvelope noSrcSpan (DriverRedirectedNoMain $ mainModuleNameIs dflags))
- -- This should be an error, not a warning (#10895).
- | ghcLink dflags /= NoLink, do_linking -> Just (Right (LinkNode unit_nodes uid))
- | otherwise -> Nothing
-
getRootSummary ::
[ModuleName] ->
ModSummaryCache ->
@@ -858,6 +936,10 @@ rootSummariesParallel n_jobs hsc_env diag_wrapper msg get_summary = do
throwIO e
a -> pure a
+--------------------------------------------------------------------------------
+-- * Check/validate properties and error out
+--------------------------------------------------------------------------------
+
-- | This function checks then important property that if both p and q are home units
-- then any dependency of p, which transitively depends on q is also a home unit.
--
@@ -905,6 +987,10 @@ checkHomeUnitsClosed ue
let todo'' = (depends Set.\\ done) `Set.union` todo'
in DigraphNode uid uid (Set.toList depends) : go (Set.insert uid done) todo''
+--------------------------------------------------------------------------------
+-- * Enable Code Gen for Template Haskell
+--------------------------------------------------------------------------------
+
-- | Update the every ModSummary that is depended on
-- by a module that needs template haskell. We enable codegen to
-- the specified target, disable optimization and change the .hi
@@ -1223,7 +1309,8 @@ Potential TODOS:
-}
-----------------------------------------------------------------------------
--- Summarising modules
+-- * Pre-processing and Summarising and modules
+-----------------------------------------------------------------------------
-- We have two types of summarisation:
--
@@ -1639,9 +1726,11 @@ getPreprocessedImports hsc_env src_fn mb_phase maybe_buf = do
return PreprocessedImports {..}
--------------------------------------------------------------------------------
+-- * Generic traversal of iteratively-built graph: dfsBuild
+--------------------------------------------------------------------------------
-- | The result of expanding a node in 'dfsBuild'.
-data MGRes v
+data NodeRes v
-- | Computed the node payload successfully
= NSuccess v
-- | Skip a node! This means this node doesn't produce a payload and we can
@@ -1657,8 +1746,8 @@ data MGRes v
-- graph by iteratively expanding a node into a payload and a list of children
-- nodes to visit next.
--
--- A node is NEVER visited/expanded more than once, as long as the the
--- node key @k@, computed from the node @n@, uniquely identifies that node.
+-- A node is NEVER visited/expanded more than once, as long as the node key
+-- @k@, computed from the node @n@, uniquely identifies that node.
--
-- The first argument @base_map@ is the starting set of already visited nodes
-- (these nodes won't be expanded again!).
@@ -1678,17 +1767,17 @@ data MGRes v
--
-- See also Note [Downsweep Control Flow and Caching]
dfsBuild :: (Ord k, Monad m)
- => Maybe (Map.Map k (MGRes v))
+ => Maybe (Map.Map k (NodeRes v))
-- ^ Base map, existing results. We won't re-expand any of the nodes
-- already present in this map.
-> [n]
-- ^ The root nodes from where to start traversal
-> (n -> k)
-- ^ Compute the key which uniquely identifies this node
- -> (n -> m (MGRes (v,[n])))
+ -> (n -> m (NodeRes (v,[n])))
-- ^ Expand this node into its payload result and into the list of
-- children nodes to visit next.
- -> m (Map.Map k (MGRes v))
+ -> m (Map.Map k (NodeRes v))
-- ^ The result accumulates the payload of expanding the root nodes
-- and all nodes transitively reachable from those roots.
dfsBuild base_map roots key expand = go roots (fromMaybe Map.empty base_map)
@@ -1704,7 +1793,7 @@ dfsBuild base_map roots key expand = go roots (fromMaybe Map.empty base_map)
go ss
(Map.insert k NSkip visited) -- Skip!
NSuccess (v,ns) ->
- go (ns ++ ss {- todo: not use ++ here? -})
+ go (ns ++ ss)
(Map.insert k (NSuccess v) visited)
where
k = key s
@@ -1725,6 +1814,17 @@ twice).
same node of the module graph. Cache is keyed by the final
`ModuleGraph`s `NodeKey`s.
+ For example, suppose
+
+ A imports B and C
+ B imports D
+ C imports D
+
+ Then, starting from A we will expand A and push B and C to the worklist;
+ then, going back to B, we expand B which pushes D to the worklist. After
+ processing D, we go to C, which imports D, but we have already visited that
+ module so we can just use the already-constructed `ModuleGraphNode` for D.
+
2. For Module A in home-unit u1, each import in the list of imports
needs to be *found* (call to `findImportedModuleWithIsBoot`): at this
point, we only have the `ModuleName` of the import, not the `Module`.
@@ -1732,6 +1832,16 @@ twice).
(`ImportsCache`). The cache key is the home-unit to which the module
belongs~[1], the import package qualifier, and the ModuleName.
+ Same example, suppose
+
+ A imports B and C
+ B imports D
+ C imports D
+
+ When expanding B, we will findImportedModule "import D".
+ When expanding C, we would findImportedModule "import D", but we can just
+ look it up in the cache
+
[1] Different home-units will have different package flags, which means
potentially different `Module` resolution for the same `ModuleName`.
@@ -1745,8 +1855,13 @@ twice).
distinguish between `.hs` and `.hs-boot` files, as their summaries
will differ.
+ Note that this covers more than just (1), because we summarise all imports
+ of a single module when expanding it (see 'expandModuleSummary'), before
+ returning from the expansion function.
+
Note that (2) can't guarantee this alone: Two ModuleName imports in
separate units can (and likely do) map to the same `Module`.
-See also Note [Downsweep and the ModuleGraph]
+See also Note [Downsweep: building and maintaining the module graph] and
+Note [The ModuleGraph].
-}
=====================================
compiler/GHC/Driver/Env.hs
=====================================
@@ -270,7 +270,7 @@ hugSomeThingsBelowUs :: (HomeModInfo -> [a]) -> Bool -> HscEnv -> UnitId -> Modu
-- These things are currently stored in the EPS for home packages. (See #25795 for
-- progress in removing these kind of checks; and making these functions of
-- `UnitEnv` rather than `HscEnv`)
--- See Note [Downsweep and the ModuleGraph]
+-- See Note [The ModuleGraph]
hugSomeThingsBelowUs _ _ hsc_env _ _ | isOneShot (ghcMode (hsc_dflags hsc_env)) = return []
hugSomeThingsBelowUs extract include_hi_boot hsc_env uid mn
= let hug = hsc_HUG hsc_env
=====================================
compiler/GHC/Unit/Env.hs
=====================================
@@ -164,7 +164,7 @@ data UnitEnv = UnitEnv
, ue_module_graph :: ModuleGraph
-- ^ The module graph of the current session
- -- See Note [Downsweep and the ModuleGraph] for when this is constructed.
+ -- See Note [The ModuleGraph] for when this is constructed.
, ue_home_unit_graph :: !HomeUnitGraph
-- See Note [Multiple Home Units]
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/5bfee53ad2045e9c6f1dae6bd2abd7e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/5bfee53ad2045e9c6f1dae6bd2abd7e…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/jeltsch/textual-bytecode-output] 7 commits: Make HPC information hashes non-negative
by Wolfgang Jeltsch (@jeltsch) 30 Jul '26
by Wolfgang Jeltsch (@jeltsch) 30 Jul '26
30 Jul '26
Wolfgang Jeltsch pushed to branch wip/jeltsch/textual-bytecode-output at Glasgow Haskell Compiler / GHC
Commits:
40bd290f by Wolfgang Jeltsch at 2026-07-30T14:32:16+03:00
Make HPC information hashes non-negative
- - - - -
1433167b by Wolfgang Jeltsch at 2026-07-30T15:19:39+03:00
Change names of variables in `where` clauses to snake case
- - - - -
b74f57b8 by Wolfgang Jeltsch at 2026-07-30T15:36:32+03:00
Remove the module from HPC information output
- - - - -
86369aba by Wolfgang Jeltsch at 2026-07-30T15:47:51+03:00
Stop using the term “name” in entry titles
- - - - -
b83d4768 by Wolfgang Jeltsch at 2026-07-30T15:50:13+03:00
Change “ordinary object” to “object”
- - - - -
6f2ba014 by Wolfgang Jeltsch at 2026-07-30T16:27:29+03:00
Add parentheses around operators
- - - - -
3cf8ab69 by Wolfgang Jeltsch at 2026-07-30T16:30:31+03:00
Restore consequent two-spaces indentation
- - - - -
4 changed files:
- compiler/GHC/ByteCode/Show.hs
- testsuite/tests/show-bytecode/show-bytecode-breakpoints.stdout
- testsuite/tests/show-bytecode/show-bytecode-hpc.stdout
- testsuite/tests/show-bytecode/show-bytecode-vanilla.stdout
Changes:
=====================================
compiler/GHC/ByteCode/Show.hs
=====================================
@@ -1,3 +1,4 @@
+{-# LANGUAGE MagicHash #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE RecordWildCards #-}
@@ -34,8 +35,8 @@ import GHC.Data.FastString (unpackFS)
import GHC.Data.FlatBag (FlatBag, elemsFlatBag)
import GHC.Fingerprint (Fingerprint)
import GHC.Types.SrcLoc (noSrcSpan)
-import GHC.Types.Name (Name)
-import GHC.Types.Name.Occurrence (OccName)
+import GHC.Types.Name (Name, nameOccName)
+import GHC.Types.Name.Occurrence (OccName, isSymOcc)
import GHC.Types.Tickish (BreakTickIndex, BreakpointId (..))
import GHC.Types.SptEntry (SptEntry (..))
import GHC.Types.Error (MessageClass (MCDump))
@@ -57,12 +58,13 @@ import GHC.Utils.Outputable
withPprStyle,
ppr
)
-import GHC.Unit.Types (Module)
+import GHC.Unit.Types (Module, moduleName)
import GHC.Iface.Type (IfaceType, IfaceTvBndr, IfaceIdBndr)
import GHC.HsToCore.Breakpoints (ModBreaks (..))
import GHC.Driver.Env.Types (HscEnv)
import GHCi.FFI (FFIType)
import GHCi.Message (ConInfoTable (..))
+import Language.Haskell.Syntax.Module.Name (moduleNameString)
-- Basic things
import Control.Arrow ((>>>))
@@ -73,6 +75,7 @@ import Data.IntMap (IntMap)
import Data.IntMap qualified as IntMap (toList)
import Data.Array (bounds, indices, elems)
import Numeric (showHex)
+import GHC.Exts (Int (I#), Word (W#), int2Word#)
-- | Outputs textual information about the contents of a bytecode file.
showByteCode :: Logger -> HscEnv -> FilePath -> IO ()
@@ -87,14 +90,14 @@ showByteCode logger env path = do
pprOnDiskModuleByteCode :: OnDiskModuleByteCode -> SDoc
pprOnDiskModuleByteCode OnDiskModuleByteCode {..}
= vcat [
- pprModuleIdent $ odgbc_module,
+ pprModule $ odgbc_module,
pprOnDiskModuleByteCodeHash $ odgbc_hash,
pprCompiledByteCode odgbc_module $ odgbc_compiled_byte_code
]
--- | Constructs textual information about the name of a module.
-pprModuleIdent :: Module -> SDoc
-pprModuleIdent = entry (text "name") . ppr
+-- | Constructs textual information about a module.
+pprModule :: Module -> SDoc
+pprModule = entry (text "module") . ppr
-- | Constructs textual information about the hash of a module.
pprOnDiskModuleByteCodeHash :: Fingerprint -> SDoc
@@ -111,7 +114,7 @@ pprCompiledByteCode current_module CompiledByteCode {..}
pprTopLevelStrings $ bc_strs,
pprBreakpoints current_module $ bc_breaks,
pprStaticPointerTableEntries $ bc_spt_entries,
- pprHPCInfo $ bc_hpc_info
+ pprHPCInfo current_module $ bc_hpc_info
]
-- | Constructs textual information about bytecode objects.
@@ -129,7 +132,7 @@ pprByteCodeObject :: Module -- ^ The enclosing module
-> SDoc -- ^ The textual information
pprByteCodeObject current_module byte_code_object = case byte_code_object of
UnlinkedBCO {..}
- -> entry (text "ordinary object" <+> quotes (ppr unlinkedBCOName)) $
+ -> entry (text "object" <+> quotes (pprName unlinkedBCOName)) $
vcat [
pprArity $ unlinkedBCOArity,
pprLiterals current_module $ unlinkedBCOLits,
@@ -137,26 +140,25 @@ pprByteCodeObject current_module byte_code_object = case byte_code_object of
]
UnlinkedStaticCon {..}
-> entry (
- text "static-construction object" <+>
- quotes (ppr unlinkedStaticConName)
+ text "static-construction object" <+>
+ quotes (pprName unlinkedStaticConName)
)
$
vcat [
- pprDataConstructorName $ unlinkedStaticConDataConName,
+ pprDataConstructor $ unlinkedStaticConDataConName,
pprLiftedness $ not unlinkedStaticConIsUnlifted,
pprLiterals current_module $ unlinkedStaticConLits,
pprUsedItems current_module $ unlinkedStaticConPtrs
]
--- | Constructs textual information about the arity of an ordinary bytecode
--- object.
+-- | Constructs textual information about the arity of a bytecode object.
pprArity :: Int -> SDoc
pprArity = entry (text "arity") . ppr
--- | Constructs textual information about the data constructor name of a
+-- | Constructs textual information about the data constructor of a
-- static-construction bytecode object.
-pprDataConstructorName :: Name -> SDoc
-pprDataConstructorName = entry (text "data constructor name") . ppr
+pprDataConstructor :: Name -> SDoc
+pprDataConstructor = entry (text "data constructor") . pprName
-- | Constructs textual information about the liftedness of a
-- static-construction bytecode object.
@@ -185,10 +187,10 @@ pprLiteral current_module literal = case literal of
quotes (ppr label)
BCONPtrItbl infoTableName
-> text "info table of" <+>
- quotes (ppr infoTableName)
+ quotes (pprName infoTableName)
BCONPtrAddr addrName
-> text "address" <+>
- quotes (ppr addrName)
+ quotes (pprName addrName)
BCONPtrStr encoded_string
-> text "top-level string" <+>
text (show (utf8DecodeByteString encoded_string))
@@ -221,14 +223,14 @@ pprInternalBreakpointID
-> InternalBreakpointId -- ^ The ID of the bytecode breakpoint
-> SDoc -- ^ The textual information
pprInternalBreakpointID current_module InternalBreakpointId {..}
- | ibi_info_mod == current_module = indexDoc
- | otherwise = indexDoc <+>
+ | ibi_info_mod == current_module = index_doc
+ | otherwise = index_doc <+>
text "in" <+>
quotes (ppr ibi_info_mod)
where
- indexDoc :: SDoc
- indexDoc = ppr ibi_info_index
+ index_doc :: SDoc
+ index_doc = ppr ibi_info_index
-- | Constructs textual information about used items.
pprUsedItems :: Module -- ^ The enclosing module
@@ -245,7 +247,7 @@ pprUsedItem :: Module -- ^ The enclosing module
-> SDoc -- ^ The textual information
pprUsedItem current_module usedItem = case usedItem of
BCOPtrName name
- -> text "named item" <+> quotes (ppr name)
+ -> text "named item" <+> quotes (pprName name)
BCOPtrPrimOp primOp
-> text "primitive operation" <+> quotes (ppr primOp)
BCOPtrBCO byte_code_object
@@ -262,7 +264,7 @@ pprDataConstructorInfoTables = entry (text "data constructor info tables") .
-- | Constructs textual information about a single data constructor info table.
pprDataConstructorInfoTable :: Name -> ConInfoTable -> SDoc
pprDataConstructorInfoTable dataConstrName ConInfoTable {..}
- = entry (text "info table of" <+> quotes (ppr dataConstrName)) $
+ = entry (text "info table of" <+> quotes (pprName dataConstrName)) $
vcat [
pprPointerWordCount $ conItblPtrs,
pprNonPointerWordCount $ conItblNPtrs
@@ -284,10 +286,10 @@ pprTopLevelStrings = entry (text "top-level strings") .
-- | Constructs textual information about a single top-level string.
pprTopLevelString :: Name -> ByteString -> SDoc
-pprTopLevelString string_name encoded_string = entry (ppr string_name) $
- text $
- show $
- utf8DecodeByteString $
+pprTopLevelString string_name encoded_string = entry (pprName string_name) $
+ text $
+ show $
+ utf8DecodeByteString $
encoded_string
-- | Constructs textual information about breakpoints.
@@ -429,14 +431,14 @@ pprBreakpointID :: Module -- ^ The enclosing module
-> BreakpointId -- ^ The ID of the source breakpoint
-> SDoc -- ^ The textual information
pprBreakpointID current_module BreakpointId {..}
- | bi_tick_mod == current_module = indexDoc
- | otherwise = indexDoc <+>
+ | bi_tick_mod == current_module = index_doc
+ | otherwise = index_doc <+>
text "in" <+>
quotes (ppr bi_tick_mod)
where
- indexDoc :: SDoc
- indexDoc = ppr bi_tick_index
+ index_doc :: SDoc
+ index_doc = ppr bi_tick_index
-- | Constructs textual information about static-pointer table entries.
pprStaticPointerTableEntries :: [SptEntry] -> SDoc
@@ -447,58 +449,69 @@ pprStaticPointerTableEntries = entry (text "static-pointer table entries") .
-- | Constructs textual information about a single static-pointer table entry.
pprStaticPointerTableEntry :: SptEntry -> SDoc
pprStaticPointerTableEntry (SptEntry name fingerprint)
- = ppr fingerprint <> text ":" <+> ppr name
+ = ppr fingerprint <> text ":" <+> pprName name
-- | Constructs textual information about HPC info.
-pprHPCInfo :: Strict.Maybe ByteCodeHpcInfo -> SDoc
-pprHPCInfo = entry (text "HPC information") .
- Strict.maybe (text "<none>") pprActualHPCInfo
+pprHPCInfo :: Module -- ^ The enclosing module
+ -> Strict.Maybe ByteCodeHpcInfo -- ^ The HPC info
+ -> SDoc -- ^ The textual information
+pprHPCInfo current_module
+ = entry (text "HPC information") .
+ Strict.maybe (text "<none>") (pprActualHPCInfo current_module)
-- | Constructs textual information about actual HPC info.
-pprActualHPCInfo :: ByteCodeHpcInfo -> SDoc
-pprActualHPCInfo ByteCodeHpcInfo {..}
- = vcat [
+pprActualHPCInfo :: Module -- ^ The enclosing module
+ -> ByteCodeHpcInfo -- ^ The actual HPC info
+ -> SDoc -- ^ The textual information
+pprActualHPCInfo current_module ByteCodeHpcInfo {..}
+ = assert (
+ utf8DecodeShortByteString bchi_module_name
+ ==
+ moduleNameString (moduleName current_module)
+ )
+ $
+ vcat [
pprHPCInfoHash $ bchi_hash,
- pprModuleName $ bchi_module_name,
- pprTickBoxName $ bchi_tickbox_name,
+ pprTickBox $ bchi_tickbox_name,
pprTickCount $ bchi_tick_count
]
-- | Constructs textual information about the hash of HPC info.
pprHPCInfoHash :: Int -> SDoc
-pprHPCInfoHash = entry (text "hash") . pprFixedSizeNatural
-
--- | Constructs textual information about a module name.
-pprModuleName :: ShortByteString -> SDoc
-pprModuleName = entry (text "module name") .
- text .
- utf8DecodeShortByteString
+pprHPCInfoHash = entry (text "hash") . pprFixedSizeNatural . intToWord
--- | Constructs textual information about a tick box name.
-pprTickBoxName :: ShortByteString -> SDoc
-pprTickBoxName = entry (text "tick box name") .
- text .
- utf8DecodeShortByteString
+-- | Constructs textual information about a tick box.
+pprTickBox :: ShortByteString -> SDoc
+pprTickBox = entry (text "tick box") . text . utf8DecodeShortByteString
-- | Constructs textual information about a number of tick counts.
pprTickCount :: Int -> SDoc
pprTickCount = entry (text "number of ticks") . ppr
+-- | Constructs the Haskell representation of a name.
+pprName :: Name -> SDoc
+pprName name | isSymOcc (nameOccName name) = text "(" <> ppr name <> text ")"
+ | otherwise = ppr name
+
-- | Constructs a hexadecimal representation of a natural number such that the
-- number of hexadecimal digits fits the number of bits used to represent the
-- natural number.
pprFixedSizeNatural :: (Integral a, FiniteBits a) => a -> SDoc
pprFixedSizeNatural num
= assert (num >= 0) $
- text $ replicate (digitCount - length unpadded) '0' ++ unpadded
+ text $ replicate (digit_count - length unpadded) '0' ++ unpadded
where
- digitCount :: Int
- digitCount = (finiteBitSize num + 3) `div` 4
+ digit_count :: Int
+ digit_count = (finiteBitSize num + 3) `div` 4
unpadded :: String
unpadded = showHex num ""
+-- | Turns an 'Int' value into the 'Word' value with the same representation.
+intToWord :: Int -> Word
+intToWord (I# int#) = W# (int2Word# int#)
+
-- | Constructs a textual representation of a boolean, interpreting 'True' and
-- 'False' as “yes” and “no”, respectively.
noOrYes :: Bool -> SDoc
=====================================
testsuite/tests/show-bytecode/show-bytecode-breakpoints.stdout
=====================================
@@ -1,8 +1,8 @@
[1 of 1] Compiling Example ( Example.hs, Example.gbc )
-name: Example
+module: Example
hash: @hash@
objects:
- ordinary object ‘primesPtr’:
+ object ‘primesPtr’:
arity: 0
literals:
top-level string "Example"
@@ -14,7 +14,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr1’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -23,56 +23,56 @@ objects:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘primes’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 27
used items: <none>
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 20
used items: <none>
- ordinary object ‘primes’:
+ object ‘primes’:
arity: 0
literals:
top-level string "Example"
top-level string "main"
cost center of breakpoint 2
- info table of ‘:’
+ info table of ‘(:)’
used items:
break array of module ‘Example’
- ordinary object ‘primes_sat_@name_suffix@’:
+ object ‘primes_sat_@name_suffix@’:
arity: 0
literals:
top-level string "Example"
@@ -80,11 +80,11 @@ objects:
cost center of breakpoint 1
used items:
break array of module ‘Example’
- ordinary object ‘primes_sat_@name_suffix@’:
+ object ‘primes_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘primes_sat_@name_suffix@’:
+ object ‘primes_sat_@name_suffix@’:
arity: 0
literals:
word 3
@@ -96,7 +96,7 @@ objects:
named item ‘enumFrom’
named item ‘isPrime_@name_suffix@’
named item ‘filter’
- ordinary object ‘primes_sat_@name_suffix@’:
+ object ‘primes_sat_@name_suffix@’:
arity: 0
literals:
word 2
@@ -104,7 +104,7 @@ objects:
used items:
named item ‘$fNumNatural’
named item ‘fromInteger’
- ordinary object ‘isPrime_@name_suffix@’:
+ object ‘isPrime_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -112,7 +112,7 @@ objects:
cost center of breakpoint 9
used items:
break array of module ‘Example’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -120,7 +120,7 @@ objects:
cost center of breakpoint 8
used items:
break array of module ‘Example’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -128,7 +128,7 @@ objects:
cost center of breakpoint 7
used items:
break array of module ‘Example’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -136,7 +136,7 @@ objects:
cost center of breakpoint 6
used items:
break array of module ‘Example’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 0
literals:
top-level string "Example"
@@ -146,18 +146,18 @@ objects:
info table of ‘IS’
used items:
break array of module ‘Example’
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fIntegralInteger’
named item ‘$fNumNatural’
- named item ‘^’
- ordinary object ‘pap_@name_suffix@’:
+ named item ‘(^)’
+ object ‘pap_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -165,20 +165,20 @@ objects:
cost center of breakpoint 4
used items:
break array of module ‘Example’
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fOrdNatural’
- named item ‘<=’
- ordinary object ‘pap_@name_suffix@’:
+ named item ‘(<=)’
+ object ‘pap_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- named item ‘.’
+ named item ‘(.)’
named item ‘primes’
named item ‘takeWhile’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
top-level string "Example"
@@ -186,7 +186,7 @@ objects:
cost center of breakpoint 3
used items:
break array of module ‘Example’
- ordinary object ‘pap_@name_suffix@’:
+ object ‘pap_@name_suffix@’:
arity: 2
literals: <none>
used items:
@@ -195,7 +195,7 @@ objects:
named item ‘$fFoldableList’
named item ‘any’
named item ‘not’
- ordinary object ‘fibonaccisPtr’:
+ object ‘fibonaccisPtr’:
arity: 0
literals:
top-level string "Example"
@@ -207,7 +207,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -216,56 +216,56 @@ objects:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘fibonaccis’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 15
used items: <none>
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 24
used items: <none>
- ordinary object ‘fibonaccis’:
+ object ‘fibonaccis’:
arity: 0
literals:
top-level string "Example"
top-level string "main"
cost center of breakpoint 11
- info table of ‘:’
+ info table of ‘(:)’
used items:
break array of module ‘Example’
- ordinary object ‘fibonaccis_sat_@name_suffix@’:
+ object ‘fibonaccis_sat_@name_suffix@’:
arity: 0
literals:
word 0
@@ -274,16 +274,16 @@ objects:
named item ‘$fNumNatural’
named item ‘fromInteger’
named item ‘positiveFibonaccis_@name_suffix@’
- ordinary object ‘positiveFibonaccis_@name_suffix@’:
+ object ‘positiveFibonaccis_@name_suffix@’:
arity: 0
literals:
top-level string "Example"
top-level string "main"
cost center of breakpoint 13
- info table of ‘:’
+ info table of ‘(:)’
used items:
break array of module ‘Example’
- ordinary object ‘positiveFibonaccis_sat_@name_suffix@’:
+ object ‘positiveFibonaccis_sat_@name_suffix@’:
arity: 0
literals:
top-level string "Example"
@@ -291,16 +291,16 @@ objects:
cost center of breakpoint 12
used items:
break array of module ‘Example’
- ordinary object ‘positiveFibonaccis_sat_@name_suffix@’:
+ object ‘positiveFibonaccis_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fNumNatural’
- named item ‘+’
+ named item ‘(+)’
named item ‘positiveFibonaccis_@name_suffix@’
named item ‘fibonaccis’
named item ‘zipWith’
- ordinary object ‘positiveFibonaccis_sat_@name_suffix@’:
+ object ‘positiveFibonaccis_sat_@name_suffix@’:
arity: 0
literals:
word 1
@@ -308,27 +308,27 @@ objects:
used items:
named item ‘$fNumNatural’
named item ‘fromInteger’
- ordinary object ‘$dTypeable2_@name_suffix@’:
+ object ‘$dTypeable2_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$dTypeable_@name_suffix@’
named item ‘$dTypeable1_@name_suffix@’
named item ‘mkTrAppChecked’
- ordinary object ‘$dTypeable1_@name_suffix@’:
+ object ‘$dTypeable1_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcList’
named item ‘mkTrCon’
- ordinary object ‘$dTypeable_@name_suffix@’:
+ object ‘$dTypeable_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcNatural’
named item ‘mkTrCon’
static-construction object ‘$tc'Nested’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -339,33 +339,33 @@ objects:
named item ‘$tc'Nested2_@name_suffix@’
named item ‘$krep17_@name_suffix@’
static-construction object ‘$tc'Nested2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Nested1_@name_suffix@’
used items: <none>
static-construction object ‘$krep17_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep16_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep16_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep15_@name_suffix@’
static-construction object ‘$krep15_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep4_@name_suffix@’
named item ‘[]’
static-construction object ‘$tc'PerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -376,33 +376,33 @@ objects:
named item ‘$tc'PerfectTree2_@name_suffix@’
named item ‘$krep14_@name_suffix@’
static-construction object ‘$tc'PerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'PerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep14_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep13_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep12_@name_suffix@’
static-construction object ‘$krep12_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcPerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -413,12 +413,12 @@ objects:
named item ‘$tcPerfectTree2_@name_suffix@’
named item ‘krep$*Arr*’
static-construction object ‘$tcPerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcPerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$tc'Node’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -429,33 +429,33 @@ objects:
named item ‘$tc'Node2_@name_suffix@’
named item ‘$krep11_@name_suffix@’
static-construction object ‘$tc'Node2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Node1_@name_suffix@’
used items: <none>
static-construction object ‘$krep11_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep10_@name_suffix@’
static-construction object ‘$krep10_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘$krep9_@name_suffix@’
static-construction object ‘$krep9_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$tc'Leaf’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -466,40 +466,40 @@ objects:
named item ‘$tc'Leaf2_@name_suffix@’
named item ‘$krep8_@name_suffix@’
static-construction object ‘$tc'Leaf2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Leaf1_@name_suffix@’
used items: <none>
static-construction object ‘$krep8_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$krep7_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcBinTree’
named item ‘$krep6_@name_suffix@’
static-construction object ‘$krep6_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep5_@name_suffix@’
static-construction object ‘$krep5_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcBinTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -510,79 +510,79 @@ objects:
named item ‘$tcBinTree2_@name_suffix@’
named item ‘krep$*->*->*’
static-construction object ‘$tcBinTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcBinTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep4_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcTuple2’
named item ‘$krep3_@name_suffix@’
static-construction object ‘$krep3_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep2_@name_suffix@’
static-construction object ‘$krep2_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$krep1_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 0
used items: <none>
static-construction object ‘$krep_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 1
used items: <none>
static-construction object ‘$trModule’:
- data constructor name: Module
+ data constructor: Module
lifted: yes
literals: <none>
used items:
named item ‘$trModule2_@name_suffix@’
named item ‘$trModule4_@name_suffix@’
static-construction object ‘$trModule4_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule3_@name_suffix@’
used items: <none>
static-construction object ‘$trModule2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule1_@name_suffix@’
used items: <none>
- ordinary object ‘divides’:
+ object ‘divides’:
arity: 3
literals: <none>
used items:
- ordinary object ‘$dReal_@name_suffix@’:
+ object ‘$dReal_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘$dNum_@name_suffix@’:
+ object ‘$dNum_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘$dEq_@name_suffix@’:
+ object ‘$dEq_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘$dEq1_@name_suffix@’:
+ object ‘$dEq1_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘bcprep_@name_suffix@’:
+ object ‘bcprep_@name_suffix@’:
arity: 5
literals:
top-level string "Example"
@@ -590,13 +590,13 @@ objects:
cost center of breakpoint 15
used items:
break array of module ‘Example’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 1
literals:
word 0
info table of ‘IS’
used items: named item ‘fromInteger’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 3
literals:
top-level string "Example"
@@ -605,24 +605,24 @@ objects:
used items:
break array of module ‘Example’
named item ‘mod’
- named item ‘==’
+ named item ‘(==)’
named item ‘$p1Ord’
named item ‘$p2Real’
named item ‘$p1Real’
named item ‘$p1Integral’
- ordinary object ‘Node’:
+ object ‘Node’:
arity: 3
literals: info table of ‘Node’
used items: <none>
- ordinary object ‘Leaf’:
+ object ‘Leaf’:
arity: 1
literals: info table of ‘Leaf’
used items: <none>
- ordinary object ‘Nested’:
+ object ‘Nested’:
arity: 1
literals: info table of ‘Nested’
used items: <none>
- ordinary object ‘PerfectTree’:
+ object ‘PerfectTree’:
arity: 1
literals: info table of ‘PerfectTree’
used items: <none>
=====================================
testsuite/tests/show-bytecode/show-bytecode-hpc.stdout
=====================================
@@ -1,8 +1,8 @@
[1 of 1] Compiling Example ( Example.hs, Example.gbc )
-name: Example
+module: Example
hash: @hash@
objects:
- ordinary object ‘primesPtr’:
+ object ‘primesPtr’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -12,7 +12,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr1’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -21,59 +21,59 @@ objects:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 27
used items: <none>
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 20
used items: <none>
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘primes’
- ordinary object ‘primes2_@name_suffix@’:
+ object ‘primes2_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘primes2_sat_@name_suffix@’:
+ object ‘primes2_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘primes2_sat_@name_suffix@’:
+ object ‘primes2_sat_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -84,110 +84,110 @@ objects:
named item ‘fromInteger’
named item ‘$fEnumNatural’
named item ‘enumFrom’
- ordinary object ‘primes2_sat_@name_suffix@’:
+ object ‘primes2_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘isPrime_@name_suffix@’
named item ‘filter’
- ordinary object ‘isPrime_@name_suffix@’:
+ object ‘isPrime_@name_suffix@’:
arity: 1
literals:
label ‘_hpc_tickboxes_Example_hpc’
label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘primes’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
named item ‘$fIntegralInteger’
named item ‘$fNumNatural’
- named item ‘^’
- ordinary object ‘v1_@name_suffix@’:
+ named item ‘(^)’
+ object ‘v1_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
word 2
info table of ‘IS’
used items: <none>
- ordinary object ‘pap_@name_suffix@’:
+ object ‘pap_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
named item ‘$fOrdNatural’
- named item ‘<=’
- ordinary object ‘v1_@name_suffix@’:
+ named item ‘(<=)’
+ object ‘v1_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: <none>
- ordinary object ‘pap_@name_suffix@’:
+ object ‘pap_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- named item ‘.’
+ named item ‘(.)’
named item ‘takeWhile’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘pap_@name_suffix@’:
+ object ‘pap_@name_suffix@’:
arity: 2
literals: <none>
used items:
named item ‘$fIntegralNatural’
named item ‘divides’
- ordinary object ‘v1_@name_suffix@’:
+ object ‘v1_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: <none>
- ordinary object ‘pap_@name_suffix@’:
+ object ‘pap_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
named item ‘$fFoldableList’
named item ‘any’
named item ‘not’
- ordinary object ‘primes’:
+ object ‘primes’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
label ‘_hpc_tickboxes_Example_hpc’
- info table of ‘:’
+ info table of ‘(:)’
used items:
named item ‘primes2_@name_suffix@’
named item ‘primes1_@name_suffix@’
- ordinary object ‘primes1_@name_suffix@’:
+ object ‘primes1_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -196,7 +196,7 @@ objects:
used items:
named item ‘$fNumNatural’
named item ‘fromInteger’
- ordinary object ‘fibonaccisPtr’:
+ object ‘fibonaccisPtr’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -206,7 +206,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -215,92 +215,92 @@ objects:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 15
used items: <none>
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 24
used items: <none>
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘fibonaccis’
- ordinary object ‘positiveFibonaccis1_@name_suffix@’:
+ object ‘positiveFibonaccis1_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
label ‘_hpc_tickboxes_Example_hpc’
- info table of ‘:’
+ info table of ‘(:)’
used items:
named item ‘positiveFibonaccis2_@name_suffix@’
named item ‘positiveFibonaccis_@name_suffix@’
- ordinary object ‘positiveFibonaccis2_@name_suffix@’:
+ object ‘positiveFibonaccis2_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘positiveFibonaccis2_sat_@name_suffix@’:
+ object ‘positiveFibonaccis2_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘positiveFibonaccis1_@name_suffix@’
- ordinary object ‘positiveFibonaccis2_sat_@name_suffix@’:
+ object ‘positiveFibonaccis2_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘fibonaccis’
- ordinary object ‘positiveFibonaccis2_sat_@name_suffix@’:
+ object ‘positiveFibonaccis2_sat_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
named item ‘$fNumNatural’
- named item ‘+’
+ named item ‘(+)’
named item ‘zipWith’
- ordinary object ‘fibonaccis’:
+ object ‘fibonaccis’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
label ‘_hpc_tickboxes_Example_hpc’
- info table of ‘:’
+ info table of ‘(:)’
used items:
named item ‘fibonaccis2_@name_suffix@’
named item ‘fibonaccis1_@name_suffix@’
- ordinary object ‘fibonaccis2_@name_suffix@’:
+ object ‘fibonaccis2_@name_suffix@’:
arity: 0
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: named item ‘positiveFibonaccis1_@name_suffix@’
- ordinary object ‘positiveFibonaccis_@name_suffix@’:
+ object ‘positiveFibonaccis_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -309,7 +309,7 @@ objects:
used items:
named item ‘$fNumNatural’
named item ‘fromInteger’
- ordinary object ‘fibonaccis1_@name_suffix@’:
+ object ‘fibonaccis1_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
@@ -318,27 +318,27 @@ objects:
used items:
named item ‘$fNumNatural’
named item ‘fromInteger’
- ordinary object ‘$dTypeable2_@name_suffix@’:
+ object ‘$dTypeable2_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$dTypeable_@name_suffix@’
named item ‘$dTypeable1_@name_suffix@’
named item ‘mkTrAppChecked’
- ordinary object ‘$dTypeable1_@name_suffix@’:
+ object ‘$dTypeable1_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcList’
named item ‘mkTrCon’
- ordinary object ‘$dTypeable_@name_suffix@’:
+ object ‘$dTypeable_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcNatural’
named item ‘mkTrCon’
static-construction object ‘$tc'Nested’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -349,33 +349,33 @@ objects:
named item ‘$tc'Nested2_@name_suffix@’
named item ‘$krep17_@name_suffix@’
static-construction object ‘$tc'Nested2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Nested1_@name_suffix@’
used items: <none>
static-construction object ‘$krep17_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep16_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep16_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep15_@name_suffix@’
static-construction object ‘$krep15_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep4_@name_suffix@’
named item ‘[]’
static-construction object ‘$tc'PerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -386,33 +386,33 @@ objects:
named item ‘$tc'PerfectTree2_@name_suffix@’
named item ‘$krep14_@name_suffix@’
static-construction object ‘$tc'PerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'PerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep14_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep13_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep12_@name_suffix@’
static-construction object ‘$krep12_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcPerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -423,12 +423,12 @@ objects:
named item ‘$tcPerfectTree2_@name_suffix@’
named item ‘krep$*Arr*’
static-construction object ‘$tcPerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcPerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$tc'Node’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -439,33 +439,33 @@ objects:
named item ‘$tc'Node2_@name_suffix@’
named item ‘$krep11_@name_suffix@’
static-construction object ‘$tc'Node2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Node1_@name_suffix@’
used items: <none>
static-construction object ‘$krep11_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep10_@name_suffix@’
static-construction object ‘$krep10_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘$krep9_@name_suffix@’
static-construction object ‘$krep9_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$tc'Leaf’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -476,40 +476,40 @@ objects:
named item ‘$tc'Leaf2_@name_suffix@’
named item ‘$krep8_@name_suffix@’
static-construction object ‘$tc'Leaf2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Leaf1_@name_suffix@’
used items: <none>
static-construction object ‘$krep8_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$krep7_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcBinTree’
named item ‘$krep6_@name_suffix@’
static-construction object ‘$krep6_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep5_@name_suffix@’
static-construction object ‘$krep5_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcBinTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -520,117 +520,117 @@ objects:
named item ‘$tcBinTree2_@name_suffix@’
named item ‘krep$*->*->*’
static-construction object ‘$tcBinTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcBinTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep4_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcTuple2’
named item ‘$krep3_@name_suffix@’
static-construction object ‘$krep3_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep2_@name_suffix@’
static-construction object ‘$krep2_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$krep1_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 0
used items: <none>
static-construction object ‘$krep_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 1
used items: <none>
static-construction object ‘$trModule’:
- data constructor name: Module
+ data constructor: Module
lifted: yes
literals: <none>
used items:
named item ‘$trModule2_@name_suffix@’
named item ‘$trModule4_@name_suffix@’
static-construction object ‘$trModule4_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule3_@name_suffix@’
used items: <none>
static-construction object ‘$trModule2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule1_@name_suffix@’
used items: <none>
- ordinary object ‘divides’:
+ object ‘divides’:
arity: 3
literals: <none>
used items:
- ordinary object ‘$dReal_@name_suffix@’:
+ object ‘$dReal_@name_suffix@’:
arity: 0
literals:
label ‘_hpc_tickboxes_Example_hpc’
label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 1
literals:
label ‘_hpc_tickboxes_Example_hpc’
word 0
info table of ‘IS’
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘fromInteger’
named item ‘$p1Real’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 3
literals: label ‘_hpc_tickboxes_Example_hpc’
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: <none>
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 1
literals: label ‘_hpc_tickboxes_Example_hpc’
used items: <none>
named item ‘mod’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
- used items: named item ‘==’
+ used items: named item ‘(==)’
named item ‘$p1Ord’
named item ‘$p2Real’
named item ‘$p1Integral’
- ordinary object ‘Node’:
+ object ‘Node’:
arity: 3
literals: info table of ‘Node’
used items: <none>
- ordinary object ‘Leaf’:
+ object ‘Leaf’:
arity: 1
literals: info table of ‘Leaf’
used items: <none>
- ordinary object ‘Nested’:
+ object ‘Nested’:
arity: 1
literals: info table of ‘Nested’
used items: <none>
- ordinary object ‘PerfectTree’:
+ object ‘PerfectTree’:
arity: 1
literals: info table of ‘PerfectTree’
used items: <none>
@@ -662,7 +662,6 @@ static-pointer table entries:
@hash@: static_ptr1
HPC information:
hash: @hash@
- module name: Example
- tick box name: _hpc_tickboxes_Example_hpc
+ tick box: _hpc_tickboxes_Example_hpc
number of ticks: 45
=====================================
testsuite/tests/show-bytecode/show-bytecode-vanilla.stdout
=====================================
@@ -1,8 +1,8 @@
[1 of 1] Compiling Example ( Example.hs, Example.gbc )
-name: Example
+module: Example
hash: @hash@
objects:
- ordinary object ‘primesPtr’:
+ object ‘primesPtr’:
arity: 0
literals: <none>
used items:
@@ -10,7 +10,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr1’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -19,96 +19,96 @@ objects:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘primes’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr1_sat_@name_suffix@’:
+ object ‘static_ptr1_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr1_sat_@name_suffix@’
named item ‘static_ptr1_sat_@name_suffix@’
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 27
used items: <none>
static-construction object ‘static_ptr1_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 20
used items: <none>
- ordinary object ‘primes2_@name_suffix@’:
+ object ‘primes2_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘primes2_sat_@name_suffix@’
named item ‘isPrime_@name_suffix@’
named item ‘filter’
- ordinary object ‘isPrime_@name_suffix@’:
+ object ‘isPrime_@name_suffix@’:
arity: 1
literals: <none>
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: <none>
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals: <none>
used items:
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 1
literals:
word 2
info table of ‘IS’
used items:
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fIntegralInteger’
named item ‘$fNumNatural’
- named item ‘^’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ named item ‘(^)’
+ object ‘isPrime_sat_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- ordinary object ‘v_@name_suffix@’:
+ object ‘v_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fOrdNatural’
- named item ‘<=’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ named item ‘(<=)’
+ object ‘isPrime_sat_@name_suffix@’:
arity: 3
literals: <none>
used items: <none>
- named item ‘.’
+ named item ‘(.)’
named item ‘primes’
named item ‘takeWhile’
- ordinary object ‘isPrime_sat_@name_suffix@’:
+ object ‘isPrime_sat_@name_suffix@’:
arity: 2
literals: <none>
used items:
@@ -118,17 +118,17 @@ objects:
named item ‘any’
named item ‘not’
static-construction object ‘primes’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘primes1_@name_suffix@’
named item ‘primes2_@name_suffix@’
- ordinary object ‘primes2_sat_@name_suffix@’:
+ object ‘primes2_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘primes2_sat_@name_suffix@’:
+ object ‘primes2_sat_@name_suffix@’:
arity: 0
literals:
word 3
@@ -138,7 +138,7 @@ objects:
named item ‘fromInteger’
named item ‘$fEnumNatural’
named item ‘enumFrom’
- ordinary object ‘primes1_@name_suffix@’:
+ object ‘primes1_@name_suffix@’:
arity: 0
literals: <none>
used items:
@@ -146,11 +146,11 @@ objects:
named item ‘$fNumNatural’
named item ‘fromInteger’
static-construction object ‘primes1_sat_@name_suffix@’:
- data constructor name: IS
+ data constructor: IS
lifted: yes
literals: word 2
used items: <none>
- ordinary object ‘fibonaccisPtr’:
+ object ‘fibonaccisPtr’:
arity: 0
literals: <none>
used items:
@@ -158,7 +158,7 @@ objects:
named item ‘$dTypeable2_@name_suffix@’
named item ‘$fIsStaticStaticPtr’
static-construction object ‘static_ptr’:
- data constructor name: StaticPtr
+ data constructor: StaticPtr
lifted: yes
literals:
word @large_word@
@@ -167,47 +167,47 @@ objects:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘fibonaccis’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: StaticPtrInfo
+ data constructor: StaticPtrInfo
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "main"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: top-level string "Example"
used items:
- ordinary object ‘static_ptr_sat_@name_suffix@’:
+ object ‘static_ptr_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘unpackCString#’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: (,)
+ data constructor: (,)
lifted: yes
literals: <none>
used items:
named item ‘static_ptr_sat_@name_suffix@’
named item ‘static_ptr_sat_@name_suffix@’
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 15
used items: <none>
static-construction object ‘static_ptr_sat_@name_suffix@’:
- data constructor name: I#
+ data constructor: I#
lifted: yes
literals: word 24
used items: <none>
- ordinary object ‘positiveFibonaccis2_@name_suffix@’:
+ object ‘positiveFibonaccis2_@name_suffix@’:
arity: 0
literals: <none>
used items:
@@ -216,26 +216,26 @@ objects:
named item ‘positiveFibonaccis2_sat_@name_suffix@’
named item ‘zipWith’
static-construction object ‘positiveFibonaccis1_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘positiveFibonaccis_@name_suffix@’
named item ‘positiveFibonaccis2_@name_suffix@’
static-construction object ‘fibonaccis’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘fibonaccis1_@name_suffix@’
named item ‘positiveFibonaccis1_@name_suffix@’
- ordinary object ‘positiveFibonaccis2_sat_@name_suffix@’:
+ object ‘positiveFibonaccis2_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$fNumNatural’
- named item ‘+’
- ordinary object ‘positiveFibonaccis_@name_suffix@’:
+ named item ‘(+)’
+ object ‘positiveFibonaccis_@name_suffix@’:
arity: 0
literals: <none>
used items:
@@ -243,11 +243,11 @@ objects:
named item ‘$fNumNatural’
named item ‘fromInteger’
static-construction object ‘positiveFibonaccis_sat_@name_suffix@’:
- data constructor name: IS
+ data constructor: IS
lifted: yes
literals: word 1
used items: <none>
- ordinary object ‘fibonaccis1_@name_suffix@’:
+ object ‘fibonaccis1_@name_suffix@’:
arity: 0
literals: <none>
used items:
@@ -255,31 +255,31 @@ objects:
named item ‘$fNumNatural’
named item ‘fromInteger’
static-construction object ‘fibonaccis1_sat_@name_suffix@’:
- data constructor name: IS
+ data constructor: IS
lifted: yes
literals: word 0
used items: <none>
- ordinary object ‘$dTypeable2_@name_suffix@’:
+ object ‘$dTypeable2_@name_suffix@’:
arity: 0
literals: <none>
used items:
named item ‘$dTypeable_@name_suffix@’
named item ‘$dTypeable1_@name_suffix@’
named item ‘mkTrAppChecked’
- ordinary object ‘$dTypeable1_@name_suffix@’:
+ object ‘$dTypeable1_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcList’
named item ‘mkTrCon’
- ordinary object ‘$dTypeable_@name_suffix@’:
+ object ‘$dTypeable_@name_suffix@’:
arity: 0
literals: info table of ‘[]’
used items:
named item ‘$tcNatural’
named item ‘mkTrCon’
static-construction object ‘$tc'Nested’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -290,33 +290,33 @@ objects:
named item ‘$tc'Nested2_@name_suffix@’
named item ‘$krep17_@name_suffix@’
static-construction object ‘$tc'Nested2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Nested1_@name_suffix@’
used items: <none>
static-construction object ‘$krep17_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep16_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep16_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep15_@name_suffix@’
static-construction object ‘$krep15_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep4_@name_suffix@’
named item ‘[]’
static-construction object ‘$tc'PerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -327,33 +327,33 @@ objects:
named item ‘$tc'PerfectTree2_@name_suffix@’
named item ‘$krep14_@name_suffix@’
static-construction object ‘$tc'PerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'PerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep14_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep13_@name_suffix@’
static-construction object ‘$krep13_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcPerfectTree’
named item ‘$krep12_@name_suffix@’
static-construction object ‘$krep12_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcPerfectTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -364,12 +364,12 @@ objects:
named item ‘$tcPerfectTree2_@name_suffix@’
named item ‘krep$*Arr*’
static-construction object ‘$tcPerfectTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcPerfectTree1_@name_suffix@’
used items: <none>
static-construction object ‘$tc'Node’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -380,33 +380,33 @@ objects:
named item ‘$tc'Node2_@name_suffix@’
named item ‘$krep11_@name_suffix@’
static-construction object ‘$tc'Node2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Node1_@name_suffix@’
used items: <none>
static-construction object ‘$krep11_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep10_@name_suffix@’
static-construction object ‘$krep10_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘$krep9_@name_suffix@’
static-construction object ‘$krep9_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep7_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$tc'Leaf’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -417,40 +417,40 @@ objects:
named item ‘$tc'Leaf2_@name_suffix@’
named item ‘$krep8_@name_suffix@’
static-construction object ‘$tc'Leaf2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tc'Leaf1_@name_suffix@’
used items: <none>
static-construction object ‘$krep8_@name_suffix@’:
- data constructor name: KindRepFun
+ data constructor: KindRepFun
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep7_@name_suffix@’
static-construction object ‘$krep7_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcBinTree’
named item ‘$krep6_@name_suffix@’
static-construction object ‘$krep6_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep5_@name_suffix@’
static-construction object ‘$krep5_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep_@name_suffix@’
named item ‘[]’
static-construction object ‘$tcBinTree’:
- data constructor name: TyCon
+ data constructor: TyCon
lifted: yes
literals:
word @large_word@
@@ -461,105 +461,105 @@ objects:
named item ‘$tcBinTree2_@name_suffix@’
named item ‘krep$*->*->*’
static-construction object ‘$tcBinTree2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$tcBinTree1_@name_suffix@’
used items: <none>
static-construction object ‘$krep4_@name_suffix@’:
- data constructor name: KindRepTyConApp
+ data constructor: KindRepTyConApp
lifted: yes
literals: <none>
used items:
named item ‘$tcTuple2’
named item ‘$krep3_@name_suffix@’
static-construction object ‘$krep3_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘$krep2_@name_suffix@’
static-construction object ‘$krep2_@name_suffix@’:
- data constructor name: :
+ data constructor: (:)
lifted: yes
literals: <none>
used items:
named item ‘$krep1_@name_suffix@’
named item ‘[]’
static-construction object ‘$krep1_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 0
used items: <none>
static-construction object ‘$krep_@name_suffix@’:
- data constructor name: KindRepVar
+ data constructor: KindRepVar
lifted: yes
literals: word 1
used items: <none>
static-construction object ‘$trModule’:
- data constructor name: Module
+ data constructor: Module
lifted: yes
literals: <none>
used items:
named item ‘$trModule2_@name_suffix@’
named item ‘$trModule4_@name_suffix@’
static-construction object ‘$trModule4_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule3_@name_suffix@’
used items: <none>
static-construction object ‘$trModule2_@name_suffix@’:
- data constructor name: TrNameS
+ data constructor: TrNameS
lifted: yes
literals: address ‘$trModule1_@name_suffix@’
used items: <none>
- ordinary object ‘divides’:
+ object ‘divides’:
arity: 3
literals: <none>
used items:
- ordinary object ‘$dReal_@name_suffix@’:
+ object ‘$dReal_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 1
literals:
word 0
info table of ‘IS’
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
used items: named item ‘fromInteger’
named item ‘$p1Real’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 3
literals: <none>
used items: named item ‘mod’
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
used items:
- ordinary object ‘divides_sat_@name_suffix@’:
+ object ‘divides_sat_@name_suffix@’:
arity: 0
literals: <none>
- used items: named item ‘==’
+ used items: named item ‘(==)’
named item ‘$p1Ord’
named item ‘$p2Real’
named item ‘$p1Integral’
- ordinary object ‘Node’:
+ object ‘Node’:
arity: 3
literals: info table of ‘Node’
used items: <none>
- ordinary object ‘Leaf’:
+ object ‘Leaf’:
arity: 1
literals: info table of ‘Leaf’
used items: <none>
- ordinary object ‘Nested’:
+ object ‘Nested’:
arity: 1
literals: info table of ‘Nested’
used items: <none>
- ordinary object ‘PerfectTree’:
+ object ‘PerfectTree’:
arity: 1
literals: info table of ‘PerfectTree’
used items: <none>
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/58e096ccdf89e8a7f413b6c5fc3fca…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/58e096ccdf89e8a7f413b6c5fc3fca…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/sjakobi/nonmoving-gc-test-fixes] testsuite: Make listThreads1 insensitive to the RTS's own threads
by Simon Jakobi (@sjakobi) 30 Jul '26
by Simon Jakobi (@sjakobi) 30 Jul '26
30 Jul '26
Simon Jakobi pushed to branch wip/sjakobi/nonmoving-gc-test-fixes at Glasgow Haskell Compiler / GHC
Commits:
1ac1d554 by Simon Jakobi at 2026-07-30T10:43:09+02:00
testsuite: Make listThreads1 insensitive to the RTS's own threads
listThreads1 expected `listThreads` to return exactly [ThreadId 1]. That
holds only under a non-threaded RTS. Under a threaded RTS however there
are more threads present, so we change the test to simply check that
`myThreadId` is present in the list.
Assisted-by: Claude Opus 5
- - - - -
2 changed files:
- libraries/base/tests/listThreads1.hs
- libraries/base/tests/listThreads1.stdout
Changes:
=====================================
libraries/base/tests/listThreads1.hs
=====================================
@@ -2,5 +2,10 @@ module Main where
import GHC.Conc.Sync
+-- Regression test for the JS backend's ListThreadsOp, which used to omit the
+-- running thread. Whatever other threads the RTS has is irrelevant here.
main :: IO ()
-main = listThreads >>= print
+main = do
+ tid <- myThreadId
+ ts <- listThreads
+ print (tid `elem` ts)
=====================================
libraries/base/tests/listThreads1.stdout
=====================================
@@ -1 +1 @@
-[ThreadId 1]
+True
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1ac1d5549cd160d095e42d3b42fdac8…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1ac1d5549cd160d095e42d3b42fdac8…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/andreask/arm-ffi] 2 commits: cmm: Expand size annotations to more operators with -dppr-debug
by Andreas Klebinger (@AndreasK) 30 Jul '26
by Andreas Klebinger (@AndreasK) 30 Jul '26
30 Jul '26
Andreas Klebinger pushed to branch wip/andreask/arm-ffi at Glasgow Haskell Compiler / GHC
Commits:
e3e35453 by Andreas Klebinger at 2026-07-29T20:13:25+00:00
cmm: Expand size annotations to more operators with -dppr-debug
- - - - -
32f219c8 by Andreas Klebinger at 2026-07-29T22:20:46+00:00
arm ncg: Fix bitmask immediates being too large.
We now use the appropriate bitmask width for the *operation* rather than the one of literal operand.
- - - - -
2 changed files:
- compiler/GHC/Cmm/Expr.hs
- compiler/GHC/CmmToAsm/AArch64/CodeGen.hs
Changes:
=====================================
compiler/GHC/Cmm/Expr.hs
=====================================
@@ -552,11 +552,11 @@ genMachOp platform mop args
infixMachOp :: MachOp -> Maybe SDoc
infixMachOp mop
= case mop of
- MO_And _ -> Just $ char '&'
- MO_Or _ -> Just $ char '|'
- MO_Xor _ -> Just $ char '^'
- MO_Not _ -> Just $ char '~'
- MO_S_Neg _ -> Just $ char '-' -- there is no unsigned neg :)
+ MO_And w -> Just $ withDebugWidth w $ char '&'
+ MO_Or w -> Just $ withDebugWidth w $ char '|'
+ MO_Xor w -> Just $ withDebugWidth w $ char '^'
+ MO_Not w -> Just $ withDebugWidth w $ char '~'
+ MO_S_Neg w -> Just $ withDebugWidth w $ char '-' -- there is no unsigned neg :)
_ -> Nothing
-- --------------------------------------------------------------------------
=====================================
compiler/GHC/CmmToAsm/AArch64/CodeGen.hs
=====================================
@@ -1184,14 +1184,14 @@ getRegister' config plat expr
return $ Any (intFormat w) (\dst -> code_x `snocOL` annExpr expr (LSR (OpReg w dst) (OpReg w reg_x) (OpImm (ImmInteger n))))
-- 3. Logic &&, ||
- CmmMachOp (MO_And w) [(CmmReg reg), CmmLit (CmmInt n _)] | isAArch64Bitmask (opRegWidth w') (fromIntegral n) ->
- return $ Any fmt (\d -> unitOL $ annExpr expr (AND fmt (OpReg w d) (OpReg w' r') (OpImm (ImmInteger n))))
+ CmmMachOp (MO_And w) [(CmmReg reg), CmmLit (CmmInt n _)] | Just op_bitmask <- getBitmaskImm n (opRegWidth w) ->
+ return $ Any fmt (\d -> unitOL $ annExpr expr (AND fmt (OpReg w d) (OpReg w' r') op_bitmask))
where fmt = intFormat w
w' = formatToWidth (cmmTypeFormat (cmmRegType reg))
r' = getRegisterReg plat reg
- CmmMachOp (MO_Or w) [(CmmReg reg), CmmLit (CmmInt n _)] | isAArch64Bitmask (opRegWidth w') (fromIntegral n) ->
- return $ Any fmt (\d -> unitOL $ annExpr expr (ORR fmt (OpReg w d) (OpReg w' r') (OpImm (ImmInteger n))))
+ CmmMachOp (MO_Or w) [(CmmReg reg), CmmLit (CmmInt n _)] | Just op_bitmask <- getBitmaskImm n (opRegWidth w) ->
+ return $ Any fmt (\d -> unitOL $ annExpr expr (ORR fmt (OpReg w d) (OpReg w' r') op_bitmask))
where fmt = intFormat w
w' = formatToWidth (cmmTypeFormat (cmmRegType reg))
r' = getRegisterReg plat reg
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/7a96d43048cde2fc2236b06d06b39c…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/7a96d43048cde2fc2236b06d06b39c…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0