[GHC] #10436: Excessive numbers of packages loaded for TH

GHC ghc-devs at haskell.org
Wed May 20 23:49:31 UTC 2015


#10436: Excessive numbers of packages loaded for TH
-------------------------------------+-------------------------------------
              Reporter:  duncan      |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.10.1
              Keywords:              |  Operating System:  Unknown/Multiple
          Architecture:              |   Type of failure:  Compile-time
  Unknown/Multiple                   |  crash
             Test Case:              |        Blocked By:
              Blocking:              |   Related Tickets:
Differential Revisions:              |
-------------------------------------+-------------------------------------
 When using Template Haskell, the behaviour of ghc with regard to loading
 packages differs in these two cases:

 {{{
 ghc --make Blah.hs
 }}}
 vs
 {{{
 ghc --make Blah.hs -package foo
 }}}

 In the first case, ghc will work out for itself which packages it needs to
 load to run the TH code in `Blah.hs` while in the second case, ghc will
 unconditionally load package `foo` in addition to anything else.

 Why is this a problem? Consider a real example (reported on IRC):

 {{{
 ghc --make Main.hs
 [1 of 4] Compiling Uplink           ( Uplink.hs, Uplink.o )
 [2 of 4] Compiling FlightData       ( FlightData.hs, FlightData.o )
 Loading package ghc-prim ... linking ... done.
 Loading package integer-gmp ... linking ... done.
 Loading package base ... linking ... done.
 [3 of 4] Compiling Joystick         ( Joystick.hs, Joystick.o )
 [4 of 4] Compiling Main             ( Main.hs, Main.o )

 Linking Main.exe ...
 }}}

 This just loads `base` and its deps. Great, it works.

 Now the exact same `Main.hs` built by cabal (which of course uses
 `-package-id` flags):

 {{{
 cabal build
 Building jpl-0.1.0.0...
 Preprocessing executable 'jpl' for jpl-0.1.0.0...
 [1 of 4] Compiling Uplink           ( Uplink.hs, dist\build\jpl\jpl-
 tmp\Uplink.o )
 [2 of 4] Compiling FlightData       ( FlightData.hs, dist\build\jpl\jpl-
 tmp\FlightData.o )
 Loading package ghc-prim ... linking ... done.
 Loading package integer-gmp ... linking ... done.
 Loading package base ... linking ... done.
 Loading package array-0.5.0.0 ... linking ... done.
 Loading package deepseq-1.3.0.2 ... linking ... done.
 Loading package bytestring-0.10.4.0 ... linking ... done.
 Loading package containers-0.5.5.1 ... linking ... done.
 Loading package binary-0.7.1.0 ... linking ... done.
 Loading package SHA-1.6.4.2 ... linking ... done.
 Loading package text-1.2.0.4 ... linking ... done.
 }}}
 ... snip a further 80, '''yes 80 packages''' ...
 {{{
 Loading package linear-1.18.0.1 ... linking ... done.
 Loading package sdl2-2.0.0 ... linking ... ghc.exe: unable to load package
 `sdl2-2.0.0'
 ghc.exe: warning: WSACleanup from ws2_32 is linked instead of
 __imp_WSACleanup
 ghc.exe: warning: WSAStartup from ws2_32 is linked instead of
 __imp_WSAStartup
 ghc.exe: warning: WSACleanup from ws2_32 is linked instead of
 __imp_WSACleanup
 }}}
 ... snip more boring details of the linker errors ...

 So yes the problem is that in practice some packages (typically FFI
 things) just can't be loaded in GHCi/TH and then this scuppers everything
 else, despite the fact that these packages never needed to be loaded in
 the first place.

 So the feature request is this: always use the parsimonious demand-driven
 algorithm for deciding what packages to load when running TH snippets, and
 don't consider `-package` flags to be instructions to load these packages
 for running TH code.

 As a bonus it'll be quicker and our build output shorter.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10436>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list