aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Ángel Arruga Vivas <rosen644835@gmail.com>2020-12-28 10:36:48 +0100
committerMiguel Ángel Arruga Vivas <rosen644835@gmail.com>2021-01-05 12:51:12 +0100
commite3281657c8a97e32169fcc7e178f3fbbab7c88b7 (patch)
tree64ec0fc16e2dd79130784e67d2ecd688b9ecbc10
parentc25285b6a155365a73c1f84e42397b2cd01d3023 (diff)
downloadguix-e3281657c8a97e32169fcc7e178f3fbbab7c88b7.tar
guix-e3281657c8a97e32169fcc7e178f3fbbab7c88b7.tar.gz
gnu: smalltalk: Fix integer multiplication overflow.
* gnu/local.mk (dist_patch_DATA): Add Smalltalk patch. * gnu/packages/patches/smalltalk-multiplication-overflow.patch: Patch from upstream commit 72ada189aba0283c551ead16635c1983968080b8. * gnu/packages/smalltalk.scm (smalltalk): Use patch and link with gmp and lightning libraries instead of the included source.
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/patches/smalltalk-multiplication-overflow.patch121
-rw-r--r--gnu/packages/smalltalk.scm47
3 files changed, 164 insertions, 5 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 53a67e6ffe..2e026cb252 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1451,6 +1451,7 @@ dist_patch_DATA = \
%D%/packages/patches/sdl-pango-header-guard.patch \
%D%/packages/patches/sdl-pango-matrix_declarations.patch \
%D%/packages/patches/sdl-pango-sans-serif.patch \
+ %D%/packages/patches/smalltalk-multiplication-overflow.patch \
%D%/packages/patches/sqlite-hurd.patch \
%D%/packages/patches/sunxi-tools-remove-sys-io.patch \
%D%/packages/patches/patchutils-test-perms.patch \
diff --git a/gnu/packages/patches/smalltalk-multiplication-overflow.patch b/gnu/packages/patches/smalltalk-multiplication-overflow.patch
new file mode 100644
index 0000000000..7a0b4d02f7
--- /dev/null
+++ b/gnu/packages/patches/smalltalk-multiplication-overflow.patch
@@ -0,0 +1,121 @@
+Extracted from this commit without the ChangeLog to avoid conflicts:
+http://git.savannah.gnu.org/cgit/smalltalk.git/commit/?id=72ada189aba0283c551ead16635c1983968080b8
+
+The upstream commit message is
+From 72ada189aba0283c551ead16635c1983968080b8 Mon Sep 17 00:00:00 2001
+From: Holger Hans Peter Freyther <holger@moiji-mobile.com>
+Date: Sat, 7 Nov 2015 18:09:31 +0100
+Subject: libgst: Add alternative multiplication overflow check
+
+Apple clang on OSX and the version on FreeBSD optimize the
+multiplication check away. Clang introduced a family of
+builtins to do the multiplication and check for the overflow
+and GCC made the API usable. For clang we would need to know
+if intptr_t is of type int, long int, long long int and
+then use the smul, smull smulll.
+Luckily clang is adopting the better interface and this is
+what we are starting to use now. This means the new code
+will be used on GCC5 (and later) and some future versions of
+clang.
+
+2015-11-07 Holger Hans Peter Freyther <holger@freyther.de>
+
+ * build-aux/overflow-builtins.m4: Add new macro.
+ * configure.ac: Use GST_C_OVERFLOW_BUILTINS macro.
+
+2015-11-07 Holger Hans Peter Freyther <holger@freyther.de>
+
+ * interp.inl: Add alternative mul_with_check implementation.
+---
+ ChangeLog | 5 +++++
+ build-aux/overflow-builtins.m4 | 23 +++++++++++++++++++++++
+ configure.ac | 1 +
+ libgst/ChangeLog | 4 ++++
+ libgst/interp.inl | 22 ++++++++++++++++++++++
+ 5 files changed, 55 insertions(+)
+ create mode 100644 build-aux/overflow-builtins.m4
+
+diff --git a/build-aux/overflow-builtins.m4 b/build-aux/overflow-builtins.m4
+new file mode 100644
+index 00000000..9d050196
+--- /dev/null
++++ b/build-aux/overflow-builtins.m4
+@@ -0,0 +1,23 @@
++dnl Check whether the host supports synchronization builtins.
++
++AC_DEFUN([GST_C_OVERFLOW_BUILTINS], [
++ AC_REQUIRE([AC_CANONICAL_HOST])
++ AC_CACHE_CHECK([whether the host supports __builtin_mul_overflow],
++ gst_cv_have_builtin_mul_overflow, [
++ save_CFLAGS="$CFLAGS"
++ case $host in
++ i?86-apple-darwin*) ;;
++ i?86-*-*) CFLAGS="$CFLAGS -march=i486" ;;
++ esac
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foovar = 0;]], [[
++if (__builtin_mul_overflow(44444, 55555, &foovar))
++ return 23;]])],
++ [gst_cv_have_builtin_mul_overflow=yes],
++ [gst_cv_have_builtin_mul_overflow=no])
++ CFLAGS="$save_CFLAGS"
++ ])
++ if test $gst_cv_have_builtin_mul_overflow = yes; then
++ AC_DEFINE(HAVE_OVERFLOW_BUILTINS, 1,
++ [Define to 1 if the host supports __builtin_*_overflow builtins])
++ fi
++])
+diff --git a/configure.ac b/configure.ac
+index e789be45..0bac23ef 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -243,6 +243,7 @@ GST_C_SYNC_BUILTINS
+ if test $gst_cv_have_sync_fetch_and_add = no; then
+ AC_MSG_ERROR([Synchronization primitives not found, please use a newer compiler.])
+ fi
++GST_C_OVERFLOW_BUILTINS
+
+ GST_LOCK
+ AC_SYS_LARGEFILE
+diff --git a/libgst/interp.inl b/libgst/interp.inl
+index e18e27c7..dbc631bc 100644
+--- a/libgst/interp.inl
++++ b/libgst/interp.inl
+@@ -159,6 +159,27 @@ sub_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
+ OOP
+ mul_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
+ {
++#ifdef HAVE_OVERFLOW_BUILTINS
++ intptr_t a = TO_INT (op1);
++ intptr_t b = TO_INT (op2);
++ intptr_t result;
++
++ if (__builtin_mul_overflow(a, b, &result))
++ {
++ *overflow = true;
++ return FROM_INT(0);
++ }
++
++
++ if (result < MIN_ST_INT || result > MAX_ST_INT)
++ {
++ *overflow = true;
++ return FROM_INT(0);
++ }
++
++ *overflow = false;
++ return FROM_INT(result);
++#else
+ intptr_t a = TO_INT (op1);
+ intptr_t b = TO_INT (op2);
+ intmax_t result = (intmax_t)a * b;
+@@ -188,6 +209,7 @@ mul_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
+ }
+
+ return FROM_INT (0);
++#endif
+ }
+
+ /* State of the random generator.
+--
+2.29.2
+
diff --git a/gnu/packages/smalltalk.scm b/gnu/packages/smalltalk.scm
index 5d35f563e2..742a9b89c4 100644
--- a/gnu/packages/smalltalk.scm
+++ b/gnu/packages/smalltalk.scm
@@ -26,6 +26,8 @@
#:use-module (guix download)
#:use-module (guix build-system cmake)
#:use-module (guix build-system gnu)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages assembly)
#:use-module (gnu packages audio)
#:use-module (gnu packages autotools)
#:use-module (gnu packages base)
@@ -36,6 +38,7 @@
#:use-module (gnu packages libffi)
#:use-module (gnu packages libsigsegv)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages multiprecision)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages pulseaudio)
#:use-module (gnu packages xorg))
@@ -51,18 +54,52 @@
version ".tar.xz"))
(sha256
(base32
- "1k2ssrapfzhngc7bg1zrnd9n2vyxp9c9m70byvsma6wapbvib6l1"))))
+ "1k2ssrapfzhngc7bg1zrnd9n2vyxp9c9m70byvsma6wapbvib6l1"))
+ ;; XXX: To be removed with the next release of Smalltalk.
+ (patches (search-patches "smalltalk-multiplication-overflow.patch"))))
(build-system gnu-build-system)
(native-inputs
- `(("libffi" ,libffi)
+ `(("pkg-config" ,pkg-config)
+ ;; XXX: To be removed with the next release of Smalltalk.
+ ("autoconf" ,autoconf)
+ ("automake" ,automake)
+ ("libtool" ,libtool)))
+ ;; TODO: These optional dependencies raise the closure size to ~1 GiB
+ ;; from the current ~100 MiB, although some of them might be very
+ ;; useful for end users:
+ ;; - freeglut
+ ;; - glib
+ ;; - gobject-introspection
+ ;; - gtk+-2
+ ;; - tcl/tk
+ ;; - SDL (sdl-union)
+ ;; - sqlite
+ ;; - zlib
+ (inputs
+ `(("gmp" ,gmp)
+ ("libffi" ,libffi)
("libltdl" ,libltdl)
("libsigsegv" ,libsigsegv)
- ("pkg-config" ,pkg-config)))
- (inputs
- `(("zip" ,zip)))
+ ("lightning" ,lightning)
+ ("zip" ,zip)))
(arguments
`(#:phases
(modify-phases %standard-phases
+ ;; XXX: To be removed with the next release of Smalltalk.
+ ;; The overflow patch modifies configure.ac, therefore remove
+ ;; old configure script and enforce an autoreconf.
+ (add-before 'bootstrap 'remove-unpatched-configure
+ (lambda _
+ (delete-file "configure")
+ #t))
+ ;; XXX: To be removed with the next release of Smalltalk.
+ ;; We don't want to regenerate the info files.
+ (add-after 'build 'keep-generated-info-manual
+ (lambda _
+ (for-each (lambda (file)
+ (invoke "touch" file))
+ (find-files "doc" "\\.info"))
+ #t))
(add-before 'configure 'fix-libc
(lambda _
(let ((libc (assoc-ref %build-inputs "libc")))