Don't relocate with sections if there might be a paired relocation.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 31 Mar 2014 19:00:23 +0000 (19:00 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 31 Mar 2014 19:00:23 +0000 (19:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205240 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/ELF.h
lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
test/MC/Mips/xgot.s

index 2ac4259143663e2dc8a260ad2e32550d1d105321..7b10ebd23f209ace3855cb65f9a56c8f952f838a 100644 (file)
@@ -880,6 +880,9 @@ enum {
   R_MIPS_TLS_TPREL_HI16    = 49,
   R_MIPS_TLS_TPREL_LO16    = 50,
   R_MIPS_GLOB_DAT          = 51,
+  R_MIPS16_GOT16           = 102,
+  R_MIPS16_HI16            = 104,
+  R_MIPS16_LO16            = 105,
   R_MIPS_COPY              = 126,
   R_MIPS_JUMP_SLOT         = 127,
   R_MICROMIPS_26_S1        = 133,
index f933962d6643b8a620e7c5c731ba382946c799d5..794978b30bf8919975f501077e59a4068b3ee049 100644 (file)
@@ -206,9 +206,25 @@ MipsELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const {
   default:
     return true;
 
-  case ELF::R_MIPS_26:
-  case ELF::R_MIPS_LO16:
+  case ELF::R_MIPS_GOT16:
+  case ELF::R_MIPS16_GOT16:
+  case ELF::R_MICROMIPS_GOT16:
+    llvm_unreachable("Should have been handled already");
+
+  // These relocations might be paired with another relocation. The pairing is
+  // done by the static linker by matching the symbol. Since we only see one
+  // relocation at a time, we have to force them to relocate with a symbol to
+  // avoid ending up with a pair where one points to a section and another
+  // points to a symbol.
   case ELF::R_MIPS_HI16:
+  case ELF::R_MIPS16_HI16:
+  case ELF::R_MICROMIPS_HI16:
+  case ELF::R_MIPS_LO16:
+  case ELF::R_MIPS16_LO16:
+  case ELF::R_MICROMIPS_LO16:
+    return true;
+
+  case ELF::R_MIPS_26:
   case ELF::R_MIPS_32:
   case ELF::R_MIPS_64:
   case ELF::R_MIPS_GPREL16:
index 13e1b7e733ed0671030473f9b39c510b3e8dcbdd..30848066ce3a4d7e9f4e3a213e18b353f6f35b31 100644 (file)
@@ -11,7 +11,7 @@
 // CHECK:   0x24 R_MIPS_CALL_HI16 printf
 // CHECK:   0x2C R_MIPS_GOT16 $.str
 // CHECK:   0x30 R_MIPS_CALL_LO16 printf
-// CHECK:   0x38 R_MIPS_LO16 .rodata.str1.1
+// CHECK:   0x38 R_MIPS_LO16 $.str
 // CHECK: ]
 
        .text