Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- SymbolizableObjectFile.h ---------------------------------*- C++ -*-===// |
2 | // |
||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
4 | // See https://llvm.org/LICENSE.txt for license information. |
||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
6 | // |
||
7 | //===----------------------------------------------------------------------===// |
||
8 | // |
||
9 | // This file declares the SymbolizableObjectFile class. |
||
10 | // |
||
11 | //===----------------------------------------------------------------------===// |
||
12 | #ifndef LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H |
||
13 | #define LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H |
||
14 | |||
15 | #include "llvm/ADT/StringRef.h" |
||
16 | #include "llvm/DebugInfo/DIContext.h" |
||
17 | #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h" |
||
18 | #include "llvm/Support/Error.h" |
||
19 | #include <cstdint> |
||
20 | #include <memory> |
||
21 | #include <string> |
||
22 | #include <utility> |
||
23 | #include <vector> |
||
24 | |||
25 | namespace llvm { |
||
26 | |||
27 | class DataExtractor; |
||
28 | |||
29 | namespace symbolize { |
||
30 | |||
31 | class SymbolizableObjectFile : public SymbolizableModule { |
||
32 | public: |
||
33 | static Expected<std::unique_ptr<SymbolizableObjectFile>> |
||
34 | create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx, |
||
35 | bool UntagAddresses); |
||
36 | |||
37 | DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset, |
||
38 | DILineInfoSpecifier LineInfoSpecifier, |
||
39 | bool UseSymbolTable) const override; |
||
40 | DIInliningInfo symbolizeInlinedCode(object::SectionedAddress ModuleOffset, |
||
41 | DILineInfoSpecifier LineInfoSpecifier, |
||
42 | bool UseSymbolTable) const override; |
||
43 | DIGlobal symbolizeData(object::SectionedAddress ModuleOffset) const override; |
||
44 | std::vector<DILocal> |
||
45 | symbolizeFrame(object::SectionedAddress ModuleOffset) const override; |
||
46 | |||
47 | // Return true if this is a 32-bit x86 PE COFF module. |
||
48 | bool isWin32Module() const override; |
||
49 | |||
50 | // Returns the preferred base of the module, i.e. where the loader would place |
||
51 | // it in memory assuming there were no conflicts. |
||
52 | uint64_t getModulePreferredBase() const override; |
||
53 | |||
54 | private: |
||
55 | bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind, |
||
56 | bool UseSymbolTable) const; |
||
57 | |||
58 | bool getNameFromSymbolTable(uint64_t Address, std::string &Name, |
||
59 | uint64_t &Addr, uint64_t &Size, |
||
60 | std::string &FileName) const; |
||
61 | // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd |
||
62 | // (function descriptor) section and OpdExtractor refers to its contents. |
||
63 | Error addSymbol(const object::SymbolRef &Symbol, uint64_t SymbolSize, |
||
64 | DataExtractor *OpdExtractor = nullptr, |
||
65 | uint64_t OpdAddress = 0); |
||
66 | Error addCoffExportSymbols(const object::COFFObjectFile *CoffObj); |
||
67 | |||
68 | /// Search for the first occurence of specified Address in ObjectFile. |
||
69 | uint64_t getModuleSectionIndexForAddress(uint64_t Address) const; |
||
70 | |||
71 | const object::ObjectFile *Module; |
||
72 | std::unique_ptr<DIContext> DebugInfoContext; |
||
73 | bool UntagAddresses; |
||
74 | |||
75 | struct SymbolDesc { |
||
76 | uint64_t Addr; |
||
77 | // If size is 0, assume that symbol occupies the whole memory range up to |
||
78 | // the following symbol. |
||
79 | uint64_t Size; |
||
80 | |||
81 | StringRef Name; |
||
82 | // Non-zero if this is an ELF local symbol. See the comment in |
||
83 | // getNameFromSymbolTable. |
||
84 | uint32_t ELFLocalSymIdx; |
||
85 | |||
86 | bool operator<(const SymbolDesc &RHS) const { |
||
87 | return Addr != RHS.Addr ? Addr < RHS.Addr : Size < RHS.Size; |
||
88 | } |
||
89 | }; |
||
90 | std::vector<SymbolDesc> Symbols; |
||
91 | // (index, filename) pairs of ELF STT_FILE symbols. |
||
92 | std::vector<std::pair<uint32_t, StringRef>> FileSymbols; |
||
93 | |||
94 | SymbolizableObjectFile(const object::ObjectFile *Obj, |
||
95 | std::unique_ptr<DIContext> DICtx, |
||
96 | bool UntagAddresses); |
||
97 | }; |
||
98 | |||
99 | } // end namespace symbolize |
||
100 | |||
101 | } // end namespace llvm |
||
102 | |||
103 | #endif // LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H |