Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===-- LVBinaryReader.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 defines the LVBinaryReader class, which is used to describe a |
||
10 | // binary reader. |
||
11 | // |
||
12 | //===----------------------------------------------------------------------===// |
||
13 | |||
14 | #ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVBINARYREADER_H |
||
15 | #define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVBINARYREADER_H |
||
16 | |||
17 | #include "llvm/DebugInfo/LogicalView/Core/LVReader.h" |
||
18 | #include "llvm/MC/MCAsmInfo.h" |
||
19 | #include "llvm/MC/MCContext.h" |
||
20 | #include "llvm/MC/MCDisassembler/MCDisassembler.h" |
||
21 | #include "llvm/MC/MCInstPrinter.h" |
||
22 | #include "llvm/MC/MCInstrInfo.h" |
||
23 | #include "llvm/MC/MCObjectFileInfo.h" |
||
24 | #include "llvm/MC/MCRegisterInfo.h" |
||
25 | #include "llvm/MC/MCSubtargetInfo.h" |
||
26 | #include "llvm/MC/TargetRegistry.h" |
||
27 | #include "llvm/Object/ObjectFile.h" |
||
28 | |||
29 | namespace llvm { |
||
30 | namespace logicalview { |
||
31 | |||
32 | constexpr bool UpdateHighAddress = false; |
||
33 | |||
34 | // Logical scope, Section address, Section index, IsComdat. |
||
35 | struct LVSymbolTableEntry final { |
||
36 | LVScope *Scope = nullptr; |
||
37 | LVAddress Address = 0; |
||
38 | LVSectionIndex SectionIndex = 0; |
||
39 | bool IsComdat = false; |
||
40 | LVSymbolTableEntry() = default; |
||
41 | LVSymbolTableEntry(LVScope *Scope, LVAddress Address, |
||
42 | LVSectionIndex SectionIndex, bool IsComdat) |
||
43 | : Scope(Scope), Address(Address), SectionIndex(SectionIndex), |
||
44 | IsComdat(IsComdat) {} |
||
45 | }; |
||
46 | |||
47 | // Function names extracted from the object symbol table. |
||
48 | class LVSymbolTable final { |
||
49 | using LVSymbolNames = std::map<std::string, LVSymbolTableEntry>; |
||
50 | LVSymbolNames SymbolNames; |
||
51 | |||
52 | public: |
||
53 | LVSymbolTable() = default; |
||
54 | |||
55 | void add(StringRef Name, LVScope *Function, LVSectionIndex SectionIndex = 0); |
||
56 | void add(StringRef Name, LVAddress Address, LVSectionIndex SectionIndex, |
||
57 | bool IsComdat); |
||
58 | LVSectionIndex update(LVScope *Function); |
||
59 | |||
60 | const LVSymbolTableEntry &getEntry(StringRef Name); |
||
61 | LVAddress getAddress(StringRef Name); |
||
62 | LVSectionIndex getIndex(StringRef Name); |
||
63 | bool getIsComdat(StringRef Name); |
||
64 | |||
65 | void print(raw_ostream &OS); |
||
66 | }; |
||
67 | |||
68 | class LVBinaryReader : public LVReader { |
||
69 | // Function names extracted from the object symbol table. |
||
70 | LVSymbolTable SymbolTable; |
||
71 | |||
72 | // Instruction lines for a logical scope. These instructions are fetched |
||
73 | // during its merge with the debug lines. |
||
74 | LVDoubleMap<LVSectionIndex, LVScope *, LVLines *> ScopeInstructions; |
||
75 | |||
76 | // Links the scope with its first assembler address line. |
||
77 | LVDoubleMap<LVSectionIndex, LVAddress, LVScope *> AssemblerMappings; |
||
78 | |||
79 | // Mapping from virtual address to section. |
||
80 | // The virtual address refers to the address where the section is loaded. |
||
81 | using LVSectionAddresses = std::map<LVSectionIndex, object::SectionRef>; |
||
82 | LVSectionAddresses SectionAddresses; |
||
83 | |||
84 | void addSectionAddress(const object::SectionRef &Section) { |
||
85 | if (SectionAddresses.find(Section.getAddress()) == SectionAddresses.end()) |
||
86 | SectionAddresses.emplace(Section.getAddress(), Section); |
||
87 | } |
||
88 | |||
89 | // Scopes with ranges for current compile unit. It is used to find a line |
||
90 | // giving its exact or closest address. To support comdat functions, all |
||
91 | // addresses for the same section are recorded in the same map. |
||
92 | using LVSectionRanges = std::map<LVSectionIndex, LVRange *>; |
||
93 | LVSectionRanges SectionRanges; |
||
94 | |||
95 | // Image base and virtual address for Executable file. |
||
96 | uint64_t ImageBaseAddress = 0; |
||
97 | uint64_t VirtualAddress = 0; |
||
98 | |||
99 | // Object sections with machine code. |
||
100 | using LVSections = std::map<LVSectionIndex, object::SectionRef>; |
||
101 | LVSections Sections; |
||
102 | |||
103 | protected: |
||
104 | // It contains the LVLineDebug elements representing the logical lines for |
||
105 | // the current compile unit, created by parsing the debug line section. |
||
106 | LVLines CULines; |
||
107 | |||
108 | std::unique_ptr<const MCRegisterInfo> MRI; |
||
109 | std::unique_ptr<const MCAsmInfo> MAI; |
||
110 | std::unique_ptr<const MCSubtargetInfo> STI; |
||
111 | std::unique_ptr<const MCInstrInfo> MII; |
||
112 | std::unique_ptr<const MCDisassembler> MD; |
||
113 | std::unique_ptr<MCContext> MC; |
||
114 | std::unique_ptr<MCInstPrinter> MIP; |
||
115 | |||
116 | // Loads all info for the architecture of the provided object file. |
||
117 | Error loadGenericTargetInfo(StringRef TheTriple, StringRef TheFeatures); |
||
118 | |||
119 | virtual void mapRangeAddress(const object::ObjectFile &Obj) {} |
||
120 | virtual void mapRangeAddress(const object::ObjectFile &Obj, |
||
121 | const object::SectionRef &Section, |
||
122 | bool IsComdat) {} |
||
123 | |||
124 | // Create a mapping from virtual address to section. |
||
125 | void mapVirtualAddress(const object::ObjectFile &Obj); |
||
126 | void mapVirtualAddress(const object::COFFObjectFile &COFFObj); |
||
127 | |||
128 | Expected<std::pair<LVSectionIndex, object::SectionRef>> |
||
129 | getSection(LVScope *Scope, LVAddress Address, LVSectionIndex SectionIndex); |
||
130 | |||
131 | void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope); |
||
132 | void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope, |
||
133 | LVAddress LowerAddress, LVAddress UpperAddress); |
||
134 | LVRange *getSectionRanges(LVSectionIndex SectionIndex); |
||
135 | |||
136 | Error createInstructions(); |
||
137 | Error createInstructions(LVScope *Function, LVSectionIndex SectionIndex); |
||
138 | Error createInstructions(LVScope *Function, LVSectionIndex SectionIndex, |
||
139 | const LVNameInfo &NameInfo); |
||
140 | |||
141 | void processLines(LVLines *DebugLines, LVSectionIndex SectionIndex); |
||
142 | void processLines(LVLines *DebugLines, LVSectionIndex SectionIndex, |
||
143 | LVScope *Function); |
||
144 | |||
145 | public: |
||
146 | LVBinaryReader() = delete; |
||
147 | LVBinaryReader(StringRef Filename, StringRef FileFormatName, ScopedPrinter &W, |
||
148 | LVBinaryType BinaryType) |
||
149 | : LVReader(Filename, FileFormatName, W, BinaryType) {} |
||
150 | LVBinaryReader(const LVBinaryReader &) = delete; |
||
151 | LVBinaryReader &operator=(const LVBinaryReader &) = delete; |
||
152 | virtual ~LVBinaryReader(); |
||
153 | |||
154 | void addToSymbolTable(StringRef Name, LVScope *Function, |
||
155 | LVSectionIndex SectionIndex = 0); |
||
156 | void addToSymbolTable(StringRef Name, LVAddress Address, |
||
157 | LVSectionIndex SectionIndex, bool IsComdat); |
||
158 | LVSectionIndex updateSymbolTable(LVScope *Function); |
||
159 | |||
160 | const LVSymbolTableEntry &getSymbolTableEntry(StringRef Name); |
||
161 | LVAddress getSymbolTableAddress(StringRef Name); |
||
162 | LVSectionIndex getSymbolTableIndex(StringRef Name); |
||
163 | bool getSymbolTableIsComdat(StringRef Name); |
||
164 | |||
165 | LVSectionIndex getSectionIndex(LVScope *Scope) override { |
||
166 | return Scope ? getSymbolTableIndex(Scope->getLinkageName()) |
||
167 | : DotTextSectionIndex; |
||
168 | } |
||
169 | |||
170 | void print(raw_ostream &OS) const; |
||
171 | |||
172 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
||
173 | void dump() const { print(dbgs()); } |
||
174 | #endif |
||
175 | }; |
||
176 | |||
177 | } // end namespace logicalview |
||
178 | } // end namespace llvm |
||
179 | |||
180 | #endif // LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVBINARYREADER_H |