[llvm-symbolizer] Avoid calling slow getSymbolSize for Mach-O files. Assume that...
authorAlexey Samsonov <samsonov@google.com>
Tue, 4 Jun 2013 07:57:38 +0000 (07:57 +0000)
committerAlexey Samsonov <samsonov@google.com>
Tue, 4 Jun 2013 07:57:38 +0000 (07:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183213 91177308-0d34-0410-b5e6-96231b3b80d8

test/DebugInfo/llvm-symbolizer.test
tools/llvm-symbolizer/LLVMSymbolize.cpp
tools/llvm-symbolizer/LLVMSymbolize.h

index d094bf9b14659ba3ab505a6d178e831033a6c801..9a7b36515cd30fa82d8e7e0e24864447d83a5019 100644 (file)
@@ -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
index 2596a4e083480a9e8a47f640d212aaff9198e04c..fcbc84e0c0fd2c6422e741af7ba5c38e195dba9c 100644 (file)
@@ -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 <sstream>
@@ -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<MachOObjectFile>(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<MachOObjectFile>(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);
index 0733dfbbc52e1ef7938e51bb892a7c20980decea..e35bdf916fccadef257e6d695327b8bdbed0d49f 100644 (file)
@@ -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<SymbolDesc, StringRef> SymbolMapTy;