From 3241724536b2c5a6ea0666676e7ad9d1b8bacfa4 Mon Sep 17 00:00:00 2001 From: Sid Manning Date: Tue, 24 Jul 2018 15:08:13 +0000 Subject: [PATCH] [ELF][HEXAGON] Add R_HEX_B15_PCREL_X relocation Update testcase Differential Revision: https://reviews.llvm.org/D49567 llvm-svn: 337829 --- lld/ELF/Arch/Hexagon.cpp | 4 ++++ lld/test/ELF/hexagon.s | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp index c0d48a85d23f..2d5c23fd5ad6 100644 --- a/lld/ELF/Arch/Hexagon.cpp +++ b/lld/ELF/Arch/Hexagon.cpp @@ -54,6 +54,7 @@ RelExpr Hexagon::getRelExpr(RelType Type, const Symbol &S, const uint8_t *Loc) const { switch (Type) { case R_HEX_B15_PCREL: + case R_HEX_B15_PCREL_X: case R_HEX_B22_PCREL: case R_HEX_B22_PCREL_X: case R_HEX_B32_PCREL_X: @@ -72,6 +73,9 @@ void Hexagon::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const { case R_HEX_B15_PCREL: or32le(Loc, applyMask(0x00df20fe, Val >> 2)); break; + case R_HEX_B15_PCREL_X: + or32le(Loc, applyMask(0x00df20fe, Val & 0x3f)); + break; case R_HEX_B22_PCREL: or32le(Loc, applyMask(0x1ff3ffe, Val >> 2)); break; diff --git a/lld/test/ELF/hexagon.s b/lld/test/ELF/hexagon.s index efc7c62fe39e..8c824ea3c78a 100644 --- a/lld/test/ELF/hexagon.s +++ b/lld/test/ELF/hexagon.s @@ -8,6 +8,11 @@ if (p0) jump:nt #_start # CHECK: if (p0) jump:nt 0x11000 +# R_HEX_B32_PCREL_X +# R_HEX_B15_PCREL_X +if (p0) jump:nt ##_start +# CHECK: if (p0) jump:nt 0x11000 + # R_HEX_B22_PCREL call #_start # CHECK: call 0x11000