[GHC] #9176: GHC not generating dyn_hi files
GHC
ghc-devs at haskell.org
Sun Jul 6 18:52:39 UTC 2014
#9176: GHC not generating dyn_hi files
-----------------------------+----------------------------------
Reporter: heatsink | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.9
Resolution: | Keywords: dynamic
Operating System: MacOS X | Architecture: x86_64 (amd64)
Type of failure: Other | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-----------------------------+----------------------------------
Description changed by heatsink:
Old description:
> == Overview ==
>
> In dynamic-too compilation, a module is compiled the normal way, then the
> backend runs twice to generate normal (.o, .hi) and dynamic (.dyn_o,
> .dyn_hi) outputs. Compilation uses the .hi files of imported modules.
> Effectively, the compiler assumes that all the information it gets from a
> .hi file, used by the normal output, is also true of the corresponding
> .dyn_hi file, used by the dynamic output. GHC has a few checks to verify
> this, but they don’t always produce desirable results.
>
> When importing a module from a package in --make mode, GHC checks that
> the normal and dynamic interfaces match, in `checkBuildDynamicToo` in
> `findAndReadIface`. If they don’t match, GHC silently disables dynamic-
> too, so that no dynamic interface file is produced. No errors or
> warnings are reported.
>
> When importing a standalone module in --make mode, GHC does not examine
> the dynamic interface at all.
>
> Of the two cases described above, GHC uses the weaker checks when
> building a package and stricter checks when using the installed package.
> The weaker checks allow a package with mismatched normal and dynamic
> interface files to build and install without errors. After it's
> installed, the stronger checks suppress the creation of .dyn_hi files
> whenever the mismatched module is imported. Thus, a package installs
> fine, but importing from the package prevents dynamic-too compilation
> from working properly.
>
> == Reproducing ==
>
> The attached code sets up an inconsistent pair of module interfaces and
> runs both kinds of imports. To compile the first two files, build the
> cabal package in `testcase9176/`. To compile the last file, install the
> package, then run the makefile in `user/`.
>
> * `Imported.hs` is compiled with different optimization flags, setting up
> a situation where the normal and dyamic module interfaces do not match.
>
> * `User.hs` importing directly `Imported.hs` loads only the static module
> interface. The dynamic interface is ignored.
>
> * `User.hs` importing from the installed package `Imported.hs` compares
> the static and dynamic interfaces, turns off dynamic-too compilation, and
> does not generate a .dyn_hi file. No errors or warnings are produced.
> This file is a copy of the other `User.hs`, just compiled differently.
>
> == Problems ==
>
> GHC with -dynamic-too is expected to generate a .dyn_hi file, but it does
> not when compiling the third file.
>
> When compiling a module, GHC should read the interfaces of any modules
> that it imports. However, when compiling the second file, GHC does not
> read the .dyn_hi file describing the imported dynamic module, only the
> .hi file describing the normal module.
>
> The compiler does not treat mismatched module interfaces consistently in
> all situations, making it hard to find the root cause of errors.
>
> I'm not sure what the correct behavior should be.
>
> == Details ==
>
> This bug appeared on my system in a Parsec module. Parsec installed with
> no apparent problems, but other modules importing from Parsec would not
> compile to .dyn_hi files.
>
> GHC was built from source, commit
> 9e10963e394680dbb1b964c66cb428a2aa03df09, compiled by GHC 7.6.3 with
> XCode 5.1.1 on OS X 10.9.3.
New description:
== Overview ==
In dynamic-too compilation, a module is compiled the normal way, then the
backend runs twice to generate normal (.o, .hi) and dynamic (.dyn_o,
.dyn_hi) outputs. Compilation uses the .hi files of imported modules.
Effectively, the compiler assumes that all the information it gets from a
.hi file, used by the normal output, is also true of the corresponding
.dyn_hi file, used by the dynamic output. GHC has a few checks to verify
this, but they don’t always produce desirable results.
* When importing a module from a package in --make mode, GHC checks that
the normal and dynamic interfaces match, in `checkBuildDynamicToo` in
`findAndReadIface`. If they don’t match, GHC silently disables dynamic-
too, so that no dynamic interface file is produced. No errors or warnings
are reported.
* When importing a module (either from a package, or standalone) in one-
shot mode with -c, GHC starts out the same way as above: it checks the
imported interfaces, finds out they don't match, and disables dynamic-too
output. After generating output the normal way, the compiler pipeline
runs again in the dynamic way to generate the dynamic output. This seems
to be the "right" thing to do.
* When importing a standalone module in --make mode, GHC does not examine
the dynamic interface at all. It generates both normal and dynamic
output.
Of the two --make cases, GHC uses the weaker checks when building a
package and stricter checks when using the installed package. The weaker
checks allow a package with mismatched normal and dynamic interface files
to build and install without errors. After it's installed, the stronger
checks suppress the creation of .dyn_hi files whenever the mismatched
module is imported. Thus, a package installs fine, but importing from the
package prevents dynamic-too compilation from working properly.
== Reproducing ==
The attached code sets up an inconsistent pair of module interfaces and
runs both kinds of imports. To compile the first two files, build the
cabal package in `testcase9176/`. To compile the last file, install the
package, then run the makefile in `user/`.
* `Imported.hs` is compiled with different optimization flags, setting up
a situation where the normal and dyamic module interfaces do not match.
* `User.hs` importing directly `Imported.hs` loads only the static module
interface. The dynamic interface is ignored.
* `User.hs` importing from the installed package `Imported.hs` compares
the static and dynamic interfaces, turns off dynamic-too compilation, and
does not generate a .dyn_hi file. No errors or warnings are produced.
This file is a copy of the other `User.hs`, just compiled differently.
== Problems ==
GHC with -dynamic-too is expected to generate a .dyn_hi file, but it does
not when compiling the third file.
When compiling a module, GHC should read the interfaces of any modules
that it imports. However, when compiling the second file, GHC does not
read the .dyn_hi file describing the imported dynamic module, only the .hi
file describing the normal module.
The compiler does not treat mismatched module interfaces consistently in
all situations, making it hard to find the root cause of errors.
I'm not sure what the correct behavior should be.
== Details ==
This bug appeared on my system in a Parsec module. Parsec installed with
no apparent problems, but other modules importing from Parsec would not
compile to .dyn_hi files.
GHC was built from source, commit
9e10963e394680dbb1b964c66cb428a2aa03df09, compiled by GHC 7.6.3 with XCode
5.1.1 on OS X 10.9.3.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9176#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list