Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/DWARFLinker/Parallel/DWARFEmitterImpl.h
35292 views
1
//===- DwarfEmitterImpl.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_LIB_DWARFLINKER_PARALLEL_DWARFEMITTERIMPL_H
10
#define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFEMITTERIMPL_H
11
12
#include "DWARFLinkerCompileUnit.h"
13
#include "llvm/BinaryFormat/Swift.h"
14
#include "llvm/CodeGen/AccelTable.h"
15
#include "llvm/CodeGen/AsmPrinter.h"
16
#include "llvm/DWARFLinker/Parallel/DWARFLinker.h"
17
#include "llvm/MC/MCAsmInfo.h"
18
#include "llvm/MC/MCContext.h"
19
#include "llvm/MC/MCInstrInfo.h"
20
#include "llvm/MC/MCObjectFileInfo.h"
21
#include "llvm/MC/MCRegisterInfo.h"
22
#include "llvm/MC/MCStreamer.h"
23
#include "llvm/MC/MCSubtargetInfo.h"
24
#include "llvm/Target/TargetMachine.h"
25
26
namespace llvm {
27
28
/// User of DwarfEmitterImpl should call initialization code
29
/// for AsmPrinter:
30
///
31
/// InitializeAllTargetInfos();
32
/// InitializeAllTargetMCs();
33
/// InitializeAllTargets();
34
/// InitializeAllAsmPrinters();
35
36
template <typename DataT> class AccelTable;
37
class MCCodeEmitter;
38
39
namespace dwarf_linker {
40
namespace parallel {
41
42
using DebugNamesUnitsOffsets = std::vector<std::variant<MCSymbol *, uint64_t>>;
43
using CompUnitIDToIdx = DenseMap<unsigned, unsigned>;
44
45
/// This class emits DWARF data to the output stream. It emits already
46
/// generated section data and specific data, which could not be generated
47
/// by CompileUnit.
48
class DwarfEmitterImpl {
49
public:
50
DwarfEmitterImpl(DWARFLinker::OutputFileType OutFileType,
51
raw_pwrite_stream &OutFile)
52
: OutFile(OutFile), OutFileType(OutFileType) {}
53
54
/// Initialize AsmPrinter data.
55
Error init(Triple TheTriple, StringRef Swift5ReflectionSegmentName);
56
57
/// Returns triple of output stream.
58
const Triple &getTargetTriple() { return MC->getTargetTriple(); }
59
60
/// Dump the file to the disk.
61
void finish() { MS->finish(); }
62
63
/// Emit abbreviations.
64
void emitAbbrevs(const SmallVector<std::unique_ptr<DIEAbbrev>> &Abbrevs,
65
unsigned DwarfVersion);
66
67
/// Emit compile unit header.
68
void emitCompileUnitHeader(DwarfUnit &Unit);
69
70
/// Emit DIE recursively.
71
void emitDIE(DIE &Die);
72
73
/// Returns size of generated .debug_info section.
74
uint64_t getDebugInfoSectionSize() const { return DebugInfoSectionSize; }
75
76
/// Emits .debug_names section according to the specified \p Table.
77
void emitDebugNames(DWARF5AccelTable &Table,
78
DebugNamesUnitsOffsets &CUOffsets,
79
CompUnitIDToIdx &UnitIDToIdxMap);
80
81
/// Emits .apple_names section according to the specified \p Table.
82
void emitAppleNames(AccelTable<AppleAccelTableStaticOffsetData> &Table);
83
84
/// Emits .apple_namespaces section according to the specified \p Table.
85
void emitAppleNamespaces(AccelTable<AppleAccelTableStaticOffsetData> &Table);
86
87
/// Emits .apple_objc section according to the specified \p Table.
88
void emitAppleObjc(AccelTable<AppleAccelTableStaticOffsetData> &Table);
89
90
/// Emits .apple_types section according to the specified \p Table.
91
void emitAppleTypes(AccelTable<AppleAccelTableStaticTypeData> &Table);
92
93
private:
94
// Enumerate all string patches and write them into the destination section.
95
// Order of patches is the same as in original input file. To avoid emitting
96
// the same string twice we accumulate NextOffset value. Thus if string
97
// offset smaller than NextOffset value then the patch is skipped (as that
98
// string was emitted earlier).
99
template <typename PatchTy>
100
void emitStringsImpl(ArrayList<PatchTy> &StringPatches,
101
const StringEntryToDwarfStringPoolEntryMap &Strings,
102
uint64_t &NextOffset, MCSection *OutSection);
103
104
/// \defgroup MCObjects MC layer objects constructed by the streamer
105
/// @{
106
std::unique_ptr<MCRegisterInfo> MRI;
107
std::unique_ptr<MCAsmInfo> MAI;
108
std::unique_ptr<MCObjectFileInfo> MOFI;
109
std::unique_ptr<MCContext> MC;
110
MCAsmBackend *MAB; // Owned by MCStreamer
111
std::unique_ptr<MCInstrInfo> MII;
112
std::unique_ptr<MCSubtargetInfo> MSTI;
113
MCInstPrinter *MIP; // Owned by AsmPrinter
114
MCCodeEmitter *MCE; // Owned by MCStreamer
115
MCStreamer *MS; // Owned by AsmPrinter
116
std::unique_ptr<TargetMachine> TM;
117
std::unique_ptr<AsmPrinter> Asm;
118
/// @}
119
120
/// The output file we stream the linked Dwarf to.
121
raw_pwrite_stream &OutFile;
122
DWARFLinkerBase::OutputFileType OutFileType =
123
DWARFLinkerBase::OutputFileType::Object;
124
125
uint64_t DebugInfoSectionSize = 0;
126
};
127
128
} // end of namespace parallel
129
} // end of namespace dwarf_linker
130
} // end of namespace llvm
131
132
#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFEMITTERIMPL_H
133
134