[GHC] #3658: Dynamically link GHCi (and use system linker) on platforms that support it
GHC
ghc-devs at haskell.org
Thu Sep 5 23:45:56 CEST 2013
#3658: Dynamically link GHCi (and use system linker) on platforms that support it
-------------------------------------------------+-------------------------
Reporter: simonmar | Owner:
Type: task | Status: new
Priority: high | Milestone: 7.8.1
Component: GHCi | Version:
Resolution: | 6.10.4
Operating System: Unknown/Multiple | Keywords:
Type of failure: None/Unknown | dynamic link
Test Case: | Architecture:
Blocking: 781, 1883, 2283, 3242, 3333, | Unknown/Multiple
3372, 3654, 4244, 5062, 5197, 5435, 6107, | Difficulty:
7043, 7056, 7072, 7097, 7103, 7134, 7316, | Unknown
7329, 7389, 7475, 7687 | Blocked By: 5987
| Related Tickets:
-------------------------------------------------+-------------------------
Old description:
> In 6.14.1 we should switch to shipping a dynamically linked GHCi binary,
> on those platforms for which dynamic linking is supported (currently
> Linux; MacOS X and Windows support is in progress).
>
> == Advantages ==
>
> * The GHCi binary is smaller
> * some packages don't need to be loaded on startup: lower memory use
> * GHCi startup might be quicker (or it might not)
> * some hacks due to having two copies of the base package are not
> necessary (see `rts/Globals.c`)
> * We might save some space in the distributions.
> * It takes us a step closer to not needing the RTS linker at all
> * It takes us a step closer to using dynamic linking by default, which
> is where we want to go ultimately
>
> == Potential Issues ==
>
> * Do we run into any problems with GHCi and the user program sharing the
> same
> stdin/stdout/stderr handles? Do we need to virtualise these
> explicitly in the
> GHCi front end?
>
> * We cannot revert CAFs in packages that are shared by GHC and the user
> program.
> There are some old non-working hacks related to reverting CAFs when
> GHCi is
> dynamically linked (see `KeepCAFsForGHCi`) that
> need to be cleaned out. CAFs can only be reverted in code loaded by
> the RTS
> linker. We need to think about whether this is a necessary feature or
> not:
> we have never supported CAF reverting for interpreted code anyway.
> One
> reason to have it was so that you can recover after saying
> `getContents` at
> the GHCi prompt, but we can provide other ways to work around that.
>
> * There will be installation/binary-dist issues to resolve; currently we
> don't
> install any dynamically-linked binaries.
>
> == Open questions ==
>
> * Whether we continue to use the same binary for GHC and GHCi is an open
> question:
> it would be possible to provide a separate statically-linked GHC
> binary if
> performance of the dynamically-linked version was an issue.
>
> * We might as well dynamically-link Haddock, and the other tools that
> come
> with GHC too.
New description:
In 6.14.1 we should switch to shipping a dynamically linked GHCi binary,
on those platforms for which dynamic linking is supported (currently
Linux; MacOS X and Windows support is in progress).
== Advantages ==
* The GHCi binary is smaller
* some packages don't need to be loaded on startup: lower memory use
* GHCi startup might be quicker (or it might not)
* some hacks due to having two copies of the base package are not
necessary (see `rts/Globals.c`)
* We might save some space in the distributions.
* It takes us a step closer to not needing the RTS linker at all
* It takes us a step closer to using dynamic linking by default, which
is where we want to go ultimately
== Potential Issues ==
* Do we run into any problems with GHCi and the user program sharing the
same
stdin/stdout/stderr handles? Do we need to virtualise these explicitly
in the
GHCi front end?
* We cannot revert CAFs in packages that are shared by GHC and the user
program.
There are some old non-working hacks related to reverting CAFs when
GHCi is
dynamically linked (see `KeepCAFsForGHCi`) that
need to be cleaned out. CAFs can only be reverted in code loaded by
the RTS
linker. We need to think about whether this is a necessary feature or
not:
we have never supported CAF reverting for interpreted code anyway. One
reason to have it was so that you can recover after saying
`getContents` at
the GHCi prompt, but we can provide other ways to work around that.
However, if
we eliminated HEAP_ALLOCED (#8199), as a side effect of this
implementation,
this might be doable, as we no longer have to reach our fingers into
the
data section of dynamically linked in libraries to revert a CAF; all of
the CAFs
are copied to dynamic memory space first. (The current implementation
doesn't
work for that, however!)
* There will be installation/binary-dist issues to resolve; currently we
don't
install any dynamically-linked binaries.
== Open questions ==
* Whether we continue to use the same binary for GHC and GHCi is an open
question:
it would be possible to provide a separate statically-linked GHC binary
if
performance of the dynamically-linked version was an issue.
* We might as well dynamically-link Haddock, and the other tools that
come
with GHC too.
--
Comment (by ezyang):
If we eliminated HEAP_ALLOCED (#8199), as a side effect of this
implementation, this might be doable, as we no longer have to reach our
fingers into the
data section of dynamically linked in libraries to revert a CAF; all of
the CAFs
are copied to dynamic memory space first. (The current implementation
doesn't
work for that, however!)
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/3658#comment:41>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list