aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2019-04-06 02:18:56 +0000
committerFangrui Song <maskray@google.com>2019-04-06 02:18:56 +0000
commitcb300f124360abf1a6640926f2dc478a45ce6b1f (patch)
treebda7e0730fadf45855a7d1cbba2c7eb6da73d434 /llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
parent18bc982c0669644fb76908b71568046dcd7fa8c7 (diff)
downloadllvm-cb300f124360abf1a6640926f2dc478a45ce6b1f.zip
llvm-cb300f124360abf1a6640926f2dc478a45ce6b1f.tar.gz
llvm-cb300f124360abf1a6640926f2dc478a45ce6b1f.tar.bz2
[Symbolize] Uniquify sorted vector<pair<SymbolDesc, StringRef>>
llvm-svn: 357833
Diffstat (limited to 'llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp')
-rw-r--r--llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
index a92fe12..e6e0de0 100644
--- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
@@ -81,10 +81,22 @@ SymbolizableObjectFile::create(object::ObjectFile *Obj,
std::vector<std::pair<SymbolDesc, StringRef>> &Fs = res->Functions,
&Os = res->Objects;
- llvm::sort(Fs);
- Fs.erase(std::unique(Fs.begin(), Fs.end()), Fs.end());
- llvm::sort(Os);
- Os.erase(std::unique(Os.begin(), Os.end()), Os.end());
+ auto Uniquify = [](std::vector<std::pair<SymbolDesc, StringRef>> &S) {
+ // Sort by (Addr,Size,Name). If several SymbolDescs share the same Addr,
+ // pick the one with the largest Size. This helps us avoid symbols with no
+ // size information (Size=0).
+ llvm::sort(S);
+ auto I = S.begin(), E = S.end(), J = S.begin();
+ while (I != E) {
+ auto OI = I;
+ while (++I != E && OI->first.Addr == I->first.Addr) {
+ }
+ *J++ = I[-1];
+ }
+ S.erase(J, S.end());
+ };
+ Uniquify(Fs);
+ Uniquify(Os);
return std::move(res);
}
@@ -205,9 +217,6 @@ bool SymbolizableObjectFile::getNameFromSymbolTable(SymbolRef::Type Type,
uint64_t &Size) const {
const auto &Symbols = Type == SymbolRef::ST_Function ? Functions : Objects;
std::pair<SymbolDesc, StringRef> SD{{Address, UINT64_C(-1)}, StringRef()};
- // SymbolDescs are sorted by (Addr,Size), if several SymbolDescs share the
- // same Addr, pick the one with the largest Size. This helps us avoid symbols
- // with no size information (Size=0).
auto SymbolIterator = llvm::upper_bound(Symbols, SD);
if (SymbolIterator == Symbols.begin())
return false;