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
//===- DwarfStreamer.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
#ifndef LLVM_DWARFLINKER_DWARFSTREAMER_H
10
#define LLVM_DWARFLINKER_DWARFSTREAMER_H
11
 
12
#include "llvm/BinaryFormat/Swift.h"
13
#include "llvm/CodeGen/AsmPrinter.h"
14
#include "llvm/DWARFLinker/DWARFLinker.h"
15
#include "llvm/MC/MCAsmInfo.h"
16
#include "llvm/MC/MCContext.h"
17
#include "llvm/MC/MCInstrInfo.h"
18
#include "llvm/MC/MCObjectFileInfo.h"
19
#include "llvm/MC/MCRegisterInfo.h"
20
#include "llvm/MC/MCSubtargetInfo.h"
21
#include "llvm/Target/TargetMachine.h"
22
 
23
namespace llvm {
24
template <typename DataT> class AccelTable;
25
 
26
enum class OutputFileType {
27
  Object,
28
  Assembly,
29
};
30
 
31
///   User of DwarfStreamer should call initialization code
32
///   for AsmPrinter:
33
///
34
///   InitializeAllTargetInfos();
35
///   InitializeAllTargetMCs();
36
///   InitializeAllTargets();
37
///   InitializeAllAsmPrinters();
38
 
39
class MCCodeEmitter;
40
class DWARFDebugMacro;
41
 
42
/// The Dwarf streaming logic.
43
///
44
/// All interactions with the MC layer that is used to build the debug
45
/// information binary representation are handled in this class.
46
class DwarfStreamer : public DwarfEmitter {
47
public:
48
  DwarfStreamer(OutputFileType OutFileType, raw_pwrite_stream &OutFile,
49
                std::function<StringRef(StringRef Input)> Translator,
50
                messageHandler Error, messageHandler Warning)
51
      : OutFile(OutFile), OutFileType(OutFileType), Translator(Translator),
52
        ErrorHandler(Error), WarningHandler(Warning) {}
53
 
54
  bool init(Triple TheTriple, StringRef Swift5ReflectionSegmentName);
55
 
56
  /// Dump the file to the disk.
57
  void finish();
58
 
59
  AsmPrinter &getAsmPrinter() const { return *Asm; }
60
 
61
  /// Set the current output section to debug_info and change
62
  /// the MC Dwarf version to \p DwarfVersion.
63
  void switchToDebugInfoSection(unsigned DwarfVersion);
64
 
65
  /// Emit the compilation unit header for \p Unit in the
66
  /// debug_info section.
67
  ///
68
  /// As a side effect, this also switches the current Dwarf version
69
  /// of the MC layer to the one of U.getOrigUnit().
70
  void emitCompileUnitHeader(CompileUnit &Unit, unsigned DwarfVersion) override;
71
 
72
  /// Recursively emit the DIE tree rooted at \p Die.
73
  void emitDIE(DIE &Die) override;
74
 
75
  /// Emit the abbreviation table \p Abbrevs to the debug_abbrev section.
76
  void emitAbbrevs(const std::vector<std::unique_ptr<DIEAbbrev>> &Abbrevs,
77
                   unsigned DwarfVersion) override;
78
 
79
  /// Emit DIE containing warnings.
80
  void emitPaperTrailWarningsDie(DIE &Die) override;
81
 
82
  /// Emit contents of section SecName From Obj.
83
  void emitSectionContents(StringRef SecData, StringRef SecName) override;
84
 
85
  /// Emit the string table described by \p Pool.
86
  void emitStrings(const NonRelocatableStringpool &Pool) override;
87
 
88
  /// Emit the swift_ast section stored in \p Buffer.
89
  void emitSwiftAST(StringRef Buffer);
90
 
91
  /// Emit the swift reflection section stored in \p Buffer.
92
  void emitSwiftReflectionSection(
93
      llvm::binaryformat::Swift5ReflectionSectionKind ReflSectionKind,
94
      StringRef Buffer, uint32_t Alignment, uint32_t Size);
95
 
96
  /// Emit piece of .debug_ranges for \p Ranges.
97
  virtual void
98
  emitDwarfDebugRangesTableFragment(const CompileUnit &Unit,
99
                                    const AddressRanges &LinkedRanges) override;
100
 
101
  /// Emit debug_aranges entries for \p Unit and if \p DoRangesSection is true,
102
  /// also emit the debug_ranges entries for the DW_TAG_compile_unit's
103
  /// DW_AT_ranges attribute.
104
  void emitUnitRangesEntries(CompileUnit &Unit, bool DoRangesSection) override;
105
 
106
  uint64_t getRangesSectionSize() const override { return RangesSectionSize; }
107
 
108
  /// Emit the debug_loc contribution for \p Unit by copying the entries from
109
  /// \p Dwarf and offsetting them. Update the location attributes to point to
110
  /// the new entries.
111
  void emitLocationsForUnit(
112
      const CompileUnit &Unit, DWARFContext &Dwarf,
113
      std::function<void(StringRef, SmallVectorImpl<uint8_t> &)> ProcessExpr)
114
      override;
115
 
116
  /// Emit the line table described in \p Rows into the debug_line section.
117
  void emitLineTableForUnit(MCDwarfLineTableParams Params,
118
                            StringRef PrologueBytes, unsigned MinInstLength,
119
                            std::vector<DWARFDebugLine::Row> &Rows,
120
                            unsigned AdddressSize) override;
121
 
122
  /// Copy the debug_line over to the updated binary while unobfuscating the
123
  /// file names and directories.
124
  void translateLineTable(DataExtractor LineData, uint64_t Offset) override;
125
 
126
  uint64_t getLineSectionSize() const override { return LineSectionSize; }
127
 
128
  /// Emit the .debug_pubnames contribution for \p Unit.
129
  void emitPubNamesForUnit(const CompileUnit &Unit) override;
130
 
131
  /// Emit the .debug_pubtypes contribution for \p Unit.
132
  void emitPubTypesForUnit(const CompileUnit &Unit) override;
133
 
134
  /// Emit a CIE.
135
  void emitCIE(StringRef CIEBytes) override;
136
 
137
  /// Emit an FDE with data \p Bytes.
138
  void emitFDE(uint32_t CIEOffset, uint32_t AddreSize, uint64_t Address,
139
               StringRef Bytes) override;
140
 
141
  /// Emit DWARF debug names.
142
  void emitDebugNames(AccelTable<DWARF5AccelTableStaticData> &Table) override;
143
 
144
  /// Emit Apple namespaces accelerator table.
145
  void emitAppleNamespaces(
146
      AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
147
 
148
  /// Emit Apple names accelerator table.
149
  void
150
  emitAppleNames(AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
151
 
152
  /// Emit Apple Objective-C accelerator table.
153
  void
154
  emitAppleObjc(AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
155
 
156
  /// Emit Apple type accelerator table.
157
  void
158
  emitAppleTypes(AccelTable<AppleAccelTableStaticTypeData> &Table) override;
159
 
160
  uint64_t getFrameSectionSize() const override { return FrameSectionSize; }
161
 
162
  uint64_t getDebugInfoSectionSize() const override {
163
    return DebugInfoSectionSize;
164
  }
165
 
166
  uint64_t getDebugMacInfoSectionSize() const override {
167
    return MacInfoSectionSize;
168
  }
169
 
170
  uint64_t getDebugMacroSectionSize() const override {
171
    return MacroSectionSize;
172
  }
173
 
174
  void emitMacroTables(DWARFContext *Context,
175
                       const Offset2UnitMap &UnitMacroMap,
176
                       OffsetsStringPool &StringPool) override;
177
 
178
private:
179
  inline void error(const Twine &Error, StringRef Context = "") {
180
    if (ErrorHandler)
181
      ErrorHandler(Error, Context, nullptr);
182
  }
183
 
184
  inline void warn(const Twine &Warning, StringRef Context = "") {
185
    if (WarningHandler)
186
      WarningHandler(Warning, Context, nullptr);
187
  }
188
 
189
  void emitMacroTableImpl(const DWARFDebugMacro *MacroTable,
190
                          const Offset2UnitMap &UnitMacroMap,
191
                          OffsetsStringPool &StringPool, uint64_t &OutOffset);
192
  void emitDwarfDebugArangesTable(const CompileUnit &Unit,
193
                                  const AddressRanges &LinkedRanges);
194
 
195
  /// \defgroup MCObjects MC layer objects constructed by the streamer
196
  /// @{
197
  std::unique_ptr<MCRegisterInfo> MRI;
198
  std::unique_ptr<MCAsmInfo> MAI;
199
  std::unique_ptr<MCObjectFileInfo> MOFI;
200
  std::unique_ptr<MCContext> MC;
201
  MCAsmBackend *MAB; // Owned by MCStreamer
202
  std::unique_ptr<MCInstrInfo> MII;
203
  std::unique_ptr<MCSubtargetInfo> MSTI;
204
  MCInstPrinter *MIP; // Owned by AsmPrinter
205
  MCCodeEmitter *MCE; // Owned by MCStreamer
206
  MCStreamer *MS;     // Owned by AsmPrinter
207
  std::unique_ptr<TargetMachine> TM;
208
  std::unique_ptr<AsmPrinter> Asm;
209
  /// @}
210
 
211
  /// The output file we stream the linked Dwarf to.
212
  raw_pwrite_stream &OutFile;
213
  OutputFileType OutFileType = OutputFileType::Object;
214
  std::function<StringRef(StringRef Input)> Translator;
215
 
216
  uint64_t RangesSectionSize = 0;
217
  uint64_t LocSectionSize = 0;
218
  uint64_t LineSectionSize = 0;
219
  uint64_t FrameSectionSize = 0;
220
  uint64_t DebugInfoSectionSize = 0;
221
  uint64_t MacInfoSectionSize = 0;
222
  uint64_t MacroSectionSize = 0;
223
 
224
  /// Keep track of emitted CUs and their Unique ID.
225
  struct EmittedUnit {
226
    unsigned ID;
227
    MCSymbol *LabelBegin;
228
  };
229
  std::vector<EmittedUnit> EmittedUnits;
230
 
231
  /// Emit the pubnames or pubtypes section contribution for \p
232
  /// Unit into \p Sec. The data is provided in \p Names.
233
  void emitPubSectionForUnit(MCSection *Sec, StringRef Name,
234
                             const CompileUnit &Unit,
235
                             const std::vector<CompileUnit::AccelInfo> &Names);
236
 
237
  messageHandler ErrorHandler = nullptr;
238
  messageHandler WarningHandler = nullptr;
239
};
240
 
241
} // end namespace llvm
242
 
243
#endif // LLVM_DWARFLINKER_DWARFSTREAMER_H