<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jan 17, 2014 at 1:18 PM, Simon Atanasyan <span dir="ltr"><<a href="mailto:simon@atanasyan.com" target="_blank">simon@atanasyan.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atanasyan<br>
Date: Fri Jan 17 15:18:37 2014<br>
New Revision: 199516<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=199516&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=199516&view=rev</a><br>
Log:<br>
[Mips] Implement .plt and .got.plt section creation.<br>
<br>
Added:<br>
    lld/trunk/test/elf/Mips/plt-header.test<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h<br>
    lld/trunk/test/elf/Mips/r26.test<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp Fri Jan 17 15:18:37 2014<br>
@@ -56,3 +56,16 @@ void MipsLinkingContext::addPasses(PassM<br>
     pm.add(std::move(pass));<br>
   ELFLinkingContext::addPasses(pm);<br>
 }<br>
+<br>
+bool MipsLinkingContext::isPLTRelocation(const DefinedAtom &,<br>
+                                         const Reference &r) const {<br>
+  if (r.kindNamespace() != Reference::KindNamespace::ELF)<br>
+    return false;<br>
+  assert(r.kindArch() == Reference::KindArch::Mips);<br>
+  switch (r.kindValue()) {<br>
+  case llvm::ELF::R_MIPS_JUMP_SLOT:<br>
+    return true;<br>
+  default:<br>
+    return false;<br>
+  }<br>
+}<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h Fri Jan 17 15:18:37 2014<br>
@@ -21,7 +21,11 @@ enum {<br>
   /// \brief The same as R_MIPS_GOT16 but for global symbols.<br>
   LLD_R_MIPS_GLOBAL_GOT16 = 1025,<br>
   /// \brief The same as R_MIPS_26 but for global symbols.<br>
-  LLD_R_MIPS_GLOBAL_26 = 1026<br>
+  LLD_R_MIPS_GLOBAL_26 = 1026,<br>
+  /// \brief Setup hi 16 bits using the symbol this reference refers to.<br>
+  LLD_R_MIPS_HI16 = 1027,<br>
+  /// \brief Setup low 16 bits using the symbol this reference refers to.<br>
+  LLD_R_MIPS_LO16 = 1028<br>
 };<br>
<br>
 typedef llvm::object::ELFType<llvm::support::little, 2, false> Mips32ElELFType;<br>
@@ -41,6 +45,7 @@ public:<br>
   virtual StringRef entrySymbolName() const;<br>
   virtual StringRef getDefaultInterpreter() const;<br>
   virtual void addPasses(PassManager &pm);<br>
+  virtual bool isPLTRelocation(const DefinedAtom &, const Reference &r) const;<br>
 };<br>
<br>
 } // elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp Fri Jan 17 15:18:37 2014<br>
@@ -105,6 +105,18 @@ void relocCall16(uint8_t *location, uint<br>
   applyReloc(location, result);<br>
 }<br>
<br>
+/// \brief LLD_R_MIPS_HI16<br>
+void relocLldHi16(uint8_t *location, uint64_t S) {<br>
+  int32_t result = lld::scatterBits<uint32_t>((S + 0x8000) >> 16, 0xffff);<br></blockquote><div><br></div><div>If my understanding of scatterBits() is correct, this expression is equivalent to a more plain one: ((S + 0x8000) >> 16) & 0xffff.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  applyReloc(location, result);<br>
+}<br>
+<br>
+/// \brief LLD_R_MIPS_LO16<br>
+void relocLldLo16(uint8_t *location, uint64_t S) {<br>
+  int32_t result = lld::scatterBits<uint32_t>(S, 0xffff);<br></blockquote><div><br></div><div>Ditto.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


+  applyReloc(location, result);<br>
+}<br>
+<br>
 } // end anon namespace<br>
<br>
 MipsTargetRelocationHandler::MipsTargetRelocationHandler(<br>
@@ -200,6 +212,9 @@ error_code MipsTargetRelocationHandler::<br>
   case R_MIPS_JALR:<br>
     // We do not do JALR optimization now.<br>
     break;<br>
+  case R_MIPS_JUMP_SLOT:<br>
+    // Ignore runtime relocations.<br>
+    break;<br>
   case LLD_R_MIPS_GLOBAL_GOT:<br>
     // Do nothing.<br>
     break;<br>
@@ -210,6 +225,12 @@ error_code MipsTargetRelocationHandler::<br>
   case LLD_R_MIPS_GLOBAL_26:<br>
     reloc26(location, relocVAddress, targetVAddress, false);<br>
     break;<br>
+  case LLD_R_MIPS_HI16:<br>
+    relocLldHi16(location, targetVAddress);<br>
+    break;<br>
+  case LLD_R_MIPS_LO16:<br>
+    relocLldLo16(location, targetVAddress);<br>
+    break;<br>
   default: {<br>
     std::string str;<br>
     llvm::raw_string_ostream s(str);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Fri Jan 17 15:18:37 2014<br>
@@ -24,6 +24,26 @@ const uint8_t mipsGot0AtomContent[] = {<br>
 // Module pointer<br>
 const uint8_t mipsGotModulePointerAtomContent[] = { 0x00, 0x00, 0x00, 0x80 };<br>
<br>
+// PLT0 entry<br>
+const uint8_t mipsPlt0AtomContent[] = {<br>
+  0x00, 0x00, 0x1c, 0x3c, // lui   $28, %hi(&GOTPLT[0])<br>
+  0x00, 0x00, 0x99, 0x8f, // lw    $25, %lo(&GOTPLT[0])($28)<br>
+  0x00, 0x00, 0x9c, 0x27, // addiu $28, $28, %lo(&GOTPLT[0])<br>
+  0x23, 0xc0, 0x1c, 0x03, // subu  $24, $24, $28<br>
+  0x21, 0x78, 0xe0, 0x03, // move  $15, $31<br>
+  0x82, 0xc0, 0x18, 0x00, // srl   $24, $24, 2<br>
+  0x09, 0xf8, 0x20, 0x03, // jalr  $25<br>
+  0xfe, 0xff, 0x18, 0x27  // subu  $24, $24, 2<br>
+};<br>
+<br>
+// Regular PLT entry<br>
+const uint8_t mipsPltAAtomContent[] = {<br>
+  0x00, 0x00, 0x0f, 0x3c, // lui   $15, %hi(.got.plt entry)<br>
+  0x00, 0x00, 0xf9, 0x8d, // l[wd] $25, %lo(.got.plt entry)($15)<br>
+  0x08, 0x00, 0x20, 0x03, // jr    $25<br>
+  0x00, 0x00, 0xf8, 0x25  // addiu $24, $15, %lo(.got.plt entry)<br>
+};<br>
+<br>
 /// \brief Abstract base class represent MIPS GOT entries.<br>
 class MipsGOTAtom : public GOTAtom {<br>
 public:<br>
@@ -52,6 +72,36 @@ public:<br>
   }<br>
 };<br>
<br>
+class PLT0Atom : public PLTAtom {<br>
+public:<br>
+  PLT0Atom(const File &f) : PLTAtom(f, ".plt") {}<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return llvm::makeArrayRef(mipsPlt0AtomContent);<br>
+  }<br>
+};<br>
+<br>
+class PLTAAtom : public PLTAtom {<br>
+public:<br>
+  PLTAAtom(const File &f) : PLTAtom(f, ".plt") {}<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return llvm::makeArrayRef(mipsPltAAtomContent);<br>
+  }<br>
+};<br>
+<br>
+/// \brief MIPS GOT PLT entry<br>
+class GOTPLTAtom : public GOTAtom {<br>
+public:<br>
+  GOTPLTAtom(const File &f) : GOTAtom(f, ".got.plt") {}<br>
+<br>
+  virtual Alignment alignment() const { return Alignment(2); }<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return llvm::makeArrayRef(mipsGot0AtomContent);<br>
+  }<br>
+};<br>
+<br>
 class RelocationPassFile : public SimpleFile {<br>
 public:<br>
   RelocationPassFile(const ELFLinkingContext &ctx)<br>
@@ -90,6 +140,20 @@ public:<br>
       got->setOrdinal(ordinal++);<br>
       mf->addAtom(*got);<br>
     }<br>
+<br>
+    for (auto &plt : _pltVector) {<br>
+      DEBUG_WITH_TYPE("MipsGOT", llvm::dbgs() << "[ PLT ] Adding "<br>
+                                              << plt->name() << "\n");<br>
+      plt->setOrdinal(ordinal++);<br>
+      mf->addAtom(*plt);<br>
+    }<br>
+<br>
+    for (auto &gotplt : _gotpltVector) {<br>
+      DEBUG_WITH_TYPE("MipsGOT", llvm::dbgs() << "[ GOTPLT ] Adding "<br>
+                                              << gotplt->name() << "\n");<br>
+      gotplt->setOrdinal(ordinal++);<br>
+      mf->addAtom(*gotplt);<br>
+    }<br>
   }<br>
<br>
 private:<br>
@@ -105,6 +169,15 @@ private:<br>
   /// \brief the list of global GOT atoms.<br>
   std::vector<GOTAtom *> _globalGotVector;<br>
<br>
+  /// \brief Map Atoms to their PLT entries.<br>
+  llvm::DenseMap<const Atom *, PLTAtom *> _pltMap;<br>
+<br>
+  /// \brief the list of PLT atoms.<br>
+  std::vector<PLTAtom *> _pltVector;<br>
+<br>
+  /// \brief the list of GOTPLT atoms.<br>
+  std::vector<GOTAtom *> _gotpltVector;<br>
+<br>
   /// \brief Handle a specific reference.<br>
   void handleReference(const DefinedAtom &atom, const Reference &ref) {<br>
     if (ref.kindNamespace() != lld::Reference::KindNamespace::ELF)<br>
@@ -131,7 +204,8 @@ private:<br>
     if (ref.kindValue() == R_MIPS_26 && !isLocal(ref.target()))<br>
       const_cast<Reference &>(ref).setKindValue(LLD_R_MIPS_GLOBAL_26);<br>
<br>
-    // FIXME (simon): Create PLT entry.<br>
+    if (isa<SharedLibraryAtom>(ref.target()))<br>
+      const_cast<Reference &>(ref).setTarget(getPLTEntry(ref.target()));<br>
   }<br>
<br>
   void handleGOT(const Reference &ref) {<br>
@@ -187,6 +261,69 @@ private:<br>
<br>
     return ga;<br>
   }<br>
+<br>
+  void createPLTHeader() {<br>
+    assert(_pltVector.empty() && _gotpltVector.empty());<br>
+<br>
+    auto pa = new (_file._alloc) PLT0Atom(_file);<br>
+    _pltVector.push_back(pa);<br>
+<br>
+    auto ga0 = new (_file._alloc) GOTPLTAtom(_file);<br>
+    _gotpltVector.push_back(ga0);<br>
+    auto ga1 = new (_file._alloc) GOTPLTAtom(_file);<br>
+    _gotpltVector.push_back(ga1);<br>
+<br>
+    // Setup reference to fixup the PLT0 entry.<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_HI16, 0, ga0, 0);<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_LO16, 4, ga0, 0);<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_LO16, 8, ga0, 0);<br>
+<br>
+    DEBUG_WITH_TYPE("MipsGOT", {<br>
+      pa->_name = "__plt0";<br>
+      llvm::dbgs() << "[ PLT ] Create PLT0\n";<br>
+      ga0->_name = "__gotplt0";<br>
+      llvm::dbgs() << "[ GOTPLT ] Create GOTPLT0\n";<br>
+      ga1->_name = "__gotplt1";<br>
+      llvm::dbgs() << "[ GOTPLT ] Create GOTPLT1\n";<br>
+    });<br>
+  }<br>
+<br>
+  const PLTAtom *getPLTEntry(const Atom *a) {<br>
+    auto plt = _pltMap.find(a);<br>
+    if (plt != _pltMap.end())<br>
+      return plt->second;<br>
+<br>
+    if (_pltVector.empty())<br>
+      createPLTHeader();<br>
+<br>
+    auto pa = new (_file._alloc) PLTAAtom(_file);<br>
+    _pltMap[a] = pa;<br>
+    _pltVector.push_back(pa);<br>
+<br>
+    auto ga = new (_file._alloc) GOTPLTAtom(_file);<br>
+    _gotpltVector.push_back(ga);<br>
+<br>
+    // Setup reference to fixup the PLT entry.<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_HI16, 0, ga, 0);<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_LO16, 4, ga, 0);<br>
+    pa->addReferenceELF_Mips(LLD_R_MIPS_LO16, 12, ga, 0);<br>
+<br>
+    // Setup reference to assign initial value to the .got.plt entry.<br>
+    ga->addReferenceELF_Mips(R_MIPS_32, 0, _pltVector.front(), 0);<br>
+    // Create dynamic relocation to adjust the .got.plt entry at runtime.<br>
+    ga->addReferenceELF_Mips(R_MIPS_JUMP_SLOT, 0, a, 0);<br>
+<br>
+    DEBUG_WITH_TYPE("MipsGOT", {<br>
+      pa->_name = "__plt_";<br>
+      pa->_name += a->name();<br>
+      llvm::dbgs() << "[ PLT ] Create " << a->name() << "\n";<br>
+      ga->_name = "__got_plt_";<br>
+      ga->_name += a->name();<br>
+      llvm::dbgs() << "[ GOTPLT ] Create " << a->name() << "\n";<br>
+    });<br>
+<br>
+    return pa;<br>
+  }<br>
 };<br>
<br>
 } // end anon namespace<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp Fri Jan 17 15:18:37 2014<br>
@@ -201,8 +201,11 @@ const Registry::KindStrings MipsTargetHa<br>
   LLD_KIND_STRING_ENTRY(R_MIPS_GOT16),<br>
   LLD_KIND_STRING_ENTRY(R_MIPS_CALL16),<br>
   LLD_KIND_STRING_ENTRY(R_MIPS_JALR),<br>
+  LLD_KIND_STRING_ENTRY(R_MIPS_JUMP_SLOT),<br>
   LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT),<br>
   LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT16),<br>
   LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_26),<br>
+  LLD_KIND_STRING_ENTRY(LLD_R_MIPS_HI16),<br>
+  LLD_KIND_STRING_ENTRY(LLD_R_MIPS_LO16),<br>
   LLD_KIND_STRING_END<br>
 };<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h Fri Jan 17 15:18:37 2014<br>
@@ -35,7 +35,7 @@ public:<br>
   createSection(StringRef name, int32_t type,<br>
                 DefinedAtom::ContentPermissions permissions,<br>
                 Layout::SectionOrder order) {<br>
-    if (type == DefinedAtom::typeGOT)<br>
+    if (type == DefinedAtom::typeGOT && name == ".got")<br>
       return _gotSection;<br>
     return DefaultLayout<ELFType>::createSection(name, type, permissions,<br>
                                                  order);<br>
<br>
Added: lld/trunk/test/elf/Mips/plt-header.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/plt-header.test?rev=199516&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/plt-header.test?rev=199516&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/test/elf/Mips/plt-header.test (added)<br>
+++ lld/trunk/test/elf/Mips/plt-header.test Fri Jan 17 15:18:37 2014<br>
@@ -0,0 +1,40 @@<br>
+# Check initialization of .plt header entries.<br>
+<br>
+# Build shared library<br>
+# RUN: llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \<br>
+# RUN:         -o=%t1 %p/Inputs/ext.s<br>
+# RUN: lld -flavor gnu -target mipsel -shared -o %t2 %t1<br>
+<br>
+# Build executable<br>
+# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t3 %s<br>
+# RUN: lld -flavor gnu -target mipsel -e glob -o %t4 %t3 %t2<br>
+# RUN: llvm-objdump -section-headers -disassemble %t4 | \<br>
+# RUN:   FileCheck -check-prefix=EXE %s<br>
+<br>
+# EXE: Disassembly of section .plt:<br>
+# EXE: .plt:<br>
+# PLT0 entry. Points to the .got.plt[0]<br>
+# EXE:   400170:  40 00 1c 3c  lui     $gp, 64<br>
+# EXE:   400174:  00 20 99 8f  lw      $25, 8192($gp)<br>
+# EXE:   400178:  00 20 9c 27  addiu   $gp, $gp, 8192<br>
+# EXE:   40017c:  23 c0 1c 03  subu    $24, $24, $gp<br>
+# EXE:   400180:  21 78 e0 03  move    $15, $ra<br>
+# EXE:   400184:  82 c0 18 00  srl     $24, $24, 2<br>
+# EXE:   400188:  09 f8 20 03  jalr    $25<br>
+# EXE:   40018c:  fe ff 18 27  addiu   $24, $24, -2<br>
+<br>
+# EXE: Sections:<br>
+# EXE: Idx Name          Size      Address          Type<br>
+# EXE:   6 .plt          00000030 0000000000400170 TEXT DATA<br>
+# EXE:  10 .got.plt      0000000c 0000000000402000 DATA<br>
+<br>
+    .abicalls<br>
+    .global glob<br>
+    .ent    glob<br>
+glob:<br>
+    jal     $t9<br>
+    jal     loc<br>
+loc:<br>
+    jal     glob<br>
+    jal     ext1<br>
+    .end    glob<br>
<br>
Modified: lld/trunk/test/elf/Mips/r26.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/r26.test?rev=199516&r1=199515&r2=199516&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/r26.test?rev=199516&r1=199515&r2=199516&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/test/elf/Mips/r26.test (original)<br>
+++ lld/trunk/test/elf/Mips/r26.test Fri Jan 17 15:18:37 2014<br>
@@ -7,33 +7,58 @@<br>
<br>
 # Build executable<br>
 # RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t3 %s<br>
-# RUN: llvm-objdump -r %t3 | FileCheck -check-prefix=REL %s<br>
+# RUN: llvm-readobj -relocations %t3 | FileCheck -check-prefix=OBJ-REL %s<br>
 # RUN: lld -flavor gnu -target mipsel -e glob -o %t4 %t3 %t2<br>
-# RUN: llvm-objdump -disassemble %t4 | FileCheck -check-prefix=EXE %s<br>
+# RUN: llvm-objdump -section-headers -disassemble %t4 | \<br>
+# RUN:   FileCheck -check-prefix=EXE %s<br>
+# RUN: llvm-readobj -relocations %t4 | FileCheck -check-prefix=EXE-REL %s<br>
<br>
 # Object file has three R_MIPS_26 relocations<br>
-# REL: RELOCATION RECORDS FOR [.rel.text]:<br>
-# REL: 8 R_MIPS_26 Unknown<br>
-# REL: 16 R_MIPS_26 Unknown<br>
-# REL: 24 R_MIPS_26 Unknown<br>
+# OBJ-REL: Relocations [<br>
+# OBJ-REL:   Section (2) .rel.text {<br>
+# OBJ-REL:      0x8 R_MIPS_26 .text 0x0<br>
+# OBJ-REL:     0x10 R_MIPS_26 glob  0x0<br>
+# OBJ-REL:     0x18 R_MIPS_26 ext1  0x0<br>
+# OBJ-REL:   }<br>
+# OBJ-REL: ]<br>
+<br>
+# Executable file has the only relocation for external symbol<br>
+# EXE-REL: Relocations [<br>
+# EXE-REL:   Section (5) .rela.plt {<br>
+# EXE-REL:     0x402008 R_MIPS_JUMP_SLOT ext1 0x0<br>
+# EXE-REL:   }<br>
+# EXE-REL: ]<br>
+<br>
+# EXE: Disassembly of section .plt:<br>
+# EXE: .plt:<br>
+# PLTA entry. Points to the .got.plt[1]<br>
+# EXE:   400190:  40 00 0f 3c  lui     $15, 64<br>
+# EXE:   400194:  08 20 f9 8d  lw      $25, 8200($15)<br>
+# EXE:   400198:  08 00 20 03  jr      $25<br>
+# EXE:   40019c:  08 20 f8 25  addiu   $24, $15, 8200<br>
<br>
 # EXE: Disassembly of section .text:<br>
 # EXE: glob:<br>
-# EXE:   40014c:  09 f8 20 03  jalr    $25<br>
-# EXE:   400150:  00 00 00 00  nop<br>
+# EXE:   4001a0:  09 f8 20 03  jalr    $25<br>
+# EXE:   4001a4:  00 00 00 00  nop<br>
 #<br>
 # Jump to 'loc' label address<br>
-# EXE:   400154:  57 00 10 0c  jal     4194652<br>
-# EXE:   400158:  00 00 00 00  nop<br>
+# EXE:   4001a8:  6c 00 10 0c  jal     4194736<br>
+# EXE:   4001ac:  00 00 00 00  nop<br>
 #<br>
 # EXE: loc:<br>
 # Jump to 'glob' label address<br>
-# EXE:   40015c:  53 00 10 0c  jal     4194636<br>
-# EXE:   400160:  00 00 00 00  nop<br>
+# EXE:   4001b0:  68 00 10 0c  jal     4194720<br>
+# EXE:   4001b4:  00 00 00 00  nop<br>
 #<br>
 # Jump to the first PLT entry (.plt + 32) for ext1 entry<br>
-# EXE:   400164:  00 00 00 0c  jal     0<br>
-# EXE:   400168:  00 00 00 00  nop<br>
+# EXE:   4001b8:  64 00 10 0c  jal     4194704<br>
+# EXE:   4001bc:  00 00 00 00  nop<br>
+<br>
+# EXE: Sections:<br>
+# EXE: Idx Name          Size      Address          Type<br>
+# EXE:   6 .plt          00000030 0000000000400170 TEXT DATA<br>
+# EXE:  10 .got.plt      0000000c 0000000000402000 DATA<br>
<br>
     .abicalls<br>
     .global glob<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>