diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-01-27 17:46:07 +0000 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-01-27 17:46:07 +0000 |
commit | da4fb573a7bfb2d1ef402ed6081131a8ce893038 (patch) | |
tree | 54dcb8f013800ae344a1dbfc2849d208ee5c82e1 /pkgs/development/libraries/aterm/max-long.patch | |
parent | 76efe57d1be042bb7cdce852106a74bb8b79b2e4 (diff) | |
download | nixpkgs-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.patch | 77 |
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; |