GHC implements experimental (by now it is actually quite well tested) support for access to foreign functions and generally the interaction between Haskell code and code written in other languages. Code generation in this context can get quite tricky. This section attempts to cast some light on this aspect of the compiler.
For each Haskell module that contains a
dynamic declaration, GHC generates a
that needs to be linked with any program that imports the Haskell
module. When asked about it Simon Marlow justified the
existence of these files as follows:
The stub files contain the helper function which invokes the Haskell code when called from C.
Each time the foreign export dynamic is invoked to create a new callback function, a small piece of code has to be dynamically generated (by code in
Adjustor.c). It is the address of this dynamically generated bit of code that is returned as the
Ptr). When called from C, the dynamically generated code must somehow invoke the Haskell function which was originally passed to the f.e.d. function -- it does this by invoking the helper function, passing it a
StablePtrto the Haskell function. It's split this way for two reasons: the same helper function can be used each time the f.e.d. function is called, and to keep the amount of dynamically generated code to a minimum.
The stub code is generated by
Last modified: Fri Aug 10 11:47:41 EST 2001