[lld] r230273 - [ELF] Create a map from Reference to Symbol.
Shankar Easwaran
shankare at codeaurora.org
Mon Feb 23 14:32:13 PST 2015
Author: shankare
Date: Mon Feb 23 16:32:12 2015
New Revision: 230273
URL: http://llvm.org/viewvc/llvm-project?rev=230273&view=rev
Log:
[ELF] Create a map from Reference to Symbol.
In LLD's model, symbol is a property of the node (atom) and not a property of
edge (reference). Prior to this patch, we stored the symbol in the reference.
>From post-commit comments, it seemed better to create a map from the reference
to the symbol instead and use this mapping wherever desired.
Address comments from Ruiu/Simon Atanasyan.
Modified:
lld/trunk/lib/ReaderWriter/ELF/Atoms.h
lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
Modified: lld/trunk/lib/ReaderWriter/ELF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Atoms.h?rev=230273&r1=230272&r2=230273&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Atoms.h Mon Feb 23 16:32:12 2015
@@ -38,24 +38,22 @@ template <class ELFT> class ELFReference
typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
public:
- ELFReference(const Elf_Sym *sym, const Elf_Rela *rela, uint64_t off,
- Reference::KindArch arch, Reference::KindValue relocType,
- uint32_t idx)
- : Reference(Reference::KindNamespace::ELF, arch, relocType), _sym(sym),
+ ELFReference(const Elf_Rela *rela, uint64_t off, Reference::KindArch arch,
+ Reference::KindValue relocType, uint32_t idx)
+ : Reference(Reference::KindNamespace::ELF, arch, relocType),
_target(nullptr), _targetSymbolIndex(idx), _offsetInAtom(off),
_addend(rela->r_addend) {}
- ELFReference(const Elf_Sym *sym, uint64_t off, Reference::KindArch arch,
+ ELFReference(uint64_t off, Reference::KindArch arch,
Reference::KindValue relocType, uint32_t idx)
- : Reference(Reference::KindNamespace::ELF, arch, relocType), _sym(sym),
+ : Reference(Reference::KindNamespace::ELF, arch, relocType),
_target(nullptr), _targetSymbolIndex(idx), _offsetInAtom(off),
_addend(0) {}
ELFReference(uint32_t edgeKind)
: Reference(Reference::KindNamespace::all, Reference::KindArch::all,
edgeKind),
- _sym(nullptr), _target(nullptr), _targetSymbolIndex(0),
- _offsetInAtom(0), _addend(0) {}
+ _target(nullptr), _targetSymbolIndex(0), _offsetInAtom(0), _addend(0) {}
uint64_t offsetInAtom() const override { return _offsetInAtom; }
@@ -74,12 +72,7 @@ public:
void setTarget(const Atom *newAtom) override { _target = newAtom; }
- /// Is used for lookup the symbol or section that refers is in the same group
- /// or not in a group.
- const Elf_Sym *symbol() const { return _sym; }
-
private:
- const Elf_Sym *_sym;
const Atom *_target;
uint64_t _targetSymbolIndex;
uint64_t _offsetInAtom;
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.h?rev=230273&r1=230272&r2=230273&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.h Mon Feb 23 16:32:12 2015
@@ -388,6 +388,17 @@ protected:
bool redirectReferenceUsingUndefAtom(const Elf_Sym *sourceSymbol,
const Elf_Sym *targetSymbol) const;
+ void addReferenceToSymbol(const ELFReference<ELFT> *r, const Elf_Sym *sym) {
+ _referenceToSymbol[r] = sym;
+ }
+
+ const Elf_Sym *findSymbolForReference(const ELFReference<ELFT> *r) const {
+ auto elfReferenceToSymbol = _referenceToSymbol.find(r);
+ if (elfReferenceToSymbol != _referenceToSymbol.end())
+ return elfReferenceToSymbol->second;
+ return nullptr;
+ }
+
llvm::BumpPtrAllocator _readerStorage;
std::unique_ptr<llvm::object::ELFFile<ELFT> > _objFile;
atom_collection_vector<DefinedAtom> _definedAtoms;
@@ -405,6 +416,8 @@ protected:
std::unordered_map<StringRef, range<Elf_Rel_Iter>> _relocationReferences;
std::vector<ELFReference<ELFT> *> _references;
llvm::DenseMap<const Elf_Sym *, Atom *> _symbolToAtomMapping;
+ llvm::DenseMap<const ELFReference<ELFT> *, const Elf_Sym *>
+ _referenceToSymbol;
// Group child atoms have a pair corresponding to the signature and the
// section header of the section that was used for generating the signature.
llvm::DenseMap<const Elf_Sym *, std::pair<StringRef, const Elf_Shdr *>>
@@ -1016,9 +1029,11 @@ void ELFFile<ELFT>::createRelocationRefe
if (rel.r_offset < symValue ||
symValue + content.size() <= rel.r_offset)
continue;
- _references.push_back(new (_readerStorage) ELFReference<ELFT>(
- symbol, &rel, rel.r_offset - symValue, kindArch(),
- rel.getType(isMips64EL), rel.getSymbol(isMips64EL)));
+ auto elfRelocation = new (_readerStorage)
+ ELFReference<ELFT>(&rel, rel.r_offset - symValue, kindArch(),
+ rel.getType(isMips64EL), rel.getSymbol(isMips64EL));
+ addReferenceToSymbol(elfRelocation, symbol);
+ _references.push_back(elfRelocation);
}
}
@@ -1033,11 +1048,13 @@ void ELFFile<ELFT>::createRelocationRefe
if (rel.r_offset < symValue ||
symValue + symContent.size() <= rel.r_offset)
continue;
- _references.push_back(new (_readerStorage) ELFReference<ELFT>(
- symbol, rel.r_offset - symValue, kindArch(), rel.getType(isMips64EL),
- rel.getSymbol(isMips64EL)));
+ auto elfRelocation = new (_readerStorage)
+ ELFReference<ELFT>(rel.r_offset - symValue, kindArch(),
+ rel.getType(isMips64EL), rel.getSymbol(isMips64EL));
int32_t addend = *(symContent.data() + rel.r_offset - symValue);
- _references.back()->setAddend(addend);
+ elfRelocation->setAddend(addend);
+ addReferenceToSymbol(elfRelocation, symbol);
+ _references.push_back(elfRelocation);
}
}
@@ -1079,7 +1096,7 @@ template <class ELFT> void ELFFile<ELFT>
// If the atom is not in mergeable string section, the target atom is
// simply that atom.
if (!isMergeableStringSection(shdr)) {
- ri->setTarget(findAtom(ri->symbol(), symbol));
+ ri->setTarget(findAtom(findSymbolForReference(ri), symbol));
continue;
}
updateReferenceForMergeStringAccess(ri, symbol, shdr);
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.h?rev=230273&r1=230272&r2=230273&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.h Mon Feb 23 16:32:12 2015
@@ -208,9 +208,11 @@ private:
symbol->st_value + symContent.size() <= rit->r_offset)
continue;
- this->_references.push_back(new (this->_readerStorage) ELFReference<ELFT>(
- symbol, rit->r_offset - symbol->st_value, this->kindArch(),
- rit->getType(isMips64EL()), rit->getSymbol(isMips64EL())));
+ auto elfReference = new (this->_readerStorage) ELFReference<ELFT>(
+ rit->r_offset - symbol->st_value, this->kindArch(),
+ rit->getType(isMips64EL()), rit->getSymbol(isMips64EL()));
+ ELFFile<ELFT>::addReferenceToSymbol(elfReference, symbol);
+ this->_references.push_back(elfReference);
auto addend = getAddend(*rit, secContent);
auto pairRelType = getPairRelocation(*rit);
More information about the llvm-commits
mailing list