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 @@ + + +
+ ++ 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 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 theAddr
(orPtr
). + 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 aStablePtr
+ 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 + + + +