[lld] r280223 - [ELF][MIPS] Support R_MIPS_HIGHER / R_MIPS_HIGHEST relocations calculation

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 31 04:47:22 PDT 2016


Author: atanasyan
Date: Wed Aug 31 06:47:21 2016
New Revision: 280223

URL: http://llvm.org/viewvc/llvm-project?rev=280223&view=rev
Log:
[ELF][MIPS] Support R_MIPS_HIGHER / R_MIPS_HIGHEST relocations calculation

Added:
    lld/trunk/test/ELF/mips-higher-highest.s
Modified:
    lld/trunk/ELF/Target.cpp

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=280223&r1=280222&r2=280223&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Wed Aug 31 06:47:21 2016
@@ -1967,6 +1967,20 @@ static void writeMipsHi16(uint8_t *Loc,
 }
 
 template <endianness E>
+static void writeMipsHigher(uint8_t *Loc, uint64_t V) {
+  uint32_t Instr = read32<E>(Loc);
+  uint16_t Res = ((V + 0x80008000) >> 32) & 0xffff;
+  write32<E>(Loc, (Instr & 0xffff0000) | Res);
+}
+
+template <endianness E>
+static void writeMipsHighest(uint8_t *Loc, uint64_t V) {
+  uint32_t Instr = read32<E>(Loc);
+  uint16_t Res = ((V + 0x800080008000) >> 48) & 0xffff;
+  write32<E>(Loc, (Instr & 0xffff0000) | Res);
+}
+
+template <endianness E>
 static void writeMipsLo16(uint8_t *Loc, uint64_t V) {
   uint32_t Instr = read32<E>(Loc);
   write32<E>(Loc, (Instr & 0xffff0000) | (V & 0xffff));
@@ -2150,6 +2164,12 @@ void MipsTargetInfo<ELFT>::relocateOne(u
   case R_MIPS_TLS_TPREL_HI16:
     writeMipsHi16<E>(Loc, Val);
     break;
+  case R_MIPS_HIGHER:
+    writeMipsHigher<E>(Loc, Val);
+    break;
+  case R_MIPS_HIGHEST:
+    writeMipsHighest<E>(Loc, Val);
+    break;
   case R_MIPS_JALR:
     // Ignore this optimization relocation for now
     break;

Added: lld/trunk/test/ELF/mips-higher-highest.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-higher-highest.s?rev=280223&view=auto
==============================================================================
--- lld/trunk/test/ELF/mips-higher-highest.s (added)
+++ lld/trunk/test/ELF/mips-higher-highest.s Wed Aug 31 06:47:21 2016
@@ -0,0 +1,21 @@
+# Check R_MIPS_HIGHER / R_MIPS_HIGHEST relocations calculation.
+
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux \
+# RUN:         %S/Inputs/mips-dynamic.s -o %t2.o
+# RUN: ld.lld %t1.o %t2.o -o %t.exe
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# REQUIRES: mips
+
+  .global  __start
+__start:
+  lui     $6, %highest(_foo+0x300047FFF7FF7)
+  daddiu  $6, $6, %higher(_foo+0x300047FFF7FF7)
+  lui     $7, %highest(_foo+0x300047FFF7FF8)
+  ld      $7, %higher (_foo+0x300047FFF7FF8)($7)
+
+# CHECK:      20000:       3c 06 00 03     lui     $6, 3
+# CHECK-NEXT: 20004:       64 c6 00 05     daddiu  $6, $6, 5
+# CHECK-NEXT: 20008:       3c 07 00 03     lui     $7, 3
+# CHECK-NEXT: 2000c:       dc e7 00 05     ld      $7, 5($7)




More information about the llvm-commits mailing list