Index: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp =================================================================== --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -374,6 +374,9 @@ 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 Index: llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s =================================================================== --- llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_BE-relocations.s @@ -33,6 +33,9 @@ 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 @@ # 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 Index: llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s =================================================================== --- llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_relocations.s @@ -47,7 +47,10 @@ .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 @@ # 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