GNU bug report logs - #22406
Cannot compile for Windows x64 due to LLP64 model

Previous Next

Package: guile;

Reported by: Peter TB Brett <peter <at> peter-b.co.uk>

Date: Tue, 19 Jan 2016 13:51:01 UTC

Severity: normal

Tags: patch

Merged with 19019

To reply to this bug, email your comments to 22406 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guile <at> gnu.org:
bug#22406; Package guile. (Tue, 19 Jan 2016 13:51:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Peter TB Brett <peter <at> peter-b.co.uk>:
New bug report received and forwarded. Copy sent to bug-guile <at> gnu.org. (Tue, 19 Jan 2016 13:51:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Peter TB Brett <peter <at> peter-b.co.uk>
To: bug-guile <at> gnu.org
Subject: Cannot compile for Windows x64 due to LLP64 model
Date: Tue, 19 Jan 2016 13:50:17 +0000
It is not currently possible to compile Guile 2.0.11 for Windows x64 (in 
particular 64-bit Windows running on the x86-64 arch).

Most operating systems' C libraries for x86-64 use an "LP64" model, 
where sizeof(long int) == sizeof(void *) == 8.

However, for backwards-compatibility reasons, Windows uses an "LLP64" 
model, where sizeof(long long int) == sizeof(void *) == 8 and 
sizeof(long int) == 4.

Guile 2.0.11 can't cope with this; the libguile build fails due to this 
code:

> static SCM
> scm_i_inum2big (scm_t_inum x)
> {
>   /* Return a newly created bignum initialized to X. */
>   SCM z = make_bignum ();
> #if SIZEOF_VOID_P == SIZEOF_LONG
>   mpz_init_set_si (SCM_I_BIG_MPZ (z), x);
> #else
>   /* Note that in this case, you'll also have to check all mpz_*_ui and
>      mpz_*_si invocations in Guile. */
> #error creation of mpz not implemented for this inum size
> #endif
>   return z;
> }

http://git.savannah.gnu.org/cgit/guile.git/tree/libguile/numbers.c?id=v2.0.11#n272

Some work appears to be required before using 64-bit Guile on Windows 
x64 is possible.


-- 
Dr Peter Brett <peter <at> peter-b.co.uk>




Information forwarded to bug-guile <at> gnu.org:
bug#22406; Package guile. (Tue, 26 Jan 2016 16:03:01 GMT) Full text and rfc822 format available.

Message #8 received at 22406 <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: Peter TB Brett <peter <at> peter-b.co.uk>
Cc: 22406 <at> debbugs.gnu.org
Subject: Re: bug#22406: Cannot compile for Windows x64 due to LLP64 model
Date: Tue, 26 Jan 2016 11:02:17 -0500
[Message part 1 (text/plain, inline)]
Hi Peter,

Peter TB Brett <peter <at> peter-b.co.uk> writes:

> It is not currently possible to compile Guile 2.0.11 for Windows x64
> (in particular 64-bit Windows running on the x86-64 arch).
>
> Most operating systems' C libraries for x86-64 use an "LP64" model,
> where sizeof(long int) == sizeof(void *) == 8.
>
> However, for backwards-compatibility reasons, Windows uses an "LLP64"
> model, where sizeof(long long int) == sizeof(void *) == 8 and
> sizeof(long int) == 4.
>
> Guile 2.0.11 can't cope with this; the libguile build fails due to
> this code:

I've attached a patch that attempts to address this issue by using
'long' as the scm_t_inum type.  So, fixnums will be limited to 30 bits
on LLP64 systems.  We can't easily avoid this while using GMP's mpz API,
since the mpz_*_si functions except longs and there are no analogous
functions that accept larger C integer types.

Can you test this patch and report back?

     Thanks,
       Mark

[0001-PRELIMINARY-fixes-for-LLP64.patch (text/x-patch, inline)]
From 4a923816c9814b07556fdcc53b74b3e1ca2a0f41 Mon Sep 17 00:00:00 2001
From: Mark H Weaver <mhw <at> netris.org>
Date: Tue, 26 Jan 2016 03:42:18 -0500
Subject: [PATCH] PRELIMINARY fixes for LLP64.

---
 libguile/numbers.c     | 19 ++++++++++---------
 libguile/numbers.h     | 29 ++++++++++++++---------------
 libguile/vm-i-scheme.c |  2 +-
 3 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/libguile/numbers.c b/libguile/numbers.c
index 1e3fc30..7d32c20 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
  *
  * Portions Copyright 1990, 1991, 1992, 1993 by AT&T Bell Laboratories
  * and Bellcore.  See scm_divide.
@@ -87,7 +87,14 @@
 /* FIXME: We assume that FLT_RADIX is 2 */
 verify (FLT_RADIX == 2);
 
-typedef scm_t_signed_bits scm_t_inum;
+/* We assume that a long fits within a SCM value.  */
+verify (SCM_SIZEOF_LONG <= SIZEOF_SCM_T_BITS);
+
+/* We use 'long' as the type for Inums, because that's the type accepted
+   by GMP's mpz_*_si functions.  Above, we checked that a long fits
+   within an SCM.  */
+typedef long scm_t_inum;
+
 #define scm_from_inum(x) (scm_from_signed_integer (x))
 
 /* Test an inum to see if it can be converted to a double without loss
@@ -272,13 +279,7 @@ scm_i_inum2big (scm_t_inum x)
 {
   /* Return a newly created bignum initialized to X. */
   SCM z = make_bignum ();
-#if SIZEOF_VOID_P == SIZEOF_LONG
   mpz_init_set_si (SCM_I_BIG_MPZ (z), x);
-#else
-  /* Note that in this case, you'll also have to check all mpz_*_ui and
-     mpz_*_si invocations in Guile. */
-#error creation of mpz not implemented for this inum size
-#endif
   return z;
 }
 
@@ -4966,7 +4967,7 @@ left_shift_exact_integer (SCM n, long count)
       if (nn == 0)
         return n;
       else if (count < SCM_I_FIXNUM_BIT-1 &&
-               ((scm_t_bits) (SCM_SRS (nn, (SCM_I_FIXNUM_BIT-1 - count)) + 1)
+               ((unsigned long) (SCM_SRS (nn, (SCM_I_FIXNUM_BIT-1 - count)) + 1)
                 <= 1))
         return SCM_I_MAKINUM (nn < 0 ? -(-nn << count) : (nn << count));
       else
diff --git a/libguile/numbers.h b/libguile/numbers.h
index b929b7a..d5e4f2b 100644
--- a/libguile/numbers.h
+++ b/libguile/numbers.h
@@ -3,8 +3,8 @@
 #ifndef SCM_NUMBERS_H
 #define SCM_NUMBERS_H
 
-/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006,
- *   2008, 2009, 2010, 2011, 2013, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1998, 2000-2006, 2008-2011, 2013, 2014,
+ *   2016 Free Software Foundation, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -38,16 +38,15 @@ typedef scm_t_int32 scm_t_wchar;
 
 /* Immediate Numbers, also known as fixnums
  *
- * Inums are exact integer data that fits within an SCM word.  */
-
-/* SCM_T_SIGNED_MAX is                 (- (expt 2 n) 1),
- * SCM_MOST_POSITIVE_FIXNUM should be  (- (expt 2 (- n 2)) 1)
- * which is the same as                (/ (- (expt 2 n) 4) 4)
- */
-
+ * Inums are exact integers that fit within an SCM word
+ * (along with two tagging bits).
+ *
+ * In the current implementation, Inums must also fit within a long
+ * because that's what GMP's mpz_*_si functions accept.  We assume that
+ * a long fits in a SCM value (this is checked in numbers.c).  */
 #define SCM_I_FIXNUM_BIT         (SCM_LONG_BIT - 2)
-#define SCM_MOST_POSITIVE_FIXNUM ((SCM_T_SIGNED_BITS_MAX-3)/4)
-#define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM-1)
+#define SCM_MOST_NEGATIVE_FIXNUM (-1L << (SCM_I_FIXNUM_BIT - 1))
+#define SCM_MOST_POSITIVE_FIXNUM (- (SCM_MOST_NEGATIVE_FIXNUM + 1))
 
 /* SCM_SRS (X, Y) is signed right shift, defined as floor (X / 2^Y),
    where Y must be non-negative and less than the width in bits of X.
@@ -60,7 +59,7 @@ typedef scm_t_int32 scm_t_wchar;
 #else
 # define SCM_SRS(x, y)                                   \
   ((x) < 0                                               \
-   ? -1 - (scm_t_signed_bits) (~(scm_t_bits)(x) >> (y))  \
+   ? -1 - (long) (~(unsigned long)(x) >> (y))            \
    : ((x) >> (y)))
 #endif
 
@@ -74,12 +73,12 @@ typedef scm_t_int32 scm_t_wchar;
 
    NOTE: X must not perform side effects.  */
 #ifdef __GNUC__
-# define SCM_I_INUM(x)  (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2))
+# define SCM_I_INUM(x)  (SCM_SRS ((long) SCM_UNPACK (x), 2))
 #else
 # define SCM_I_INUM(x)                                \
   (SCM_UNPACK (x) > LONG_MAX                          \
-   ? -1 - (scm_t_signed_bits) (~SCM_UNPACK (x) >> 2)  \
-   : (scm_t_signed_bits) (SCM_UNPACK (x) >> 2))
+   ? -1 - (long) (~SCM_UNPACK (x) >> 2)               \
+   : (long) (SCM_UNPACK (x) >> 2))
 #endif
 
 #define SCM_I_INUMP(x)	(2 & SCM_UNPACK (x))
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c
index 162efab..249b835 100644
--- a/libguile/vm-i-scheme.c
+++ b/libguile/vm-i-scheme.c
@@ -360,7 +360,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2)
 #  define ASM_MUL(x, y)							\
     if (SCM_LIKELY (SCM_I_INUMP (x) && SCM_I_INUMP (y)))		\
       {									\
-	scm_t_signed_bits rlo, rhi;					\
+	long rlo, rhi;							\
 	asm ("smull %0, %1, %2, %3\n"					\
 	     : "=&r" (rlo), "=&r" (rhi)					\
 	     : "r" (SCM_UNPACK (x) - scm_tc2_int),			\
-- 
2.6.3


Information forwarded to bug-guile <at> gnu.org:
bug#22406; Package guile. (Tue, 26 Jan 2016 17:39:01 GMT) Full text and rfc822 format available.

Message #11 received at 22406 <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: Peter TB Brett <peter <at> peter-b.co.uk>
Cc: 22406 <at> debbugs.gnu.org
Subject: Re: bug#22406: Cannot compile for Windows x64 due to LLP64 model
Date: Tue, 26 Jan 2016 12:38:04 -0500
[Message part 1 (text/plain, inline)]
Mark H Weaver <mhw <at> netris.org> writes:

> Peter TB Brett <peter <at> peter-b.co.uk> writes:
>
>> It is not currently possible to compile Guile 2.0.11 for Windows x64
>> (in particular 64-bit Windows running on the x86-64 arch).
>>
>> Most operating systems' C libraries for x86-64 use an "LP64" model,
>> where sizeof(long int) == sizeof(void *) == 8.
>>
>> However, for backwards-compatibility reasons, Windows uses an "LLP64"
>> model, where sizeof(long long int) == sizeof(void *) == 8 and
>> sizeof(long int) == 4.
>>
>> Guile 2.0.11 can't cope with this; the libguile build fails due to
>> this code:
>
> I've attached a patch that attempts to address this issue by using
> 'long' as the scm_t_inum type.  So, fixnums will be limited to 30 bits
> on LLP64 systems.  We can't easily avoid this while using GMP's mpz API,
> since the mpz_*_si functions except longs and there are no analogous
> functions that accept larger C integer types.
>
> Can you test this patch and report back?

Disregard my first patch, as it missed a few important changes.
Please try this one instead.

     Thanks,
       Mark


[0001-PRELIMINARY-fixes-for-LLP64.patch (text/x-patch, inline)]
From 333ec4fd35c5625cd090e216a77842a5e1ca9941 Mon Sep 17 00:00:00 2001
From: Mark H Weaver <mhw <at> netris.org>
Date: Tue, 26 Jan 2016 03:42:18 -0500
Subject: [PATCH] PRELIMINARY fixes for LLP64.

---
 libguile/numbers.c     | 12 ++++--------
 libguile/numbers.h     | 37 ++++++++++++++++++-------------------
 libguile/vm-i-scheme.c | 28 ++++++++++++++--------------
 3 files changed, 36 insertions(+), 41 deletions(-)

diff --git a/libguile/numbers.c b/libguile/numbers.c
index 1e3fc30..205548d 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
  *
  * Portions Copyright 1990, 1991, 1992, 1993 by AT&T Bell Laboratories
  * and Bellcore.  See scm_divide.
@@ -87,7 +87,9 @@
 /* FIXME: We assume that FLT_RADIX is 2 */
 verify (FLT_RADIX == 2);
 
-typedef scm_t_signed_bits scm_t_inum;
+/* Make sure that scm_t_inum fits within a SCM value.  */
+verify (sizeof (scm_t_inum) <= sizeof (scm_t_bits));
+
 #define scm_from_inum(x) (scm_from_signed_integer (x))
 
 /* Test an inum to see if it can be converted to a double without loss
@@ -272,13 +274,7 @@ scm_i_inum2big (scm_t_inum x)
 {
   /* Return a newly created bignum initialized to X. */
   SCM z = make_bignum ();
-#if SIZEOF_VOID_P == SIZEOF_LONG
   mpz_init_set_si (SCM_I_BIG_MPZ (z), x);
-#else
-  /* Note that in this case, you'll also have to check all mpz_*_ui and
-     mpz_*_si invocations in Guile. */
-#error creation of mpz not implemented for this inum size
-#endif
   return z;
 }
 
diff --git a/libguile/numbers.h b/libguile/numbers.h
index b929b7a..9f7dd3c 100644
--- a/libguile/numbers.h
+++ b/libguile/numbers.h
@@ -3,8 +3,8 @@
 #ifndef SCM_NUMBERS_H
 #define SCM_NUMBERS_H
 
-/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006,
- *   2008, 2009, 2010, 2011, 2013, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1998, 2000-2006, 2008-2011, 2013, 2014,
+ *   2016 Free Software Foundation, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -38,16 +38,15 @@ typedef scm_t_int32 scm_t_wchar;
 
 /* Immediate Numbers, also known as fixnums
  *
- * Inums are exact integer data that fits within an SCM word.  */
-
-/* SCM_T_SIGNED_MAX is                 (- (expt 2 n) 1),
- * SCM_MOST_POSITIVE_FIXNUM should be  (- (expt 2 (- n 2)) 1)
- * which is the same as                (/ (- (expt 2 n) 4) 4)
- */
-
+ * Inums are exact integers that fit within an SCM word
+ * (along with two tagging bits).
+ *
+ * In the current implementation, Inums must also fit within a long
+ * because that's what GMP's mpz_*_si functions accept.  */
+typedef long scm_t_inum;
 #define SCM_I_FIXNUM_BIT         (SCM_LONG_BIT - 2)
-#define SCM_MOST_POSITIVE_FIXNUM ((SCM_T_SIGNED_BITS_MAX-3)/4)
-#define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM-1)
+#define SCM_MOST_NEGATIVE_FIXNUM (-1L << (SCM_I_FIXNUM_BIT - 1))
+#define SCM_MOST_POSITIVE_FIXNUM (- (SCM_MOST_NEGATIVE_FIXNUM + 1))
 
 /* SCM_SRS (X, Y) is signed right shift, defined as floor (X / 2^Y),
    where Y must be non-negative and less than the width in bits of X.
@@ -58,9 +57,9 @@ typedef scm_t_int32 scm_t_wchar;
 #if (-1 >> 2 == -1) && (-4 >> 2 == -1) && (-5 >> 2 == -2) && (-8 >> 2 == -2)
 # define SCM_SRS(x, y)  ((x) >> (y))
 #else
-# define SCM_SRS(x, y)                                   \
-  ((x) < 0                                               \
-   ? -1 - (scm_t_signed_bits) (~(scm_t_bits)(x) >> (y))  \
+# define SCM_SRS(x, y)                          \
+  ((x) < 0                                      \
+   ? -1 - (long) (~(unsigned long)(x) >> (y))   \
    : ((x) >> (y)))
 #endif
 
@@ -74,12 +73,12 @@ typedef scm_t_int32 scm_t_wchar;
 
    NOTE: X must not perform side effects.  */
 #ifdef __GNUC__
-# define SCM_I_INUM(x)  (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2))
+# define SCM_I_INUM(x)  (SCM_SRS ((scm_t_inum) SCM_UNPACK (x), 2))
 #else
-# define SCM_I_INUM(x)                                \
-  (SCM_UNPACK (x) > LONG_MAX                          \
-   ? -1 - (scm_t_signed_bits) (~SCM_UNPACK (x) >> 2)  \
-   : (scm_t_signed_bits) (SCM_UNPACK (x) >> 2))
+# define SCM_I_INUM(x)                          \
+  (SCM_UNPACK (x) > SCM_T_SIGNED_BITS_MAX       \
+   ? -1 - (scm_t_inum) (~SCM_UNPACK (x) >> 2)   \
+   : (scm_t_inum) (SCM_UNPACK (x) >> 2))
 #endif
 
 #define SCM_I_INUMP(x)	(2 & SCM_UNPACK (x))
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c
index 162efab..452a459 100644
--- a/libguile/vm-i-scheme.c
+++ b/libguile/vm-i-scheme.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2009-2014 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2009-2014, 2016 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -236,9 +236,9 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2)
 #if SCM_GNUC_PREREQ (4, 5) && (defined __x86_64__ || defined __i386__)
 
 # undef _CX
-# if SIZEOF_VOID_P == 8
+# if SCM_I_FIXNUM_BIT == 62
 #  define _CX "rcx"
-# elif SIZEOF_VOID_P == 4
+# elif SCM_I_FIXNUM_BIT == 30
 #  define _CX "ecx"
 # else
 #  error unsupported word size
@@ -291,7 +291,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2)
 
 # define ASM_MUL(x, y)							\
     {									\
-      scm_t_signed_bits xx = SCM_I_INUM (x);				\
+      scm_t_inum xx = SCM_I_INUM (x);					\
       asm volatile goto ("mov %1, %%"_CX"; "				\
 			 "test %[tag], %%cl;   je %l[slow_mul]; "	\
 			 "sub %[tag], %%"_CX"; "			\
@@ -360,7 +360,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2)
 #  define ASM_MUL(x, y)							\
     if (SCM_LIKELY (SCM_I_INUMP (x) && SCM_I_INUMP (y)))		\
       {									\
-	scm_t_signed_bits rlo, rhi;					\
+	scm_t_inum rlo, rhi;						\
 	asm ("smull %0, %1, %2, %3\n"					\
 	     : "=&r" (rlo), "=&r" (rhi)					\
 	     : "r" (SCM_UNPACK (x) - scm_tc2_int),			\
@@ -496,7 +496,7 @@ VM_DEFINE_FUNCTION (159, ash, "ash", 2)
       else
         /* Left shift. See comments in scm_ash. */
         {
-          scm_t_signed_bits nn, bits_to_shift;
+          scm_t_inum nn, bits_to_shift;
 
           nn = SCM_I_INUM (x);
           bits_to_shift = SCM_I_INUM (y);
@@ -552,7 +552,7 @@ VM_DEFINE_FUNCTION (162, logxor, "logxor", 2)
 
 VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2)
 {
-  scm_t_signed_bits i = 0;
+  scm_t_inum i = 0;
   ARGS2 (vect, idx);
   if (SCM_LIKELY (SCM_I_IS_NONWEAK_VECTOR (vect)
                   && SCM_I_INUMP (idx)
@@ -568,7 +568,7 @@ VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2)
 
 VM_DEFINE_INSTRUCTION (164, vector_set, "vector-set", 0, 3, 0)
 {
-  scm_t_signed_bits i = 0;
+  scm_t_inum i = 0;
   SCM vect, idx, val;
   POP3 (val, idx, vect);
   if (SCM_LIKELY (SCM_I_IS_NONWEAK_VECTOR (vect)
@@ -792,7 +792,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FIXABLE_INT_REF(stem, fn_stem, type, size)			\
 {									\
-  scm_t_signed_bits i;							\
+  scm_t_inum i;								\
   const scm_t_ ## type *int_ptr;					\
   ARGS2 (bv, idx);							\
 									\
@@ -814,7 +814,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_INT_REF(stem, type, size)					\
 {									\
-  scm_t_signed_bits i;							\
+  scm_t_inum i;								\
   const scm_t_ ## type *int_ptr;					\
   ARGS2 (bv, idx);							\
 									\
@@ -845,7 +845,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FLOAT_REF(stem, fn_stem, type, size)				\
 {									\
-  scm_t_signed_bits i;							\
+  scm_t_inum i;								\
   const type *float_ptr;						\
   ARGS2 (bv, idx);							\
 									\
@@ -933,7 +933,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FIXABLE_INT_SET(stem, fn_stem, type, min, max, size)		\
 {									\
-  scm_t_signed_bits i, j = 0;						\
+  scm_t_inum i, j = 0;							\
   SCM bv, idx, val;							\
   scm_t_ ## type *int_ptr;						\
 									\
@@ -960,7 +960,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_INT_SET(stem, type, size)					\
 {									\
-  scm_t_signed_bits i = 0;						\
+  scm_t_inum i = 0;							\
   SCM bv, idx, val;							\
   scm_t_ ## type *int_ptr;						\
 									\
@@ -984,7 +984,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FLOAT_SET(stem, fn_stem, type, size)                         \
 {                                                                       \
-  scm_t_signed_bits i = 0;                                              \
+  scm_t_inum i = 0;                                                     \
   SCM bv, idx, val;                                                     \
   type *float_ptr;                                                      \
                                                                         \
-- 
2.6.3


Information forwarded to bug-guile <at> gnu.org:
bug#22406; Package guile. (Mon, 20 Jun 2016 20:02:01 GMT) Full text and rfc822 format available.

Message #14 received at 22406 <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: Peter TB Brett <peter <at> peter-b.co.uk>
Cc: 22406 <at> debbugs.gnu.org
Subject: Re: bug#22406: Cannot compile for Windows x64 due to LLP64 model
Date: Mon, 20 Jun 2016 16:01:13 -0400
Peter TB Brett <peter <at> peter-b.co.uk> writes:

> It is not currently possible to compile Guile 2.0.11 for Windows x64
> (in particular 64-bit Windows running on the x86-64 arch).
>
> Most operating systems' C libraries for x86-64 use an "LP64" model,
> where sizeof(long int) == sizeof(void *) == 8.
>
> However, for backwards-compatibility reasons, Windows uses an "LLP64"
> model, where sizeof(long long int) == sizeof(void *) == 8 and
> sizeof(long int) == 4.

I pushed commit b0a702d7733e02cb68ea2331bd632e25a3127c75 to stable-2.0
which should, I hope, fix the specific issues raised in this bug report.
However, there are likely to be other places in guile where similar
assumptions are made.  If you'd like to test current 'stable-2.0' on
LLP64, we can proceed.

    Thanks!
      Mark




Merged 19019 22406. Request was from Andy Wingo <wingo <at> pobox.com> to control <at> debbugs.gnu.org. (Wed, 22 Jun 2016 13:39:02 GMT) Full text and rfc822 format available.

Added tag(s) patch. Request was from Taylan Kammer <taylan.kammer <at> gmail.com> to control <at> debbugs.gnu.org. (Mon, 17 May 2021 21:00:02 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 344 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.