[lld] r231715 - Remove COFFReference and use SimpleReference instead.
Rui Ueyama
ruiu at google.com
Mon Mar 9 15:18:51 PDT 2015
Author: ruiu
Date: Mon Mar 9 17:18:51 2015
New Revision: 231715
URL: http://llvm.org/viewvc/llvm-project?rev=231715&view=rev
Log:
Remove COFFReference and use SimpleReference instead.
SimpleReference, which is defined in Core, provides the same functionality
as COFFReference does, so we don't need a custom class.
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h
lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
lld/trunk/lib/ReaderWriter/PECOFF/Pass.cpp
lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h?rev=231715&r1=231714&r2=231715&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h Mon Mar 9 17:18:51 2015
@@ -20,34 +20,6 @@ namespace lld {
namespace pecoff {
class COFFDefinedAtom;
-/// A COFFReference represents relocation information for an atom. For
-/// example, if atom X has a reference to atom Y with offsetInAtom=8, that
-/// means that the address starting at 8th byte of the content of atom X needs
-/// to be fixed up so that the address points to atom Y's address.
-class COFFReference final : public Reference {
-public:
- COFFReference(const Atom *target, uint32_t offsetInAtom, uint16_t relocType,
- Reference::KindArch arch,
- Reference::KindNamespace ns = Reference::KindNamespace::COFF)
- : Reference(ns, arch, relocType), _target(target),
- _offsetInAtom(offsetInAtom) {}
-
- const Atom *target() const override { return _target; }
- void setTarget(const Atom *newAtom) override { _target = newAtom; }
-
- // Addend is a value to be added to the relocation target. For example, if
- // target=AtomX and addend=4, the relocation address will become the address
- // of AtomX + 4. COFF does not support that sort of relocation, thus addend
- // is always zero.
- Addend addend() const override { return 0; }
- void setAddend(Addend) override {}
- uint64_t offsetInAtom() const override { return _offsetInAtom; }
-
-private:
- const Atom *_target;
- uint32_t _offsetInAtom;
-};
-
class COFFAbsoluteAtom : public AbsoluteAtom {
public:
COFFAbsoluteAtom(const File &f, StringRef name, Scope scope, uint64_t value)
@@ -103,7 +75,7 @@ public:
Kind getKind() const { return _kind; }
- void addReference(std::unique_ptr<COFFReference> reference) {
+ void addReference(std::unique_ptr<SimpleReference> reference) {
_references.push_back(std::move(reference));
}
@@ -134,7 +106,7 @@ private:
const File &_file;
StringRef _name;
Kind _kind;
- std::vector<std::unique_ptr<COFFReference> > _references;
+ std::vector<std::unique_ptr<SimpleReference>> _references;
};
/// This is the root class of the atom read from a file. This class have two
@@ -164,10 +136,10 @@ public:
Alignment alignment() const override { return _alignment; }
void addAssociate(const DefinedAtom *other) {
- auto *ref = new COFFReference(other, 0, lld::Reference::kindAssociate,
- Reference::KindArch::all,
- Reference::KindNamespace::all);
- addReference(std::unique_ptr<COFFReference>(ref));
+ auto *ref = new SimpleReference(Reference::KindNamespace::all,
+ Reference::KindArch::all,
+ lld::Reference::kindAssociate, 0, other, 0);
+ addReference(std::unique_ptr<SimpleReference>(ref));
}
private:
@@ -178,7 +150,7 @@ private:
ContentPermissions _permissions;
uint64_t _ordinal;
Alignment _alignment;
- std::vector<std::unique_ptr<COFFReference> > _references;
+ std::vector<std::unique_ptr<SimpleReference>> _references;
};
// A COFFDefinedAtom represents an atom read from a file and has contents.
@@ -345,10 +317,10 @@ private:
template <typename T, typename U>
void addLayoutEdge(T *a, U *b, uint32_t which) {
- auto ref = new COFFReference(nullptr, 0, which, Reference::KindArch::all,
- Reference::KindNamespace::all);
- ref->setTarget(b);
- a->addReference(std::unique_ptr<COFFReference>(ref));
+ auto ref = new SimpleReference(Reference::KindNamespace::all,
+ Reference::KindArch::all,
+ which, 0, b, 0);
+ a->addReference(std::unique_ptr<SimpleReference>(ref));
}
} // namespace pecoff
Modified: lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h?rev=231715&r1=231714&r2=231715&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h Mon Mar 9 17:18:51 2015
@@ -49,13 +49,19 @@ public:
bool is64)
: SimpleFile(defsym), _undefined(*this, undefsym),
_defined(*this, defsym, ordinal) {
- auto *ref = is64 ? new COFFReference(&_undefined, 0,
- llvm::COFF::IMAGE_REL_AMD64_ADDR32,
- Reference::KindArch::x86_64)
- : new COFFReference(&_undefined, 0,
- llvm::COFF::IMAGE_REL_I386_DIR32,
- Reference::KindArch::x86);
- _defined.addReference(std::unique_ptr<COFFReference>(ref));
+ SimpleReference *ref;
+ if (is64) {
+ ref = new SimpleReference(Reference::KindNamespace::COFF,
+ Reference::KindArch::x86_64,
+ llvm::COFF::IMAGE_REL_AMD64_ADDR32,
+ 0, &_undefined, 0);
+ } else {
+ ref = new SimpleReference(Reference::KindNamespace::COFF,
+ Reference::KindArch::x86,
+ llvm::COFF::IMAGE_REL_I386_DIR32,
+ 0, &_undefined, 0);
+ }
+ _defined.addReference(std::unique_ptr<SimpleReference>(ref));
addAtom(_defined);
addAtom(_undefined);
};
Modified: lld/trunk/lib/ReaderWriter/PECOFF/Pass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/Pass.cpp?rev=231715&r1=231714&r2=231715&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/Pass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/Pass.cpp Mon Mar 9 17:18:51 2015
@@ -19,8 +19,8 @@ namespace pecoff {
static void addReloc(COFFBaseDefinedAtom *atom, const Atom *target,
size_t offsetInAtom, Reference::KindArch arch,
Reference::KindValue relType) {
- atom->addReference(llvm::make_unique<COFFReference>(
- target, offsetInAtom, relType, arch));
+ atom->addReference(llvm::make_unique<SimpleReference>(
+ Reference::KindNamespace::COFF, arch, relType, offsetInAtom, target, 0));
}
void addDir64Reloc(COFFBaseDefinedAtom *atom, const Atom *target,
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=231715&r1=231714&r2=231715&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Mon Mar 9 17:18:51 2015
@@ -14,6 +14,7 @@
#include "lld/Driver/Driver.h"
#include "lld/ReaderWriter/PECOFFLinkingContext.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Object/COFF.h"
#include "llvm/Support/Casting.h"
@@ -42,7 +43,6 @@ using lld::pecoff::COFFAbsoluteAtom;
using lld::pecoff::COFFBSSAtom;
using lld::pecoff::COFFDefinedAtom;
using lld::pecoff::COFFDefinedFileAtom;
-using lld::pecoff::COFFReference;
using lld::pecoff::COFFUndefinedAtom;
using llvm::object::coff_aux_section_definition;
using llvm::object::coff_aux_weak_external;
@@ -834,8 +834,9 @@ std::error_code FileCOFF::addRelocationR
uint32_t offsetInAtom;
if (std::error_code ec = findAtomAt(section, itemAddress, atom, offsetInAtom))
return ec;
- atom->addReference(std::unique_ptr<COFFReference>(
- new COFFReference(targetAtom, offsetInAtom, rel->Type, _referenceArch)));
+ atom->addReference(llvm::make_unique<SimpleReference>(
+ Reference::KindNamespace::COFF, _referenceArch, rel->Type, offsetInAtom,
+ targetAtom, 0));
return std::error_code();
}
@@ -1003,8 +1004,9 @@ std::error_code FileCOFF::maybeCreateSXD
llvm_unreachable("unsupported machine type");
}
- atom->addReference(std::unique_ptr<COFFReference>(new COFFReference(
- handlerFunc, offsetInAtom, rtype, _referenceArch)));
+ atom->addReference(llvm::make_unique<SimpleReference>(
+ Reference::KindNamespace::COFF, _referenceArch, rtype, offsetInAtom,
+ handlerFunc, 0));
}
_definedAtoms._atoms.push_back(atom);
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp?rev=231715&r1=231714&r2=231715&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp Mon Mar 9 17:18:51 2015
@@ -164,25 +164,30 @@ const uint8_t FuncAtomContentARMNT[] = {
static void setJumpInstTarget(COFFLinkerInternalAtom *src, const Atom *dst,
int off, MachineTypes machine) {
- COFFReference *ref;
+ SimpleReference *ref;
switch (machine) {
default: llvm::report_fatal_error("unsupported machine type");
case llvm::COFF::IMAGE_FILE_MACHINE_I386:
- ref = new COFFReference(dst, off, llvm::COFF::IMAGE_REL_I386_DIR32,
- Reference::KindArch::x86);
+ ref = new SimpleReference(Reference::KindNamespace::COFF,
+ Reference::KindArch::x86,
+ llvm::COFF::IMAGE_REL_I386_DIR32,
+ off, dst, 0);
break;
case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
- ref = new COFFReference(dst, off, llvm::COFF::IMAGE_REL_AMD64_REL32,
- Reference::KindArch::x86_64);
+ ref = new SimpleReference(Reference::KindNamespace::COFF,
+ Reference::KindArch::x86_64,
+ llvm::COFF::IMAGE_REL_AMD64_REL32,
+ off, dst, 0);
break;
case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
- ref = new COFFReference(dst, off, llvm::COFF::IMAGE_REL_ARM_MOV32T,
- Reference::KindArch::ARM);
+ ref = new SimpleReference(Reference::KindNamespace::COFF,
+ Reference::KindArch::ARM,
+ llvm::COFF::IMAGE_REL_ARM_MOV32T,
+ off, dst, 0);
break;
}
-
- src->addReference(std::unique_ptr<COFFReference>(ref));
+ src->addReference(std::unique_ptr<SimpleReference>(ref));
}
/// The defined atom for jump table.
More information about the llvm-commits
mailing list