X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=docs%2Fcomm%2Fthe-beast%2Falien.html;fp=docs%2Fcomm%2Fthe-beast%2Falien.html;h=3d4776ebc9a079d6936ea5df3264f4880afa5739;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/docs/comm/the-beast/alien.html b/docs/comm/the-beast/alien.html new file mode 100644 index 0000000..3d4776e --- /dev/null +++ b/docs/comm/the-beast/alien.html @@ -0,0 +1,56 @@ + + + + + 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 (by code in Adjustor.c). 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 + + + +