Generating Function Prototypes
Alastair Reid
reid at reid-consulting-uk.ltd.uk
Thu Jul 4 07:05:08 EDT 2002
Alastair:
>> Well, if you disable the warning by giving gcc a consistent story,
>> then the code is correct. (To give gcc a consistent story, don't
>> #include any user or system-supplied headers and make sure gcc
>> doesn't silently #include any of its own (as it likes to do).)
Simon:
> I don't think it's possible to completely eliminate system headers
> from the transitive closure of stuff we include when compiling a .hc
> file. I've just taken a look at this, and it seems that while we
> can eliminate a lot of the stuff we include, there are some awkward
> ones: we need gmp.h for Integer operations, and that includes
> <stddef.h>, and HsFFI.h needs <stdint.h> to get the int-type limits
> (perhaps these could be autoconf'd).
Well here's a trick that makes it ok to pull in arbitrary header files
which might appeal to the assembly post-processing fans amongst us.
Suppose you are compiling a module containing this ffi decl.
foreign import foo :: Float -> Char
1) Have the Haskell compiler generate C code like this:
#include <anything you like>
#define whatever_you_want
extern HsChar ffi_generated_foo(HsChar arg1);
... put GHC-generated code here ...
Using the prefix "ffi_generated_" lets us be fairly confident that
there is no prototype for the function i scope.
2) In the assembly postprocessor, apply the following transformation:
s/ffi_generated_foo/foo/g
The only thing this will mess up is use of inline functions (which
won't get inlined).
extern inline functions (for which gcc generates no code at all) are a
bit of a problem too but the fault lies in the person who wrote the C
code for writing code which won't even compile if you turn
optimisation off.
--
Alastair
More information about the FFI
mailing list