Index: lld/trunk/ELF/Arch/Hexagon.cpp =================================================================== --- lld/trunk/ELF/Arch/Hexagon.cpp +++ lld/trunk/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_B9_PCREL: + case R_HEX_B9_PCREL_X: case R_HEX_B15_PCREL: case R_HEX_B15_PCREL_X: case R_HEX_B22_PCREL: @@ -152,6 +154,12 @@ case R_HEX_32_6_X: or32le(Loc, applyMask(0x0fff3fff, Val >> 6)); break; + case R_HEX_B9_PCREL: + or32le(Loc, applyMask(0x003000fe, Val >> 2)); + break; + case R_HEX_B9_PCREL_X: + or32le(Loc, applyMask(0x003000fe, Val & 0x3f)); + break; case R_HEX_B15_PCREL: or32le(Loc, applyMask(0x00df20fe, Val >> 2)); break; Index: lld/trunk/test/ELF/hexagon.s =================================================================== --- lld/trunk/test/ELF/hexagon.s +++ lld/trunk/test/ELF/hexagon.s @@ -194,3 +194,11 @@ # 0xb0000000 r0 = add(r1, ##_start) # CHECK: b001c000 r0 = add(r1,##69632) } + +# R_HEX_B9_PCREL: +{r0=#1 ; jump #_start} +# CHECK: jump 0x11000 + +# R_HEX_B9_PCREL_X: +{r0=#1 ; jump ##_start} +# CHECK: jump 0x11000