| //===- 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 |