From 26d086bd3666dd27a545224492876b1ffc95da7b Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 6 Apr 2019 02:18:56 +0000 Subject: [PATCH] [Symbolize] Uniquify sorted vector> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357833 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Symbolize/SymbolizableObjectFile.cpp | 23 +++++++++++++------ .../Symbolize/SymbolizableObjectFile.h | 3 --- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index a92fe123c3b..e6e0de05f5d 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -81,10 +81,22 @@ SymbolizableObjectFile::create(object::ObjectFile *Obj, std::vector> &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> &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 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; diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index ed2f89b2e4d..d5510cb1b8e 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -75,9 +75,6 @@ private: // the following symbol. uint64_t Size; - bool operator==(const SymbolDesc &RHS) const { - return Addr == RHS.Addr && Size == RHS.Size; - } bool operator<(const SymbolDesc &RHS) const { return Addr != RHS.Addr ? Addr < RHS.Addr : Size < RHS.Size; } -- 2.50.1