[llvm-symbolizer] -print-source-context-lines option to print source code around...
[oota-llvm.git] / lib / DebugInfo / Symbolize / SymbolizableObjectFile.h
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