Workaround for inexplicable fatal error on macOS.
authorChris Hanson <org/chris-hanson/cph>
Tue, 17 Sep 2019 06:50:23 +0000 (23:50 -0700)
committerChris Hanson <org/chris-hanson/cph>
Tue, 17 Sep 2019 06:50:23 +0000 (23:50 -0700)
src/microcode/cmpintmd/x86-64.c

index 84b9f62140b44a675bbe13ba3bf3d87e43ef92fb..8edfd8baae2e81d366e9fb65cbdcf91ae8cd62cf 100644 (file)
@@ -224,24 +224,26 @@ write_uuo_target (insn_t * target, SCHEME_OBJECT * saddr)
      But if the target is a compiled closure pointing into a block
      somewhere else, the block may not have been relocated yet and so
      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]));
-      if ((INT32_MIN <= jmprel32_offset) && (jmprel32_offset <= INT32_MAX))
-       {
-         (addr[10]) = 0xe9;    /* JMP rel32 */
-         (* ((int32_t *) (&addr[11]))) = jmprel32_offset;
-       }
-      else
-       {
-         (addr[10]) = 0x48;    /* MOV RAX,imm64 */
-         (addr[11]) = 0xb8;
-         (* ((insn_t **) (&addr[12]))) = target;
-         (addr[20]) = 0xff;    /* JMP RAX */
-         (addr[21]) = 0xe0;
-       }
-    }
-  else
+
+  // **** For unknown reasons this optimization doesn't work right on macOS.
+  // if ((((int64_t *) (newspace_to_tospace (target)))[-1]) == 0)
+  //   {
+  //     ptrdiff_t jmprel32_offset = (target - (&addr[15]));
+  //     if ((INT32_MIN <= jmprel32_offset) && (jmprel32_offset <= INT32_MAX))
+  //   {
+  //     (addr[10]) = 0xe9;    /* JMP rel32 */
+  //     (* ((int32_t *) (&addr[11]))) = jmprel32_offset;
+  //   }
+  //     else
+  //   {
+  //     (addr[10]) = 0x48;    /* MOV RAX,imm64 */
+  //     (addr[11]) = 0xb8;
+  //     (* ((insn_t **) (&addr[12]))) = target;
+  //     (addr[20]) = 0xff;    /* JMP RAX */
+  //     (addr[21]) = 0xe0;
+  //   }
+  //   }
+  // else
     {
       (addr[10]) = 0x48;       /* MOV RAX,-8(RCX) */
       (addr[11]) = 0x8b;