<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>