summary refs log tree commit diff
path: root/pkgs/development/libraries/boehm-gc
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2015-10-03 13:33:13 +0200
committerVladimír Čunát <vcunat@gmail.com>2015-10-03 13:33:37 +0200
commit5227fb1dd53fcb5918b9342dff4868f4ad68427e (patch)
treed6cd521e3f67944031216a27f740f28f22b73b41 /pkgs/development/libraries/boehm-gc
parentd6dd3b8bd1eaeeb21dfdb5051cd4732c748ce5d7 (diff)
parent33373d939a19f465228ddede6d38ce9032b5916b (diff)
downloadnixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.gz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.bz2
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.lz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.xz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.zst
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.zip
Merge commit staging+systemd into closure-size
Many non-conflict problems weren't (fully) resolved in this commit yet.
Diffstat (limited to 'pkgs/development/libraries/boehm-gc')
-rw-r--r--pkgs/development/libraries/boehm-gc/cygwin.patch108
-rw-r--r--pkgs/development/libraries/boehm-gc/default.nix1
2 files changed, 109 insertions, 0 deletions
diff --git a/pkgs/development/libraries/boehm-gc/cygwin.patch b/pkgs/development/libraries/boehm-gc/cygwin.patch
new file mode 100644
index 000000000000..25c6b9f06f31
--- /dev/null
+++ b/pkgs/development/libraries/boehm-gc/cygwin.patch
@@ -0,0 +1,108 @@
+--- gc-7.2/include/gc.h	2014-06-01 19:00:48.000000000 +0200
++++ gc-7.2/include/gc.h	2015-05-27 12:55:42.248984200 +0200
+@@ -1386,7 +1386,14 @@
+ /* THREAD_LOCAL_ALLOC defined and the initial allocation call is not    */
+ /* to GC_malloc() or GC_malloc_atomic().                                */
+ 
+-#ifdef __CYGWIN32__
++#ifdef __CYGWIN__
++#ifdef __x86_64__
++  extern int __data_start__[], __data_end__[], __bss_start__[], __bss_end__[];
++#define GC_DATASTART (__data_start__ < __bss_start__ ?\
++                      (void *)__data_start__ : (void *)__bss_start__)
++#define GC_DATAEND (__data_end__ < __bss_end__ ?\
++                      (void *)__data_end__ : (void *)__bss_end__)
++#else
+   /* Similarly gnu-win32 DLLs need explicit initialization from the     */
+   /* main program, as does AIX.                                         */
+   extern int _data_start__[], _data_end__[], _bss_start__[], _bss_end__[];
+@@ -1394,6 +1401,7 @@
+                        (void *)_data_start__ : (void *)_bss_start__)
+ # define GC_DATAEND (_data_end__ > _bss_end__ ? \
+                      (void *)_data_end__ : (void *)_bss_end__)
++#endif
+ # define GC_INIT_CONF_ROOTS GC_add_roots(GC_DATASTART, GC_DATAEND); \
+                                  GC_gcollect() /* For blacklisting. */
+         /* Required at least if GC is in a DLL.  And doesn't hurt. */
+--- gc-7.2/include/private/gcconfig.h	2014-06-01 19:00:48.000000000 +0200
++++ gc-7.2/include/private/gcconfig.h	2015-05-27 12:46:01.864338700 +0200
+@@ -441,10 +441,20 @@
+ #   endif
+ #   define mach_type_known
+ # endif
+-# if defined(__CYGWIN32__) || defined(__CYGWIN__)
++# if defined(__CYGWIN32__)
+ #   define I386
+ #   define CYGWIN32
+ #   define mach_type_known
++#if defined(__CYGWIN__)
++#  if defined(__LP64__)
++#    define X86_64
++#    define mach_type_known
++#  else
++#    define I386
++#  endif
++#  define CYGWIN32
++#  define mach_type_known
++#endif
+ # endif
+ # if defined(__MINGW32__) && !defined(mach_type_known)
+ #   define I386
+@@ -511,6 +521,16 @@
+ #    define mach_type_known
+ # endif
+ 
++#if defined(__CYGWIN__)
++#  if defined(__LP64__)
++#    define X86_64
++#    define mach_type_known
++#  else
++#    define I386
++#  endif
++#  define CYGWIN32
++#  define mach_type_known
++#endif
+ /* Feel free to add more clauses here */
+ 
+ /* Or manually define the machine type here.  A machine type is         */
+@@ -2279,6 +2299,20 @@
+ #       define GWW_VDB
+ #       define DATAEND  /* not needed */
+ #   endif
++
++#   ifdef CYGWIN32
++#       define OS_TYPE "CYGWIN32"
++#       define DATASTART ((ptr_t)GC_DATASTART)  /* From gc.h */
++#       define DATAEND   ((ptr_t)GC_DATAEND)
++#       define ALIGNMENT 8
++#       undef STACK_GRAN
++#       define STACK_GRAN 0x10000
++#       ifdef USE_MMAP
++#         define NEED_FIND_LIMIT
++#         define USE_MMAP_ANON
++#       endif
++#   endif
++
+ # endif /* X86_64 */
+ 
+ # ifdef HEXAGON
+--- gc-7.2/os_dep.c	2015-05-27 12:25:29.097698800 +0200
++++ gc-7.2/os_dep.c	2015-05-27 12:48:23.714600800 +0200
+@@ -764,10 +764,16 @@
+     /* gcc version of boehm-gc).                                        */
+     GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+     {
++# ifdef __x86_64__
++      PNT_TIB pTib = NtCurrentTeb();
++      void * _tlsbase = pTib->StackBase;
++      /*void * _tlsbase = NtCurrentTeb()->pTib.StackBase;*/
++      /*extern void * _tlsbase __asm__ ("%gs:8");*/
++# else
+       void * _tlsbase;
+-
+       __asm__ ("movl %%fs:4, %0"
+                : "=r" (_tlsbase));
++# endif
+       sb -> mem_base = _tlsbase;
+       return GC_SUCCESS;
+     }
diff --git a/pkgs/development/libraries/boehm-gc/default.nix b/pkgs/development/libraries/boehm-gc/default.nix
index 089370195470..4839bedd8bb0 100644
--- a/pkgs/development/libraries/boehm-gc/default.nix
+++ b/pkgs/development/libraries/boehm-gc/default.nix
@@ -7,6 +7,7 @@ stdenv.mkDerivation rec {
     url = http://www.hboehm.info/gc/gc_source/gc-7.2f.tar.gz;
     sha256 = "119x7p1cqw40mpwj80xfq879l9m1dkc7vbc1f3bz3kvkf8bf6p16";
   };
+  patches = if stdenv.isCygwin then [ ./cygwin.patch ] else null;
 
   outputs = [ "dev" "out" "doc" ];