[lld] r182076 - [lld][ELF][X86_64] Reorganize X86_64 Target specific code
Rui Ueyama
ruiu at google.com
Fri May 17 12:50:46 PDT 2013
LGTM. Thank you for doing this!
On Thu, May 16, 2013 at 9:19 PM, Shankar Easwaran
<shankare at codeaurora.org>wrote:
> Author: shankare
> Date: Thu May 16 23:19:53 2013
> New Revision: 182076
>
> URL: http://llvm.org/viewvc/llvm-project?rev=182076&view=rev
> Log:
> [lld][ELF][X86_64] Reorganize X86_64 Target specific code
>
> This patch splits X86_64Target specific code so that
> the dynamic atoms and the Relocation handlers are in seperate
> files for easier maintenace. The files are sure to grow and this
> makes it easier to work with.
>
> * There is no change in functionality *
>
> Added:
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h
> Modified:
> lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h
> lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt?rev=182076&r1=182075&r2=182076&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt Thu May 16
> 23:19:53 2013
> @@ -1,6 +1,7 @@
> add_lld_library(lldX86_64ELFTarget
> X86_64TargetInfo.cpp
> X86_64TargetHandler.cpp
> + X86_64RelocationHandler.cpp
> )
>
> target_link_libraries(lldX86_64ELFTarget
>
> Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h?rev=182076&view=auto
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h (added)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h Thu May 16
> 23:19:53 2013
> @@ -0,0 +1,73 @@
> +//===- lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h
> -------------------===//
> +//
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef X86_64_DYNAMIC_ATOMS_H
> +#define X86_64_DYNAMIC_ATOMS_H
> +
> +#include "Atoms.h"
> +#include "X86_64TargetInfo.h"
> +
> +namespace lld {
> +namespace elf {
> +
> +class X86_64GOTAtom : public GOTAtom {
> + static const uint8_t _defaultContent[8];
> +
> +public:
> + X86_64GOTAtom(const File &f, StringRef secName) : GOTAtom(f, secName) {}
> +
> + virtual ArrayRef<uint8_t> rawContent() const {
> + return ArrayRef<uint8_t>(_defaultContent, 8);
> + }
> +};
> +
> +const uint8_t X86_64GOTAtom::_defaultContent[8] = { 0 };
> +
> +class X86_64PLTAtom : public PLTAtom {
> + static const uint8_t _defaultContent[16];
> +
> +public:
> + X86_64PLTAtom(const File &f, StringRef secName) : PLTAtom(f, secName) {}
> +
> + virtual ArrayRef<uint8_t> rawContent() const {
> + return ArrayRef<uint8_t>(_defaultContent, 16);
> + }
> +};
> +
> +const uint8_t X86_64PLTAtom::_defaultContent[16] = {
> + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *gotatom(%rip)
> + 0x68, 0x00, 0x00, 0x00, 0x00, // pushq reloc-index
> + 0xe9, 0x00, 0x00, 0x00, 0x00 // jmpq plt[-1]
> +};
> +
> +class X86_64PLT0Atom : public PLT0Atom {
> + static const uint8_t _plt0Content[16];
> +
> +public:
> + X86_64PLT0Atom(const File &f) : PLT0Atom(f) {
> +#ifndef NDEBUG
> + _name = ".PLT0";
> +#endif
> + }
> +
> + virtual ArrayRef<uint8_t> rawContent() const {
> + return ArrayRef<uint8_t>(_plt0Content, 16);
> + }
> +};
> +
> +const uint8_t X86_64PLT0Atom::_plt0Content[16] = {
> + 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)
> + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)
> + 0x90, 0x90, 0x90, 0x90 // nopnopnop
> +};
> +
> +} // elf
> +} // lld
> +
> +#endif
>
> Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp?rev=182076&view=auto
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp
> (added)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp Thu
> May 16 23:19:53 2013
> @@ -0,0 +1,146 @@
> +//===- lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp
> ------------===//
> +//
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "X86_64TargetHandler.h"
> +#include "X86_64TargetInfo.h"
> +
> +using namespace lld;
> +using namespace elf;
> +
> +namespace {
> +/// \brief R_X86_64_64 - word64: S + A
> +void reloc64(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> + uint64_t result = S + A;
> + *reinterpret_cast<llvm::support::ulittle64_t *>(location) =
> + result |
> + (uint64_t) * reinterpret_cast<llvm::support::ulittle64_t
> *>(location);
> +}
> +
> +/// \brief R_X86_64_PC32 - word32: S + A - P
> +void relocPC32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> + uint32_t result = (uint32_t)((S + A) - P);
> + *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
> + result +
> + (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t
> *>(location);
> +}
> +
> +/// \brief R_X86_64_32 - word32: S + A
> +void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> + int32_t result = (uint32_t)(S + A);
> + *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
> + result |
> + (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t
> *>(location);
> + // TODO: Make sure that the result zero extends to the 64bit value.
> +}
> +
> +/// \brief R_X86_64_32S - word32: S + A
> +void reloc32S(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> + int32_t result = (int32_t)(S + A);
> + *reinterpret_cast<llvm::support::little32_t *>(location) =
> + result |
> + (int32_t) * reinterpret_cast<llvm::support::little32_t *>(location);
> + // TODO: Make sure that the result sign extends to the 64bit value.
> +}
> +} // end anon namespace
> +
> +int64_t X86_64TargetRelocationHandler::relocAddend(const Reference &ref)
> const {
> + switch (ref.kind()) {
> + case R_X86_64_PC32:
> + return 4;
> + default:
> + return 0;
> + }
> + return 0;
> +}
> +
> +ErrorOr<void> X86_64TargetRelocationHandler::applyRelocation(
> + ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout
> &atom,
> + const Reference &ref) const {
> + uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;
> + uint8_t *location = atomContent + ref.offsetInAtom();
> + uint64_t targetVAddress = writer.addressOfAtom(ref.target());
> + uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom();
> +
> + switch (ref.kind()) {
> + case R_X86_64_NONE:
> + break;
> + case R_X86_64_64:
> + reloc64(location, relocVAddress, targetVAddress, ref.addend());
> + break;
> + case R_X86_64_PC32:
> + relocPC32(location, relocVAddress, targetVAddress, ref.addend());
> + break;
> + case R_X86_64_32:
> + reloc32(location, relocVAddress, targetVAddress, ref.addend());
> + break;
> + case R_X86_64_32S:
> + reloc32S(location, relocVAddress, targetVAddress, ref.addend());
> + break;
> + case R_X86_64_TPOFF64:
> + case R_X86_64_DTPOFF32:
> + case R_X86_64_TPOFF32: {
> + _tlsSize =
> _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
> + .getTLSSize();
> + if (ref.kind() == R_X86_64_TPOFF32 || ref.kind() ==
> R_X86_64_DTPOFF32) {
> + int32_t result = (int32_t)(targetVAddress - _tlsSize);
> + *reinterpret_cast<llvm::support::little32_t *>(location) = result;
> + } else {
> + int64_t result = (int64_t)(targetVAddress - _tlsSize);
> + *reinterpret_cast<llvm::support::little64_t *>(location) = result;
> + }
> + break;
> + }
> + case R_X86_64_TLSLD: {
> + // Rewrite to move %fs:0 into %rax. Technically we should verify that
> the
> + // next relocation is a PC32 to __tls_get_addr...
> + static uint8_t instr[] = { 0x66, 0x66, 0x66, 0x64, 0x48, 0x8b, 0x04,
> 0x25,
> + 0x00, 0x00, 0x00, 0x00 };
> + std::memcpy(location - 3, instr, sizeof(instr));
> + break;
> + }
> + case LLD_R_X86_64_GOTRELINDEX: {
> + const DefinedAtom *target = cast<const DefinedAtom>(ref.target());
> + for (const Reference *r : *target) {
> + if (r->kind() == R_X86_64_JUMP_SLOT) {
> + uint32_t index;
> + if (!_targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
> + .getPLTRelocationTable()->getRelocationIndex(*r, index))
> + llvm_unreachable("Relocation doesn't exist");
> + reloc32(location, 0, index, 0);
> + break;
> + }
> + }
> + break;
> + }
> + // Runtime only relocations. Ignore here.
> + case R_X86_64_RELATIVE:
> + case R_X86_64_IRELATIVE:
> + case R_X86_64_JUMP_SLOT:
> + case R_X86_64_GLOB_DAT:
> + break;
> +
> + case lld::Reference::kindLayoutAfter:
> + case lld::Reference::kindLayoutBefore:
> + case lld::Reference::kindInGroup:
> + break;
> +
> + default: {
> + std::string str;
> + llvm::raw_string_ostream s(str);
> + auto name = _targetInfo.stringFromRelocKind(ref.kind());
> + s << "Unhandled relocation: " << atom._atom->file().path() << ":"
> + << atom._atom->name() << "@" << ref.offsetInAtom() << " "
> + << (name ? *name : "<unknown>") << " (" << ref.kind() << ")";
> + s.flush();
> + llvm_unreachable(str.c_str());
> + }
> + }
> +
> + return error_code::success();
> +}
>
> Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h?rev=182076&view=auto
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h (added)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h Thu
> May 16 23:19:53 2013
> @@ -0,0 +1,42 @@
> +//===- lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h
> +//------------------===//
> +//
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef X86_64_RELOCATION_HANDLER_H
> +#define X86_64_RELOCATION_HANDLER_H
> +
> +#include "X86_64TargetHandler.h"
> +
> +namespace lld {
> +namespace elf {
> +typedef llvm::object::ELFType<llvm::support::little, 8, true>
> X86_64ELFType;
> +class X86_64TargetInfo;
> +
> +class X86_64TargetRelocationHandler LLVM_FINAL
> + : public TargetRelocationHandler<X86_64ELFType> {
> +public:
> + X86_64TargetRelocationHandler(const X86_64TargetInfo &ti)
> + : _tlsSize(0), _targetInfo(ti) {}
> +
> + virtual ErrorOr<void> applyRelocation(ELFWriter &,
> llvm::FileOutputBuffer &,
> + const AtomLayout &,
> + const Reference &) const;
> +
> + virtual int64_t relocAddend(const Reference &) const;
> +
> +private:
> + // Cached size of the TLS segment.
> + mutable uint64_t _tlsSize;
> + const X86_64TargetInfo &_targetInfo;
> +};
> +
> +} // end namespace elf
> +} // end namespace lld
> +
> +#endif
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp?rev=182076&r1=182075&r2=182076&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp
> (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp Thu May
> 16 23:19:53 2013
> @@ -14,140 +14,10 @@
> using namespace lld;
> using namespace elf;
>
> -using namespace llvm::ELF;
> -
> X86_64TargetHandler::X86_64TargetHandler(X86_64TargetInfo &targetInfo)
> : DefaultTargetHandler(targetInfo), _gotFile(targetInfo),
> _relocationHandler(targetInfo), _targetLayout(targetInfo) {}
>
> -namespace {
> -/// \brief R_X86_64_64 - word64: S + A
> -void reloc64(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> - uint64_t result = S + A;
> - *reinterpret_cast<llvm::support::ulittle64_t *>(location) = result |
> - (uint64_t)*reinterpret_cast<llvm::support::ulittle64_t
> *>(location);
> -}
> -
> -/// \brief R_X86_64_PC32 - word32: S + A - P
> -void relocPC32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> - uint32_t result = (uint32_t)((S + A) - P);
> - *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result +
> - (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t
> *>(location);
> -}
> -
> -/// \brief R_X86_64_32 - word32: S + A
> -void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> - int32_t result = (uint32_t)(S + A);
> - *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result |
> - (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t
> *>(location);
> - // TODO: Make sure that the result zero extends to the 64bit value.
> -}
> -
> -/// \brief R_X86_64_32S - word32: S + A
> -void reloc32S(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
> - int32_t result = (int32_t)(S + A);
> - *reinterpret_cast<llvm::support::little32_t *>(location) = result |
> - (int32_t)*reinterpret_cast<llvm::support::little32_t
> *>(location);
> - // TODO: Make sure that the result sign extends to the 64bit value.
> -}
> -} // end anon namespace
> -
> -int64_t X86_64TargetRelocationHandler::relocAddend(const Reference &ref)
> const {
> - switch (ref.kind()) {
> - case R_X86_64_PC32:
> - return 4;
> - default:
> - return 0;
> - }
> - return 0;
> -}
> -
> -ErrorOr<void> X86_64TargetRelocationHandler::applyRelocation(
> - ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout
> &atom,
> - const Reference &ref) const {
> - uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;
> - uint8_t *location = atomContent + ref.offsetInAtom();
> - uint64_t targetVAddress = writer.addressOfAtom(ref.target());
> - uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom();
> -
> - switch (ref.kind()) {
> - case R_X86_64_NONE:
> - break;
> - case R_X86_64_64:
> - reloc64(location, relocVAddress, targetVAddress, ref.addend());
> - break;
> - case R_X86_64_PC32:
> - relocPC32(location, relocVAddress, targetVAddress, ref.addend());
> - break;
> - case R_X86_64_32:
> - reloc32(location, relocVAddress, targetVAddress, ref.addend());
> - break;
> - case R_X86_64_32S:
> - reloc32S(location, relocVAddress, targetVAddress, ref.addend());
> - break;
> - case R_X86_64_TPOFF64:
> - case R_X86_64_DTPOFF32:
> - case R_X86_64_TPOFF32: {
> - _tlsSize =
> _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
> - .getTLSSize();
> - if (ref.kind() == R_X86_64_TPOFF32 || ref.kind() ==
> R_X86_64_DTPOFF32) {
> - int32_t result = (int32_t)(targetVAddress - _tlsSize);
> - *reinterpret_cast<llvm::support::little32_t *>(location) = result;
> - } else {
> - int64_t result = (int64_t)(targetVAddress - _tlsSize);
> - *reinterpret_cast<llvm::support::little64_t *>(location) = result;
> - }
> - break;
> - }
> - case R_X86_64_TLSLD: {
> - // Rewrite to move %fs:0 into %rax. Technically we should verify that
> the
> - // next relocation is a PC32 to __tls_get_addr...
> - static uint8_t instr[] = { 0x66, 0x66, 0x66, 0x64, 0x48, 0x8b, 0x04,
> 0x25,
> - 0x00, 0x00, 0x00, 0x00 };
> - std::memcpy(location - 3, instr, sizeof(instr));
> - break;
> - }
> - case LLD_R_X86_64_GOTRELINDEX: {
> - const DefinedAtom *target = cast<const DefinedAtom>(ref.target());
> - for (const Reference *r : *target) {
> - if (r->kind() == R_X86_64_JUMP_SLOT) {
> - uint32_t index;
> - if (!_targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
> - .getPLTRelocationTable()->getRelocationIndex(*r, index))
> - llvm_unreachable("Relocation doesn't exist");
> - reloc32(location, 0, index, 0);
> - break;
> - }
> - }
> - break;
> - }
> - // Runtime only relocations. Ignore here.
> - case R_X86_64_RELATIVE:
> - case R_X86_64_IRELATIVE:
> - case R_X86_64_JUMP_SLOT:
> - case R_X86_64_GLOB_DAT:
> - break;
> -
> - case lld::Reference::kindLayoutAfter:
> - case lld::Reference::kindLayoutBefore:
> - case lld::Reference::kindInGroup:
> - break;
> -
> - default : {
> - std::string str;
> - llvm::raw_string_ostream s(str);
> - auto name = _targetInfo.stringFromRelocKind(ref.kind());
> - s << "Unhandled relocation: " << atom._atom->file().path() << ":"
> - << atom._atom->name() << "@" << ref.offsetInAtom() << " "
> - << (name ? *name : "<unknown>") << " (" << ref.kind() << ")";
> - s.flush();
> - llvm_unreachable(str.c_str());
> - }
> - }
> -
> - return error_code::success();
> -}
> -
> void X86_64TargetHandler::addFiles(InputFiles &f) {
> _gotFile.addAtom(*new (_gotFile._alloc)
> GLOBAL_OFFSET_TABLEAtom(_gotFile));
> _gotFile.addAtom(*new (_gotFile._alloc) TLSGETADDRAtom(_gotFile));
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h?rev=182076&r1=182075&r2=182076&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h Thu May 16
> 23:19:53 2013
> @@ -11,6 +11,7 @@
> #define LLD_READER_WRITER_ELF_X86_64_TARGET_HANDLER_H
>
> #include "DefaultTargetHandler.h"
> +#include "X86_64RelocationHandler.h"
> #include "TargetLayout.h"
>
> #include "lld/ReaderWriter/Simple.h"
> @@ -20,24 +21,6 @@ namespace elf {
> typedef llvm::object::ELFType<llvm::support::little, 8, true>
> X86_64ELFType;
> class X86_64TargetInfo;
>
> -class X86_64TargetRelocationHandler LLVM_FINAL
> - : public TargetRelocationHandler<X86_64ELFType> {
> -public:
> - X86_64TargetRelocationHandler(const X86_64TargetInfo &ti)
> - : _tlsSize(0), _targetInfo(ti) {}
> -
> - virtual ErrorOr<void>
> - applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, const AtomLayout
> &,
> - const Reference &)const;
> -
> - virtual int64_t relocAddend(const Reference &)const;
> -
> -private:
> - // Cached size of the TLS segment.
> - mutable uint64_t _tlsSize;
> - const X86_64TargetInfo &_targetInfo;
> -};
> -
> class X86_64TargetHandler LLVM_FINAL
> : public DefaultTargetHandler<X86_64ELFType> {
> public:
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp?rev=182076&r1=182075&r2=182076&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp Thu May 16
> 23:19:53 2013
> @@ -7,7 +7,7 @@
> //
>
> //===----------------------------------------------------------------------===//
>
> -#include "Atoms.h"
> +#include "X86_64DynamicAtoms.h"
> #include "X86_64TargetInfo.h"
>
> #include "lld/Core/File.h"
> @@ -25,61 +25,6 @@ using namespace lld::elf;
> namespace {
> using namespace llvm::ELF;
>
> -class X86_64GOTAtom : public GOTAtom {
> - static const uint8_t _defaultContent[8];
> -
> -public:
> - X86_64GOTAtom(const File &f, StringRef secName)
> - : GOTAtom(f, secName) {
> - }
> -
> - virtual ArrayRef<uint8_t> rawContent() const {
> - return ArrayRef<uint8_t>(_defaultContent, 8);
> - }
> -};
> -
> -const uint8_t X86_64GOTAtom::_defaultContent[8] = { 0 };
> -
> -class X86_64PLTAtom : public PLTAtom {
> - static const uint8_t _defaultContent[16];
> -
> -public:
> - X86_64PLTAtom(const File &f, StringRef secName)
> - : PLTAtom(f, secName) {
> - }
> -
> - virtual ArrayRef<uint8_t> rawContent() const {
> - return ArrayRef<uint8_t>(_defaultContent, 16);
> - }
> -};
> -
> -const uint8_t X86_64PLTAtom::_defaultContent[16] = {
> - 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *gotatom(%rip)
> - 0x68, 0x00, 0x00, 0x00, 0x00, // pushq reloc-index
> - 0xe9, 0x00, 0x00, 0x00, 0x00 // jmpq plt[-1]
> -};
> -
> -class X86_64PLT0Atom : public PLT0Atom {
> - static const uint8_t _plt0Content[16];
> -
> -public:
> - X86_64PLT0Atom(const File &f) : PLT0Atom(f) {
> -#ifndef NDEBUG
> - _name = ".PLT0";
> -#endif
> - }
> -
> - virtual ArrayRef<uint8_t> rawContent() const {
> - return ArrayRef<uint8_t>(_plt0Content, 16);
> - }
> -};
> -
> -const uint8_t X86_64PLT0Atom::_plt0Content[16] = {
> - 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)
> - 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)
> - 0x90, 0x90, 0x90, 0x90 // nopnopnop
> -};
> -
> class ELFPassFile : public SimpleFile {
> public:
> ELFPassFile(const ELFTargetInfo &eti) : SimpleFile(eti, "ELFPassFile")
> {}
> @@ -420,7 +365,7 @@ void elf::X86_64TargetInfo::addPasses(Pa
>
> #define LLD_CASE(name) .Case(#name, llvm::ELF::name)
>
> -ErrorOr<Reference::Kind>
> +ErrorOr<Reference::Kind>
> elf::X86_64TargetInfo::relocKindFromString(StringRef str) const {
> int32_t ret = llvm::StringSwitch<int32_t>(str)
> LLD_CASE(R_X86_64_NONE)
> @@ -473,7 +418,7 @@ elf::X86_64TargetInfo::relocKindFromStri
>
> #define LLD_CASE(name) case llvm::ELF::name: return std::string(#name);
>
> -ErrorOr<std::string>
> +ErrorOr<std::string>
> elf::X86_64TargetInfo::stringFromRelocKind(Reference::Kind kind) const {
> switch (kind) {
> LLD_CASE(R_X86_64_NONE)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130517/689af44e/attachment.html>
More information about the llvm-commits
mailing list