Bring r264761 back with an extra fix.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 1 Apr 2016 17:00:36 +0000 (17:00 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 1 Apr 2016 17:00:36 +0000 (17:00 +0000)
The extra fix is to note that it still requires copy relocations.

Original message:

Change how we handle R_MIPS_LO16.

Mips aligns PT_LOAD to 16 bits (0x10000). That means that the lower 16
bits are always the same, so we can, effectively, say that the
relocation is relative.

P.S.: Suggestions for a better name for the predicate are welcome :-)

llvm-svn: 265150

lld/ELF/Target.cpp
lld/ELF/Writer.cpp

index 247f48e..2fe4579 100644 (file)
@@ -1722,7 +1722,7 @@ void MipsTargetInfo<ELFT>::writeThunk(uint8_t *Buf, uint64_t S) const {
 
 template <class ELFT>
 bool MipsTargetInfo<ELFT>::needsCopyRelImpl(uint32_t Type) const {
-  return !isRelRelative(Type);
+  return !isRelRelative(Type) || Type == R_MIPS_LO16;
 }
 
 template <class ELFT>
@@ -1897,7 +1897,6 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const {
   case R_MIPS_32:
   case R_MIPS_64:
   case R_MIPS_HI16:
-  case R_MIPS_LO16:
   case R_MIPS_TLS_DTPREL_HI16:
   case R_MIPS_TLS_DTPREL_LO16:
   case R_MIPS_TLS_TPREL_HI16:
index da5c3f8..b814adf 100644 (file)
@@ -445,15 +445,6 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C,
     }
 
     if (Config->EMachine == EM_MIPS) {
-      if (Type == R_MIPS_LO16)
-        // Ignore R_MIPS_LO16 relocation. If it is a pair for R_MIPS_GOT16 we
-        // already completed all required action (GOT entry allocation) when
-        // handle R_MIPS_GOT16. If it is a pair for R_MIPS_HI16 against
-        // _gp_disp it does not require dynamic relocation. If its a pair for
-        // R_MIPS_HI16 against a regular symbol it does not require dynamic
-        // relocation too because that case is possible for executable file
-        // linking only.
-        continue;
       if (&Body == Config->MipsGpDisp || &Body == Config->MipsLocalGp)
         // MIPS _gp_disp designates offset between start of function and 'gp'
         // pointer into GOT. __gnu_local_gp is equal to the current value of