summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2014-04-12 01:55:07 +0100
committerAustin Seipp <austin@well-typed.com>2014-04-21 22:27:25 -0500
commit5a31f231eebfb8140f9b519b166094d9d4fc2d79 (patch)
treeb351c89c4b0b707eea34a3bf3d228d9226f6a114 /includes
parentc29bf984dd20431cd4344e8a5c444d7a5be08389 (diff)
downloadhaskell-5a31f231eebfb8140f9b519b166094d9d4fc2d79.tar.gz
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@debian.org> Signed-off-by: Austin Seipp <austin@well-typed.com>
Diffstat (limited to 'includes')
-rw-r--r--includes/Stg.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/includes/Stg.h b/includes/Stg.h
index be966aaf16..1707c9b9a4 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