forked from OSchip/llvm-project
Add SymbolTable::isCoalescedAway
isCoalescedAway(x) is faster than replacement(x) != x as the former does not follow the replacement atom chain. Also it's easier to use. llvm-svn: 210242
This commit is contained in:
parent
52edc49031
commit
733b45f3b0
|
@ -72,6 +72,9 @@ public:
|
|||
/// @brief if atom has been coalesced away, return replacement, else return atom
|
||||
const Atom *replacement(const Atom *);
|
||||
|
||||
/// @brief if atom has been coalesced away, return true
|
||||
bool isCoalescedAway(const Atom *);
|
||||
|
||||
/// @brief Find a group atom.
|
||||
const Atom *findGroup(StringRef name);
|
||||
|
||||
|
|
|
@ -29,24 +29,6 @@
|
|||
|
||||
namespace lld {
|
||||
|
||||
namespace {
|
||||
|
||||
/// This is used as a filter function to std::remove_if to coalesced atoms.
|
||||
class AtomCoalescedAway {
|
||||
public:
|
||||
explicit AtomCoalescedAway(SymbolTable &sym) : _symbolTable(sym) {}
|
||||
|
||||
bool operator()(const Atom *atom) const {
|
||||
const Atom *rep = _symbolTable.replacement(atom);
|
||||
return rep != atom;
|
||||
}
|
||||
|
||||
private:
|
||||
SymbolTable &_symbolTable;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
void Resolver::handleFile(const File &file) {
|
||||
bool undefAdded = false;
|
||||
for (const DefinedAtom *atom : file.defined())
|
||||
|
@ -394,7 +376,7 @@ bool Resolver::checkUndefines() {
|
|||
continue;
|
||||
|
||||
// If the undefine is coalesced away, skip over it.
|
||||
if (_symbolTable.replacement(undefAtom) != undefAtom)
|
||||
if (_symbolTable.isCoalescedAway(undefAtom))
|
||||
continue;
|
||||
|
||||
// Seems like this symbol is undefined. Warn that.
|
||||
|
@ -416,8 +398,9 @@ bool Resolver::checkUndefines() {
|
|||
// remove from _atoms all coaleseced away atoms
|
||||
void Resolver::removeCoalescedAwayAtoms() {
|
||||
ScopedTask task(getDefaultDomain(), "removeCoalescedAwayAtoms");
|
||||
_atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(),
|
||||
AtomCoalescedAway(_symbolTable)),
|
||||
_atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(), [&](const Atom *a) {
|
||||
return _symbolTable.isCoalescedAway(a);
|
||||
}),
|
||||
_atoms.end());
|
||||
}
|
||||
|
||||
|
|
|
@ -381,6 +381,10 @@ const Atom *SymbolTable::replacement(const Atom *atom) {
|
|||
}
|
||||
}
|
||||
|
||||
bool SymbolTable::isCoalescedAway(const Atom *atom) {
|
||||
return _replacedAtoms.count(atom) > 0;
|
||||
}
|
||||
|
||||
unsigned int SymbolTable::size() {
|
||||
return _nameTable.size();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue