[ELF][HEXAGON] Add R_HEX_GOT_16_X support

Differential Revision: https://reviews.llvm.org/D52909

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@343972 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/ELF/Arch/Hexagon.cpp b/ELF/Arch/Hexagon.cpp
index 9933192..b585007 100644
--- a/ELF/Arch/Hexagon.cpp
+++ b/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:
diff --git a/test/ELF/hexagon-shared.s b/test/ELF/hexagon-shared.s
index 9d65b4e..97f8e84 100644
--- a/test/ELF/hexagon-shared.s
+++ b/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 <unknown>