From 6be9604d29f64fb0605563183f301798d0a9e2c9 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Wed, 18 Sep 2019 01:50:37 +0000 Subject: [PATCH] Fix tospace/newspace confusion. This did not manifest in my testing on NetBSD because it happened that on NetBSD, the tospace and newspace are always separated by more than 4 GB, so the bogus jmprel32_offset was never used during GC, e.g.: newspace=0x17dd7f8 tospace=0x7f7feeb00000 delta=17523427132673 I suspect it is the cause of Chris's problems on macOS, so this should fix Chris's issue on macOS and speed things up even more for everyone. --- src/microcode/cmpintmd/x86-64.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/microcode/cmpintmd/x86-64.c b/src/microcode/cmpintmd/x86-64.c index 84b9f6214..bf28fa1f4 100644 --- a/src/microcode/cmpintmd/x86-64.c +++ b/src/microcode/cmpintmd/x86-64.c @@ -226,7 +226,8 @@ write_uuo_target (insn_t * target, SCHEME_OBJECT * saddr) we don't know where the PC will be in the newspace. */ if ((((int64_t *) (newspace_to_tospace (target)))[-1]) == 0) { - ptrdiff_t jmprel32_offset = (target - (&addr[15])); + ptrdiff_t jmprel32_offset = + (target - ((const insn_t *) (tospace_to_newspace (&addr[15])))); if ((INT32_MIN <= jmprel32_offset) && (jmprel32_offset <= INT32_MAX)) { (addr[10]) = 0xe9; /* JMP rel32 */ -- 2.25.1