<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Jan 26, 2014 at 6:30 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Hal,<br>
<br>
Thanks for your quick review!<br>
<br>
Agree, the description of the commit should have contained more information.<br>
<br>
Anyways, the details are :-<br>
<br>
a) The individual ELF sub targets could override the basic functionality of ELF writing from the generic layer<br>
<br>
What this amounts to is each ELF subtarget is in complete control of how the output ELF is written to by using the linker.<br>
<br>
As for the test, there was a bug in the code, that I saw.<br></blockquote><div><br></div><div>If you find a bug in code, please fix it in an independent commit, so that other people can easily understand what you are fixing.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Will be more careful next time.<br>
<br>
PS: The next few commits I plan are going to add more comments.<br>
<br>
Thanks<br>
<br>
Shankar Easwaran<br>
<br>
On 1/26/2014 8:20 PM, Hal Finkel wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
----- Original Message -----<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: "Shankar Easwaran" <<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>><br>
To: <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
Sent: Sunday, January 26, 2014 7:21:03 PM<br>
Subject: [lld] r200177 - [ELF] Make changes to all the targets supported currently<br>
<br>
Author: shankare<br>
Date: Sun Jan 26 19:21:02 2014<br>
New Revision: 200177<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=200177&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=200177&view=rev</a><br>
Log:<br>
[ELF] Make changes to all the targets supported currently<br>
</blockquote>
"Make changes", seriously? ;) -- Can you please provide a more-verbose explanation of what you're doing.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
X86_64,X86,PPC,Hexagon,Mips<br>
<br>
No change in functionality.<br>
</blockquote>
One of the tests changed.<br>
<br>
-Hal<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Added:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCELFFile.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCELFReader.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64DynamicLibraryWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64ExecutableWriter.h<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/OutputELFWriter.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCTargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCTargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/SectionChunks.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/SegmentChunks.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/TargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86TargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86TargetHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.h<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64TargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64TargetHandler.h<br>
lld/trunk/test/elf/Hexagon/<u></u>dynlib-syms.test<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Chunk.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Chunk.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h Sun Jan 26 19:21:02 2014<br>
@@ -27,6 +27,8 @@ class ELFLinkingContext;<br>
namespace elf {<br>
class ELFWriter;<br>
+template <class ELFT> class TargetLayout;<br>
+<br>
/// \brief A chunk is a contiguous region of space<br>
template<class ELFT><br>
class Chunk {<br>
@@ -73,7 +75,8 @@ public:<br>
// Whats the contentType of the chunk ?<br>
virtual int getContentType() const = 0;<br>
// Writer the chunk<br>
- virtual void write(ELFWriter *writer, llvm::FileOutputBuffer<br>
&buffer) = 0;<br>
+ virtual void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer) = 0;<br>
// Finalize the chunk before assigning offsets/virtual addresses<br>
virtual void doPreFlight() = 0;<br>
// Finalize the chunk before writing<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultTargetHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>DefaultTargetHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -29,49 +29,10 @@ public:<br>
DefaultTargetHandler(<u></u>ELFLinkingContext &context)<br>
: TargetHandler<ELFT>(context) {}<br>
- bool doesOverrideELFHeader() { return false; }<br>
-<br>
- void setELFHeader(ELFHeader<ELFT> *elfHeader) {<br>
- llvm_unreachable("Target should provide implementation for<br>
function ");<br>
- }<br>
-<br>
const TargetRelocationHandler<ELFT> &getRelocationHandler() const<br>
{<br>
llvm_unreachable("Target should provide implementation for<br>
function ");<br>
}<br>
- /// Create a set of Default target sections that a target might<br>
needj<br>
- void createDefaultSections() {}<br>
-<br>
- /// \brief Add a section to the current Layout<br>
- void addSection(Section<ELFT> *section) {}<br>
-<br>
- /// \brief add new symbol file<br>
- bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File> > &) {<br>
- return true;<br>
- }<br>
-<br>
- /// \brief Finalize the symbol values<br>
- void finalizeSymbolValues() {}<br>
-<br>
- /// \brief allocate Commons, some architectures may move small<br>
common<br>
- /// symbols over to small data, this would also be used<br>
- void allocateCommons() {}<br>
-<br>
- /// \brief create dynamic table<br>
- LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable() {<br>
- return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(<br>
- new (_alloc) DynamicTable<ELFT>(<br>
- this->_context, ".dynamic",<br>
DefaultLayout<ELFT>::ORDER_<u></u>DYNAMIC));<br>
- }<br>
-<br>
- /// \brief create dynamic symbol table<br>
- LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable() {<br>
- return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(<br>
- new (_alloc) DynamicSymbolTable<ELFT>(<br>
- this->_context, ".dynsym",<br>
- DefaultLayout<ELFT>::ORDER_<u></u>DYNAMIC_SYMBOLS));<br>
- }<br>
-<br>
virtual std::unique_ptr<Reader> getObjReader(bool atomizeStrings)<br>
{<br>
return std::unique_ptr<Reader>(new<br>
ELFObjectReader(<u></u>atomizeStrings));<br>
}<br>
@@ -80,64 +41,9 @@ public:<br>
return std::unique_ptr<Reader>(new<br>
ELFDSOReader(<u></u>useShlibUndefines));<br>
}<br>
- virtual std::unique_ptr<Writer> getWriter();<br>
-<br>
-protected:<br>
- llvm::BumpPtrAllocator _alloc;<br>
+ virtual std::unique_ptr<Writer> getWriter() = 0;<br>
};<br>
-template <class ELFT><br>
-std::unique_ptr<Writer> DefaultTargetHandler<ELFT>::<u></u>getWriter() {<br>
- switch (this->_context.<u></u>getOutputELFType()) {<br>
- case llvm::ELF::ET_EXEC:<br>
- if (this->_context.is64Bits()) {<br>
- if (this->_context.<u></u>isLittleEndian())<br>
- return std::unique_ptr<Writer>(<br>
- new elf::ExecutableWriter<ELFType<<u></u>support::little, 8,<br>
true>>(<br>
- this->_context));<br>
- else<br>
- return std::unique_ptr<Writer>(<br>
- new elf::ExecutableWriter<ELFType<<u></u>support::big, 8,<br>
true>>(<br>
- this->_context));<br>
- } else {<br>
- if (this->_context.<u></u>isLittleEndian())<br>
- return std::unique_ptr<Writer>(<br>
- new elf::ExecutableWriter<ELFType<<u></u>support::little, 4,<br>
false>>(<br>
- this->_context));<br>
- else<br>
- return std::unique_ptr<Writer>(<br>
- new elf::ExecutableWriter<ELFType<<u></u>support::big, 4,<br>
false>>(<br>
- this->_context));<br>
- }<br>
- break;<br>
- case llvm::ELF::ET_DYN:<br>
- if (this->_context.is64Bits()) {<br>
- if (this->_context.<u></u>isLittleEndian())<br>
- return std::unique_ptr<Writer>(<br>
- new elf::DynamicLibraryWriter<<u></u>ELFType<support::little,<br>
8, true>>(<br>
- this->_context));<br>
- else<br>
- return std::unique_ptr<Writer>(<br>
- new elf::DynamicLibraryWriter<<u></u>ELFType<support::big, 8,<br>
true>>(<br>
- this->_context));<br>
- } else {<br>
- if (this->_context.<u></u>isLittleEndian())<br>
- return std::unique_ptr<Writer>(<br>
- new elf::DynamicLibraryWriter<<u></u>ELFType<support::little,<br>
4, false>>(<br>
- this->_context));<br>
- else<br>
- return std::unique_ptr<Writer>(<br>
- new elf::DynamicLibraryWriter<<u></u>ELFType<support::big, 4,<br>
false>>(<br>
- this->_context));<br>
- }<br>
- break;<br>
- case llvm::ELF::ET_REL:<br>
- llvm_unreachable("TODO: support -r mode");<br>
- default:<br>
- llvm_unreachable("unsupported output type");<br>
- }<br>
-}<br>
-<br>
} // end namespace elf<br>
} // end namespace lld<br>
#endif<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DynamicLibraryWriter.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>DynamicLibraryWriter.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -25,17 +25,18 @@ class DynamicLibraryWriter;<br>
template<class ELFT><br>
class DynamicLibraryWriter : public OutputELFWriter<ELFT> {<br>
public:<br>
- DynamicLibraryWriter(const ELFLinkingContext &context)<br>
- : OutputELFWriter<ELFT>(context)<u></u>,<br>
+ DynamicLibraryWriter(const ELFLinkingContext &context,<br>
+ TargetLayout<ELFT> &layout)<br>
+ : OutputELFWriter<ELFT>(context, layout),<br>
_runtimeFile(new CRuntimeFile<ELFT>(context)) {}<br>
-private:<br>
- void buildDynamicSymbolTable(const File &file);<br>
- void addDefaultAtoms();<br>
+protected:<br>
+ virtual void buildDynamicSymbolTable(const File &file);<br>
+ virtual void addDefaultAtoms();<br>
virtual bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File><br>
> &);<br>
- void finalizeDefaultAtomValues();<br>
+ virtual void finalizeDefaultAtomValues();<br>
- llvm::BumpPtrAllocator _alloc;<br>
+protected:<br>
std::unique_ptr<CRuntimeFile<<u></u>ELFT> > _runtimeFile;<br>
};<br>
@@ -47,7 +48,7 @@ void DynamicLibraryWriter<ELFT>::<u></u>buildDy<br>
// Add all the defined symbols to the dynamic symbol table<br>
// we need hooks into the Atom to find out which atoms need<br>
// to be exported<br>
- for (auto sec : this->_layout->sections())<br>
+ for (auto sec : this->_layout.sections())<br>
if (auto section = dyn_cast<AtomSection<ELFT>>(<u></u>sec))<br>
for (const auto &atom : section->atoms()) {<br>
const DefinedAtom *da = dyn_cast<const<br>
DefinedAtom>(atom->_atom);<br>
@@ -71,7 +72,7 @@ template <class ELFT><br>
bool DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(<br>
std::vector<std::unique_ptr<<u></u>File> > &result) {<br>
// Add the default atoms as defined by executables<br>
- addDefaultAtoms();<br>
+ DynamicLibraryWriter<ELFT>::<u></u>addDefaultAtoms();<br>
OutputELFWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
result.push_back(std::move(_<u></u>runtimeFile));<br>
return true;<br>
@@ -79,17 +80,15 @@ bool DynamicLibraryWriter<ELFT>::<u></u>createI<br>
template <class ELFT><br>
void DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
- auto underScoreEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("_end");<br>
+ auto underScoreEndAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("_end");<br>
- if (auto bssSection = this->_layout-><u></u>findOutputSection(".bss")) {<br>
+ if (auto bssSection = this->_layout.<u></u>findOutputSection(".bss")) {<br>
(*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
bssSection->virtualAddr() + bssSection->memSize();<br>
- } else if (auto dataSection =<br>
this->_layout-><u></u>findOutputSection(".data")) {<br>
+ } else if (auto dataSection =<br>
this->_layout.<u></u>findOutputSection(".data")) {<br>
(*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
dataSection->virtualAddr() + dataSection->memSize();<br>
}<br>
-<br>
- this->_targetHandler.<u></u>finalizeSymbolValues();<br>
}<br>
} // namespace elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>ExecutableWriter.h?rev=200177&<u></u>r1=200176&r2=200177&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -25,11 +25,11 @@ class ExecutableWriter;<br>
template<class ELFT><br>
class ExecutableWriter : public OutputELFWriter<ELFT> {<br>
public:<br>
- ExecutableWriter(const ELFLinkingContext &context)<br>
- : OutputELFWriter<ELFT>(context)<u></u>,<br>
+ ExecutableWriter(const ELFLinkingContext &context,<br>
TargetLayout<ELFT> &layout)<br>
+ : OutputELFWriter<ELFT>(context, layout),<br>
_runtimeFile(new CRuntimeFile<ELFT>(context)) {}<br>
-private:<br>
+protected:<br>
virtual void addDefaultAtoms();<br>
virtual bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File><br>
> &);<br>
virtual void finalizeDefaultAtomValues();<br>
@@ -71,7 +71,7 @@ template <class ELFT><br>
bool ExecutableWriter<ELFT>::<u></u>createImplicitFiles(<br>
std::vector<std::unique_ptr<<u></u>File> > &result) {<br>
// Add the default atoms as defined by executables<br>
- addDefaultAtoms();<br>
+ ExecutableWriter<ELFT>::<u></u>addDefaultAtoms();<br>
OutputELFWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
result.push_back(std::move(_<u></u>runtimeFile));<br>
return true;<br>
@@ -83,17 +83,17 @@ template <class ELFT> void ExecutableWri<br>
_interpSection.reset(new (this->_alloc) InterpSection<ELFT>(<br>
this->_context, ".interp",<br>
DefaultLayout<ELFT>::ORDER_<u></u>INTERP,<br>
this->_context.getInterpreter(<u></u>)));<br>
- this->_layout->addSection(_<u></u>interpSection.get());<br>
+ this->_layout.addSection(_<u></u>interpSection.get());<br>
}<br>
}<br>
/// Finalize the value of all the absolute symbols that we<br>
/// created<br>
template <class ELFT> void<br>
ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
- auto bssStartAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("__bss_start"<u></u>);<br>
- auto bssEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("__bss_end");<br>
- auto underScoreEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("_end");<br>
- auto endAtomIter = this->_layout-><u></u>findAbsoluteAtom("end");<br>
+ auto bssStartAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("__bss_start"<u></u>);<br>
+ auto bssEndAtomIter = this->_layout.<u></u>findAbsoluteAtom("__bss_end");<br>
+ auto underScoreEndAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("_end");<br>
+ auto endAtomIter = this->_layout.<u></u>findAbsoluteAtom("end");<br>
auto startEnd = [&](StringRef sym, StringRef sec) -> void {<br>
// TODO: This looks like a good place to use Twine...<br>
@@ -102,9 +102,9 @@ template <class ELFT> void ExecutableWri<br>
start += "_start";<br>
end += sym;<br>
end += "_end";<br>
- auto s = this->_layout-><u></u>findAbsoluteAtom(start);<br>
- auto e = this->_layout-><u></u>findAbsoluteAtom(end);<br>
- auto section = this->_layout-><u></u>findOutputSection(sec);<br>
+ auto s = this->_layout.<u></u>findAbsoluteAtom(start);<br>
+ auto e = this->_layout.<u></u>findAbsoluteAtom(end);<br>
+ auto section = this->_layout.<u></u>findOutputSection(sec);<br>
if (section) {<br>
(*s)->_virtualAddr = section->virtualAddr();<br>
(*e)->_virtualAddr = section->virtualAddr() +<br>
section->memSize();<br>
@@ -122,13 +122,13 @@ template <class ELFT> void ExecutableWri<br>
startEnd("rel_iplt", ".rel.plt");<br>
startEnd("fini_array", ".fini_array");<br>
- assert(!(bssStartAtomIter == this->_layout->absoluteAtoms()<u></u>.end()<br>
||<br>
- bssEndAtomIter == this->_layout->absoluteAtoms()<u></u>.end() ||<br>
- underScoreEndAtomIter ==<br>
this->_layout->absoluteAtoms()<u></u>.end() ||<br>
- endAtomIter == this->_layout->absoluteAtoms()<u></u>.end()) &&<br>
+ assert(!(bssStartAtomIter == this->_layout.absoluteAtoms().<u></u>end()<br>
||<br>
+ bssEndAtomIter == this->_layout.absoluteAtoms().<u></u>end() ||<br>
+ underScoreEndAtomIter ==<br>
this->_layout.absoluteAtoms().<u></u>end() ||<br>
+ endAtomIter == this->_layout.absoluteAtoms().<u></u>end()) &&<br>
"Unable to find the absolute atoms that have been added by<br>
lld");<br>
- auto bssSection = this->_layout-><u></u>findOutputSection(".bss");<br>
+ auto bssSection = this->_layout.<u></u>findOutputSection(".bss");<br>
// If we don't find a bss section, then don't set these values<br>
if (bssSection) {<br>
@@ -137,14 +137,11 @@ template <class ELFT> void ExecutableWri<br>
bssSection->virtualAddr() + bssSection->memSize();<br>
(*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
(*bssEndAtomIter)->_<u></u>virtualAddr;<br>
(*endAtomIter)->_virtualAddr = (*bssEndAtomIter)->_<u></u>virtualAddr;<br>
- } else if (auto dataSection =<br>
this->_layout-><u></u>findOutputSection(".data")) {<br>
+ } else if (auto dataSection =<br>
this->_layout.<u></u>findOutputSection(".data")) {<br>
(*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
dataSection->virtualAddr() + dataSection->memSize();<br>
(*endAtomIter)->_virtualAddr =<br>
(*underScoreEndAtomIter)->_<u></u>virtualAddr;<br>
}<br>
-<br>
- // Give a chance for the target to finalize its atom values<br>
- this->_targetHandler.<u></u>finalizeSymbolValues();<br>
}<br>
} // namespace elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/HeaderChunks.<u></u>h?rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h Sun Jan 26 19:21:02<br>
2014<br>
@@ -52,7 +52,8 @@ public:<br>
inline int getContentType() const { return<br>
Chunk<ELFT>::ContentType::<u></u>Header; }<br>
- void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+ void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer);<br>
virtual void doPreFlight() {}<br>
@@ -78,7 +79,8 @@ ELFHeader<ELFT>::ELFHeader(<u></u>const ELFLink<br>
}<br>
template <class ELFT><br>
-void ELFHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
llvm::FileOutputBuffer &buffer) {<br>
+void ELFHeader<ELFT>::write(<u></u>ELFWriter *writer, TargetLayout<ELFT><br>
&layout,<br>
+ llvm::FileOutputBuffer &buffer) {<br>
uint8_t *chunkBuffer = buffer.getBufferStart();<br>
uint8_t *atomContent = chunkBuffer + this->fileOffset();<br>
memcpy(atomContent, &_eh, fileSize());<br>
@@ -132,7 +134,8 @@ public:<br>
return c->Kind() == Chunk<ELFT>::Kind::<u></u>ProgramHeader;<br>
}<br>
- void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+ void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer);<br>
/// \brief find a program header entry in the list of program<br>
headers<br>
ReversePhIterT<br>
@@ -231,8 +234,8 @@ bool ProgramHeader<ELFT>::<u></u>addSegment(Seg<br>
}<br>
template <class ELFT><br>
-void ProgramHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
- llvm::FileOutputBuffer &buffer) {<br>
+void ProgramHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer) {<br>
uint8_t *chunkBuffer = buffer.getBufferStart();<br>
uint8_t *dest = chunkBuffer + this->fileOffset();<br>
for (auto phi : _ph) {<br>
@@ -262,7 +265,8 @@ public:<br>
_stringSection = s;<br>
}<br>
- void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+ void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer);<br>
virtual void doPreFlight() {}<br>
@@ -336,15 +340,15 @@ SectionHeader<ELFT>::<u></u>updateSection(Secti<br>
}<br>
template <class ELFT><br>
-void SectionHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
- llvm::FileOutputBuffer &buffer) {<br>
+void SectionHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
TargetLayout<ELFT> &layout,<br>
+ llvm::FileOutputBuffer &buffer) {<br>
uint8_t *chunkBuffer = buffer.getBufferStart();<br>
uint8_t *dest = chunkBuffer + this->fileOffset();<br>
for (auto shi : _sectionInfo) {<br>
memcpy(dest, shi, sizeof(Elf_Shdr));<br>
dest += sizeof(Elf_Shdr);<br>
}<br>
- _stringSection->write(writer, buffer);<br>
+ _stringSection->write(writer, layout, buffer);<br>
}<br>
} // end namespace elf<br>
} // end namespace lld<br>
<br>
Added:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h?<u></u>rev=200177&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
---<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
(added)<br>
+++<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,80 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
+//-------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
+#define HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
+<br>
+#include "HexagonExecutableAtoms.h"<br>
+#include "HexagonLinkingContext.h"<br>
+#include "DynamicLibraryWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class HexagonTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class HexagonDynamicLibraryWriter : public<br>
DynamicLibraryWriter<ELFT>,<br>
+ public HexagonELFWriter<ELFT> {<br>
+public:<br>
+ HexagonDynamicLibraryWriter(<u></u>HexagonLinkingContext &context,<br>
+ HexagonTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+ // Add any runtime files and their atoms to the output<br>
+ virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+ virtual void finalizeDefaultAtomValues();<br>
+<br>
+ virtual error_code setELFHeader() {<br>
+ DynamicLibraryWriter<ELFT>::<u></u>setELFHeader();<br>
+ HexagonELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+ return error_code::success();<br>
+ }<br>
+<br>
+private:<br>
+ void addDefaultAtoms() {<br>
+ _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
+ }<br>
+<br>
+ HexagonLinkingContext &_hexagonLinkingContext;<br>
+ HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+ std::unique_ptr<<u></u>HexagonRuntimeFile<ELFT>> _hexagonRuntimeFile;<br>
+};<br>
+<br>
+template <class ELFT><br>
+HexagonDynamicLibraryWriter<<u></u>ELFT>::<u></u>HexagonDynamicLibraryWriter(<br>
+ HexagonLinkingContext &context, HexagonTargetLayout<ELFT><br>
&layout)<br>
+ : DynamicLibraryWriter<ELFT>(<u></u>context, layout),<br>
+ HexagonELFWriter<ELFT>(<u></u>context, layout),<br>
_hexagonLinkingContext(<u></u>context),<br>
+ _hexagonTargetLayout(layout),<br>
+ _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(<u></u>context)) {}<br>
+<br>
+template <class ELFT><br>
+bool HexagonDynamicLibraryWriter<<u></u>ELFT>::createImplicitFiles(<br>
+ std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+ DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+ // Add the default atoms as defined for hexagon<br>
+ addDefaultAtoms();<br>
+ result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
+ return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void HexagonDynamicLibraryWriter<<u></u>ELFT>::<u></u>finalizeDefaultAtomValues()<br>
{<br>
+ // Finalize the atom values that are part of the parent.<br>
+ DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+ HexagonELFWriter<ELFT>::<u></u>finalizeHexagonRuntimeAtomValu<u></u>es();<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonELFWriters.h?rev=<u></u>200177&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -0,0 +1,61 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonELFWriters.h<br>
-------------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef HEXAGON_ELF_WRITERS_H<br>
+#define HEXAGON_ELF_WRITERS_H<br>
+<br>
+#include "HexagonLinkingContext.h"<br>
+#include "OutputELFWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <class ELFT> class HexagonTargetLayout;<br>
+<br>
+template <typename ELFT> class HexagonELFWriter {<br>
+public:<br>
+ HexagonELFWriter(<u></u>HexagonLinkingContext &context,<br>
+ HexagonTargetLayout<ELFT> &targetLayout)<br>
+ : _hexagonLinkingContext(<u></u>context),<br>
_hexagonTargetLayout(<u></u>targetLayout) {}<br>
+<br>
+protected:<br>
+ bool setELFHeader(ELFHeader<ELFT> &elfHeader) {<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_VERSION, 1);<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_OSABI, 0);<br>
+ elfHeader.e_version(1);<br>
+ elfHeader.e_flags(0x3);<br>
+ return true;<br>
+ }<br>
+<br>
+ void finalizeHexagonRuntimeAtomValu<u></u>es() {<br>
+ if (_hexagonLinkingContext.<u></u>isDynamic()) {<br>
+ auto gotAtomIter =<br>
+<br>
_hexagonTargetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ auto gotpltSection =<br>
_hexagonTargetLayout.<u></u>findOutputSection(".got.plt");<br>
+ if (gotpltSection)<br>
+ (*gotAtomIter)->_virtualAddr = gotpltSection->virtualAddr();<br>
+ else<br>
+ (*gotAtomIter)->_virtualAddr = 0;<br>
+ auto dynamicAtomIter =<br>
_hexagonTargetLayout.<u></u>findAbsoluteAtom("_DYNAMIC");<br>
+ auto dynamicSection =<br>
_hexagonTargetLayout.<u></u>findOutputSection(".dynamic");<br>
+ if (dynamicSection)<br>
+ (*dynamicAtomIter)->_<u></u>virtualAddr =<br>
dynamicSection->virtualAddr();<br>
+ else<br>
+ (*dynamicAtomIter)->_<u></u>virtualAddr = 0;<br>
+ }<br>
+ }<br>
+<br>
+private:<br>
+ HexagonLinkingContext &_hexagonLinkingContext<br>
LLVM_ATTRIBUTE_UNUSED;<br>
+ HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+};<br>
+<br>
+} // elf<br>
+} // lld<br>
+#endif // HEXAGON_ELF_WRITERS_H<br>
<br>
Added:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonExecutableWriter.h?rev=<u></u>200177&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,86 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
-------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef HEXAGON_EXECUTABLE_WRITER_H<br>
+#define HEXAGON_EXECUTABLE_WRITER_H<br>
+<br>
+#include "HexagonExecutableAtoms.h"<br>
+#include "HexagonLinkingContext.h"<br>
+#include "HexagonELFWriters.h"<br>
+#include "ExecutableWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class HexagonTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class HexagonExecutableWriter : public ExecutableWriter<ELFT>,<br>
+ public HexagonELFWriter<ELFT> {<br>
+public:<br>
+ HexagonExecutableWriter(<u></u>HexagonLinkingContext &context,<br>
+ HexagonTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+ // Add any runtime files and their atoms to the output<br>
+ virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+ virtual void finalizeDefaultAtomValues();<br>
+<br>
+ virtual error_code setELFHeader() {<br>
+ ExecutableWriter<ELFT>::<u></u>setELFHeader();<br>
+ HexagonELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+ return error_code::success();<br>
+ }<br>
+<br>
+private:<br>
+ void addDefaultAtoms() {<br>
+ _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_SDA_BASE_");<br>
+ if (this->_context.isDynamic()) {<br>
+ _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
+ }<br>
+ }<br>
+<br>
+ HexagonLinkingContext &_hexagonLinkingContext;<br>
+ HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+ std::unique_ptr<<u></u>HexagonRuntimeFile<ELFT>> _hexagonRuntimeFile;<br>
+};<br>
+<br>
+template <class ELFT><br>
+HexagonExecutableWriter<ELFT><u></u>::HexagonExecutableWriter(<br>
+ HexagonLinkingContext &context, HexagonTargetLayout<ELFT><br>
&layout)<br>
+ : ExecutableWriter<ELFT>(<u></u>context, layout),<br>
+ HexagonELFWriter<ELFT>(<u></u>context, layout),<br>
_hexagonLinkingContext(<u></u>context),<br>
+ _hexagonTargetLayout(layout),<br>
+ _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(<u></u>context)) {}<br>
+<br>
+template <class ELFT><br>
+bool HexagonExecutableWriter<ELFT>:<u></u>:createImplicitFiles(<br>
+ std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+ ExecutableWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+ // Add the default atoms as defined for hexagon<br>
+ addDefaultAtoms();<br>
+ result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
+ return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void HexagonExecutableWriter<ELFT>:<u></u>:finalizeDefaultAtomValues() {<br>
+ // Finalize the atom values that are part of the parent.<br>
+ ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+ auto sdabaseAtomIter =<br>
_hexagonTargetLayout.<u></u>findAbsoluteAtom("_SDA_BASE_")<u></u>;<br>
+ (*sdabaseAtomIter)->_<u></u>virtualAddr =<br>
+ _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr();<br>
+ HexagonELFWriter<ELFT>::<u></u>finalizeHexagonRuntimeAtomValu<u></u>es();<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // HEXAGON_EXECUTABLE_WRITER_H<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonLinkingContext.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -18,6 +18,8 @@<br>
namespace lld {<br>
namespace elf {<br>
+typedef llvm::object::ELFType<llvm::<u></u>support::little, 2, false><br>
HexagonELFType;<br>
+<br>
class HexagonLinkingContext LLVM_FINAL : public ELFLinkingContext {<br>
public:<br>
HexagonLinkingContext(llvm::<u></u>Triple triple);<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp?<u></u>rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
---<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
(original)<br>
+++<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
Sun Jan 26 19:21:02 2014<br>
@@ -264,19 +264,19 @@ error_code HexagonTargetRelocationHandle<br>
break;<br>
case R_HEX_GPREL16_0:<br>
relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
0);<br>
+<br>
_hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
0);<br>
break;<br>
case R_HEX_GPREL16_1:<br>
relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
1);<br>
+<br>
_hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
1);<br>
break;<br>
case R_HEX_GPREL16_2:<br>
relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
2);<br>
+<br>
_hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
2);<br>
break;<br>
case R_HEX_GPREL16_3:<br>
relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
3);<br>
+<br>
_hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
3);<br>
break;<br>
case R_HEX_16_X:<br>
case R_HEX_12_X:<br>
@@ -296,45 +296,52 @@ error_code HexagonTargetRelocationHandle<br>
break;<br>
case R_HEX_GOTREL_32:<br>
relocHexGOTREL_32(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.getGOTSymAddr()<u></u>);<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOTREL_LO16:<br>
relocHexGOTREL_HILO16(<u></u>location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.getGOTSymAddr()<u></u>);<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOTREL_HI16:<br>
relocHexGOTREL_HILO16(<u></u>location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.getGOTSymAddr()<u></u>, 16);<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr(), 16);<br>
break;<br>
case R_HEX_GOT_LO16:<br>
- relocHexGOTLO16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOTLO16(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_HI16:<br>
- relocHexGOTHI16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOTHI16(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_32:<br>
- relocHexGOT32(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOT32(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_16:<br>
- relocHexGOT16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOT16(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_32_6_X:<br>
- relocHexGOT32_6_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOT32_6_X(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_16_X:<br>
- relocHexGOT16_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOT16_X(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOT_11_X:<br>
- relocHexGOT11_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOT11_X(location, targetVAddress,<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
case R_HEX_GOTREL_32_6_X:<br>
relocHexGOTRELSigned(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.getGOTSymAddr()<u></u>, 6);<br>
+ _hexagonTargetLayout.<u></u>getGOTSymAddr(), 6);<br>
break;<br>
case R_HEX_GOTREL_16_X:<br>
case R_HEX_GOTREL_11_X:<br>
- relocHexGOTRELUnsigned(<u></u>location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.getGOTSymAddr()<u></u>);<br>
+ relocHexGOTRELUnsigned(<u></u>location, relocVAddress, targetVAddress,<br>
+ ref.addend(),<br>
_hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
break;<br>
default : {<br>
@@ -349,4 +356,4 @@ error_code HexagonTargetRelocationHandle<br>
return error_code::success();<br>
}<br>
-<br>
\ No newline at end of file<br>
+<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.h?<u></u>rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -18,23 +18,21 @@ namespace elf {<br>
class HexagonLinkingContext;<br>
class HexagonTargetHandler;<br>
-template <class HexagonELFType> class HexagonTargetLayout;<br>
class HexagonTargetRelocationHandler LLVM_FINAL :<br>
public TargetRelocationHandler<<u></u>HexagonELFType> {<br>
public:<br>
- HexagonTargetRelocationHandler<u></u>(<br>
- const HexagonLinkingContext &context, const<br>
HexagonTargetHandler &tH,<br>
- const HexagonTargetLayout<<u></u>HexagonELFType> &layout)<br>
- : _targetHandler(tH), _targetLayout(layout) {}<br>
+ HexagonTargetRelocationHandler<u></u>(HexagonLinkingContext &context,<br>
+ HexagonTargetLayout<<u></u>HexagonELFType><br>
&layout)<br>
+ : _hexagonLinkingContext(<u></u>context),<br>
_hexagonTargetLayout(layout) {}<br>
- virtual error_code<br>
- applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,<br>
- const lld::AtomLayout &, const Reference &) const;<br>
+ virtual error_code applyRelocation(ELFWriter &,<br>
llvm::FileOutputBuffer &,<br>
+ const lld::AtomLayout &,<br>
+ const Reference &) const;<br>
private:<br>
- const HexagonTargetHandler &_targetHandler;<br>
- const HexagonTargetLayout<<u></u>HexagonELFType> &_targetLayout;<br>
+ HexagonLinkingContext &_hexagonLinkingContext<br>
LLVM_ATTRIBUTE_UNUSED;<br>
+ HexagonTargetLayout<<u></u>HexagonELFType> &_hexagonTargetLayout;<br>
};<br>
} // elf<br>
} // lld<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonSectionChunks.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -6,14 +6,13 @@<br>
// License. See LICENSE.TXT for details.<br>
//<br>
//===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
-#ifndef LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_SECTION_CHUNKS_H<br>
-#define LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_SECTION_CHUNKS_H<br>
+#ifndef HEXAGON_SECTION_CHUNKS_H<br>
+#define HEXAGON_SECTION_CHUNKS_H<br>
#include "HexagonTargetHandler.h"<br>
namespace lld {<br>
namespace elf {<br>
-typedef llvm::object::ELFType<llvm::<u></u>support::little, 2, false><br>
HexagonELFType;<br>
template <typename ELFT> class HexagonTargetLayout;<br>
class HexagonLinkingContext;<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonTargetHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
Sun Jan 26 19:21:02 2014<br>
@@ -7,6 +7,8 @@<br>
//<br>
//===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
+#include "HexagonExecutableWriter.h"<br>
+#include "HexagonDynamicLibraryWriter.<u></u>h"<br>
#include "HexagonTargetHandler.h"<br>
#include "HexagonLinkingContext.h"<br>
@@ -17,11 +19,28 @@ using namespace llvm::ELF;<br>
using llvm::makeArrayRef;<br>
HexagonTargetHandler::<u></u>HexagonTargetHandler(<u></u>HexagonLinkingContext<br>
&context)<br>
- : DefaultTargetHandler(context), _targetLayout(context),<br>
- _relocationHandler(context, *this, _targetLayout),<br>
- _hexagonRuntimeFile(new<br>
HexagonRuntimeFile<<u></u>HexagonELFType>(context)) {}<br>
-<br>
-namespace {<br>
+ : DefaultTargetHandler(context),<br>
_hexagonLinkingContext(<u></u>context),<br>
+ _hexagonRuntimeFile(new<br>
HexagonRuntimeFile<<u></u>HexagonELFType>(context)),<br>
+ _hexagonTargetLayout(new<br>
HexagonTargetLayout<<u></u>HexagonELFType>(context)),<br>
+ _hexagonRelocationHandler(new HexagonTargetRelocationHandler<u></u>(<br>
+ context, *_hexagonTargetLayout.get())) {}<br>
+<br>
+std::unique_ptr<Writer> HexagonTargetHandler::<u></u>getWriter() {<br>
+ switch (_hexagonLinkingContext.<u></u>getOutputELFType()) {<br>
+ case llvm::ELF::ET_EXEC:<br>
+ return std::unique_ptr<Writer>(<br>
+ new elf::HexagonExecutableWriter<<u></u>HexagonELFType>(<br>
+ _hexagonLinkingContext, *_hexagonTargetLayout.get()));<br>
+ case llvm::ELF::ET_DYN:<br>
+ return std::unique_ptr<Writer>(<br>
+ new elf::<u></u>HexagonDynamicLibraryWriter<<u></u>HexagonELFType>(<br>
+ _hexagonLinkingContext, *_hexagonTargetLayout.get()));<br>
+ case llvm::ELF::ET_REL:<br>
+ llvm_unreachable("TODO: support -r mode");<br>
+ default:<br>
+ llvm_unreachable("unsupported output type");<br>
+ }<br>
+}<br>
using namespace llvm::ELF;<br>
@@ -297,7 +316,6 @@ public:<br>
return error_code::success();<br>
}<br>
};<br>
-} // end anonymous namespace<br>
void elf::HexagonLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
if (isDynamic())<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonTargetHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -7,8 +7,8 @@<br>
//<br>
//===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
-#ifndef LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_TARGET_HANDLER_H<br>
-#define LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_TARGET_HANDLER_H<br>
+#ifndef HEXAGON_TARGET_HANDLER_H<br>
+#define HEXAGON_TARGET_HANDLER_H<br>
#include "DefaultTargetHandler.h"<br>
#include "HexagonExecutableAtoms.h"<br>
@@ -25,14 +25,14 @@ class HexagonLinkingContext;<br>
/// \brief TargetLayout for Hexagon<br>
template <class HexagonELFType><br>
class HexagonTargetLayout LLVM_FINAL : public<br>
TargetLayout<HexagonELFType> {<br>
-<br>
public:<br>
enum HexagonSectionOrder {<br>
ORDER_SDATA = 205<br>
};<br>
HexagonTargetLayout(const HexagonLinkingContext &hti)<br>
- : TargetLayout<HexagonELFType>(<u></u>hti), _sdataSection(nullptr) {<br>
+ : TargetLayout<HexagonELFType>(<u></u>hti), _sdataSection(nullptr),<br>
+ _gotSymAtom(nullptr), _cachedGotSymAtom(false) {<br>
_sdataSection = new (_alloc) SDataSection<HexagonELFType>(<u></u>hti);<br>
}<br>
@@ -84,9 +84,22 @@ public:<br>
return _sdataSection;<br>
}<br>
+ uint64_t getGOTSymAddr() {<br>
+ if (!_cachedGotSymAtom) {<br>
+ auto gotAtomIter =<br>
this->findAbsoluteAtom("_<u></u>GLOBAL_OFFSET_TABLE_");<br>
+ _gotSymAtom = (*gotAtomIter);<br>
+ _cachedGotSymAtom = true;<br>
+ }<br>
+ if (_gotSymAtom)<br>
+ return _gotSymAtom->_virtualAddr;<br>
+ return 0;<br>
+ }<br>
+<br>
private:<br>
llvm::BumpPtrAllocator _alloc;<br>
SDataSection<HexagonELFType> *_sdataSection;<br>
+ AtomLayout *_gotSymAtom;<br>
+ bool _cachedGotSymAtom;<br>
};<br>
/// \brief TargetHandler for Hexagon<br>
@@ -97,64 +110,12 @@ public:<br>
virtual void registerRelocationNames(<u></u>Registry ®istry);<br>
- bool doesOverrideELFHeader() { return true; }<br>
-<br>
- void setELFHeader(ELFHeader<<u></u>HexagonELFType> *elfHeader) {<br>
- elfHeader->e_ident(llvm::ELF::<u></u>EI_VERSION, 1);<br>
- elfHeader->e_ident(llvm::ELF::<u></u>EI_OSABI, 0);<br>
- elfHeader->e_version(1);<br>
- elfHeader->e_flags(0x3);<br>
- }<br>
-<br>
- virtual HexagonTargetLayout<<u></u>HexagonELFType> &targetLayout() {<br>
- return _targetLayout;<br>
- }<br>
-<br>
virtual const HexagonTargetRelocationHandler<br>
&getRelocationHandler() const {<br>
- return _relocationHandler;<br>
- }<br>
-<br>
- void addDefaultAtoms() {<br>
- _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_SDA_BASE_");<br>
- if (_context.isDynamic()) {<br>
- _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
- _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
- }<br>
- }<br>
-<br>
- virtual bool<br>
- createImplicitFiles(std::<u></u>vector<std::unique_ptr<File> > &result) {<br>
- // Add the default atoms as defined for hexagon<br>
- addDefaultAtoms();<br>
- result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
- return true;<br>
- }<br>
-<br>
- void finalizeSymbolValues() {<br>
- auto sdabaseAtomIter =<br>
_targetLayout.<u></u>findAbsoluteAtom("_SDA_BASE_")<u></u>;<br>
- (*sdabaseAtomIter)->_<u></u>virtualAddr =<br>
- _targetLayout.getSDataSection(<u></u>)->virtualAddr();<br>
- if (_context.isDynamic()) {<br>
- auto gotAtomIter =<br>
- _targetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
- _gotSymAtom = (*gotAtomIter);<br>
- auto gotpltSection =<br>
_targetLayout.<u></u>findOutputSection(".got.plt");<br>
- if (gotpltSection)<br>
- _gotSymAtom->_virtualAddr = gotpltSection->virtualAddr();<br>
- else<br>
- _gotSymAtom->_virtualAddr = 0;<br>
- auto dynamicAtomIter =<br>
_targetLayout.<u></u>findAbsoluteAtom("_DYNAMIC");<br>
- auto dynamicSection =<br>
_targetLayout.<u></u>findOutputSection(".dynamic");<br>
- if (dynamicSection)<br>
- (*dynamicAtomIter)->_<u></u>virtualAddr =<br>
dynamicSection->virtualAddr();<br>
- else<br>
- (*dynamicAtomIter)->_<u></u>virtualAddr = 0;<br>
- }<br>
+ return *(_hexagonRelocationHandler.<u></u>get());<br>
}<br>
- uint64_t getGOTSymAddr() const {<br>
- if (!_gotSymAtom) return 0;<br>
- return _gotSymAtom->_virtualAddr;<br>
+ virtual HexagonTargetLayout<<u></u>HexagonELFType> &getTargetLayout() {<br>
+ return *(_hexagonTargetLayout.get());<br>
}<br>
virtual std::unique_ptr<Reader> getObjReader(bool atomizeStrings)<br>
{<br>
@@ -165,13 +126,15 @@ public:<br>
return std::unique_ptr<Reader>(new<br>
HexagonELFDSOReader(<u></u>useShlibUndefines));<br>
}<br>
+ virtual std::unique_ptr<Writer> getWriter();<br>
+<br>
private:<br>
+ llvm::BumpPtrAllocator _alloc;<br>
static const Registry::KindStrings kindStrings[];<br>
-<br>
- HexagonTargetLayout<<u></u>HexagonELFType> _targetLayout;<br>
- HexagonTargetRelocationHandler _relocationHandler;<br>
+ HexagonLinkingContext &_hexagonLinkingContext;<br>
std::unique_ptr<<u></u>HexagonRuntimeFile<<u></u>HexagonELFType> ><br>
_hexagonRuntimeFile;<br>
- AtomLayout *_gotSymAtom;<br>
+ std::unique_ptr<<u></u>HexagonTargetLayout<<u></u>HexagonELFType>><br>
_hexagonTargetLayout;<br>
+ std::unique_ptr<<u></u>HexagonTargetRelocationHandler<u></u>><br>
_hexagonRelocationHandler;<br>
};<br>
} // end namespace elf<br>
} // end namespace lld<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsDynamicLibraryWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsDynamicLibraryWriter.h?<u></u>rev=200177&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,102 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
---------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
+#define MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
+<br>
+#include "DynamicLibraryWriter.h"<br>
+#include "MipsELFWriters.h"<br>
+#include "MipsLinkingContext.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class MipsTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class MipsDynamicLibraryWriter : public DynamicLibraryWriter<ELFT>,<br>
+ public MipsELFWriter<ELFT> {<br>
+public:<br>
+ MipsDynamicLibraryWriter(<u></u>MipsLinkingContext &context,<br>
+ MipsTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+ // Add any runtime files and their atoms to the output<br>
+ virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+ virtual void finalizeDefaultAtomValues();<br>
+<br>
+ virtual error_code setELFHeader() {<br>
+ DynamicLibraryWriter<ELFT>::<u></u>setELFHeader();<br>
+ MipsELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+ return error_code::success();<br>
+ }<br>
+<br>
+ LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable();<br>
+<br>
+ LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable();<br>
+<br>
+private:<br>
+ void addDefaultAtoms() {<br>
+ if (this->_context.isDynamic()) {<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp");<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp_disp");<br>
+ }<br>
+ }<br>
+<br>
+ std::unique_ptr<<u></u>MipsRuntimeFile<ELFT>> _mipsRuntimeFile;<br>
+ MipsLinkingContext &_mipsContext;<br>
+ MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
+};<br>
+<br>
+template <class ELFT><br>
+MipsDynamicLibraryWriter<<u></u>ELFT>::<u></u>MipsDynamicLibraryWriter(<br>
+ MipsLinkingContext &context, MipsTargetLayout<ELFT> &layout)<br>
+ : DynamicLibraryWriter<ELFT>(<u></u>context, layout),<br>
+ MipsELFWriter<ELFT>(context, layout),<br>
+ _mipsRuntimeFile(new MipsRuntimeFile<ELFT>(context)<u></u>),<br>
+ _mipsContext(context), _mipsTargetLayout(layout) {}<br>
+<br>
+template <class ELFT><br>
+bool MipsDynamicLibraryWriter<ELFT><u></u>::createImplicitFiles(<br>
+ std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+ DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+ // Add the default atoms as defined for mips<br>
+ addDefaultAtoms();<br>
+ result.push_back(std::move(_<u></u>mipsRuntimeFile));<br>
+ return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void MipsDynamicLibraryWriter<ELFT><u></u>::finalizeDefaultAtomValues() {<br>
+ // Finalize the atom values that are part of the parent.<br>
+ DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+ MipsELFWriter<ELFT>::<u></u>finalizeMipsRuntimeAtomValues(<u></u>);<br>
+}<br>
+<br>
+/// \brief create dynamic table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)<br>
+ MipsDynamicLibraryWriter<ELFT><u></u>::createDynamicTable() {<br>
+ return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(new (<br>
+ this->_alloc) MipsDynamicTable(_mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+/// \brief create dynamic symbol table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
+ MipsDynamicLibraryWriter<ELFT><u></u>::createDynamicSymbolTable() {<br>
+ return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(new (<br>
+ this->_alloc) MipsDynamicSymbolTable(_<u></u>mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsELFWriters.h?rev=200177&<u></u>view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h (added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -0,0 +1,75 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsELFWriters.h<br>
-------------------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef MIPS_ELF_WRITERS_H<br>
+#define MIPS_ELF_WRITERS_H<br>
+<br>
+#include "MipsLinkingContext.h"<br>
+#include "OutputELFWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <class ELFT> class MipsTargetLayout;<br>
+<br>
+template <typename ELFT> class MipsELFWriter {<br>
+public:<br>
+ MipsELFWriter(<u></u>MipsLinkingContext &context,<br>
+ MipsTargetLayout<ELFT> &targetLayout)<br>
+ : _mipsLinkingContext(context),<br>
_mipsTargetLayout(<u></u>targetLayout) {}<br>
+<br>
+protected:<br>
+ bool setELFHeader(ELFHeader<ELFT> &elfHeader) {<br>
+ elfHeader.e_version(1);<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_VERSION, llvm::ELF::EV_CURRENT);<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_OSABI,<br>
llvm::ELF::ELFOSABI_NONE);<br>
+ if (_mipsTargetLayout.<u></u>findOutputSection(".got.plt"))<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_ABIVERSION, 1);<br>
+ else<br>
+ elfHeader.e_ident(llvm::ELF::<u></u>EI_ABIVERSION, 0);<br>
+<br>
+ // FIXME (simon): Read elf flags from all inputs, check<br>
compatibility,<br>
+ // merge them and write result here.<br>
+ uint32_t flags = llvm::ELF::EF_MIPS_NOREORDER |<br>
llvm::ELF::EF_MIPS_ABI_O32 |<br>
+ llvm::ELF::EF_MIPS_CPIC |<br>
llvm::ELF::EF_MIPS_ARCH_32R2;<br>
+ if (_mipsLinkingContext.<u></u>getOutputELFType() == llvm::ELF::ET_DYN)<br>
+ flags |= EF_MIPS_PIC;<br>
+ elfHeader.e_flags(flags);<br>
+ return true;<br>
+ }<br>
+<br>
+ void finalizeMipsRuntimeAtomValues(<u></u>) {<br>
+ if (_mipsLinkingContext.<u></u>isDynamic()) {<br>
+ auto gotSection = _mipsTargetLayout.<u></u>findOutputSection(".got");<br>
+ auto got = gotSection ? gotSection->virtualAddr() : 0;<br>
+ auto gp = gotSection ? got + _mipsTargetLayout.getGPOffset(<u></u>) :<br>
0;<br>
+<br>
+ auto gotAtomIter =<br>
+<br>
_mipsTargetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ assert(gotAtomIter !=<br>
_mipsTargetLayout.<u></u>absoluteAtoms().end());<br>
+ (*gotAtomIter)->_virtualAddr = got;<br>
+<br>
+ auto gpAtomIter = _mipsTargetLayout.<u></u>findAbsoluteAtom("_gp");<br>
+ assert(gpAtomIter != _mipsTargetLayout.<u></u>absoluteAtoms().end());<br>
+ (*gpAtomIter)->_virtualAddr = gp;<br>
+<br>
+ AtomLayout *gpAtom = _mipsTargetLayout.getGP();<br>
+ assert(gpAtom != nullptr);<br>
+ gpAtom->_virtualAddr = gp;<br>
+ }<br>
+ }<br>
+<br>
+private:<br>
+ MipsLinkingContext &_mipsLinkingContext LLVM_ATTRIBUTE_UNUSED;<br>
+ MipsTargetLayout<ELFT> &_mipsTargetLayout;<br>
+};<br>
+<br>
+} // elf<br>
+} // lld<br>
+#endif // MIPS_ELF_WRITERS_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsExecutableWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsExecutableWriter.h?rev=<u></u>200177&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -0,0 +1,102 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsExecutableWriter.h<br>
-------------------===//<br>
+//<br>
+// The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef MIPS_EXECUTABLE_WRITER_H<br>
+#define MIPS_EXECUTABLE_WRITER_H<br>
+<br>
+#include "ExecutableWriter.h"<br>
+#include "MipsELFWriters.h"<br>
+#include "MipsLinkingContext.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class MipsTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class MipsExecutableWriter : public ExecutableWriter<ELFT>,<br>
+ public MipsELFWriter<ELFT> {<br>
+public:<br>
+ MipsExecutableWriter(<u></u>MipsLinkingContext &context,<br>
+ MipsTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+ // Add any runtime files and their atoms to the output<br>
+ virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+ virtual void finalizeDefaultAtomValues();<br>
+<br>
+ virtual error_code setELFHeader() {<br>
+ ExecutableWriter<ELFT>::<u></u>setELFHeader();<br>
+ MipsELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+ return error_code::success();<br>
+ }<br>
+<br>
+ LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable();<br>
+<br>
+ LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable();<br>
+<br>
+private:<br>
+ void addDefaultAtoms() {<br>
+ if (this->_context.isDynamic()) {<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp");<br>
+ _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp_disp");<br>
+ }<br>
+ }<br>
+<br>
+ std::unique_ptr<<u></u>MipsRuntimeFile<ELFT>> _mipsRuntimeFile;<br>
+ MipsLinkingContext &_mipsContext;<br>
+ MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
+};<br>
+<br>
+template <class ELFT><br>
+MipsExecutableWriter<ELFT>::<u></u>MipsExecutableWriter(<u></u>MipsLinkingContext<br>
&context,<br>
+<br>
MipsTargetLayout<ELFT><br>
&layout)<br>
+ : ExecutableWriter<ELFT>(<u></u>context, layout),<br>
+ MipsELFWriter<ELFT>(context, layout),<br>
+ _mipsRuntimeFile(new MipsRuntimeFile<ELFT>(context)<u></u>),<br>
+ _mipsContext(context), _mipsTargetLayout(layout) {}<br>
+<br>
+template <class ELFT><br>
+bool MipsExecutableWriter<ELFT>::<u></u>createImplicitFiles(<br>
+ std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+ ExecutableWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+ // Add the default atoms as defined for mips<br>
+ addDefaultAtoms();<br>
+ result.push_back(std::move(_<u></u>mipsRuntimeFile));<br>
+ return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void MipsExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
+ // Finalize the atom values that are part of the parent.<br>
+ ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+ MipsELFWriter<ELFT>::<u></u>finalizeMipsRuntimeAtomValues(<u></u>);<br>
+}<br>
+<br>
+/// \brief create dynamic table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)<br>
+ MipsExecutableWriter<ELFT>::<u></u>createDynamicTable() {<br>
+ return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(new (<br>
+ this->_alloc) MipsDynamicTable(_mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+/// \brief create dynamic symbol table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
+ MipsExecutableWriter<ELFT>::<u></u>createDynamicSymbolTable() {<br>
+ return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(new (<br>
+ this->_alloc) MipsDynamicSymbolTable(_<u></u>mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // MIPS_EXECUTABLE_WRITER_H<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsLinkingContext.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp Sun<br>
Jan 26 19:21:02 2014<br>
@@ -19,17 +19,6 @@ MipsLinkingContext::<u></u>MipsLinkingContext(l<br>
: ELFLinkingContext(triple, std::unique_ptr<<u></u>TargetHandlerBase>(<br>
new MipsTargetHandler(*this)))<br>
{}<br>
-MipsTargetLayout<<u></u>Mips32ElELFType><br>
&MipsLinkingContext::<u></u>getTargetLayout() {<br>
- auto &layout = getTargetHandler<<u></u>Mips32ElELFType>().<u></u>targetLayout();<br>
- return static_cast<MipsTargetLayout<<u></u>Mips32ElELFType> &>(layout);<br>
-}<br>
-<br>
-const MipsTargetLayout<<u></u>Mips32ElELFType> &<br>
-MipsLinkingContext::<u></u>getTargetLayout() const {<br>
- auto &layout = getTargetHandler<<u></u>Mips32ElELFType>().<u></u>targetLayout();<br>
- return static_cast<MipsTargetLayout<<u></u>Mips32ElELFType> &>(layout);<br>
-}<br>
-<br>
bool MipsLinkingContext::<u></u>isLittleEndian() const {<br>
return Mips32ElELFType::<u></u>TargetEndianness == llvm::support::little;<br>
}<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsRelocationHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp Sun<br>
Jan 26 19:21:02 2014<br>
@@ -112,10 +112,6 @@ void relocLldLo16(uint8_t *location, uin<br>
} // end anon namespace<br>
-MipsTargetRelocationHandler::<u></u>MipsTargetRelocationHandler(<br>
- const MipsLinkingContext &context, const MipsTargetHandler<br>
&handler)<br>
- : _targetHandler(handler) {}<br>
-<br>
MipsTargetRelocationHandler::~<u></u>MipsTargetRelocationHandler() {<br>
assert(_pairedRelocations.<u></u>empty());<br>
}<br>
@@ -132,7 +128,7 @@ MipsTargetRelocationHandler::<u></u>savePairedR<br>
void MipsTargetRelocationHandler::<u></u>applyPairedRelocations(<br>
ELFWriter &writer, llvm::FileOutputBuffer &buf, const<br>
lld::AtomLayout &atom,<br>
- int64_t loAddend) const {<br>
+ int64_t gpAddr, int64_t loAddend) const {<br>
auto pi = _pairedRelocations.find(&atom)<u></u>;<br>
if (pi == _pairedRelocations.end())<br>
return;<br>
@@ -150,13 +146,11 @@ void MipsTargetRelocationHandler::<u></u>applyP<br>
assert(ri->kindArch() == Reference::KindArch::Mips);<br>
switch (ri->kindValue()) {<br>
case R_MIPS_HI16:<br>
- relocHi16(location, relocVAddress, targetVAddress, ahl,<br>
- _targetHandler.<u></u>getGPDispSymAddr(),<br>
+ relocHi16(location, relocVAddress, targetVAddress, ahl,<br>
gpAddr,<br>
ri->target()->name() == "_gp_disp");<br>
break;<br>
case R_MIPS_GOT16:<br>
- relocGOT16(location, relocVAddress, targetVAddress, ahl,<br>
- _targetHandler.<u></u>getGPDispSymAddr());<br>
+ relocGOT16(location, relocVAddress, targetVAddress, ahl,<br>
gpAddr);<br>
break;<br>
default:<br>
llvm_unreachable("Unknown type of paired relocation.");<br>
@@ -169,6 +163,9 @@ void MipsTargetRelocationHandler::<u></u>applyP<br>
error_code MipsTargetRelocationHandler::<u></u>applyRelocation(<br>
ELFWriter &writer, llvm::FileOutputBuffer &buf, const<br>
lld::AtomLayout &atom,<br>
const Reference &ref) const {<br>
+ AtomLayout *gpAtom = _mipsTargetLayout.getGP();<br>
+ uint64_t gpAddr = gpAtom ? gpAtom->_virtualAddr : 0;<br>
+<br>
uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;<br>
uint8_t *location = atomContent + ref.offsetInAtom();<br>
uint64_t targetVAddress = writer.addressOfAtom(ref.<u></u>target());<br>
@@ -191,16 +188,14 @@ error_code MipsTargetRelocationHandler::<br>
break;<br>
case R_MIPS_LO16:<br>
relocLo16(location, relocVAddress, targetVAddress, calcAHL(0,<br>
ref.addend()),<br>
- _targetHandler.<u></u>getGPDispSymAddr(),<br>
- ref.target()->name() == "_gp_disp");<br>
- applyPairedRelocations(writer, buf, atom, ref.addend());<br>
+ gpAddr, ref.target()->name() == "_gp_disp");<br>
+ applyPairedRelocations(writer, buf, atom, gpAddr, ref.addend());<br>
break;<br>
case R_MIPS_GOT16:<br>
savePairedRelocation(atom, ref);<br>
break;<br>
case R_MIPS_CALL16:<br>
- relocCall16(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.<u></u>getGPDispSymAddr());<br>
+ relocCall16(location, relocVAddress, targetVAddress,<br>
ref.addend(), gpAddr);<br>
break;<br>
case R_MIPS_JALR:<br>
// We do not do JALR optimization now.<br>
@@ -212,8 +207,7 @@ error_code MipsTargetRelocationHandler::<br>
// Do nothing.<br>
break;<br>
case LLD_R_MIPS_GLOBAL_GOT16:<br>
- relocGOT16(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
- _targetHandler.<u></u>getGPDispSymAddr());<br>
+ relocGOT16(location, relocVAddress, targetVAddress,<br>
ref.addend(), gpAddr);<br>
break;<br>
case LLD_R_MIPS_GLOBAL_26:<br>
reloc26(location, relocVAddress, targetVAddress, false);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsRelocationHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -19,8 +19,9 @@ class MipsTargetHandler;<br>
class MipsTargetRelocationHandler LLVM_FINAL<br>
: public TargetRelocationHandler<<u></u>Mips32ElELFType> {<br>
public:<br>
- MipsTargetRelocationHandler(<u></u>const MipsLinkingContext &context,<br>
- const MipsTargetHandler &handler);<br>
+ MipsTargetRelocationHandler(<u></u>MipsLinkingContext &context,<br>
+ MipsTargetLayout<<u></u>Mips32ElELFType><br>
&layout)<br>
+ : _mipsLinkingContext(context), _mipsTargetLayout(layout) {}<br>
~MipsTargetRelocationHandler()<u></u>;<br>
@@ -29,8 +30,6 @@ public:<br>
const Reference &) const;<br>
private:<br>
- const MipsTargetHandler &_targetHandler;<br>
-<br>
typedef std::vector<const Reference *> PairedRelocationsT;<br>
typedef std::unordered_map<const lld::AtomLayout *,<br>
PairedRelocationsT><br>
PairedRelocationMapT;<br>
@@ -40,8 +39,11 @@ private:<br>
void savePairedRelocation(const lld::AtomLayout &atom,<br>
const Reference &ref) const;<br>
void applyPairedRelocations(<u></u>ELFWriter &writer,<br>
llvm::FileOutputBuffer &buf,<br>
- const lld::AtomLayout &atom,<br>
+ const lld::AtomLayout &atom, int64_t<br>
gpAddr,<br>
int64_t loAddend) const;<br>
+<br>
+ MipsLinkingContext &_mipsLinkingContext LLVM_ATTRIBUTE_UNUSED;<br>
+ MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
};<br>
} // elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsTargetHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp Sun Jan<br>
26 19:21:02 2014<br>
@@ -10,201 +10,35 @@<br>
#include "ELFFile.h"<br>
#include "MipsLinkingContext.h"<br>
#include "MipsTargetHandler.h"<br>
+#include "MipsExecutableWriter.h"<br>
+#include "MipsDynamicLibraryWriter.h"<br>
using namespace lld;<br>
using namespace elf;<br>
-namespace {<br>
-<br>
-class MipsDynamicSymbolTable : public<br>
DynamicSymbolTable<<u></u>Mips32ElELFType> {<br>
-public:<br>
- MipsDynamicSymbolTable(const MipsLinkingContext &context)<br>
- : DynamicSymbolTable<<u></u>Mips32ElELFType>(<br>
- context, ".dynsym",<br>
- DefaultLayout<Mips32ElELFType><u></u>::ORDER_DYNAMIC_SYMBOLS),<br>
- _layout(context.<u></u>getTargetLayout()) {}<br>
-<br>
- virtual void sortSymbols() {<br>
- std::stable_sort(_symbolTable.<u></u>begin(), _symbolTable.end(),<br>
- [this](const SymbolEntry &A, const SymbolEntry<br>
&B) {<br>
- if (A._symbol.getBinding() != STB_GLOBAL &&<br>
- B._symbol.getBinding() != STB_GLOBAL)<br>
- return A._symbol.getBinding() < B._symbol.getBinding();<br>
-<br>
- return _layout.getGOTSection().<u></u>compare(A._atom, B._atom);<br>
- });<br>
- }<br>
-<br>
-private:<br>
- const MipsTargetLayout<<u></u>Mips32ElELFType> &_layout;<br>
-};<br>
-<br>
-class MipsDynamicTable : public DynamicTable<Mips32ElELFType> {<br>
-public:<br>
- MipsDynamicTable(<u></u>MipsLinkingContext &context)<br>
- : DynamicTable<Mips32ElELFType>(<br>
- context, ".dynamic",<br>
DefaultLayout<Mips32ElELFType><u></u>::ORDER_DYNAMIC),<br>
- _layout(context.<u></u>getTargetLayout()) {}<br>
-<br>
- virtual void createDefaultEntries() {<br>
- DynamicTable<Mips32ElELFType>:<u></u>:createDefaultEntries();<br>
-<br>
- Elf_Dyn dyn;<br>
-<br>
- // Version id for the Runtime Linker Interface.<br>
- dyn.d_un.d_val = 1;<br>
- dyn.d_tag = DT_MIPS_RLD_VERSION;<br>
- addEntry(dyn);<br>
-<br>
- // MIPS flags.<br>
- dyn.d_un.d_val = RHF_NOTPOT;<br>
- dyn.d_tag = DT_MIPS_FLAGS;<br>
- addEntry(dyn);<br>
-<br>
- // The base address of the segment.<br>
- dyn.d_un.d_ptr = 0;<br>
- dyn.d_tag = DT_MIPS_BASE_ADDRESS;<br>
- _dt_baseaddr = addEntry(dyn);<br>
-<br>
- // Number of local global offset table entries.<br>
- dyn.d_un.d_val = 0;<br>
- dyn.d_tag = DT_MIPS_LOCAL_GOTNO;</blockquote></blockquote>
</blockquote></div><br></div></div>