xref: /aosp_15_r20/external/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- SymbolizableObjectFile.h -------------------------------- C++ -----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file declares the SymbolizableObjectFile class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
14*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
17*9880d681SAndroid Build Coastguard Worker #include <map>
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker namespace llvm {
20*9880d681SAndroid Build Coastguard Worker class DataExtractor;
21*9880d681SAndroid Build Coastguard Worker }
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker namespace llvm {
24*9880d681SAndroid Build Coastguard Worker namespace symbolize {
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker class SymbolizableObjectFile : public SymbolizableModule {
27*9880d681SAndroid Build Coastguard Worker public:
28*9880d681SAndroid Build Coastguard Worker   static ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
29*9880d681SAndroid Build Coastguard Worker   create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind,
32*9880d681SAndroid Build Coastguard Worker                            bool UseSymbolTable) const override;
33*9880d681SAndroid Build Coastguard Worker   DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset,
34*9880d681SAndroid Build Coastguard Worker                                       FunctionNameKind FNKind,
35*9880d681SAndroid Build Coastguard Worker                                       bool UseSymbolTable) const override;
36*9880d681SAndroid Build Coastguard Worker   DIGlobal symbolizeData(uint64_t ModuleOffset) const override;
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker   // Return true if this is a 32-bit x86 PE COFF module.
39*9880d681SAndroid Build Coastguard Worker   bool isWin32Module() const override;
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker   // Returns the preferred base of the module, i.e. where the loader would place
42*9880d681SAndroid Build Coastguard Worker   // it in memory assuming there were no conflicts.
43*9880d681SAndroid Build Coastguard Worker   uint64_t getModulePreferredBase() const override;
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker private:
46*9880d681SAndroid Build Coastguard Worker   bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind,
47*9880d681SAndroid Build Coastguard Worker                                      bool UseSymbolTable) const;
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker   bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address,
50*9880d681SAndroid Build Coastguard Worker                               std::string &Name, uint64_t &Addr,
51*9880d681SAndroid Build Coastguard Worker                               uint64_t &Size) const;
52*9880d681SAndroid Build Coastguard Worker   // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd
53*9880d681SAndroid Build Coastguard Worker   // (function descriptor) section and OpdExtractor refers to its contents.
54*9880d681SAndroid Build Coastguard Worker   std::error_code addSymbol(const object::SymbolRef &Symbol,
55*9880d681SAndroid Build Coastguard Worker                             uint64_t SymbolSize,
56*9880d681SAndroid Build Coastguard Worker                             DataExtractor *OpdExtractor = nullptr,
57*9880d681SAndroid Build Coastguard Worker                             uint64_t OpdAddress = 0);
58*9880d681SAndroid Build Coastguard Worker   std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj);
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker   object::ObjectFile *Module;
61*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<DIContext> DebugInfoContext;
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker   struct SymbolDesc {
64*9880d681SAndroid Build Coastguard Worker     uint64_t Addr;
65*9880d681SAndroid Build Coastguard Worker     // If size is 0, assume that symbol occupies the whole memory range up to
66*9880d681SAndroid Build Coastguard Worker     // the following symbol.
67*9880d681SAndroid Build Coastguard Worker     uint64_t Size;
68*9880d681SAndroid Build Coastguard Worker     friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
69*9880d681SAndroid Build Coastguard Worker       return s1.Addr < s2.Addr;
70*9880d681SAndroid Build Coastguard Worker     }
71*9880d681SAndroid Build Coastguard Worker   };
72*9880d681SAndroid Build Coastguard Worker   std::map<SymbolDesc, StringRef> Functions;
73*9880d681SAndroid Build Coastguard Worker   std::map<SymbolDesc, StringRef> Objects;
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   SymbolizableObjectFile(object::ObjectFile *Obj,
76*9880d681SAndroid Build Coastguard Worker                          std::unique_ptr<DIContext> DICtx);
77*9880d681SAndroid Build Coastguard Worker };
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker }  // namespace symbolize
80*9880d681SAndroid Build Coastguard Worker }  // namespace llvm
81*9880d681SAndroid Build Coastguard Worker 
82*9880d681SAndroid Build Coastguard Worker #endif  // LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
83