[[project @ 2001-08-10 01:47:39 by chak] chak**20010810014740 Added SimonM's explanation about f.e.d. stubs. ] { addfile ./ghc/docs/comm/the-beast/alien.html hunk ./ghc/docs/comm/index.html 9 -

The Glasgow Haskell Compiler (GHC) Commentary [v0.1]

+

The Glasgow Haskell Compiler (GHC) Commentary [v0.2]

hunk ./ghc/docs/comm/index.html 50 +
  • Alien Functions hunk ./ghc/docs/comm/index.html 66 -Last modified: Wed Aug 8 00:11:49 EST 2001 +Last modified: Fri Aug 10 11:48:22 EST 2001 hunk ./ghc/docs/comm/the-beast/alien.html 1 + + + + + The GHC Commentary - Alien Functions + + + +

    The GHC Commentary - Alien Functions

    +

    + 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. + +

    FFI Stub Files

    +

    + For each Haskell module that contains a foreign export + dynamic declaration, GHC generates a _stub.c file + 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. It is the address of this dynamically generated bit of + code that is returned as the Addr (or 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 StablePtr + to 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 DSForeign.fexportEntry. + + +

    + +Last modified: Fri Aug 10 11:47:41 EST 2001 + + + + }