1 //===-- LLVMSymbolize.h ----------------------------------------- C++ -----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Header for LLVM symbolization library. 11 // 12 //===----------------------------------------------------------------------===// 13 #ifndef LLVM_SYMBOLIZE_H 14 #define LLVM_SYMBOLIZE_H 15 16 #include "llvm/ADT/OwningPtr.h" 17 #include "llvm/ADT/SmallVector.h" 18 #include "llvm/DebugInfo/DIContext.h" 19 #include "llvm/Object/MachOUniversal.h" 20 #include "llvm/Object/ObjectFile.h" 21 #include "llvm/Support/MemoryBuffer.h" 22 #include <map> 23 #include <string> 24 25 namespace llvm { 26 27 using namespace object; 28 29 namespace symbolize { 30 31 class ModuleInfo; 32 33 class LLVMSymbolizer { 34 public: 35 struct Options { 36 bool UseSymbolTable : 1; 37 bool PrintFunctions : 1; 38 bool PrintInlining : 1; 39 bool Demangle : 1; 40 std::string DefaultArch; 41 Options(bool UseSymbolTable = true, bool PrintFunctions = true, 42 bool PrintInlining = true, bool Demangle = true, 43 std::string DefaultArch = "") 44 : UseSymbolTable(UseSymbolTable), PrintFunctions(PrintFunctions), 45 PrintInlining(PrintInlining), Demangle(Demangle), 46 DefaultArch(DefaultArch) { 47 } 48 }; 49 50 LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {} 51 ~LLVMSymbolizer() { 52 flush(); 53 } 54 55 // Returns the result of symbolization for module name/offset as 56 // a string (possibly containing newlines). 57 std::string 58 symbolizeCode(const std::string &ModuleName, uint64_t ModuleOffset); 59 std::string 60 symbolizeData(const std::string &ModuleName, uint64_t ModuleOffset); 61 void flush(); 62 static std::string DemangleName(const std::string &Name); 63 private: 64 typedef std::pair<Binary*, Binary*> BinaryPair; 65 66 ModuleInfo *getOrCreateModuleInfo(const std::string &ModuleName); 67 /// \brief Returns pair of pointers to binary and debug binary. 68 BinaryPair getOrCreateBinary(const std::string &Path); 69 /// \brief Returns a parsed object file for a given architecture in a 70 /// universal binary (or the binary itself if it is an object file). 71 ObjectFile *getObjectFileFromBinary(Binary *Bin, const std::string &ArchName); 72 73 std::string printDILineInfo(DILineInfo LineInfo) const; 74 75 // Owns all the parsed binaries and object files. 76 SmallVector<Binary*, 4> ParsedBinariesAndObjects; 77 // Owns module info objects. 78 typedef std::map<std::string, ModuleInfo *> ModuleMapTy; 79 ModuleMapTy Modules; 80 typedef std::map<std::string, BinaryPair> BinaryMapTy; 81 BinaryMapTy BinaryForPath; 82 typedef std::map<std::pair<MachOUniversalBinary *, std::string>, ObjectFile *> 83 ObjectFileForArchMapTy; 84 ObjectFileForArchMapTy ObjectFileForArch; 85 86 Options Opts; 87 static const char kBadString[]; 88 }; 89 90 class ModuleInfo { 91 public: 92 ModuleInfo(ObjectFile *Obj, DIContext *DICtx); 93 94 DILineInfo symbolizeCode(uint64_t ModuleOffset, 95 const LLVMSymbolizer::Options &Opts) const; 96 DIInliningInfo symbolizeInlinedCode( 97 uint64_t ModuleOffset, const LLVMSymbolizer::Options &Opts) const; 98 bool symbolizeData(uint64_t ModuleOffset, std::string &Name, uint64_t &Start, 99 uint64_t &Size) const; 100 101 private: 102 bool getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address, 103 std::string &Name, uint64_t &Addr, 104 uint64_t &Size) const; 105 ObjectFile *Module; 106 OwningPtr<DIContext> DebugInfoContext; 107 108 struct SymbolDesc { 109 uint64_t Addr; 110 // If size is 0, assume that symbol occupies the whole memory range up to 111 // the following symbol. 112 uint64_t Size; 113 friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) { 114 return s1.Addr < s2.Addr; 115 } 116 }; 117 typedef std::map<SymbolDesc, StringRef> SymbolMapTy; 118 SymbolMapTy Functions; 119 SymbolMapTy Objects; 120 }; 121 122 } // namespace symbolize 123 } // namespace llvm 124 125 #endif // LLVM_SYMBOLIZE_H 126