diff options
author | Shankar Easwaran <shankarke@gmail.com> | 2014-03-26 16:37:13 +0000 |
---|---|---|
committer | Shankar Easwaran <shankarke@gmail.com> | 2014-03-26 16:37:13 +0000 |
commit | 7ac2a3df64649d6244a5de215b7d7e4352929777 (patch) | |
tree | 5ed4bc37ebd1f9506920266099568a391d40922e /lld/lib/Core/SymbolTable.cpp | |
parent | d683a22dd21424416cb261c2de22520c84977c0f (diff) | |
download | bcm5719-llvm-7ac2a3df64649d6244a5de215b7d7e4352929777.tar.gz bcm5719-llvm-7ac2a3df64649d6244a5de215b7d7e4352929777.zip |
[core] add SectionGroup support
Review : http://llvm-reviews.chandlerc.com/D3182
llvm-svn: 204830
Diffstat (limited to 'lld/lib/Core/SymbolTable.cpp')
-rw-r--r-- | lld/lib/Core/SymbolTable.cpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/lld/lib/Core/SymbolTable.cpp b/lld/lib/Core/SymbolTable.cpp index 9bacdad17d9..7fdecaf9dae 100644 --- a/lld/lib/Core/SymbolTable.cpp +++ b/lld/lib/Core/SymbolTable.cpp @@ -32,17 +32,11 @@ namespace lld { SymbolTable::SymbolTable(const LinkingContext &context) : _context(context) {} -void SymbolTable::add(const UndefinedAtom &atom) { - this->addByName(atom); -} +void SymbolTable::add(const UndefinedAtom &atom) { addByName(atom); } -void SymbolTable::add(const SharedLibraryAtom &atom) { - this->addByName(atom); -} +void SymbolTable::add(const SharedLibraryAtom &atom) { addByName(atom); } -void SymbolTable::add(const AbsoluteAtom &atom) { - this->addByName(atom); -} +void SymbolTable::add(const AbsoluteAtom &atom) { addByName(atom); } void SymbolTable::add(const DefinedAtom &atom) { if (!atom.name().empty() && @@ -50,14 +44,33 @@ void SymbolTable::add(const DefinedAtom &atom) { // Named atoms cannot be merged by content. assert(atom.merge() != DefinedAtom::mergeByContent); // Track named atoms that are not scoped to file (static). - this->addByName(atom); + addByName(atom); return; } if (atom.merge() == DefinedAtom::mergeByContent) { // Named atoms cannot be merged by content. assert(atom.name().empty()); - this->addByContent(atom); + addByContent(atom); + } +} + +const Atom *SymbolTable::findGroup(StringRef sym) { + NameToAtom::iterator pos = _groupTable.find(sym); + if (pos == _groupTable.end()) + return nullptr; + return pos->second; +} + +bool SymbolTable::addGroup(const DefinedAtom &da) { + StringRef name = da.name(); + assert(!name.empty()); + const Atom *existing = findGroup(name); + if (existing == nullptr) { + _groupTable[name] = &da; + return true; } + _replacedAtoms[&da] = existing; + return false; } enum NameCollisionResolution { @@ -149,7 +162,7 @@ static uint64_t sectionSize(const DefinedAtom *atom) { void SymbolTable::addByName(const Atom &newAtom) { StringRef name = newAtom.name(); assert(!name.empty()); - const Atom *existing = this->findByName(name); + const Atom *existing = findByName(name); if (existing == nullptr) { // Name is not in symbol table yet, add it associate with this atom. _nameTable[name] = &newAtom; @@ -351,7 +364,7 @@ const Atom *SymbolTable::findByName(StringRef sym) { } bool SymbolTable::isDefined(StringRef sym) { - const Atom *atom = this->findByName(sym); + const Atom *atom = findByName(sym); if (atom == nullptr) return false; return atom->definition() != Atom::definitionUndefined; @@ -367,7 +380,7 @@ const Atom *SymbolTable::replacement(const Atom *atom) { if (pos == _replacedAtoms.end()) return atom; // might be chain, recurse to end - return this->replacement(pos->second); + return replacement(pos->second); } unsigned int SymbolTable::size() { |