LLVM 24.0.0git
DWARFLinkerImpl.h
Go to the documentation of this file.
1//===- DWARFLinkerImpl.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_DWARFLINKERIMPL_H
10#define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H
11
12#include "DWARFEmitterImpl.h"
14#include "DWARFLinkerTypeUnit.h"
21
22namespace llvm {
23namespace dwarf_linker {
24namespace parallel {
25
26/// This class links debug info.
28public:
30 MessageHandlerTy WarningHandler);
31
32 /// Add object file to be linked. Pre-load compile unit die. Call
33 /// \p OnCUDieLoaded for each compile unit die. If specified \p File
34 /// has reference to the Clang module then such module would be
35 /// pre-loaded by \p Loader for !Update case.
36 ///
37 /// \pre NoODR, Update options should be set before call to addObjectFile.
38 void addObjectFile(
39 DWARFFile &File, ObjFileLoaderTy Loader = nullptr,
40
41 CompileUnitHandlerTy OnCUDieLoaded = [](const DWARFUnit &) {}) override;
42
43 /// Link debug info for added files.
44 Error link() override;
45
46 /// Set output DWARF handler. May be not set if output generation is not
47 /// necessary.
48 void setOutputDWARFHandler(const Triple &TargetTriple,
50 GlobalData.setTargetTriple(TargetTriple);
51 this->SectionHandler = SectionHandler;
52 }
53
54 /// \defgroup Methods setting various linking options:
55 ///
56 /// @{
57 ///
58
59 /// Allows to generate log of linking process to the standard output.
60 void setVerbosity(bool Verbose) override {
61 GlobalData.Options.Verbose = Verbose;
62 }
63
64 /// Print statistics to standard output.
65 void setStatistics(bool Statistics) override {
66 GlobalData.Options.Statistics = Statistics;
67 }
68
69 /// Verify the input DWARF.
70 void setVerifyInputDWARF(bool Verify) override {
71 GlobalData.Options.VerifyInputDWARF = Verify;
72 }
73
74 /// Do not unique types according to ODR.
75 void setNoODR(bool NoODR) override { GlobalData.Options.NoODR = NoODR; }
76
77 /// Update index tables only(do not modify rest of DWARF).
78 void setUpdateIndexTablesOnly(bool UpdateIndexTablesOnly) override {
79 GlobalData.Options.UpdateIndexTablesOnly = UpdateIndexTablesOnly;
80 }
81
82 /// Set to keep the enclosing function for a static variable.
83 void setKeepFunctionForStatic(bool KeepFunctionForStatic) override {
84 GlobalData.Options.KeepFunctionForStatic = KeepFunctionForStatic;
85 }
86
87 /// Use specified number of threads for parallel files linking.
88 void setNumThreads(unsigned NumThreads) override {
89 GlobalData.Options.Threads = NumThreads;
90 }
91
92 /// Use the specified thread pool to link the object files.
93 void setThreadPool(ThreadPoolInterface *Pool) override { ThreadPool = Pool; }
94
95 /// Add kind of accelerator tables to be generated.
96 void addAccelTableKind(AccelTableKind Kind) override {
97 assert(!llvm::is_contained(GlobalData.getOptions().AccelTables, Kind));
98 GlobalData.Options.AccelTables.emplace_back(Kind);
99 }
100
101 /// Set prepend path for clang modules.
102 void setPrependPath(StringRef Ppath) override {
103 GlobalData.Options.PrependPath = Ppath;
104 }
105
106 /// Set estimated objects files amount, for preliminary data allocation.
107 void setEstimatedObjfilesAmount(unsigned ObjFilesNum) override;
108
109 /// Set verification handler which would be used to report verification
110 /// errors.
111 void
113 GlobalData.Options.InputVerificationHandler = Handler;
114 }
115
116 /// Set map for Swift interfaces.
118 GlobalData.Options.ParseableSwiftInterfaces = Map;
119 }
120
121 /// Set prefix map for objects.
123 GlobalData.Options.ObjectPrefixMap = Map;
124 }
125
126 /// Set target DWARF version.
127 Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) override {
128 if ((TargetDWARFVersion < 1) || (TargetDWARFVersion > 5))
129 return createStringError(std::errc::invalid_argument,
130 "unsupported DWARF version: %d",
131 TargetDWARFVersion);
132
133 GlobalData.Options.TargetDWARFVersion = TargetDWARFVersion;
134 return Error::success();
135 }
136 /// @}
137
138protected:
139 /// Verify input DWARF file.
140 void verifyInput(const DWARFFile &File);
141
142 /// Validate specified options.
144
145 /// Take already linked compile units and glue them into single file.
147
148 /// Hold the input and output of the debug info size in bytes.
153
154 friend class DependencyTracker;
155 /// Keeps track of data associated with one object during linking.
156 /// i.e. source file descriptor, compilation units, output data
157 /// for compilation units common tables.
158 struct LinkContext : public OutputSections {
160
161 /// Object file descriptor.
163
164 /// Set of Compilation Units(may be accessed asynchroniously for reading).
166
167 /// Set of Compile Units for modules.
169
170 /// Index of this object file in the link order (used for deterministic
171 /// type DIE allocation).
173
174 /// Size of Debug info before optimizing.
176
177 /// Flag indicating that all inter-connected units are loaded
178 /// and the dwarf linking process for these units is started.
180
182
184
185 /// Flag indicating that new inter-connected compilation units were
186 /// discovered. It is used for restarting units processing
187 /// if new inter-connected units were found.
188 std::atomic<bool> HasNewInterconnectedCUs = {false};
189
190 std::atomic<bool> HasNewGlobalDependency = {false};
191
192 /// Counter for compile units ID.
193 std::atomic<size_t> &UniqueUnitID;
194
197 uint64_t &ModuleUnitIdx, std::atomic<size_t> &UniqueUnitID);
198
199 /// Check whether specified \p CUDie is a Clang module reference.
200 /// if \p Quiet is false then display error messages.
201 /// \return first == true if CUDie is a Clang module reference.
202 /// second == true if module is already loaded.
203 std::pair<bool, bool> isClangModuleRef(const DWARFDie &CUDie,
204 std::string &PCMFile,
205 unsigned Indent, bool Quiet);
206
207 /// If this compile unit is really a skeleton CU that points to a
208 /// clang module, register it in ClangModules and return true.
209 ///
210 /// A skeleton CU is a CU without children, a DW_AT_gnu_dwo_name
211 /// pointing to the module, and a DW_AT_gnu_dwo_id with the module
212 /// hash.
213 bool registerModuleReference(const DWARFDie &CUDie, ObjFileLoaderTy Loader,
214 CompileUnitHandlerTy OnCUDieLoaded,
215 unsigned Indent = 0);
216
217 /// Recursively add the debug info in this clang module .pcm
218 /// file (and all the modules imported by it in a bottom-up fashion)
219 /// to ModuleUnits.
220 Error loadClangModule(ObjFileLoaderTy Loader, const DWARFDie &CUDie,
221 const std::string &PCMFile,
222 CompileUnitHandlerTy OnCUDieLoaded,
223 unsigned Indent = 0);
224
225 /// Computes the total size of the debug info.
227 uint64_t Size = 0;
228
229 if (InputDWARFFile.Dwarf == nullptr)
230 return Size;
231
232 for (auto &Unit : InputDWARFFile.Dwarf->compile_units())
233 Size += Unit->getLength();
234
235 return Size;
236 }
237
238 /// Section + local offset of a .debug_frame CIE that has been (or will
239 /// be) emitted by some LinkContext. Stored in CIERegistry so that any
240 /// FDE referencing the same CIE bytes can resolve its CIE_pointer to
241 /// OwnerSection->StartOffset + LocalOffset at output time, even when
242 /// the FDE lives in a different LinkContext's section.
247
248 /// Linker-wide registry for .debug_frame CIEs. The key is the raw CIE
249 /// bytes. Populated by a serial pass over ObjectContexts (so ownership
250 /// is deterministic — first LinkContext wins) and then consumed
251 /// read-only by a parallel emission pass that writes each context's
252 /// .debug_frame section. SectionDescriptor pointers remain valid until
253 /// linking completes because they live in std::map-held shared_ptrs.
255
256 /// Result of scanning one LinkContext's input .debug_frame. Produced
257 /// by scanFrameData() during the parallel link phase and consumed by
258 /// the serial CIE-registry merge and parallel emission passes. Owns a
259 /// copy of the raw frame bytes so the StringRef views below remain
260 /// valid after the input DWARFContext is unloaded.
262 /// Owning copy of the input .debug_frame bytes.
264
265 /// Address size of the input object, used by emitFDE to size the
266 /// FDE's initial_location field.
267 unsigned AddressSize = 0;
268
269 /// Unique CIEs referenced by at least one retained FDE in this
270 /// context, in first-reference order. Each element is a view into
271 /// FrameData and is a key into the linker-wide CIERegistry.
273
274 /// FDEs retained for emission. CIEBytes is the registry key;
275 /// Instructions is the FDE body after the initial_length /
276 /// CIE_pointer / initial_location fields.
283
284 /// CIEs this context owns, set during the serial CIE-registry
285 /// merge. Emission writes these at local offsets 0,
286 /// OwnedCIEs[0].size(), ... in order.
288 };
289 std::unique_ptr<FrameScanResult> FrameScan;
290
291 /// Link compile units for this context.
293
294 /// Link specified compile unit until specified stage.
298
299 /// Emit invariant sections.
301
302 /// Unload the input DWARFContext after scanning the input .debug_frame into
303 /// FrameScan.
305
306 /// Parse this context's input .debug_frame into FrameScan. Deferred
307 /// CIE/FDE emission happens later against the scan result alone.
309
310 /// Register this context's CIEs with the linker-wide registry.
311 void registerCIEs(CIERegistry &CIEs);
312
313 /// Emit this context's .debug_frame section. Safe to call in parallel
314 /// across contexts because each call writes only to its own
315 /// SectionDescriptor.
316 Error emitDebugFrame(const CIERegistry &CIEs);
317
318 /// Emit FDE record.
319 void emitFDE(uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address,
320 StringRef FDEBytes, SectionDescriptor &Section);
321
323 [&](uint64_t Offset) -> CompileUnit * {
324 auto CU = llvm::upper_bound(
326 [](uint64_t LHS, const std::unique_ptr<CompileUnit> &RHS) {
327 return LHS < RHS->getOrigUnit().getNextUnitOffset();
328 });
329
330 return CU != CompileUnits.end() ? CU->get() : nullptr;
331 };
332 };
333
334 /// Enumerate all compile units and assign offsets to their sections and
335 /// strings.
336 void assignOffsets();
337
338 /// Enumerate all compile units and assign offsets to their sections.
340
341 /// Enumerate all compile units and assign offsets to their strings.
343
344 /// Print statistic for processed Debug Info.
345 void printStatistic();
346
348
349 /// Enumerates all strings.
352 StringHandler);
353
354 /// Enumerates sections for modules, invariant for object files, compile
355 /// units.
357 function_ref<void(OutputSections &SectionsSet)> SectionsSetHandler);
358
359 /// Enumerates all compile and type units.
360 void forEachCompileAndTypeUnit(function_ref<void(DwarfUnit *CU)> UnitHandler);
361
362 /// Enumerates all comple units.
363 void forEachCompileUnit(function_ref<void(CompileUnit *CU)> UnitHandler);
364
365 /// Enumerates all patches and update them with the correct values.
367
368 /// Emit debug sections common for all input files.
370
371 /// Emit apple accelerator sections.
372 void emitAppleAcceleratorSections(const Triple &TargetTriple);
373
374 /// Emit .debug_names section.
375 void emitDWARFv5DebugNamesSection(const Triple &TargetTriple);
376
377 /// Emit string sections.
378 void emitStringSections();
379
380 /// Cleanup data(string pools) after output sections are generated.
382
383 /// Enumerate all compile units and put their data into the output stream.
385
386 /// Enumerate common sections and put their data into the output stream.
388
389 /// The object file index given to every clang module unit. It sorts below
390 /// every object file's, which makes a module unit outrank all of them: the
391 /// definition a module gives of what it defines wins over the copy an
392 /// importer carries.
393 static constexpr uint64_t ModuleUnitObjFileIdx = 0;
394
395 /// Object file indices follow the module units'.
397
398 /// \defgroup Data members accessed asinchroniously.
399 ///
400 /// @{
401
402 /// Unique ID for compile unit.
403 std::atomic<size_t> UniqueUnitID;
404
405 /// Mapping the PCM filename to the DwoId. Only ever touched from
406 /// addObjectFile(), which runs serially, so it needs no synchronization.
408
409 /// Numbers the clang module units of the whole link, so that they form one
410 /// priority sequence regardless of which object file referenced a .pcm first.
412
413 /// Type unit.
414 std::unique_ptr<TypeUnit> ArtificialTypeUnit;
415 /// @}
416
417 /// \defgroup Data members accessed sequentially.
418 ///
419 /// @{
420 /// Data global for the whole linking process.
422
423 /// DwarfStringPoolEntries for .debug_str section.
425
426 /// DwarfStringPoolEntries for .debug_line_str section.
428
429 /// Keeps all linking contexts.
431
432 /// Common sections.
434
435 /// Hanler for output sections.
437
438 /// Thread pool that links the object files, or null to use a private pool.
440 /// @}
441};
442
443} // end of namespace parallel
444} // end of namespace dwarf_linker
445} // end of namespace llvm
446
447#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERIMPL_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
This file contains support for writing accelerator tables.
static fatal_error_handler_t ErrorHandler
ppc ctr loops PowerPC CTR Loops Verify
This file defines the SmallString class.
Value * RHS
Value * LHS
Utility class that carries the DWARF compile/type unit and the debug info entry in an object.
Definition DWARFDie.h:43
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:129
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
This defines the abstract base interface for a ThreadPool allowing asynchronous parallel execution on...
Definition ThreadPool.h:51
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
This class represents DWARF information for source file and it's address map.
Definition DWARFFile.h:25
std::map< std::string, std::string > ObjectPrefixMapTy
function_ref< void(const DWARFUnit &Unit)> CompileUnitHandlerTy
std::function< void( const Twine &Warning, StringRef Context, const DWARFDie *DIE)> MessageHandlerTy
AccelTableKind
The kind of accelerator tables to be emitted.
std::map< std::string, std::string > SwiftInterfacesMapTy
std::function< ErrorOr< DWARFFile & >( StringRef ContainerName, StringRef Path)> ObjFileLoaderTy
std::function< void(const DWARFFile &File, llvm::StringRef Output)> InputVerificationHandlerTy
Stores all information related to a compile unit, be it in its original instance of the object file o...
Stage
The stages of new compile unit processing.
@ Cleaned
Resources(Input DWARF, Output DWARF tree) are released.
void forEachObjectSectionsSet(function_ref< void(OutputSections &SectionsSet)> SectionsSetHandler)
Enumerates sections for modules, invariant for object files, compile units.
void emitDWARFv5DebugNamesSection(const Triple &TargetTriple)
Emit .debug_names section.
static constexpr uint64_t ModuleUnitObjFileIdx
The object file index given to every clang module unit.
void writeCompileUnitsToTheOutput()
Enumerate all compile units and put their data into the output stream.
void forEachCompileUnit(function_ref< void(CompileUnit *CU)> UnitHandler)
Enumerates all comple units.
void assignOffsetsToStrings()
Enumerate all compile units and assign offsets to their strings.
void assignOffsets()
Enumerate all compile units and assign offsets to their sections and strings.
Error link() override
Link debug info for added files.
Error validateAndUpdateOptions()
Validate specified options.
void writeCommonSectionsToTheOutput()
Enumerate common sections and put their data into the output stream.
void assignOffsetsToSections()
Enumerate all compile units and assign offsets to their sections.
void printStatistic()
Print statistic for processed Debug Info.
void glueCompileUnitsAndWriteToTheOutput()
Take already linked compile units and glue them into single file.
void emitAppleAcceleratorSections(const Triple &TargetTriple)
Emit apple accelerator sections.
void verifyInput(const DWARFFile &File)
Verify input DWARF file.
void forEachCompileAndTypeUnit(function_ref< void(DwarfUnit *CU)> UnitHandler)
Enumerates all compile and type units.
DWARFLinkerImpl(MessageHandlerTy ErrorHandler, MessageHandlerTy WarningHandler)
void addObjectFile(DWARFFile &File, ObjFileLoaderTy Loader=nullptr, CompileUnitHandlerTy OnCUDieLoaded=[](const DWARFUnit &) {}) override
Add object file to be linked.
void cleanupDataAfterDWARFOutputIsWritten()
Cleanup data(string pools) after output sections are generated.
void forEachOutputString(function_ref< void(StringDestinationKind, const StringEntry *)> StringHandler)
Enumerates all strings.
void setOutputDWARFHandler(const Triple &TargetTriple, SectionHandlerTy SectionHandler) override
Set output DWARF handler.
static constexpr uint64_t FirstObjFileIdx
Object file indices follow the module units'.
void emitCommonSectionsAndWriteCompileUnitsToTheOutput()
Emit debug sections common for all input files.
void patchOffsetsAndSizes()
Enumerates all patches and update them with the correct values.
Base class for all Dwarf units(Compile unit/Type table unit).
This class keeps data and services common for the whole linking process.
This class keeps contents and offsets to the debug sections.
OutputSections(LinkingGlobalData &GlobalData)
This class creates a DwarfStringPoolEntry for the corresponding StringEntry.
Type Unit is used to represent an artificial compilation unit which keeps all type information.
An efficient, type-erasing, non-owning reference to a callable.
ThreadPoolInterface * ThreadPool
Thread pool that links the object files, or null to use a private pool.
std::atomic< size_t > UniqueUnitID
Unique ID for compile unit.
SmallVector< std::unique_ptr< LinkContext > > ObjectContexts
Keeps all linking contexts.
StringEntryToDwarfStringPoolEntryMap DebugLineStrStrings
DwarfStringPoolEntries for .debug_line_str section.
SectionHandlerTy SectionHandler
Hanler for output sections.
std::unique_ptr< TypeUnit > ArtificialTypeUnit
Type unit.
StringEntryToDwarfStringPoolEntryMap DebugStrStrings
DwarfStringPoolEntries for .debug_str section.
uint64_t ModuleUnitIdx
Numbers the clang module units of the whole link, so that they form one priority sequence regardless ...
OutputSections CommonSections
Common sections.
StringMap< uint64_t > ClangModules
Mapping the PCM filename to the DwoId.
void setNumThreads(unsigned NumThreads) override
Use specified number of threads for parallel files linking.
Error setTargetDWARFVersion(uint16_t TargetDWARFVersion) override
Set target DWARF version.
void setThreadPool(ThreadPoolInterface *Pool) override
Use the specified thread pool to link the object files.
void setVerbosity(bool Verbose) override
Allows to generate log of linking process to the standard output.
void setInputVerificationHandler(InputVerificationHandlerTy Handler) override
Set verification handler which would be used to report verification errors.
void setObjectPrefixMap(ObjectPrefixMapTy *Map) override
Set prefix map for objects.
void addAccelTableKind(AccelTableKind Kind) override
Add kind of accelerator tables to be generated.
void setVerifyInputDWARF(bool Verify) override
Verify the input DWARF.
void setKeepFunctionForStatic(bool KeepFunctionForStatic) override
Set to keep the enclosing function for a static variable.
void setUpdateIndexTablesOnly(bool UpdateIndexTablesOnly) override
Update index tables only(do not modify rest of DWARF).
void setSwiftInterfacesMap(SwiftInterfacesMapTy *Map) override
Set map for Swift interfaces.
void setStatistics(bool Statistics) override
Print statistics to standard output.
void setNoODR(bool NoODR) override
Do not unique types according to ODR.
void setPrependPath(StringRef Ppath) override
Set prepend path for clang modules.
void setEstimatedObjfilesAmount(unsigned ObjFilesNum) override
Set estimated objects files amount, for preliminary data allocation.
std::function< void(std::shared_ptr< SectionDescriptorBase > Section)> SectionHandlerTy
StringMapEntry< EmptyStringSetTag > StringEntry
StringEntry keeps data of the string: the length, external offset and a string body which is placed r...
Definition StringPool.h:23
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2065
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Hold the input and output of the debug info size in bytes.
Section + local offset of a .debug_frame CIE that has been (or will be) emitted by some LinkContext.
Result of scanning one LinkContext's input .debug_frame.
SmallString< 0 > FrameData
Owning copy of the input .debug_frame bytes.
SmallVector< StringRef > OwnedCIEs
CIEs this context owns, set during the serial CIE-registry merge.
SmallVector< StringRef > CIEs
Unique CIEs referenced by at least one retained FDE in this context, in first-reference order.
unsigned AddressSize
Address size of the input object, used by emitFDE to size the FDE's initial_location field.
uint64_t getInputDebugInfoSize() const
Computes the total size of the debug info.
bool InterCUProcessingStarted
Flag indicating that all inter-connected units are loaded and the dwarf linking process for these uni...
bool registerModuleReference(const DWARFDie &CUDie, ObjFileLoaderTy Loader, CompileUnitHandlerTy OnCUDieLoaded, unsigned Indent=0)
If this compile unit is really a skeleton CU that points to a clang module, register it in ClangModul...
Error loadClangModule(ObjFileLoaderTy Loader, const DWARFDie &CUDie, const std::string &PCMFile, CompileUnitHandlerTy OnCUDieLoaded, unsigned Indent=0)
Recursively add the debug info in this clang module .pcm file (and all the modules imported by it in ...
LinkContext(LinkingGlobalData &GlobalData, DWARFFile &File, uint64_t ObjFileIdx, StringMap< uint64_t > &ClangModules, uint64_t &ModuleUnitIdx, std::atomic< size_t > &UniqueUnitID)
Error scanFrameData()
Parse this context's input .debug_frame into FrameScan.
uint64_t OriginalDebugInfoSize
Size of Debug info before optimizing.
std::pair< bool, bool > isClangModuleRef(const DWARFDie &CUDie, std::string &PCMFile, unsigned Indent, bool Quiet)
Check whether specified CUDie is a Clang module reference.
void emitFDE(uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address, StringRef FDEBytes, SectionDescriptor &Section)
Emit FDE record.
UnitListTy CompileUnits
Set of Compilation Units(may be accessed asynchroniously for reading).
SmallVector< std::unique_ptr< CompileUnit > > UnitListTy
void linkSingleCompileUnit(CompileUnit &CU, TypeUnit *ArtificialTypeUnit, enum CompileUnit::Stage DoUntilStage=CompileUnit::Stage::Cleaned)
Link specified compile unit until specified stage.
UnitListTy ModulesCompileUnits
Set of Compile Units for modules.
void registerCIEs(CIERegistry &CIEs)
Register this context's CIEs with the linker-wide registry.
std::atomic< bool > HasNewInterconnectedCUs
Flag indicating that new inter-connected compilation units were discovered.
Error emitDebugFrame(const CIERegistry &CIEs)
Emit this context's .debug_frame section.
std::atomic< size_t > & UniqueUnitID
Counter for compile units ID.
StringMap< CIELocation > CIERegistry
Linker-wide registry for .debug_frame CIEs.
Error unloadInput()
Unload the input DWARFContext after scanning the input .debug_frame into FrameScan.
uint64_t ObjectFileIdx
Index of this object file in the link order (used for deterministic type DIE allocation).
std::function< CompileUnit *(uint64_t)> getUnitForOffset
This structure is used to keep data of the concrete section.