From: Eugene Leviant Date: Tue, 10 Jan 2017 11:05:30 +0000 (+0000) Subject: RuntimeDyldELF: implement R_AARCH64_PREL64 reloc X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d0a1dd4176f5a56893c0ed861bb887cb83e96a7;p=llvm RuntimeDyldELF: implement R_AARCH64_PREL64 reloc Differential revision: https://reviews.llvm.org/D28122 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291558 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index 8f6b1849169..05615d3cc6c 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -374,6 +374,9 @@ void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section, write(isBE, TargetPtr, static_cast(Result & 0xffffffffU)); break; } + case ELF::R_AARCH64_PREL64: + write(isBE, TargetPtr, Value + Addend - FinalAddress); + break; case ELF::R_AARCH64_CALL26: // fallthrough case ELF::R_AARCH64_JUMP26: { // Operation: S+A-P. Set Call or B immediate value to bits fff_fffc of the diff --git a/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s index a9ec0093950..7ef07d72200 100644 --- a/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s +++ b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s @@ -33,6 +33,9 @@ k: r: # R_AARCH64_PREL32: use Q instead of f to fit in 32 bits. .word Q - . +# R_AARCH64_PREL64 + .p2align 3 + .xword f - . # LE instructions read as BE # rtdyld-check: *{4}(g) = 0x6024e0d2 @@ -41,3 +44,4 @@ r: # rtdyld-check: *{4}(g + 12) = 0xe0bd99f2 # rtdyld-check: *{8}k = f # rtdyld-check: *{4}r = (Q - r)[31:0] +# rtdyld-check: *{8}(r + 8) = f - r - 8 diff --git a/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s index f9a03ab4066..069170bdf36 100644 --- a/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s +++ b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s @@ -47,7 +47,10 @@ k: .size k, 16 r: # R_AARCH64_PREL32: use Q instead of f to fit in 32 bits. - .word Q - . + .word Q - . +# R_AARCH64_PREL64 + .p2align 3 + .xword f - . # rtdyld-check: *{4}(g) = 0xd2e02460 # rtdyld-check: *{4}(g + 4) = 0xf2c8ace0 @@ -65,6 +68,7 @@ r: # rtdyld-check: *{8}k = f # rtdyld-check: *{4}r = (Q - r)[31:0] +# rtdyld-check: *{8}(r + 8) = f - r - 8 ## f & 0xFFF = 0xdef (bits 11:0 of f) ## 0xdef << 10 = 0x37bc00