Duncan Coutts wrote:
On Sun, 2010-01-10 at 17:24 +1100, Ben Lippmeier wrote:
Windows DLLs should be working now.

Huzza. Great work Ben.

So what was the solution in the end to the problem of the cross-module
inlining and making intra vs inter DLL-calls?

The solution was to refactor the foreign call code to track the packageIds of imported labels, and also put this information in the interface files.

For example, in the "integer-gmp" package, in the module "GHC.Integer.GMP.Internals" there is an import:

foreign import prim "integer_cmm_plusIntegerzh" plusInteger#
 :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)

The code for plusInteger# is linked into the integer-gmp library, and appears in libHSinteger-gmp-version.dll. Now, when we're compiling GHC.Integer.GMP.Internals the renamer tags the plusInteger# label with the package that it's from (integer-gmp). If code that uses this label gets inlined into another package, we'll still know that the actual implementation of plusInteger# is in libHSinteger-gmp-version.dll.

For ELF(Linux) and MachO(OSX) it doesn't matter. When we're compiling in the "dyn" way on these platforms all foreign labels are taken to need dynamic linkage, and the linker just works it out. On Windows, we have to generate different code depending on whether a label needs dynamic linkage or not, so we have to track what package each label comes from.

Ben.

_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to