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