[commit: ghc] master: Be less untruthful about the prototypes of external functions (5a31f23)

Simon Marlow marlowsd at gmail.com
Wed Apr 23 07:35:14 UTC 2014


Could we have a comment with the ticket number next to the prototype 
please?  Otherwise some well-meaning developer will "fix" it again in 
the future :-)

Cheers,
Simon

On 22/04/2014 05:40, git at git.haskell.org wrote:
> Repository : ssh://git@git.haskell.org/ghc
>
> On branch  : master
> Link       : http://ghc.haskell.org/trac/ghc/changeset/5a31f231eebfb8140f9b519b166094d9d4fc2d79/ghc
>
>> ---------------------------------------------------------------
>
> commit 5a31f231eebfb8140f9b519b166094d9d4fc2d79
> Author: Colin Watson <cjwatson at debian.org>
> Date:   Sat Apr 12 01:55:07 2014 +0100
>
>      Be less untruthful about the prototypes of external functions
>
>      GHC's generated C code uses dummy prototypes for foreign imports.  At the
>      moment these all claim to be (void), i.e. functions of zero arguments.  On
>      most platforms this doesn't matter very much: calls to these functions put
>      the parameters in the usual places anyway, and (with the exception of
>      varargs) things just work.
>
>      However, the ELFv2 ABI on ppc64 optimises stack allocation
>      (http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01149.html): a call to a
>      function that has a prototype, is not varargs, and receives all parameters
>      in registers rather than on the stack does not require the caller to
>      allocate an argument save area.  The incorrect prototypes cause GCC to
>      believe that all functions declared this way can be called without an
>      argument save area, but if the callee has sufficiently many arguments then
>      it will expect that area to be present, and will thus corrupt the caller's
>      stack.  This happens in particular with calls to runInteractiveProcess in
>      libraries/process/cbits/runProcess.c.
>
>      The simplest fix appears to be to declare these external functions with an
>      unspecified argument list rather than a void argument list.  This is no
>      worse for platforms that don't care either way, and allows a successful
>      bootstrap of GHC 7.8 on little-endian Linux ppc64 (which uses the ELFv2
>      ABI).
>
>      Fixes #8965
>
>      Signed-off-by: Colin Watson <cjwatson at debian.org>
>      Signed-off-by: Austin Seipp <austin at well-typed.com>
>
>
>> ---------------------------------------------------------------
>
> 5a31f231eebfb8140f9b519b166094d9d4fc2d79
>   includes/Stg.h |    2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/includes/Stg.h b/includes/Stg.h
> index be966aa..1707c9b 100644
> --- a/includes/Stg.h
> +++ b/includes/Stg.h
> @@ -213,7 +213,7 @@ typedef StgFunPtr       F_;
>   #define II_(X)          static StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
>   #define IF_(f)    static StgFunPtr GNUC3_ATTRIBUTE(used) f(void)
>   #define FN_(f)    StgFunPtr f(void)
> -#define EF_(f)    extern StgFunPtr f(void)
> +#define EF_(f)    extern StgFunPtr f()
>
>   /* -----------------------------------------------------------------------------
>      Tail calls
>
> _______________________________________________
> ghc-commits mailing list
> ghc-commits at haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-commits
>


More information about the ghc-devs mailing list