[lld] r232919 - [Mips] Pass type of relocation and addendum to the `calculateRelocation`

Simon Atanasyan simon at atanasyan.com
Sun Mar 22 09:35:09 PDT 2015


Author: atanasyan
Date: Sun Mar 22 11:35:08 2015
New Revision: 232919

URL: http://llvm.org/viewvc/llvm-project?rev=232919&view=rev
Log:
[Mips] Pass type of relocation and addendum to the `calculateRelocation`
separately

This change reduce difference between the trunk and upcoming patch and
simplify the future code review.

No functional changes.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=232919&r1=232918&r2=232919&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp Sun Mar 22 11:35:08 2015
@@ -373,34 +373,36 @@ static uint32_t microShuffle(uint32_t in
   return ((ins & 0xffff) << 16) | ((ins & 0xffff0000) >> 16);
 }
 
-static ErrorOr<uint64_t> calculateRelocation(const Reference &ref,
+static ErrorOr<uint64_t> calculateRelocation(Reference::KindValue kind,
+                                             Reference::Addend addend,
                                              uint64_t tgtAddr, uint64_t relAddr,
-                                             uint64_t gpAddr, bool isGP) {
-  bool isCrossJump = getCrossJumpMode(ref) != CrossJumpMode::None;
-  switch (ref.kindValue()) {
+                                             uint64_t gpAddr, bool isGP,
+                                             CrossJumpMode jumpMode) {
+  bool isCrossJump = jumpMode !=  CrossJumpMode::None;
+  switch (kind) {
   case R_MIPS_NONE:
     return 0;
   case R_MIPS_32:
-    return reloc32(tgtAddr, ref.addend());
+    return reloc32(tgtAddr, addend);
   case R_MIPS_64:
-    return reloc64(tgtAddr, ref.addend());
+    return reloc64(tgtAddr, addend);
   case R_MIPS_SUB:
-    return relocSub(tgtAddr, ref.addend());
+    return relocSub(tgtAddr, addend);
   case R_MIPS_26:
-    return reloc26loc(relAddr, tgtAddr, ref.addend(), 2);
+    return reloc26loc(relAddr, tgtAddr, addend, 2);
   case R_MICROMIPS_26_S1:
-    return reloc26loc(relAddr, tgtAddr, ref.addend(), isCrossJump ? 2 : 1);
+    return reloc26loc(relAddr, tgtAddr, addend, isCrossJump ? 2 : 1);
   case R_MIPS_HI16:
   case R_MICROMIPS_HI16:
-    return relocHi16(relAddr, tgtAddr, ref.addend(), isGP);
+    return relocHi16(relAddr, tgtAddr, addend, isGP);
   case R_MIPS_PCHI16:
-    return relocPcHi16(relAddr, tgtAddr, ref.addend());
+    return relocPcHi16(relAddr, tgtAddr, addend);
   case R_MIPS_LO16:
-    return relocLo16(relAddr, tgtAddr, ref.addend(), isGP, false);
+    return relocLo16(relAddr, tgtAddr, addend, isGP, false);
   case R_MIPS_PCLO16:
-    return relocPcLo16(relAddr, tgtAddr, ref.addend());
+    return relocPcLo16(relAddr, tgtAddr, addend);
   case R_MICROMIPS_LO16:
-    return relocLo16(relAddr, tgtAddr, ref.addend(), isGP, true);
+    return relocLo16(relAddr, tgtAddr, addend, isGP, true);
   case R_MIPS_GOT16:
   case R_MIPS_CALL16:
   case R_MIPS_GOT_DISP:
@@ -415,38 +417,38 @@ static ErrorOr<uint64_t> calculateReloca
   case R_MICROMIPS_TLS_GOTTPREL:
     return relocGOT(tgtAddr, gpAddr);
   case R_MIPS_GOT_OFST:
-    return relocGOTOfst(tgtAddr, ref.addend());
+    return relocGOTOfst(tgtAddr, addend);
   case R_MIPS_PC18_S3:
-    return relocPc18(relAddr, tgtAddr, ref.addend());
+    return relocPc18(relAddr, tgtAddr, addend);
   case R_MIPS_PC19_S2:
-    return relocPc19(relAddr, tgtAddr, ref.addend());
+    return relocPc19(relAddr, tgtAddr, addend);
   case R_MIPS_PC21_S2:
-    return relocPc21(relAddr, tgtAddr, ref.addend());
+    return relocPc21(relAddr, tgtAddr, addend);
   case R_MIPS_PC26_S2:
-    return relocPc26(relAddr, tgtAddr, ref.addend());
+    return relocPc26(relAddr, tgtAddr, addend);
   case R_MICROMIPS_PC7_S1:
-    return relocPc7(relAddr, tgtAddr, ref.addend());
+    return relocPc7(relAddr, tgtAddr, addend);
   case R_MICROMIPS_PC10_S1:
-    return relocPc10(relAddr, tgtAddr, ref.addend());
+    return relocPc10(relAddr, tgtAddr, addend);
   case R_MICROMIPS_PC16_S1:
-    return relocPc16(relAddr, tgtAddr, ref.addend());
+    return relocPc16(relAddr, tgtAddr, addend);
   case R_MICROMIPS_PC23_S2:
-    return relocPc23(relAddr, tgtAddr, ref.addend());
+    return relocPc23(relAddr, tgtAddr, addend);
   case R_MIPS_TLS_DTPREL_HI16:
   case R_MIPS_TLS_TPREL_HI16:
   case R_MICROMIPS_TLS_DTPREL_HI16:
   case R_MICROMIPS_TLS_TPREL_HI16:
-    return relocHi16(0, tgtAddr, ref.addend(), false);
+    return relocHi16(0, tgtAddr, addend, false);
   case R_MIPS_TLS_DTPREL_LO16:
   case R_MIPS_TLS_TPREL_LO16:
-    return relocLo16(0, tgtAddr, ref.addend(), false, false);
+    return relocLo16(0, tgtAddr, addend, false, false);
   case R_MICROMIPS_TLS_DTPREL_LO16:
   case R_MICROMIPS_TLS_TPREL_LO16:
-    return relocLo16(0, tgtAddr, ref.addend(), false, true);
+    return relocLo16(0, tgtAddr, addend, false, true);
   case R_MIPS_GPREL16:
-    return relocGPRel16(tgtAddr, ref.addend(), gpAddr);
+    return relocGPRel16(tgtAddr, addend, gpAddr);
   case R_MIPS_GPREL32:
-    return relocGPRel32(tgtAddr, ref.addend(), gpAddr);
+    return relocGPRel32(tgtAddr, addend, gpAddr);
   case R_MIPS_JALR:
   case R_MICROMIPS_JALR:
     // We do not do JALR optimization now.
@@ -463,16 +465,16 @@ static ErrorOr<uint64_t> calculateReloca
     // Ignore runtime relocations.
     return 0;
   case R_MIPS_PC32:
-    return relocpc32(relAddr, tgtAddr, ref.addend());
+    return relocpc32(relAddr, tgtAddr, addend);
   case LLD_R_MIPS_GLOBAL_GOT:
     // Do nothing.
   case LLD_R_MIPS_32_HI16:
   case LLD_R_MIPS_64_HI16:
-    return relocMaskLow16(tgtAddr, ref.addend());
+    return relocMaskLow16(tgtAddr, addend);
   case LLD_R_MIPS_GLOBAL_26:
-    return reloc26ext(tgtAddr, ref.addend(), 2);
+    return reloc26ext(tgtAddr, addend, 2);
   case LLD_R_MICROMIPS_GLOBAL_26_S1:
-    return reloc26ext(tgtAddr, ref.addend(), isCrossJump ? 2 : 1);
+    return reloc26ext(tgtAddr, addend, isCrossJump ? 2 : 1);
   case LLD_R_MIPS_HI16:
     return relocHi16(0, tgtAddr, 0, false);
   case LLD_R_MIPS_LO16:
@@ -546,14 +548,18 @@ std::error_code RelocationHandler<ELFT>:
   if (isMicroMipsAtom(ref.target()))
     tgtAddr |= 1;
 
-  auto res = calculateRelocation(ref, tgtAddr, relAddr, gpAddr, isGpDisp);
+  CrossJumpMode jumpMode = getCrossJumpMode(ref);
+
+  ErrorOr<uint64_t> res =
+      calculateRelocation(ref.kindValue(), ref.addend(), tgtAddr, relAddr,
+                          gpAddr, isGpDisp, jumpMode);
   if (auto ec = res.getError())
     return ec;
 
   auto params = getRelocationParams(ref.kindValue());
   uint64_t ins = relocRead<ELFT>(params, location);
 
-  if (auto ec = adjustJumpOpCode(ins, tgtAddr, getCrossJumpMode(ref)))
+  if (auto ec = adjustJumpOpCode(ins, tgtAddr, jumpMode))
     return ec;
 
   ins = (ins & ~params._mask) | (*res & params._mask);





More information about the llvm-commits mailing list