da4fb573a7
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
78 lines
1.7 KiB
Diff
78 lines
1.7 KiB
Diff
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;
|