Patch GMP to always use the GHC allocation functions
authorIan Lynagh <igloo@earth.li>
Sun, 21 Jun 2009 18:29:57 +0000 (18:29 +0000)
committerIan Lynagh <igloo@earth.li>
Sun, 21 Jun 2009 18:29:57 +0000 (18:29 +0000)
This works around a crash (only on OS X for some reason?) where the GHCi
GMP uses the systems memory allocator. We should fix this properly, by
making ghci run constructor functions.

cbits/alloc.c
gmp/ghc.mk
gmp/tarball/gmp-4.2.4-nodoc-patched.tar.bz2 [new file with mode: 0644]
gmp/tarball/gmp-4.2.4-nodoc.tar.bz2 [deleted file]
gmp/tarball/patch [new file with mode: 0644]

index 2771386..d1d9229 100644 (file)
@@ -10,9 +10,9 @@
 
 #include "gmp.h"
 
 
 #include "gmp.h"
 
-static void * stgAllocForGMP   (size_t size_in_bytes);
-static void * stgReallocForGMP (void *ptr, size_t old_size, size_t new_size);
-static void   stgDeallocForGMP (void *ptr STG_UNUSED, size_t size STG_UNUSED);
+void * stgAllocForGMP   (size_t size_in_bytes);
+void * stgReallocForGMP (void *ptr, size_t old_size, size_t new_size);
+void   stgDeallocForGMP (void *ptr STG_UNUSED, size_t size STG_UNUSED);
 
 static void initAllocForGMP( void ) __attribute__((constructor));
 
 
 static void initAllocForGMP( void ) __attribute__((constructor));
 
@@ -62,7 +62,7 @@ static void initAllocForGMP( void )
    only allocate() style allocation.
    -------------------------------------------------------------------------- */
 
    only allocate() style allocation.
    -------------------------------------------------------------------------- */
 
-static void *
+void *
 stgAllocForGMP (size_t size_in_bytes)
 {
   StgArrWords* arr;
 stgAllocForGMP (size_t size_in_bytes)
 {
   StgArrWords* arr;
@@ -80,7 +80,7 @@ stgAllocForGMP (size_t size_in_bytes)
   return arr->payload;
 }
 
   return arr->payload;
 }
 
-static void *
+void *
 stgReallocForGMP (void *ptr, size_t old_size, size_t new_size)
 {
     size_t min_size;
 stgReallocForGMP (void *ptr, size_t old_size, size_t new_size)
 {
     size_t min_size;
@@ -98,7 +98,7 @@ stgReallocForGMP (void *ptr, size_t old_size, size_t new_size)
     return(new_stuff_ptr);
 }
 
     return(new_stuff_ptr);
 }
 
-static void
+void
 stgDeallocForGMP (void *ptr STG_UNUSED, size_t size STG_UNUSED)
 {
     /* easy for us: the garbage collector does the dealloc'n */
 stgDeallocForGMP (void *ptr STG_UNUSED, size_t size STG_UNUSED)
 {
     /* easy for us: the garbage collector does the dealloc'n */
index a798e46..9bd52c2 100644 (file)
@@ -93,7 +93,7 @@ PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g')
 # which causes problems for Debian.
 
 GMP_TARBALL := $(wildcard libraries/integer-gmp/gmp/tarball/gmp*.tar.bz2)
 # which causes problems for Debian.
 
 GMP_TARBALL := $(wildcard libraries/integer-gmp/gmp/tarball/gmp*.tar.bz2)
-GMP_DIR := $(patsubst libraries/integer-gmp/gmp/tarball/%-nodoc.tar.bz2,%,$(GMP_TARBALL))
+GMP_DIR := $(patsubst libraries/integer-gmp/gmp/tarball/%-nodoc-patched.tar.bz2,%,$(GMP_TARBALL))
 
 libraries/integer-gmp/gmp/libgmp.a libraries/integer-gmp/gmp/gmp.h:
        $(RM) -rf $(GMP_DIR) libraries/integer-gmp/gmp/gmpbuild libraries/integer-gmp/gmp/objs
 
 libraries/integer-gmp/gmp/libgmp.a libraries/integer-gmp/gmp/gmp.h:
        $(RM) -rf $(GMP_DIR) libraries/integer-gmp/gmp/gmpbuild libraries/integer-gmp/gmp/objs
diff --git a/gmp/tarball/gmp-4.2.4-nodoc-patched.tar.bz2 b/gmp/tarball/gmp-4.2.4-nodoc-patched.tar.bz2
new file mode 100644 (file)
index 0000000..ddf5d33
Binary files /dev/null and b/gmp/tarball/gmp-4.2.4-nodoc-patched.tar.bz2 differ
diff --git a/gmp/tarball/gmp-4.2.4-nodoc.tar.bz2 b/gmp/tarball/gmp-4.2.4-nodoc.tar.bz2
deleted file mode 100644 (file)
index acd7482..0000000
Binary files a/gmp/tarball/gmp-4.2.4-nodoc.tar.bz2 and /dev/null differ
diff --git a/gmp/tarball/patch b/gmp/tarball/patch
new file mode 100644 (file)
index 0000000..4850bc4
--- /dev/null
@@ -0,0 +1,25 @@
+diff -ur before/memory.c after/memory.c
+--- before/memory.c    2007-08-30 19:31:40.000000000 +0100
++++ after/memory.c     2009-06-21 19:12:39.000000000 +0100
+@@ -24,10 +24,21 @@
+ #include "gmp-impl.h"
++void * stgAllocForGMP   (size_t size_in_bytes);
++void * stgReallocForGMP (void *ptr, size_t old_size, size_t new_size);
++void   stgDeallocForGMP (void *ptr, size_t size);
++
++void *  (*__gmp_allocate_func) _PROTO ((size_t)) = stgAllocForGMP;
++void *  (*__gmp_reallocate_func) _PROTO ((void *, size_t, size_t))
++     = stgReallocForGMP;
++void    (*__gmp_free_func) _PROTO ((void *, size_t)) = stgDeallocForGMP;
++
++/*
+ void *        (*__gmp_allocate_func) _PROTO ((size_t)) = __gmp_default_allocate;
+ void *        (*__gmp_reallocate_func) _PROTO ((void *, size_t, size_t))
+      = __gmp_default_reallocate;
+ void  (*__gmp_free_func) _PROTO ((void *, size_t)) = __gmp_default_free;
++*/
+ /* Default allocation functions.  In case of failure to allocate/reallocate