diff options
| author | Davide Italiano <davide@freebsd.org> | 2015-10-28 16:14:18 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2015-10-28 16:14:18 +0000 |
| commit | b12d668e3d8c6b8fb327c6aff5f4620f60ea7b95 (patch) | |
| tree | 6b0ff9069c70996ad0b89e0d81f501d609290e65 | |
| parent | 7c9aa073fbc2e0c726af46e027a48d2be3f235f8 (diff) | |
| download | bcm5719-llvm-b12d668e3d8c6b8fb327c6aff5f4620f60ea7b95.tar.gz bcm5719-llvm-b12d668e3d8c6b8fb327c6aff5f4620f60ea7b95.zip | |
[ELF2/AArch64] Add support for R_AARCH64_PREL64.
llvm-svn: 251523
| -rw-r--r-- | lld/ELF/Target.cpp | 4 | ||||
| -rw-r--r-- | lld/test/elf2/aarch64-data-relocs.s | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 09e9df81896..4f2b0a16ea0 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -628,6 +628,10 @@ void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, updateAArch64Adr(Loc, (X >> 12) & 0x1FFFFF); // X[32:12] break; } + case R_AARCH64_PREL64: + // No overflow check needed. + write64le(Loc, SA - P); + break; default: error("unrecognized reloc " + Twine(Type)); } diff --git a/lld/test/elf2/aarch64-data-relocs.s b/lld/test/elf2/aarch64-data-relocs.s index bc68d518206..418776d857f 100644 --- a/lld/test/elf2/aarch64-data-relocs.s +++ b/lld/test/elf2/aarch64-data-relocs.s @@ -27,3 +27,14 @@ // CHECK-NEXT: 1006: 24 00 00 00 .word // ^-- A = 0x24 // CHECK-NEXT: 100a: 00 00 00 00 .word + +.section .R_AARCH64_PREL64, "ax",@progbits + .xword sym - . + 36 + +// S + A = 0x24 +// P = 0x100e +// SA - P = 0xfffffffffffff016 +// CHECK: Disassembly of section .R_AARCH64_PREL64: +// CHECK-NEXT: $d.3: +// CHECK-NEXT: 100e: 16 f0 ff ff .word +// CHECK-NEXT: 1012: ff ff ff ff .word |

