Index: lld/trunk/ELF/Arch/Hexagon.cpp =================================================================== --- lld/trunk/ELF/Arch/Hexagon.cpp +++ lld/trunk/ELF/Arch/Hexagon.cpp @@ -90,6 +90,7 @@ case R_HEX_B32_PCREL_X: return R_PLT_PC; case R_HEX_GOT_11_X: + case R_HEX_GOT_16_X: case R_HEX_GOT_32_6_X: return R_HEXAGON_GOT; default: @@ -191,7 +192,8 @@ case R_HEX_12_X: or32le(Loc, applyMask(0x000007e0, Val)); break; - case R_HEX_16_X: // This reloc only has 6 effective bits. + case R_HEX_16_X: // These relocs only have 6 effective bits. + case R_HEX_GOT_16_X: or32le(Loc, applyMask(findMaskR16(read32le(Loc)), Val & 0x3f)); break; case R_HEX_32: Index: lld/trunk/test/ELF/hexagon-shared.s =================================================================== --- lld/trunk/test/ELF/hexagon-shared.s +++ lld/trunk/test/ELF/hexagon-shared.s @@ -22,6 +22,9 @@ r0 = memw (r2+##bar@GOT) jumpr r0 +# R_HEX_GOT_16_X +r0 = add(r1,##bar@GOT) + # PLT: { immext(#65472 # PLT: r28 = add(pc,##65488) } # PLT: { r14 -= add(r28,#16) @@ -37,6 +40,7 @@ # TEXT: 10000: 00 00 02 00 00020000 # TEXT: { call 0x10050 } +# TEXT: r0 = add(r1,##65664) } # GOT: .got: # GOT: 30080: 00 00 00 00 00000000