Browse Source

DynASM/ARM64: Fix ADRP encoding with absolute address.

Thanks to Dmitry Stogov.
Mike Pall 4 years ago
parent
commit
5783ba1bf7
1 changed files with 7 additions and 1 deletions
  1. 7 1
      dynasm/dasm_arm64.h

+ 7 - 1
dynasm/dasm_arm64.h

@@ -473,7 +473,13 @@ int dasm_encode(Dst_DECL, void *buffer)
 	  }
 	  }
 	  break;
 	  break;
 	case DASM_REL_A: {
 	case DASM_REL_A: {
-	  ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n) - (ptrdiff_t)cp + 4;
+	  ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n);
+	  if ((ins & 0x3000) == 0x3000) {  /* ADRP */
+	    ins &= ~0x1000;
+	    na = (na >> 12) - (((ptrdiff_t)cp - 4) >> 12);
+	  } else {
+	    na = na - (ptrdiff_t)cp + 4;
+	  }
 	  n = (int)na;
 	  n = (int)na;
 	  CK((ptrdiff_t)n == na, RANGE_REL);
 	  CK((ptrdiff_t)n == na, RANGE_REL);
 	  goto patchrel;
 	  goto patchrel;