From f8aad6c1efe96685549e644ded43d4fb6db21ad6 Mon Sep 17 00:00:00 2001 From: Petar Jovanovic Date: Mon, 8 Jun 2015 14:10:23 +0000 Subject: [PATCH] [Mips64][mcjit] Add R_MIPS_PC32 relocation This patch adds R_MIPS_PC32 relocation for Mips64. Patch by Vladimir Radosavljevic. Differential Revision: http://reviews.llvm.org/D10235 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239301 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 5 +++++ .../RuntimeDyld/Mips/ELF_Mips64r2N64_PIC_relocations.s | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index 720b7b22933..b4a34e8acf3 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -631,6 +631,10 @@ RuntimeDyldELF::evaluateMIPS64Relocation(const SectionEntry &Section, uint64_t FinalAddress = (Section.LoadAddress + Offset); return ((Value + Addend - FinalAddress - 4) >> 2) & 0xffff; } + case ELF::R_MIPS_PC32: { + uint64_t FinalAddress = (Section.LoadAddress + Offset); + return Value + Addend - FinalAddress; + } case ELF::R_MIPS_PC18_S3: { uint64_t FinalAddress = (Section.LoadAddress + Offset); return ((Value + Addend - ((FinalAddress | 7) ^ 7)) >> 3) & 0x3ffff; @@ -669,6 +673,7 @@ void RuntimeDyldELF::applyMIPS64Relocation(uint8_t *TargetPtr, break; case ELF::R_MIPS_32: case ELF::R_MIPS_GPREL32: + case ELF::R_MIPS_PC32: writeBytesUnaligned(CalculatedValue & 0xffffffff, TargetPtr, 4); break; case ELF::R_MIPS_64: diff --git a/test/ExecutionEngine/RuntimeDyld/Mips/ELF_Mips64r2N64_PIC_relocations.s b/test/ExecutionEngine/RuntimeDyld/Mips/ELF_Mips64r2N64_PIC_relocations.s index d59d1350f39..1d8d293a26a 100644 --- a/test/ExecutionEngine/RuntimeDyld/Mips/ELF_Mips64r2N64_PIC_relocations.s +++ b/test/ExecutionEngine/RuntimeDyld/Mips/ELF_Mips64r2N64_PIC_relocations.s @@ -2,6 +2,15 @@ # RUN: llc -mtriple=mips64el-unknown-linux -relocation-model=pic -filetype=obj -o %T/test_ELF_ExternalFunction_Mips64N64.o %S/Inputs/ExternalFunction.ll # RUN: llvm-rtdyld -triple=mips64el-unknown-linux -verify -map-section test_ELF_Mips64N64.o,.text=0x1000 -map-section test_ELF_ExternalFunction_Mips64N64.o,.text=0x10000 -check=%s %/T/test_ELF_Mips64N64.o %T/test_ELF_ExternalFunction_Mips64N64.o + .data +# Test R_MIPS_PC32 relocation. +# rtdyld-check: *{4}(R_MIPS_PC32) = (foo - R_MIPS_PC32)[31:0] +R_MIPS_PC32: + .word foo-. +# rtdyld-check: *{4}(R_MIPS_PC32 + 4) = (foo - tmp1)[31:0] +tmp1: + .4byte foo-tmp1 + .text .abicalls .section .mdebug.abi64,"",@progbits -- 2.34.1