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 |