Index: ELF/Arch/Hexagon.cpp =================================================================== --- ELF/Arch/Hexagon.cpp +++ ELF/Arch/Hexagon.cpp @@ -53,6 +53,8 @@ RelExpr Hexagon::getRelExpr(RelType Type, const Symbol &S, const uint8_t *Loc) const { switch (Type) { + case R_HEX_B32_PCREL_X: + case R_HEX_B22_PCREL_X: case R_HEX_B22_PCREL: return R_PC; default: @@ -66,6 +68,12 @@ switch (Type) { case R_HEX_NONE: break; + case R_HEX_B32_PCREL_X: + or32le(Loc, applyMask(0x0fff3fff, Val >> 6)); + break; + case R_HEX_B22_PCREL_X: + or32le(Loc, applyMask(0x1ff3ffe, Val & 0x3f)); + break; case R_HEX_B22_PCREL: or32le(Loc, applyMask(0x1ff3ffe, Val >> 2)); break; Index: test/ELF/hexagon.s =================================================================== --- test/ELF/hexagon.s +++ test/ELF/hexagon.s @@ -7,3 +7,8 @@ # 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