From 3e67b7a1e6779eb0b3f1e056ab63a9330b731485 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 4 Apr 2019 11:08:45 +0000 Subject: [PATCH] [Symbolize] Keep SymbolDescs with the same address and improve getNameFromSymbolTable heuristic I'll follow up with better heuristics or tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357683 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp | 5 ++++- lib/DebugInfo/Symbolize/SymbolizableObjectFile.h | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index fc09be251e1..889b0c1d8be 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -198,7 +198,10 @@ bool SymbolizableObjectFile::getNameFromSymbolTable(SymbolRef::Type Type, const auto &SymbolMap = Type == SymbolRef::ST_Function ? Functions : Objects; if (SymbolMap.empty()) return false; - SymbolDesc SD = { Address, Address }; + SymbolDesc SD = {Address, UINT64_C(-1)}; + // 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 = SymbolMap.upper_bound(SD); if (SymbolIterator == SymbolMap.begin()) return false; diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index d5ad8d0d3c4..d811dc2d01e 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -75,8 +75,8 @@ private: // the following symbol. uint64_t Size; - friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) { - return s1.Addr < s2.Addr; + bool operator<(const SymbolDesc &RHS) const { + return Addr != RHS.Addr ? Addr < RHS.Addr : Size < RHS.Size; } }; std::map Functions; -- 2.50.1