Home | History | Annotate | Download | only in Symbolize
      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