summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-12-22 05:31:52 +0000
committerRui Ueyama <ruiu@google.com>2016-12-22 05:31:52 +0000
commit96aff3751f4dc93e5526767562c98df1a465e031 (patch)
treee7e9cefac4a20f1c23fc989db33dfbb54032f5e1
parent49797ca6be3f13148dc8a92681579a3278519d06 (diff)
downloadbcm5719-llvm-96aff3751f4dc93e5526767562c98df1a465e031.tar.gz
bcm5719-llvm-96aff3751f4dc93e5526767562c98df1a465e031.zip
Define a getter function for a lazily-created object.
Previously, you had to call initDemangledSyms() before accessing DemangledSyms. Now getDemangledSyms() initializes it and then returns it. So it is now less easy to use it in a wrong way. llvm-svn: 290323
-rw-r--r--lld/ELF/SymbolTable.cpp31
-rw-r--r--lld/ELF/SymbolTable.h2
2 files changed, 15 insertions, 18 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index b697f0906ac..46cbc951400 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -556,26 +556,24 @@ template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() {
// So, if "extern C++" feature is used, we need to demangle all known
// symbols.
template <class ELFT>
-void SymbolTable<ELFT>::initDemangledSyms() {
- if (DemangledSyms)
- return;
- DemangledSyms.emplace();
-
- for (Symbol *Sym : SymVector) {
- SymbolBody *B = Sym->body();
- if (Optional<std::string> S = demangle(B->getName()))
- (*DemangledSyms)[*S].push_back(B);
- else
- (*DemangledSyms)[B->getName()].push_back(B);
+StringMap<std::vector<SymbolBody *>> &SymbolTable<ELFT>::getDemangledSyms() {
+ if (!DemangledSyms) {
+ DemangledSyms.emplace();
+ for (Symbol *Sym : SymVector) {
+ SymbolBody *B = Sym->body();
+ if (Optional<std::string> S = demangle(B->getName()))
+ (*DemangledSyms)[*S].push_back(B);
+ else
+ (*DemangledSyms)[B->getName()].push_back(B);
+ }
}
+ return *DemangledSyms;
}
template <class ELFT>
std::vector<SymbolBody *> SymbolTable<ELFT>::findByVersion(SymbolVersion Ver) {
- if (Ver.IsExternCpp) {
- initDemangledSyms();
- return DemangledSyms->lookup(Ver.Name);
- }
+ if (Ver.IsExternCpp)
+ return getDemangledSyms().lookup(Ver.Name);
return {find(Ver.Name)};
}
@@ -586,8 +584,7 @@ SymbolTable<ELFT>::findAllByVersion(SymbolVersion Ver) {
StringMatcher M(Ver.Name);
if (Ver.IsExternCpp) {
- initDemangledSyms();
- for (auto &P : *DemangledSyms)
+ for (auto &P : getDemangledSyms())
if (M.match(P.first()))
for (SymbolBody *Body : P.second)
if (!Body->isUndefined())
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index d03f2f786b3..1e5a335acc1 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -97,7 +97,7 @@ private:
std::vector<SymbolBody *> findByVersion(SymbolVersion Ver);
std::vector<SymbolBody *> findAllByVersion(SymbolVersion Ver);
- void initDemangledSyms();
+ llvm::StringMap<std::vector<SymbolBody *>> &getDemangledSyms();
void handleAnonymousVersion();
void assignExactVersion(SymbolVersion Ver, uint16_t VersionId,
StringRef VersionName);
OpenPOWER on IntegriCloud