diff options
author | Moritz Angermann <moritz.angermann@gmail.com> | 2020-05-15 13:34:31 +0800 |
---|---|---|
committer | Moritz Angermann <moritz.angermann@gmail.com> | 2020-06-04 04:56:41 -0400 |
commit | f2446ff1578a37822488e0e3968694f66712b969 (patch) | |
tree | 075f7d3175f0a076a876dafaae53a2bbb42cba99 | |
parent | ad44b50484f27beceab8213a061aa60c7a03f7ca (diff) | |
download | haskell-wip/angerman/aarch64-reloc-range.tar.gz |
Range is actually +/-2^32, not +/-2^31wip/angerman/aarch64-reloc-range
See also: https://static.docs.arm.com/ihi0056/g/aaelf64.pdf
-rw-r--r-- | rts/linker/elf_reloc_aarch64.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/rts/linker/elf_reloc_aarch64.c b/rts/linker/elf_reloc_aarch64.c index c2df14b06e..cdaaa67711 100644 --- a/rts/linker/elf_reloc_aarch64.c +++ b/rts/linker/elf_reloc_aarch64.c @@ -93,12 +93,14 @@ encodeAddendAarch64(Section * section, Elf_Rel * rel, int64_t addend) { // ... hi ] [ Rd ] // // imm64 = SignExtend(hi:lo:0x000,64) - assert(isInt64(32, addend)); + // Range is 21 bits + the 12 page relative bits + // known to be 0. -2^32 <= X < 2^32 + assert(isInt64(21+12, addend)); assert((addend & 0xfff) == 0); /* page relative */ *(inst_t *)P = (*(inst_t *)P & 0x9f00001f) - | (inst_t) (((uint64_t) addend << 17) & 0x60000000) - | (inst_t) (((uint64_t) addend >> 9) & 0x00ffffe0); + | (inst_t) (((uint64_t) addend << 17) & 0x60000000) + | (inst_t) (((uint64_t) addend >> 9) & 0x00ffffe0); break; } /* - control flow relocations */ @@ -111,8 +113,8 @@ encodeAddendAarch64(Section * section, Elf_Rel * rel, int64_t addend) { break; } case COMPAT_R_AARCH64_ADR_GOT_PAGE: { - - assert(isInt64(32, addend)); /* X in range */ + /* range is -2^32 <= X < 2^32 */ + assert(isInt64(21+12, addend)); /* X in range */ assert((addend & 0xfff) == 0); /* page relative */ *(inst_t *)P = (*(inst_t *)P & 0x9f00001f) |