use unordered_map for library symbol table.

This commit is contained in:
Kelvin Sherlock 2017-01-21 12:42:53 -05:00
parent 253a3ccc49
commit 466c90a34e

View File

@ -1359,6 +1359,33 @@ enum {
kProcessed = 2, kProcessed = 2,
}; };
/*
* observation: the library symbol size will far exceed the missing symbols size.
* Therefore, library symbols should be an unordered_map and explicitely look up
* each undefined symbol.
*
* output c is a map (and thus sorted) to guarantee reproducable builds.
* (could use a vector then sort/unique it...)
*/
bool intersection(const std::unordered_map<std::string, uint32_t> &a,
const std::set<std::string> &b,
std::map<uint32_t, int> &c)
{
bool rv = false;
for (const auto &name : b) {
auto iter = a.find(name);
if (iter == a.end()) continue;
rv = true;
c.emplace(iter->second, kPending);
}
return rv;
}
#if 0
bool intersection(const std::map<std::string, uint32_t> &a, bool intersection(const std::map<std::string, uint32_t> &a,
const std::set<std::string> &b, const std::set<std::string> &b,
std::map<uint32_t, int> &c) std::map<uint32_t, int> &c)
@ -1386,6 +1413,7 @@ bool intersection(const std::map<std::string, uint32_t> &a,
return rv; return rv;
} }
#endif
bool one_lib(const std::string &path) { bool one_lib(const std::string &path) {
@ -1452,7 +1480,7 @@ bool one_lib(const std::string &path) {
//iter += size; // don't care about the name. //iter += size; // don't care about the name.
} }
std::map<std::string, uint32_t> lib_symbol_map; std::unordered_map<std::string, uint32_t> lib_symbol_map;
// map of which modules have been loaded or are pending processing. // map of which modules have been loaded or are pending processing.