[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#22406: Cannot compile for Windows x64 due to LLP64 model
From: |
Mark H Weaver |
Subject: |
bug#22406: Cannot compile for Windows x64 due to LLP64 model |
Date: |
Tue, 26 Jan 2016 12:38:04 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Mark H Weaver <address@hidden> writes:
> Peter TB Brett <address@hidden> 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
>From 333ec4fd35c5625cd090e216a77842a5e1ca9941 Mon Sep 17 00:00:00 2001
From: Mark H Weaver <address@hidden>
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