summary refs log tree commit diff
path: root/pkgs/development/libraries/aterm/max-long.patch
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2009-01-27 17:46:07 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2009-01-27 17:46:07 +0000
commitda4fb573a7bfb2d1ef402ed6081131a8ce893038 (patch)
tree54dcb8f013800ae344a1dbfc2849d208ee5c82e1 /pkgs/development/libraries/aterm/max-long.patch
parent76efe57d1be042bb7cdce852106a74bb8b79b2e4 (diff)
downloadnixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar.gz
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar.bz2
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar.lz
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar.xz
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.tar.zst
nixpkgs-da4fb573a7bfb2d1ef402ed6081131a8ce893038.zip
* Added ATerm 2.8. Also removed some old versions and patches that
  were no longer in use.

* A patch for compiling the ATerm library with GCC 4.3.  Without it,
  the code for resizing ATerm tables gets stuck in an infinite loop
  (http://bugzilla.sen.cwi.nl:8080/show_bug.cgi?id=841).  The problem
  is in this bit of code in hash.c, which tries to dynamically figure
  out the maximum signed integer:

    long try_long_max;
    long long_max;
    long delta;

    try_long_max = 1;
    do {
      long_max = try_long_max;
      try_long_max = long_max * 2;
    } while (try_long_max > 0);

  At -O2, GCC 4.3 determines that 1 * 2 * 2 * ... can never be <= 0,
  and so it optimises this into a 1-instruction infinite loop:

    0x0805a782 <keyPut+1282>: jmp  0x805a782 <keyPut+1282>

  Quite beautiful really. ;-)

  The fix is to use the LONG_MAX macro instead.

svn path=/nixpkgs/branches/stdenv-updates/; revision=13888
Diffstat (limited to 'pkgs/development/libraries/aterm/max-long.patch')
-rw-r--r--pkgs/development/libraries/aterm/max-long.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/pkgs/development/libraries/aterm/max-long.patch b/pkgs/development/libraries/aterm/max-long.patch
new file mode 100644
index 00000000000..a2f260b970b
--- /dev/null
+++ b/pkgs/development/libraries/aterm/max-long.patch
@@ -0,0 +1,77 @@
+diff -rc aterm-2.8-orig/aterm/hash.c aterm-2.8/aterm/hash.c
+*** aterm-2.8-orig/aterm/hash.c	2008-11-10 13:54:22.000000000 +0100
+--- aterm-2.8/aterm/hash.c	2009-01-27 18:14:14.000000000 +0100
+***************
+*** 93,146 ****
+  }
+  
+  /*}}}  */
+- /*{{{  static long calc_long_max() */
+- static long calc_long_max()
+- {
+-   long try_long_max;
+-   long long_max;
+-   long delta;
+- 
+-   try_long_max = 1;
+-   do {
+-     long_max = try_long_max;
+-     try_long_max = long_max * 2;
+-   } while (try_long_max > 0);
+- 
+-   delta = long_max;
+-   while (delta > 1) {
+-     while (long_max + delta < 0) {
+-       delta /= 2;
+-     }
+-     long_max += delta;
+-   }
+- 
+-   return long_max;
+- 
+- }
+- /*}}}  */
+  /*{{{  static long calculateNewSize(sizeMinus1, nrdel, nrentries) */
+  
+  static long calculateNewSize
+  (long sizeMinus1, long nr_deletions, long nr_entries)
+  { 
+- 
+-   /* Hack: LONG_MAX (limits.h) is often unreliable, we need to find
+-    * out the maximum possible value of a signed long dynamically.
+-    */
+-   static long st_long_max = 0;
+- 
+-   /* the resulting length has the form 2^k-1 */
+- 
+    if (nr_deletions >= nr_entries/2) { 
+      return sizeMinus1;
+    }
+  
+!   if (st_long_max == 0) {
+!     st_long_max = calc_long_max();
+!   }
+! 
+!   if (sizeMinus1 > st_long_max / 2) {
+!     return st_long_max-1;
+    }
+  
+    return (2*sizeMinus1)+1;
+--- 93,109 ----
+  }
+  
+  /*}}}  */
+  /*{{{  static long calculateNewSize(sizeMinus1, nrdel, nrentries) */
+  
+  static long calculateNewSize
+  (long sizeMinus1, long nr_deletions, long nr_entries)
+  { 
+    if (nr_deletions >= nr_entries/2) { 
+      return sizeMinus1;
+    }
+  
+!   if (sizeMinus1 > LONG_MAX / 2) {
+!     return LONG_MAX-1;
+    }
+  
+    return (2*sizeMinus1)+1;