Fix tospace/newspace confusion.
authorTaylor R Campbell <campbell@mumble.net>
Wed, 18 Sep 2019 01:50:37 +0000 (01:50 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 18 Sep 2019 01:50:37 +0000 (01:50 +0000)
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

index 84b9f62140b44a675bbe13ba3bf3d87e43ef92fb..bf28fa1f4a906398ae4144363a618f5d4d713360 100644 (file)
@@ -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 */