diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp index 40746f21aac0b..8820ddc043d72 100644 --- a/lld/ELF/Arch/Hexagon.cpp +++ b/lld/ELF/Arch/Hexagon.cpp @@ -54,6 +54,8 @@ RelExpr Hexagon::getRelExpr(RelType Type, const Symbol &S, const uint8_t *Loc) const { switch (Type) { case R_HEX_B22_PCREL: + case R_HEX_B22_PCREL_X: + case R_HEX_B32_PCREL_X: return R_PC; default: return R_ABS; @@ -69,6 +71,12 @@ void Hexagon::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const { case R_HEX_B22_PCREL: or32le(Loc, applyMask(0x1ff3ffe, Val >> 2)); break; + case R_HEX_B22_PCREL_X: + or32le(Loc, applyMask(0x1ff3ffe, Val & 0x3f)); + break; + case R_HEX_B32_PCREL_X: + or32le(Loc, applyMask(0x0fff3fff, Val >> 6)); + break; default: error(getErrorLocation(Loc) + "unrecognized reloc " + toString(Type)); break; diff --git a/lld/test/ELF/hexagon.s b/lld/test/ELF/hexagon.s index 596b3d03c9d11..54922fab8d311 100644 --- a/lld/test/ELF/hexagon.s +++ b/lld/test/ELF/hexagon.s @@ -7,3 +7,9 @@ # R_HEX_B22_PCREL call #_start # CHECK: call 0x11000 + +# R_HEX_B32_PCREL_X +# R_HEX_B22_PCREL_X +call ##_start +# CHECK: immext(#4294967232) +# CHECK: call 0x11000