[lld] r199515 - [Mips] Handle R_MIPS_26 relocation. Maintaining of .plt and .got.plt

Simon Atanasyan simon at atanasyan.com
Fri Jan 17 13:18:26 PST 2014


Author: atanasyan
Date: Fri Jan 17 15:18:26 2014
New Revision: 199515

URL: http://llvm.org/viewvc/llvm-project?rev=199515&view=rev
Log:
[Mips] Handle R_MIPS_26 relocation. Maintaining of .plt and .got.plt
sections will be implemented later.

Added:
    lld/trunk/test/elf/Mips/Inputs/ext.s
    lld/trunk/test/elf/Mips/r26.test
Modified:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h Fri Jan 17 15:18:26 2014
@@ -19,7 +19,9 @@ enum {
   /// \brief Do nothing but mark GOT entry as a global one.
   LLD_R_MIPS_GLOBAL_GOT = 1024,
   /// \brief The same as R_MIPS_GOT16 but for global symbols.
-  LLD_R_MIPS_GLOBAL_GOT16 = 1025
+  LLD_R_MIPS_GLOBAL_GOT16 = 1025,
+  /// \brief The same as R_MIPS_26 but for global symbols.
+  LLD_R_MIPS_GLOBAL_26 = 1026
 };
 
 typedef llvm::object::ELFType<llvm::support::little, 2, false> Mips32ElELFType;

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=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp Fri Jan 17 15:18:26 2014
@@ -31,6 +31,12 @@ inline int64_t calcAHL(int64_t AHI, int6
   return (AHI << 16) + (int16_t)ALO;
 }
 
+template <size_t BITS, class T> inline T signExtend(T val) {
+  if (val & (T(1) << (BITS - 1)))
+    val |= T(-1) << BITS;
+  return val;
+}
+
 /// \brief R_MIPS_32
 /// local/external: word32 S + A (truncate)
 void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
@@ -38,6 +44,16 @@ void reloc32(uint8_t *location, uint64_t
   applyReloc(location, result);
 }
 
+/// \brief R_MIPS_26
+/// local   : ((A | ((P + 4) & 0x3F000000)) + S) >> 2
+/// external: (sign–extend(A) + S) >> 2
+void reloc26(uint8_t *location, uint64_t P, uint64_t S, bool isLocal) {
+  int32_t A = (*(uint32_t*)location & 0x03FFFFFFU) << 2;
+  uint32_t result = isLocal ? (A | ((P + 4) & 0x3F000000)) : signExtend<28>(A);
+  result = (result + S) >> 2;
+  applyReloc(location, result);
+}
+
 /// \brief R_MIPS_HI16
 /// local/external: hi16 (AHL + S) - (short)(AHL + S) (truncate)
 /// _gp_disp      : hi16 (AHL + GP - P) - (short)(AHL + GP - P) (verify)
@@ -162,6 +178,9 @@ error_code MipsTargetRelocationHandler::
   case R_MIPS_32:
     reloc32(location, relocVAddress, targetVAddress, ref.addend());
     break;
+  case R_MIPS_26:
+    reloc26(location, relocVAddress, targetVAddress, true);
+    break;
   case R_MIPS_HI16:
     savePairedRelocation(atom, ref);
     break;
@@ -188,6 +207,9 @@ error_code MipsTargetRelocationHandler::
     relocGOT16(location, relocVAddress, targetVAddress, ref.addend(),
                _targetHandler.getGPDispSymAddr());
     break;
+  case LLD_R_MIPS_GLOBAL_26:
+    reloc26(location, relocVAddress, targetVAddress, false);
+    break;
   default: {
     std::string str;
     llvm::raw_string_ostream s(str);

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Fri Jan 17 15:18:26 2014
@@ -111,6 +111,9 @@ private:
       return;
     assert(ref.kindArch() == Reference::KindArch::Mips);
     switch (ref.kindValue()) {
+    case R_MIPS_26:
+      handlePLT(ref);
+      break;
     case R_MIPS_GOT16:
     case R_MIPS_CALL16:
       handleGOT(ref);
@@ -124,6 +127,13 @@ private:
     return false;
   }
 
+  void handlePLT(const Reference &ref) {
+    if (ref.kindValue() == R_MIPS_26 && !isLocal(ref.target()))
+      const_cast<Reference &>(ref).setKindValue(LLD_R_MIPS_GLOBAL_26);
+
+    // FIXME (simon): Create PLT entry.
+  }
+
   void handleGOT(const Reference &ref) {
     if (ref.kindValue() == R_MIPS_GOT16 && !isLocal(ref.target()))
       const_cast<Reference &>(ref).setKindValue(LLD_R_MIPS_GLOBAL_GOT16);

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp Fri Jan 17 15:18:26 2014
@@ -195,6 +195,7 @@ void MipsTargetHandler::registerRelocati
 const Registry::KindStrings MipsTargetHandler::kindStrings[] = {
   LLD_KIND_STRING_ENTRY(R_MIPS_NONE),
   LLD_KIND_STRING_ENTRY(R_MIPS_32),
+  LLD_KIND_STRING_ENTRY(R_MIPS_26),
   LLD_KIND_STRING_ENTRY(R_MIPS_HI16),
   LLD_KIND_STRING_ENTRY(R_MIPS_LO16),
   LLD_KIND_STRING_ENTRY(R_MIPS_GOT16),
@@ -202,5 +203,6 @@ const Registry::KindStrings MipsTargetHa
   LLD_KIND_STRING_ENTRY(R_MIPS_JALR),
   LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT),
   LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT16),
+  LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_26),
   LLD_KIND_STRING_END
 };

Added: lld/trunk/test/elf/Mips/Inputs/ext.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/Inputs/ext.s?rev=199515&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/Inputs/ext.s (added)
+++ lld/trunk/test/elf/Mips/Inputs/ext.s Fri Jan 17 15:18:26 2014
@@ -0,0 +1,46 @@
+# Assembly code defines set of externally visible labels.
+
+# Shared library generation:
+#   llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \
+#           -o=%t1 %p/Inputs/ext.s
+#   lld -flavor gnu -target mipsel -shared -o %t2 %t1
+
+# Executable generation:
+#   llvm-mc -triple=mipsel -filetype=obj -o=%t1 %p/Inputs/ext.s
+#   lld -flavor gnu -target mipsel -e ext1 -o %t2 %t1
+
+    .global ext1
+    .ent    ext1
+ext1:
+    nop
+    .end    ext1
+
+    .global ext2
+    .ent    ext2
+ext2:
+    nop
+    .end    ext2
+
+    .global ext3
+    .ent    ext3
+ext3:
+    nop
+    .end    ext3
+
+    .global ext4
+    .ent    ext4
+ext4:
+    nop
+    .end    ext4
+
+    .global ext5
+    .ent    ext5
+ext5:
+    nop
+    .end    ext5
+
+    .global ext6
+    .ent    ext6
+ext6:
+    nop
+    .end    ext6

Added: lld/trunk/test/elf/Mips/r26.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/r26.test?rev=199515&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/r26.test (added)
+++ lld/trunk/test/elf/Mips/r26.test Fri Jan 17 15:18:26 2014
@@ -0,0 +1,47 @@
+# Check handling of R_MIPS_26 relocation.
+
+# Build shared library
+# RUN: llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \
+# RUN:         -o=%t1 %p/Inputs/ext.s
+# RUN: lld -flavor gnu -target mipsel -shared -o %t2 %t1
+
+# Build executable
+# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t3 %s
+# RUN: llvm-objdump -r %t3 | FileCheck -check-prefix=REL %s
+# RUN: lld -flavor gnu -target mipsel -e glob -o %t4 %t3 %t2
+# RUN: llvm-objdump -disassemble %t4 | FileCheck -check-prefix=EXE %s
+
+# Object file has three R_MIPS_26 relocations
+# REL: RELOCATION RECORDS FOR [.rel.text]:
+# REL: 8 R_MIPS_26 Unknown
+# REL: 16 R_MIPS_26 Unknown
+# REL: 24 R_MIPS_26 Unknown
+
+# EXE: Disassembly of section .text:
+# EXE: glob:
+# EXE:   40014c:  09 f8 20 03  jalr    $25
+# EXE:   400150:  00 00 00 00  nop
+#
+# Jump to 'loc' label address
+# EXE:   400154:  57 00 10 0c  jal     4194652
+# EXE:   400158:  00 00 00 00  nop
+#
+# EXE: loc:
+# Jump to 'glob' label address
+# EXE:   40015c:  53 00 10 0c  jal     4194636
+# EXE:   400160:  00 00 00 00  nop
+#
+# Jump to the first PLT entry (.plt + 32) for ext1 entry
+# EXE:   400164:  00 00 00 0c  jal     0
+# EXE:   400168:  00 00 00 00  nop
+
+    .abicalls
+    .global glob
+    .ent    glob
+glob:
+    jal     $t9
+    jal     loc
+loc:
+    jal     glob
+    jal     ext1
+    .end    glob





More information about the llvm-commits mailing list