Define SimpleFile::addAtom for concrete atom types.

Previously, addAtom always used dynamic dispatching mechanism to
bin atoms. This patch eliminates dynamic dispatching in most cases.

llvm-svn: 234365
This commit is contained in:
Rui Ueyama 2015-04-07 22:21:18 +00:00
parent ab745c2ad8
commit 18cd75cc47
1 changed files with 23 additions and 18 deletions

View File

@ -30,50 +30,55 @@ class SimpleFile : public File {
public: public:
SimpleFile(StringRef path) : File(path, kindObject) {} SimpleFile(StringRef path) : File(path, kindObject) {}
void addAtom(const DefinedAtom &a) { _defined._atoms.push_back(&a); }
void addAtom(const UndefinedAtom &a) { _undefined._atoms.push_back(&a); }
void addAtom(const SharedLibraryAtom &a) { _shared._atoms.push_back(&a); }
void addAtom(const AbsoluteAtom &a) { _absolute._atoms.push_back(&a); }
void addAtom(const Atom &atom) { void addAtom(const Atom &atom) {
if (auto *defAtom = dyn_cast<DefinedAtom>(&atom)) { if (auto *p = dyn_cast<DefinedAtom>(&atom)) {
_definedAtoms._atoms.push_back(defAtom); _defined._atoms.push_back(p);
} else if (auto *undefAtom = dyn_cast<UndefinedAtom>(&atom)) { } else if (auto *p = dyn_cast<UndefinedAtom>(&atom)) {
_undefinedAtoms._atoms.push_back(undefAtom); _undefined._atoms.push_back(p);
} else if (auto *shlibAtom = dyn_cast<SharedLibraryAtom>(&atom)) { } else if (auto *p = dyn_cast<SharedLibraryAtom>(&atom)) {
_sharedLibraryAtoms._atoms.push_back(shlibAtom); _shared._atoms.push_back(p);
} else if (auto *absAtom = dyn_cast<AbsoluteAtom>(&atom)) { } else if (auto *p = dyn_cast<AbsoluteAtom>(&atom)) {
_absoluteAtoms._atoms.push_back(absAtom); _absolute._atoms.push_back(p);
} else { } else {
llvm_unreachable("atom has unknown definition kind"); llvm_unreachable("atom has unknown definition kind");
} }
} }
void removeDefinedAtomsIf(std::function<bool(const DefinedAtom *)> pred) { void removeDefinedAtomsIf(std::function<bool(const DefinedAtom *)> pred) {
auto &atoms = _definedAtoms._atoms; auto &atoms = _defined._atoms;
auto newEnd = std::remove_if(atoms.begin(), atoms.end(), pred); auto newEnd = std::remove_if(atoms.begin(), atoms.end(), pred);
atoms.erase(newEnd, atoms.end()); atoms.erase(newEnd, atoms.end());
} }
const atom_collection<DefinedAtom> &defined() const override { const atom_collection<DefinedAtom> &defined() const override {
return _definedAtoms; return _defined;
} }
const atom_collection<UndefinedAtom> &undefined() const override { const atom_collection<UndefinedAtom> &undefined() const override {
return _undefinedAtoms; return _undefined;
} }
const atom_collection<SharedLibraryAtom> &sharedLibrary() const override { const atom_collection<SharedLibraryAtom> &sharedLibrary() const override {
return _sharedLibraryAtoms; return _shared;
} }
const atom_collection<AbsoluteAtom> &absolute() const override { const atom_collection<AbsoluteAtom> &absolute() const override {
return _absoluteAtoms; return _absolute;
} }
typedef range<std::vector<const DefinedAtom *>::iterator> DefinedAtomRange; typedef range<std::vector<const DefinedAtom *>::iterator> DefinedAtomRange;
DefinedAtomRange definedAtoms() { return make_range(_definedAtoms._atoms); } DefinedAtomRange definedAtoms() { return make_range(_defined._atoms); }
private: private:
atom_collection_vector<DefinedAtom> _definedAtoms; atom_collection_vector<DefinedAtom> _defined;
atom_collection_vector<UndefinedAtom> _undefinedAtoms; atom_collection_vector<UndefinedAtom> _undefined;
atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms; atom_collection_vector<SharedLibraryAtom> _shared;
atom_collection_vector<AbsoluteAtom> _absoluteAtoms; atom_collection_vector<AbsoluteAtom> _absolute;
}; };
/// \brief Archive library file that may be used as a virtual container /// \brief Archive library file that may be used as a virtual container