diff options
Diffstat (limited to 'docs/comm/the-beast/alien.html')
-rw-r--r-- | docs/comm/the-beast/alien.html | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/docs/comm/the-beast/alien.html b/docs/comm/the-beast/alien.html new file mode 100644 index 0000000000..3d4776ebc9 --- /dev/null +++ b/docs/comm/the-beast/alien.html @@ -0,0 +1,56 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> + <head> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> + <title>The GHC Commentary - Alien Functions</title> + </head> + + <body BGCOLOR="FFFFFF"> + <h1>The GHC Commentary - Alien Functions</h1> + <p> + 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. + + <h4>FFI Stub Files</h4> + <p> + For each Haskell module that contains a <code>foreign export + dynamic</code> declaration, GHC generates a <code>_stub.c</code> file + that needs to be linked with any program that imports the Haskell + module. When asked about it <a + href="mailto:simonmar@microsoft.com">Simon Marlow</a> justified the + existence of these files as follows: + <blockquote> + The stub files contain the helper function which invokes the Haskell + code when called from C. + <p> + 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 <a + href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/rts/Adjustor.c"><code>Adjustor.c</code></a>). It is the address of this dynamically generated bit of + code that is returned as the <code>Addr</code> (or <a + href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/hslibs/lang/Ptr.lhs"><code>Ptr</code></a>). + 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 <a + href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/hslibs/lang/StablePtr.lhs"><code>StablePtr</code></a> + 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. + </blockquote> + <p> + The stub code is generated by <a + href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/compiler/deSugar/DsForeign.lhs"><code>DSForeign</code></a><code>.fexportEntry</code>. + + + <p><small> +<!-- hhmts start --> +Last modified: Fri Aug 10 11:47:41 EST 2001 +<!-- hhmts end --> + </small> + </body> +</html> |