unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc
@ 2020-06-07 15:17 Simon South
  2020-06-07 15:18 ` [bug#41748] [PATCH 1/1] gnu: jamvm: Fix " Simon South
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Simon South @ 2020-06-07 15:17 UTC (permalink / raw)
  To: 41748; +Cc: Simon South

This patch allows JamVM 2.0.0 to be built without using outdated versions of
gcc and glibc, by disabling the branch-patching optimization JamVM normally
applies to code it has inlined.

I've successfully built IcedTea 1.13.13 on x86_64 with this patch applied,
without encountering any "Invalid instruction" errors. It also seems to work
fine on aarch64.

Lengthy explanation, for anyone interested in the details:

JamVM's branch-patching optimization tries to improve the performance of
Java's branching opcodes by replacing the load-operand-and-jump portion of
their implementation with a single jump instruction directly to the handler
for the opcode to which the operand points. However, the current
implementation

- Doesn't attempt much of an optimization, since it only replaces the final
  jump instruction with another (the operand is still loaded in either case).

- Doesn't have any actual effect since the instruction it replaces is a
  duplicate synthesized by gcc that is never executed anyway.

- Is prone to breakage, since it doesn't ensure the new jump instruction is
  the same length as the original. (This is the specific reason for the
  failure on x86_64: The replacement jump instruction is longer and clobbers
  part of the following instruction, making it invalid.)

This patch simply disables the optimization within JamVM, leaving the other
optimizations intact. (gcc is smart enough to no longer generate duplicate
jump instructions in this case so it reduces the code size slightly, too.)

Alternate solutions I considered and rejected:

- Fixing the implementation. JamVM uses a label to mark within each opcode's
  handler where the jump instruction should be placed, and moving this label
  to the start of the load-and-jump sequence rather than the end appears (from
  stepping through the code with gdb) to fix all the issues above. However,
  JamVM then fails at startup, reporting an unhandle-able exception during
  initialization. So presumably some other part of the code relies on the
  current, broken implementation of this feature, and while it's probably
  possible to fix _that_ as well I doubt it would be worth the effort.

- Disabling the optimization at runtime. Invoking JamVM with "-Xnopatching"
  also solves the problem, and we could just update the bootstrap procedure to
  do this. However JamVM 1.5.1 doesn't recognize this option and fails if it's
  specified, so we'd need to change the ecj-javac-wrapper package to handle
  the two interpreters differently or to accept an argument specifying the
  flags to use, and in my opinion this would be a step backwards from what
  exists currently.

  Also, since JamVM would only ever work reliably when this option is
  specified, it's not really much of an "option" and making its effect
  permanent in the code seems like a more sensible approach.
  
--
Simon South
simon@simonsouth.net


Simon South (1):
  gnu: jamvm: Fix to work with current gcc and glibc.

 gnu/packages/java.scm                         |  7 ++---
 .../jamvm-2.0.0-disable-branch-patching.patch | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 5 deletions(-)
 create mode 100644 gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch

-- 
2.26.2




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [bug#41748] [PATCH 1/1] gnu: jamvm: Fix to work with current gcc and glibc.
  2020-06-07 15:17 [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc Simon South
@ 2020-06-07 15:18 ` Simon South
  2020-06-10 15:03 ` [bug#41748] [PATCH 0/1] Fix JamVM " Simon South
  2020-06-22 20:37 ` bug#41748: " Marius Bakke
  2 siblings, 0 replies; 4+ messages in thread
From: Simon South @ 2020-06-07 15:18 UTC (permalink / raw)
  To: 41748; +Cc: Simon South

* gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch: New file.
* gnu/packages/java.scm (jamvm)[source]: Add patch.
(jamvm-1-bootstrap)[native-inputs]: Remove.
---
 gnu/packages/java.scm                         |  7 ++---
 .../jamvm-2.0.0-disable-branch-patching.patch | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 5 deletions(-)
 create mode 100644 gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch

diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 43f0f37b91..9a6f6fe0df 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -254,11 +254,6 @@ language.")
        ("libffi" ,libffi)
        ("zip" ,zip)
        ("zlib" ,zlib)))
-    ;; When built with a recent GCC and glibc the configure step of icedtea-6
-    ;; fails with an invalid instruction error.
-    (native-inputs
-     `(("gcc" ,gcc-5)
-       ("libc" ,glibc-2.28)))
     (home-page "http://jamvm.sourceforge.net/")
     (synopsis "Small Java Virtual Machine")
     (description "JamVM is a Java Virtual Machine conforming to the JVM
@@ -708,6 +703,8 @@ machine.")))
               (sha256
                (base32
                 "1nl0zxz8y5x8gwsrm7n32bry4dx8x70p8z3s9jbdvs8avyb8whkn"))
+              (patches
+               (search-patches "jamvm-2.0.0-disable-branch-patching.patch"))
               (snippet
                '(begin
                   ;; Remove precompiled software.
diff --git a/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch b/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch
new file mode 100644
index 0000000000..a99624280f
--- /dev/null
+++ b/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch
@@ -0,0 +1,27 @@
+From 8d10be7345d7fe139e619cc55a22dbc86f677543 Mon Sep 17 00:00:00 2001
+From: Simon South <simon@simonsouth.net>
+Date: Sat, 6 Jun 2020 18:56:56 -0400
+Subject: [PATCH] Disable branch-patching
+
+---
+ src/init.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/init.c b/src/init.c
+index 32539cf..38ad54b 100644
+--- a/src/init.c
++++ b/src/init.c
+@@ -72,8 +72,8 @@ void setDefaultInitArgs(InitArgs *args) {
+ #ifdef INLINING
+     args->replication_threshold = 10;
+     args->profile_threshold     = 10;
+-    args->branch_patching_dup   = TRUE;
+-    args->branch_patching       = TRUE;
++    args->branch_patching_dup   = FALSE;
++    args->branch_patching       = FALSE;
+     args->print_codestats       = FALSE;
+     args->join_blocks           = TRUE;
+     args->profiling             = TRUE;
+-- 
+2.25.2
+
-- 
2.26.2





^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc
  2020-06-07 15:17 [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc Simon South
  2020-06-07 15:18 ` [bug#41748] [PATCH 1/1] gnu: jamvm: Fix " Simon South
@ 2020-06-10 15:03 ` Simon South
  2020-06-22 20:37 ` bug#41748: " Marius Bakke
  2 siblings, 0 replies; 4+ messages in thread
From: Simon South @ 2020-06-10 15:03 UTC (permalink / raw)
  To: 41748

[-- Attachment #1: Type: text/plain, Size: 237 bytes --]

Attached is an updated version of this patch that

- Adds a brief description to the patch it contains, indicating why it
  is necessary; and

- Updates gnu/local.mk, as is apparently now required.

-- 
Simon South
simon@simonsouth.net


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-gnu-jamvm-Fix-to-work-with-current-gcc-and-glibc.patch --]
[-- Type: text/x-patch, Size: 3741 bytes --]

From 3dbc081418737b0901982f89b8eb260b6c8bd3f0 Mon Sep 17 00:00:00 2001
From: Simon South <simon@simonsouth.net>
Date: Sat, 6 Jun 2020 19:53:39 -0400
Subject: [PATCH] gnu: jamvm: Fix to work with current gcc and glibc.

* gnu/packages/java.scm (jamvm)[source]: Add patch.
(jamvm-1-bootstrap)[native-inputs]: Remove.
* gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
---
 gnu/local.mk                                  |  1 +
 gnu/packages/java.scm                         |  7 ++---
 .../jamvm-2.0.0-disable-branch-patching.patch | 31 +++++++++++++++++++
 3 files changed, 34 insertions(+), 5 deletions(-)
 create mode 100644 gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 76d6b5deba..7d65fbb605 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1107,6 +1107,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/irrlicht-use-system-libs.patch		\
   %D%/packages/patches/isl-0.11.1-aarch64-support.patch	\
   %D%/packages/patches/jacal-fix-texinfo.patch			\
+  %D%/packages/patches/jamvm-2.0.0-disable-branch-patching.patch	\
   %D%/packages/patches/jamvm-arm.patch				\
   %D%/packages/patches/java-apache-ivy-port-to-latest-bouncycastle.patch	\
   %D%/packages/patches/java-commons-collections-fix-java8.patch \
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 43f0f37b91..9a6f6fe0df 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -254,11 +254,6 @@ language.")
        ("libffi" ,libffi)
        ("zip" ,zip)
        ("zlib" ,zlib)))
-    ;; When built with a recent GCC and glibc the configure step of icedtea-6
-    ;; fails with an invalid instruction error.
-    (native-inputs
-     `(("gcc" ,gcc-5)
-       ("libc" ,glibc-2.28)))
     (home-page "http://jamvm.sourceforge.net/")
     (synopsis "Small Java Virtual Machine")
     (description "JamVM is a Java Virtual Machine conforming to the JVM
@@ -708,6 +703,8 @@ machine.")))
               (sha256
                (base32
                 "1nl0zxz8y5x8gwsrm7n32bry4dx8x70p8z3s9jbdvs8avyb8whkn"))
+              (patches
+               (search-patches "jamvm-2.0.0-disable-branch-patching.patch"))
               (snippet
                '(begin
                   ;; Remove precompiled software.
diff --git a/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch b/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch
new file mode 100644
index 0000000000..1352ed7803
--- /dev/null
+++ b/gnu/packages/patches/jamvm-2.0.0-disable-branch-patching.patch
@@ -0,0 +1,31 @@
+From d80cfc83325f8e95d35ecd9f15b36b96fa9ed3ee Mon Sep 17 00:00:00 2001
+From: Simon South <simon@simonsouth.net>
+Date: Sat, 6 Jun 2020 18:56:56 -0400
+Subject: [PATCH] Disable branch-patching
+
+This patch disables JamVM's branch-patching optimization, which tends
+to make JamVM fail with an "Illegal instruction" error on x86_64 (and
+possibly other architectures that use variable-length instructions)
+when built using modern versions of gcc and glibc.
+---
+ src/init.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/init.c b/src/init.c
+index 32539cf..38ad54b 100644
+--- a/src/init.c
++++ b/src/init.c
+@@ -72,8 +72,8 @@ void setDefaultInitArgs(InitArgs *args) {
+ #ifdef INLINING
+     args->replication_threshold = 10;
+     args->profile_threshold     = 10;
+-    args->branch_patching_dup   = TRUE;
+-    args->branch_patching       = TRUE;
++    args->branch_patching_dup   = FALSE;
++    args->branch_patching       = FALSE;
+     args->print_codestats       = FALSE;
+     args->join_blocks           = TRUE;
+     args->profiling             = TRUE;
+-- 
+2.25.2
+
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* bug#41748: [PATCH 0/1] Fix JamVM to work with current gcc and glibc
  2020-06-07 15:17 [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc Simon South
  2020-06-07 15:18 ` [bug#41748] [PATCH 1/1] gnu: jamvm: Fix " Simon South
  2020-06-10 15:03 ` [bug#41748] [PATCH 0/1] Fix JamVM " Simon South
@ 2020-06-22 20:37 ` Marius Bakke
  2 siblings, 0 replies; 4+ messages in thread
From: Marius Bakke @ 2020-06-22 20:37 UTC (permalink / raw)
  To: Simon South, 41748-done; +Cc: Simon South

[-- Attachment #1: Type: text/plain, Size: 609 bytes --]

Simon South <simon@simonsouth.net> writes:

> This patch allows JamVM 2.0.0 to be built without using outdated versions of
> gcc and glibc, by disabling the branch-patching optimization JamVM normally
> applies to code it has inlined.
>
> I've successfully built IcedTea 1.13.13 on x86_64 with this patch applied,
> without encountering any "Invalid instruction" errors. It also seems to work
> fine on aarch64.

Thanks a lot for this patch, and the brilliant analysis.  I have applied
the updated version and will push shortly.

I modified it to also remove the (gnu packages gcc) import from
java.scm.  \o/

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-06-22 20:38 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-07 15:17 [bug#41748] [PATCH 0/1] Fix JamVM to work with current gcc and glibc Simon South
2020-06-07 15:18 ` [bug#41748] [PATCH 1/1] gnu: jamvm: Fix " Simon South
2020-06-10 15:03 ` [bug#41748] [PATCH 0/1] Fix JamVM " Simon South
2020-06-22 20:37 ` bug#41748: " Marius Bakke

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).