1 //===-- SymbolizableObjectFile.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 // This file declares the SymbolizableObjectFile class. 11 // 12 //===----------------------------------------------------------------------===// 13 #ifndef LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H 14 #define LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H 15 16 #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h" 17 #include <map> 18 19 namespace llvm { 20 class DataExtractor; 21 } 22 23 namespace llvm { 24 namespace symbolize { 25 26 class SymbolizableObjectFile : public SymbolizableModule { 27 public: 28 static ErrorOr<std::unique_ptr<SymbolizableObjectFile>> 29 create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); 30 31 DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind, 32 bool UseSymbolTable) const override; 33 DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset, 34 FunctionNameKind FNKind, 35 bool UseSymbolTable) const override; 36 DIGlobal symbolizeData(uint64_t ModuleOffset) const override; 37 38 // Return true if this is a 32-bit x86 PE COFF module. 39 bool isWin32Module() const override; 40 41 // Returns the preferred base of the module, i.e. where the loader would place 42 // it in memory assuming there were no conflicts. 43 uint64_t getModulePreferredBase() const override; 44 45 private: 46 bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind, 47 bool UseSymbolTable) const; 48 49 bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address, 50 std::string &Name, uint64_t &Addr, 51 uint64_t &Size) const; 52 // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd 53 // (function descriptor) section and OpdExtractor refers to its contents. 54 std::error_code addSymbol(const object::SymbolRef &Symbol, 55 uint64_t SymbolSize, 56 DataExtractor *OpdExtractor = nullptr, 57 uint64_t OpdAddress = 0); 58 std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj); 59 60 object::ObjectFile *Module; 61 std::unique_ptr<DIContext> DebugInfoContext; 62 63 struct SymbolDesc { 64 uint64_t Addr; 65 // If size is 0, assume that symbol occupies the whole memory range up to 66 // the following symbol. 67 uint64_t Size; 68 friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) { 69 return s1.Addr < s2.Addr; 70 } 71 }; 72 std::map<SymbolDesc, StringRef> Functions; 73 std::map<SymbolDesc, StringRef> Objects; 74 75 SymbolizableObjectFile(object::ObjectFile *Obj, 76 std::unique_ptr<DIContext> DICtx); 77 }; 78 79 } // namespace symbolize 80 } // namespace llvm 81 82 #endif // LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H 83