From 888ca964a45696a1b3e60940d3c9ad8ae677ef1c Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 4 Jun 2013 07:57:38 +0000 Subject: [PATCH] [llvm-symbolizer] Avoid calling slow getSymbolSize for Mach-O files. Assume that symbols with zero size are in fact large enough. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183213 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/DebugInfo/llvm-symbolizer.test | 5 +++++ tools/llvm-symbolizer/LLVMSymbolize.cpp | 27 +++++++++++++++++-------- tools/llvm-symbolizer/LLVMSymbolize.h | 2 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/test/DebugInfo/llvm-symbolizer.test b/test/DebugInfo/llvm-symbolizer.test index d094bf9b146..9a7b36515cd 100644 --- a/test/DebugInfo/llvm-symbolizer.test +++ b/test/DebugInfo/llvm-symbolizer.test @@ -1,4 +1,5 @@ RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input +RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400436" >> %t.input RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x633" >> %t.input @@ -10,8 +11,12 @@ REQUIRES: shell CHECK: main CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 + +CHECK: _start + CHECK: _Z1cv CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2 + CHECK: inlined_h CHECK-NEXT: dwarfdump-inl-test.h:2 CHECK-NEXT: inlined_g diff --git a/tools/llvm-symbolizer/LLVMSymbolize.cpp b/tools/llvm-symbolizer/LLVMSymbolize.cpp index 2596a4e0834..fcbc84e0c0f 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ b/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -15,6 +15,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Object/MachO.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include @@ -63,7 +64,11 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx) SymbolAddress == UnknownAddressOrSize) continue; uint64_t SymbolSize; - if (error(si->getSize(SymbolSize)) || SymbolSize == UnknownAddressOrSize) + // Getting symbol size is linear for Mach-O files, so avoid it. + if (isa(Obj)) + SymbolSize = 0; + else if (error(si->getSize(SymbolSize)) || + SymbolSize == UnknownAddressOrSize) continue; StringRef SymbolName; if (error(si->getName(SymbolName))) @@ -80,11 +85,14 @@ bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address, std::string &Name, uint64_t &Addr, uint64_t &Size) const { const SymbolMapTy &M = Type == SymbolRef::ST_Function ? Functions : Objects; - SymbolDesc SD = { Address, Address + 1 }; - SymbolMapTy::const_iterator it = M.find(SD); - if (it == M.end()) + if (M.empty()) return false; - if (Address < it->first.Addr || Address >= it->first.AddrEnd) + SymbolDesc SD = { Address, Address }; + SymbolMapTy::const_iterator it = M.upper_bound(SD); + --it; + // Assume that symbols with zero size are large enough. + if (it->first.Addr < it->first.AddrEnd && + it->first.AddrEnd <= Address) return false; Name = it->second.str(); Addr = it->first.Addr; @@ -236,9 +244,12 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { if (isa(Obj)) { const std::string &ResourceName = getDarwinDWARFResourceForModule(ModuleName); - ObjectFile *ResourceObj = getObjectFile(ResourceName); - if (ResourceObj != 0) - DbgObj = ResourceObj; + bool ResourceFileExists = false; + if (!sys::fs::exists(ResourceName, ResourceFileExists) && + ResourceFileExists) { + if (ObjectFile *ResourceObj = getObjectFile(ResourceName)) + DbgObj = ResourceObj; + } } Context = DIContext::getDWARFContext(DbgObj); assert(Context); diff --git a/tools/llvm-symbolizer/LLVMSymbolize.h b/tools/llvm-symbolizer/LLVMSymbolize.h index 0733dfbbc52..e35bdf916fc 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.h +++ b/tools/llvm-symbolizer/LLVMSymbolize.h @@ -84,7 +84,7 @@ private: uint64_t Addr; uint64_t AddrEnd; friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) { - return s1.AddrEnd <= s2.Addr; + return s1.Addr < s2.Addr; } }; typedef std::map SymbolMapTy;