[lld] r234367 - ELF: Simplify ELFFile by deriving from SimpleFile instead of File.
Rui Ueyama
ruiu at google.com
Tue Apr 7 15:27:43 PDT 2015
Author: ruiu
Date: Tue Apr 7 17:27:43 2015
New Revision: 234367
URL: http://llvm.org/viewvc/llvm-project?rev=234367&view=rev
Log:
ELF: Simplify ELFFile by deriving from SimpleFile instead of File.
SimpleFile defines defined(). undefined(), sharedLibrary() and absolute().
We should use the class instead of deriving from the base class and
re-defining the member functions in ELFFile.
Modified:
lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.h?rev=234367&r1=234366&r2=234367&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.h Tue Apr 7 17:27:43 2015
@@ -21,7 +21,7 @@ namespace lld {
namespace elf {
/// \brief Read a binary, find out based on the symbol table contents what kind
/// of symbol it is and create corresponding atoms for it
-template <class ELFT> class ELFFile : public File {
+template <class ELFT> class ELFFile : public SimpleFile {
typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
typedef llvm::object::Elf_Shdr_Impl<ELFT> Elf_Shdr;
typedef llvm::object::Elf_Rel_Impl<ELFT, false> Elf_Rel;
@@ -91,14 +91,14 @@ template <class ELFT> class ELFFile : pu
public:
ELFFile(StringRef name, ELFLinkingContext &ctx)
- : File(name, kindObject), _ordinal(0),
+ : SimpleFile(name), _ordinal(0),
_doStringsMerge(ctx.mergeCommonStrings()), _useWrap(false), _ctx(ctx) {
setLastError(std::error_code());
}
ELFFile(std::unique_ptr<MemoryBuffer> mb, ELFLinkingContext &ctx)
- : File(mb->getBufferIdentifier(), kindObject), _mb(std::move(mb)),
- _ordinal(0), _doStringsMerge(ctx.mergeCommonStrings()),
+ : SimpleFile(mb->getBufferIdentifier()), _mb(std::move(mb)), _ordinal(0),
+ _doStringsMerge(ctx.mergeCommonStrings()),
_useWrap(ctx.wrapCalls().size()), _ctx(ctx) {}
static bool canParse(file_magic magic) {
@@ -126,22 +126,6 @@ public:
/// \brief Create individual atoms
std::error_code createAtoms();
- const atom_collection<DefinedAtom> &defined() const override {
- return _definedAtoms;
- }
-
- const atom_collection<UndefinedAtom> &undefined() const override {
- return _undefinedAtoms;
- }
-
- const atom_collection<SharedLibraryAtom> &sharedLibrary() const override {
- return _sharedLibraryAtoms;
- }
-
- const atom_collection<AbsoluteAtom> &absolute() const override {
- return _absoluteAtoms;
- }
-
// Assuming sourceSymbol has a reference to targetSym, find an atom
// for targetSym. Usually it's just the atom for targetSym.
// However, if an atom is in a section group, we may want to return an
@@ -167,7 +151,7 @@ public:
return it->getValue();
auto atom = new (_readerStorage) SimpleUndefinedAtom(*this, targetName);
_undefAtomsForGroupChild[targetName] = atom;
- _undefinedAtoms._atoms.push_back(atom);
+ addAtom(*atom);
return atom;
}
@@ -388,10 +372,6 @@ protected:
llvm::BumpPtrAllocator _readerStorage;
std::unique_ptr<llvm::object::ELFFile<ELFT> > _objFile;
- atom_collection_vector<DefinedAtom> _definedAtoms;
- atom_collection_vector<UndefinedAtom> _undefinedAtoms;
- atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms;
- atom_collection_vector<AbsoluteAtom> _absoluteAtoms;
/// \brief _relocationAddendReferences and _relocationReferences contain the
/// list of relocations references. In ELF, if a section named, ".text" has
@@ -460,7 +440,7 @@ public:
sym->setVisibility(llvm::ELF::STV_DEFAULT);
sym->st_size = 0;
ELFAbsoluteAtom<ELFT> *atom = this->createAbsoluteAtom(symbolName, sym, -1);
- this->_absoluteAtoms._atoms.push_back(atom);
+ this->addAtom(*atom);
}
/// \brief add an undefined atom
@@ -474,12 +454,7 @@ public:
sym->setVisibility(llvm::ELF::STV_DEFAULT);
sym->st_size = 0;
ELFUndefinedAtom<ELFT> *atom = this->createUndefinedAtom(symbolName, sym);
- this->_undefinedAtoms._atoms.push_back(atom);
- }
-
- // cannot add atoms to Runtime file
- virtual void addAtom(const Atom &) {
- llvm_unreachable("cannot add atoms to Runtime files");
+ this->addAtom(*atom);
}
};
@@ -615,7 +590,7 @@ template <class ELFT> std::error_code EL
ELFMergeAtom<ELFT> *atom = createMergedString(tai->_sectionName, tai->_shdr,
content, tai->_offset);
atom->setOrdinal(++_ordinal);
- _definedAtoms._atoms.push_back(atom);
+ addAtom(*atom);
_mergeAtoms.push_back(atom);
}
return std::error_code();
@@ -641,7 +616,7 @@ std::error_code ELFFile<ELFT>::createSym
if (isAbsoluteSymbol(&*SymI)) {
ELFAbsoluteAtom<ELFT> *absAtom = createAbsoluteAtom(
*symbolName, &*SymI, (int64_t)getSymbolValue(&*SymI));
- _absoluteAtoms._atoms.push_back(absAtom);
+ addAtom(*absAtom);
_symbolToAtomMapping.insert(std::make_pair(&*SymI, absAtom));
} else if (isUndefinedSymbol(&*SymI)) {
if (_useWrap &&
@@ -653,12 +628,12 @@ std::error_code ELFFile<ELFT>::createSym
}
ELFUndefinedAtom<ELFT> *undefAtom =
createUndefinedAtom(*symbolName, &*SymI);
- _undefinedAtoms._atoms.push_back(undefAtom);
+ addAtom(*undefAtom);
_symbolToAtomMapping.insert(std::make_pair(&*SymI, undefAtom));
} else if (isCommonSymbol(&*SymI)) {
ELFCommonAtom<ELFT> *commonAtom = createCommonAtom(*symbolName, &*SymI);
commonAtom->setOrdinal(++_ordinal);
- _definedAtoms._atoms.push_back(commonAtom);
+ addAtom(*commonAtom);
_symbolToAtomMapping.insert(std::make_pair(&*SymI, commonAtom));
} else if (isDefinedSymbol(&*SymI)) {
_sectionSymbols[section].push_back(SymI);
@@ -707,7 +682,7 @@ template <class ELFT> std::error_code EL
createSectionAtom(section, *sectionName, *sectionContents);
newAtom->setOrdinal(++_ordinal);
if (addAtoms)
- _definedAtoms._atoms.push_back(newAtom);
+ addAtom(*newAtom);
else
atomsForSection[*sectionName].push_back(newAtom);
continue;
@@ -760,7 +735,7 @@ template <class ELFT> std::error_code EL
_references.size(), _references.size(), _references);
atom->setOrdinal(++_ordinal);
if (addAtoms)
- _definedAtoms._atoms.push_back(atom);
+ addAtom(*atom);
else
atomsForSection[*sectionName].push_back(atom);
continue;
@@ -808,7 +783,7 @@ template <class ELFT> std::error_code EL
previousAtom = anonAtom ? anonAtom : newAtom;
if (addAtoms)
- _definedAtoms._atoms.push_back(newAtom);
+ addAtom(*newAtom);
else
atomsForSection[*sectionName].push_back(newAtom);
@@ -816,7 +791,7 @@ template <class ELFT> std::error_code EL
if (anonAtom) {
anonAtom->setOrdinal(++_ordinal);
if (addAtoms)
- _definedAtoms._atoms.push_back(anonAtom);
+ addAtom(*anonAtom);
else
atomsForSection[*sectionName].push_back(anonAtom);
}
@@ -859,7 +834,7 @@ std::error_code ELFFile<ELFT>::handleGnu
*sectionName, *sectionName, nullptr, section, ArrayRef<uint8_t>(),
referenceStart, _references.size(), _references);
atom->setOrdinal(++_ordinal);
- _definedAtoms._atoms.push_back(atom);
+ addAtom(*atom);
for (auto reference : refs)
atom->addReference(reference);
return std::error_code();
@@ -923,7 +898,7 @@ std::error_code ELFFile<ELFT>::handleSec
*symbolName, *sectionName, nullptr, section, ArrayRef<uint8_t>(),
referenceStart, _references.size(), _references);
atom->setOrdinal(++_ordinal);
- _definedAtoms._atoms.push_back(atom);
+ addAtom(*atom);
for (auto reference : refs)
atom->addReference(reference);
return std::error_code();
@@ -955,8 +930,8 @@ template <class ELFT> std::error_code EL
// Whenever there is a reference to realCall it should point to the symbol
// created for each wrap usage.
_wrapSymbolMap.insert(std::make_pair(realCallSym, wrapSymAtom));
- _undefinedAtoms._atoms.push_back(wrapSymAtom);
- _undefinedAtoms._atoms.push_back(wrapCallAtom);
+ addAtom(*wrapSymAtom);
+ addAtom(*wrapCallAtom);
}
return std::error_code();
}
More information about the llvm-commits
mailing list