Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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