diff options
| author | Mike Pall <mike> | 2021-05-22 13:31:48 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2021-05-22 13:31:48 +0200 |
| commit | 5783ba1bf73c53ca56e64ed0c462c62224f0393c (patch) | |
| tree | f9cc610239d7194db6cd6b7ee925bb970a5dadf3 | |
| parent | aa7ac6606872e4e21f92400d8491564ace10f259 (diff) | |
| download | luajit-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.h | 8 |
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; |
