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