nixpkgs/pkgs/development/libraries/aterm/max-long.patch
Eelco Dolstra da4fb573a7 * 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
2009-01-27 17:46:07 +00:00

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;