[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Pre-approval for plt-scheme (Was: Re: Bug#598615: plt-scheme: FTBFS on mips/mipsel (error: impossible constraint in 'asm')



On Thu, Sep 30, 2010 at 12:15:05PM -0400, James Vega wrote:
> On Thu, Sep 30, 2010 at 9:22 AM, Julien Cristau <jcristau@debian.org> wrote:
> > plt-scheme FTBFS on mipsen in testing:
> >> [...]
> >> gcc -I./.. -I/build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/../include   -Wall     -c /build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/gmp/gmp.c -o gmp.o
> >> /build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/gmp/gmp.c: In function 'mpn_sb_get_str':
> >> /build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/gmp/gmp.c:1858: error: impossible constraint in 'asm'
> >> /build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/gmp/gmp.c:1863: error: impossible constraint in 'asm'
> >> /build/buildd-plt-scheme_4.2.1-1+b1-mips-JD2ADc/plt-scheme-4.2.1/src/mzscheme/src/gmp/gmp.c:1915: error: impossible constraint in 'asm'
> >> make[7]: *** [gmp.o] Error 1
> 
> These are instances of the umul_ppmm macro being called.  It's defined
> in src/mzscheme/src/gmp/gmplonglong.h as follows:
> 
> [snip]
> 
> I'll try to get some time this weekend to test a patch that simply
> always uses the mfhi/mflo macros, but I'm a bit busy.  So if someone
> else has some spare cycles to test it, I'd appreciate it.

I found a patch from upstream that, with a little massaging to backport
cleanly, fixes the issue.  Would this be acceptable to upload to t-p-u?

-- 
James
GPG Key: 1024D/61326D40 2003-09-02 James Vega <jamessan@debian.org>
diff --git a/debian/changelog b/debian/changelog
index eb69202..63ab077 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+plt-scheme (4.2.1-1+squeeze1) testing-proposed-updates; urgency=low
+
+  * Backport patch from upstream to fix mips FTBFS. (Closes: #598615)
+    + debian/rules: Pass --enable-cgcdefault to configure to use alternate
+      garbage collector on alpha/mips(el).
+  * debian/control:
+    + Add myself to Uploaders.
+    + Point Vcs-* to git.
+
+ -- James Vega <jamessan@debian.org>  Mon, 04 Oct 2010 00:45:31 -0400
+
 plt-scheme (4.2.1-1) unstable; urgency=low
 
   * New upstream version
diff --git a/debian/control b/debian/control
index 46c69a5..b72da8b 100644
--- a/debian/control
+++ b/debian/control
@@ -1,14 +1,15 @@
 Source: plt-scheme
-Section: lisp 
+Section: lisp
 Priority: optional
 Maintainer: Ari Pollak <ari@debian.org>
+Uploaders: James Vega <jamessan@debian.org>
 Standards-Version: 3.8.0
 Build-Depends: cdbs, quilt, debhelper (>= 7.0.0), patchutils,
  libfreetype6-dev, libjpeg62-dev, libpng12-dev, libssl-dev, libxaw7-dev,
  xbitmaps, libxft-dev, libgl1-mesa-dev | libgl-dev,
  libglu1-mesa-dev | libglu-dev, libx11-dev, libxrender-dev, libcairo2-dev
-XS-Vcs-Svn: svn://svn.debian.org/svn/pkt-plt-scheme/drscheme/
-XS-Vcs-Browser: http://svn.debian.org/wsvn/pkg-plt-scheme/drscheme/
+Vcs-Git: git://git.debian.org/collab-maint/racket.git
+Vcs-Browser: http://git.debian.org/?p=collab-maint/racket.git
 Homepage: http://www.plt-scheme.org/
 
 Package: plt-scheme
diff --git a/debian/patches/mips-gmp.diff b/debian/patches/mips-gmp.diff
new file mode 100644
index 0000000..0ab4605
--- /dev/null
+++ b/debian/patches/mips-gmp.diff
@@ -0,0 +1,198 @@
+From: Matthew Flatt <mflatt@racket-lang.org>
+Date: Mon, 19 Jul 2010 06:07:55 -0600
+Subject: [PATCH] fix MIPS bignum config and implementation
+  --- includes a fix for gmp with long long configuration,
+  but that's now disabled for MIPS to keep things
+  simpler
+ (cherry picked from commit 7a8efb446eec852dcd770a7ab534c0425efb48ea)
+
+Patch is based on the above, but adjusted accordingly as a backport to
+plt-scheme 4.2.1.
+
+Origin: upstream, http://git.racket-lang.org/plt/commitdiff/43bdcc3
+Bug-Debian: http://bugs.debian.org/598615
+---
+
+diff --git a/src/mzscheme/sconfig.h b/src/mzscheme/sconfig.h
+index a7b8e8b..b0fad01 100644
+--- a/src/mzscheme/sconfig.h
++++ b/src/mzscheme/sconfig.h
+@@ -384,10 +384,6 @@
+ 
+ # define USE_TIMEZONE_AND_ALTZONE_VAR
+ 
+-# ifdef _ABIN32
+-#  define USE_LONG_LONG_FOR_BIGDIG
+-# endif
+-
+ # define FLAGS_ALREADY_SET
+ 
+ #endif
+diff --git a/src/mzscheme/src/bignum.c b/src/mzscheme/src/bignum.c
+index 7dacdb0..bd65dcc 100644
+--- a/src/mzscheme/src/bignum.c
++++ b/src/mzscheme/src/bignum.c
+@@ -81,20 +81,23 @@ void scheme_bignum_use_fuel(long n);
+ #endif
+ 
+ #if defined(USE_LONG_LONG_FOR_BIGDIG)
+-# define TOP_BITS_MASK 0xFFFFFFFF00000000
++# define TOP_BITS_MASK ((bigdig)0xFFFFFFFF << 32)
+ # define BOTTOM_BITS_MASK 0x00000000FFFFFFFF
++# define FIRST_BIT_MASK_LL ((bigdig)FIRST_BIT_MASK << 32)
++#else
++# define FIRST_BIT_MASK_LL FIRST_BIT_MASK
+ #endif
+ 
+ #if defined(SIXTY_FOUR_BIT_INTEGERS) || defined(USE_LONG_LONG_FOR_BIGDIG)
+ # define BIG_RADIX 18446744073709551616.0 /* = 0x10000000000000000 */
+-# define ALL_ONES 0xFFFFFFFFFFFFFFFF
+ # define WORD_SIZE 64
+ #else
+ # define BIG_RADIX 4294967296.0 /* = 0x100000000 */
+-# define ALL_ONES 0xFFFFFFFF
+ # define WORD_SIZE 32
+ #endif
+ 
++# define ALL_ONES (~(bigdig)0)
++
+ static Scheme_Object *bignum_one;
+ 
+ #ifdef MZ_PRECISE_GC
+@@ -406,7 +409,7 @@ int scheme_bignum_get_long_long_val(const Scheme_Object *o, mzlonglong *v)
+   } else if (SCHEME_BIGLEN(o) == 0) {
+     *v = 0;
+     return 1;
+-  } else if (SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] == FIRST_BIT_MASK 
++  } else if (SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] == FIRST_BIT_MASK_LL 
+ # ifndef USE_LONG_LONG_FOR_BIGDIG
+ 	     && !SCHEME_BIGDIG(o)[0]
+ # endif
+@@ -417,7 +420,7 @@ int scheme_bignum_get_long_long_val(const Scheme_Object *o, mzlonglong *v)
+     v2 = (v2 << 63);
+     *v = v2;
+     return 1;
+-  } else if ((SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] & FIRST_BIT_MASK) != 0) { /* Won't fit into a signed long long */
++  } else if ((SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] & FIRST_BIT_MASK_LL) != 0) { /* Won't fit into a signed long long */
+     return 0;
+   } else {
+     mzlonglong v2;
+@@ -448,7 +451,7 @@ int scheme_bignum_get_unsigned_long_long_val(const Scheme_Object *o, umzlonglong
+   } else {
+     umzlonglong v2;
+     v2 = SCHEME_BIGDIG(o)[0];
+-    if (SCHEME_BIGLEN(o)) {
++    if (SCHEME_BIGLEN(o) > 1) {
+       v2 |= ((umzlonglong)SCHEME_BIGDIG(o)[1]) << 32;
+     }
+     *v = v2;
+diff --git a/src/mzscheme/src/gmp/gmp.c b/src/mzscheme/src/gmp/gmp.c
+index 59d9ad2..cc22a05 100644
+--- a/src/mzscheme/src/gmp/gmp.c
++++ b/src/mzscheme/src/gmp/gmp.c
+@@ -54,7 +54,7 @@ THREAD_LOCAL_DECL(static void *gmp_mem_pool);
+ # define MP_BASES_BIG_BASE_10            CNST_LIMB(0x8ac7230489e80000)
+ # define MP_BASES_BIG_BASE_INVERTED_10   CNST_LIMB(0xd83c94fb6d2ac34a)
+ # define MP_BASES_NORMALIZATION_STEPS_10 0
+-# define GMP_NUMB_MASK 0xFFFFFFFFFFFFFFFF
++# define GMP_NUMB_MASK (~(mp_limb_t)0)
+ #endif
+ 
+ #define MPN_DIVREM_OR_PREINV_DIVREM_1(qp,xsize,ap,size,d,dinv,shift)    \
+diff --git a/src/mzscheme/src/gmp/gmp.h b/src/mzscheme/src/gmp/gmp.h
+index b5dddd4..45628b5 100644
+--- a/src/mzscheme/src/gmp/gmp.h
++++ b/src/mzscheme/src/gmp/gmp.h
+@@ -40,9 +40,15 @@ MA 02111-1307, USA. */
+ # endif
+ #endif
+ 
+-#if defined (__mips) && defined (_ABIN32)
++#if 0
++# if (defined (__mips) || defined(mips)) && defined (_ABIN32)
+ /* Force the use of 64-bit limbs for all 64-bit MIPS CPUs if ABI permits.  */
+-#define _LONG_LONG_LIMB
++# define _LONG_LONG_LIMB
++# endif
++#endif
++
++#ifdef USE_LONG_LONG_FOR_BIGDIG
++# define _LONG_LONG_LIMB
+ #endif
+ 
+ #if (__STDC__-0) || defined (__cplusplus)
+@@ -607,5 +613,13 @@ enum
+ #define gmp_version __gmp_version
+ extern __gmp_const char *gmp_version;
+ 
++/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
++#if defined (__GNUC__) && defined (__GNUC_MINOR__)
++#define __GMP_GNUC_PREREQ(maj, min) \
++  ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
++#else
++#define __GMP_GNUC_PREREQ(maj, min)  0
++#endif
++
+ #define __GMP_H__
+ #endif /* __GMP_H__ */
+diff --git a/src/mzscheme/src/gmp/gmplonglong.h b/src/mzscheme/src/gmp/gmplonglong.h
+index bca4b77..5199d94 100644
+--- a/src/mzscheme/src/gmp/gmplonglong.h
++++ b/src/mzscheme/src/gmp/gmplonglong.h
+@@ -618,26 +618,45 @@ extern USItype __MPN(udiv_qrnnd) _PROTO ((USItype *, USItype, USItype, USItype))
+ #endif /* __m88000__ */
+ 
+ #if defined (__mips) && W_TYPE_SIZE == 32
+-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
++#if __GMP_GNUC_PREREQ (4,4)
++#define umul_ppmm(w1, w0, u, v) \
++  do {                                                                  \
++    UDItype __ll = (UDItype)(u) * (v);                                  \
++    w1 = __ll >> 32;                                                    \
++    w0 = __ll;                                                          \
++  } while (0)
++#endif
++#if !defined (umul_ppmm) && __GMP_GNUC_PREREQ (2,7)
+ #define umul_ppmm(w1, w0, u, v) \
+   __asm__ ("multu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
+-#else
++#endif
++#if !defined (umul_ppmm)
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("multu %2,%3\n\tmflo %0\n\tmfhi %1"				\
+-	   : "=d" (w0), "=d" (w1) : "d" (u), "d" (v))
++  __asm__ ("multu %2,%3\n\tmflo %0\n\tmfhi %1"                          \
++           : "=d" (w0), "=d" (w1) : "d" (u), "d" (v))
+ #endif
+ #define UMUL_TIME 10
+ #define UDIV_TIME 100
+ #endif /* __mips */
+ 
+ #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
+-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
++#if __GMP_GNUC_PREREQ (4,4)
++#define umul_ppmm(w1, w0, u, v) \
++  do {                                                                  \
++    typedef unsigned int __ll_UTItype __attribute__((mode(TI)));        \
++    __ll_UTItype __ll = (__ll_UTItype)(u) * (v);                        \
++    w1 = __ll >> 64;                                                    \
++    w0 = __ll;                                                          \
++  } while (0)
++#endif
++#if !defined (umul_ppmm) && __GMP_GNUC_PREREQ (2,7)
+ #define umul_ppmm(w1, w0, u, v) \
+   __asm__ ("dmultu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
+-#else
++#endif
++#if !defined (umul_ppmm)
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("dmultu %2,%3\n\tmflo %0\n\tmfhi %1"				\
+-	   : "=d" (w0), "=d" (w1) : "d" (u), "d" (v))
++  __asm__ ("dmultu %2,%3\n\tmflo %0\n\tmfhi %1"                         \
++           : "=d" (w0), "=d" (w1) : "d" (u), "d" (v))
+ #endif
+ #define UMUL_TIME 20
+ #define UDIV_TIME 140
+-- 
+1.7.3.1
+
diff --git a/debian/patches/series b/debian/patches/series
index e69de29..4762dac 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -0,0 +1 @@
+mips-gmp.diff
diff --git a/debian/rules b/debian/rules
index 66f2344..9dd3da9 100755
--- a/debian/rules
+++ b/debian/rules
@@ -4,7 +4,13 @@ include /usr/share/cdbs/1/rules/debhelper.mk
 include /usr/share/cdbs/1/class/autotools.mk
 include /usr/share/cdbs/1/rules/patchsys-quilt.mk
 
+DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
 DEB_CONFIGURE_SCRIPT := $(CURDIR)/src/configure
+# Some architectures don't like the 3m garbage collector, so use Boehm (aka
+# cgc)
+ifneq (,$(filter alpha mips mipsel,$(DEB_HOST_ARCH)))
+    DEB_CONFIGURE_EXTRA_FLAGS := --enable-cgcdefault
+endif
 # Upstream does funky things with assembly, so we'll have to trust their 
 # compilation settings and override cdbs/dpkg-buildpackage defaults for
 # configure and make

Attachment: signature.asc
Description: Digital signature


Reply to: