//===- SymbolizableObjectFile.h ---------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file declares the SymbolizableObjectFile class. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H #define LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H #include "llvm/ADT/StringRef.h" #include "llvm/DebugInfo/DIContext.h" #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h" #include "llvm/Support/ErrorOr.h" #include <cstdint> #include <map> #include <memory> #include <string> #include <system_error> namespace llvm { class DataExtractor; namespace symbolize { class SymbolizableObjectFile : public SymbolizableModule { public: static ErrorOr<std::unique_ptr<SymbolizableObjectFile>> create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable) const override; DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable) const override; DIGlobal symbolizeData(uint64_t ModuleOffset) const override; // Return true if this is a 32-bit x86 PE COFF module. bool isWin32Module() const override; // Returns the preferred base of the module, i.e. where the loader would place // it in memory assuming there were no conflicts. uint64_t getModulePreferredBase() const override; private: bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind, bool UseSymbolTable) const; bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address, std::string &Name, uint64_t &Addr, uint64_t &Size) const; // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd // (function descriptor) section and OpdExtractor refers to its contents. std::error_code addSymbol(const object::SymbolRef &Symbol, uint64_t SymbolSize, DataExtractor *OpdExtractor = nullptr, uint64_t OpdAddress = 0); std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj); object::ObjectFile *Module; std::unique_ptr<DIContext> DebugInfoContext; struct SymbolDesc { uint64_t Addr; // If size is 0, assume that symbol occupies the whole memory range up to // the following symbol. uint64_t Size; friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) { return s1.Addr < s2.Addr; } }; std::map<SymbolDesc, StringRef> Functions; std::map<SymbolDesc, StringRef> Objects; SymbolizableObjectFile(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx); }; } // end namespace symbolize } // end namespace llvm #endif // LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H |