summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2021-05-22 13:31:48 +0200
committerMike Pall <mike>2021-05-22 13:31:48 +0200
commit5783ba1bf73c53ca56e64ed0c462c62224f0393c (patch)
treef9cc610239d7194db6cd6b7ee925bb970a5dadf3
parentaa7ac6606872e4e21f92400d8491564ace10f259 (diff)
downloadluajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.tar.gz
luajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.tar.bz2
luajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.zip
DynASM/ARM64: Fix ADRP encoding with absolute address.
Thanks to Dmitry Stogov.
-rw-r--r--dynasm/dasm_arm64.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h
index 8d1d9a96..d6da4528 100644
--- a/dynasm/dasm_arm64.h
+++ b/dynasm/dasm_arm64.h
@@ -473,7 +473,13 @@ int dasm_encode(Dst_DECL, void *buffer)
473 } 473 }
474 break; 474 break;
475 case DASM_REL_A: { 475 case DASM_REL_A: {
476 ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n) - (ptrdiff_t)cp + 4; 476 ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n);
477 if ((ins & 0x3000) == 0x3000) { /* ADRP */
478 ins &= ~0x1000;
479 na = (na >> 12) - (((ptrdiff_t)cp - 4) >> 12);
480 } else {
481 na = na - (ptrdiff_t)cp + 4;
482 }
477 n = (int)na; 483 n = (int)na;
478 CK((ptrdiff_t)n == na, RANGE_REL); 484 CK((ptrdiff_t)n == na, RANGE_REL);
479 goto patchrel; 485 goto patchrel;