LLVM 23.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 /// Keep information for referenced clang module: already loaded DWARF info
162 /// of the clang module and a CompileUnit of the module.
164 RefModuleUnit(DWARFFile &File, std::unique_ptr<CompileUnit> Unit);
166 RefModuleUnit(const RefModuleUnit &) = delete;
167
169 std::unique_ptr<CompileUnit> Unit;
170 };
172
173 /// Object file descriptor.
175
176 /// Set of Compilation Units(may be accessed asynchroniously for reading).
178
179 /// Set of Compile Units for modules.
181
182 /// Index of this object file in the link order (used for deterministic
183 /// type DIE allocation).
185
186 /// Size of Debug info before optimizing.
188
189 /// Flag indicating that all inter-connected units are loaded
190 /// and the dwarf linking process for these units is started.
192
194
195 /// Flag indicating that new inter-connected compilation units were
196 /// discovered. It is used for restarting units processing
197 /// if new inter-connected units were found.
198 std::atomic<bool> HasNewInterconnectedCUs = {false};
199
200 std::atomic<bool> HasNewGlobalDependency = {false};
201
202 /// Counter for compile units ID.
203 std::atomic<size_t> &UniqueUnitID;
204
207 std::atomic<size_t> &UniqueUnitID);
208
209 /// Check whether specified \p CUDie is a Clang module reference.
210 /// if \p Quiet is false then display error messages.
211 /// \return first == true if CUDie is a Clang module reference.
212 /// second == true if module is already loaded.
213 std::pair<bool, bool> isClangModuleRef(const DWARFDie &CUDie,
214 std::string &PCMFile,
215 unsigned Indent, bool Quiet);
216
217 /// If this compile unit is really a skeleton CU that points to a
218 /// clang module, register it in ClangModules and return true.
219 ///
220 /// A skeleton CU is a CU without children, a DW_AT_gnu_dwo_name
221 /// pointing to the module, and a DW_AT_gnu_dwo_id with the module
222 /// hash.
223 bool registerModuleReference(const DWARFDie &CUDie, ObjFileLoaderTy Loader,
224 CompileUnitHandlerTy OnCUDieLoaded,
225 unsigned Indent = 0);
226
227 /// Recursively add the debug info in this clang module .pcm
228 /// file (and all the modules imported by it in a bottom-up fashion)
229 /// to ModuleUnits.
230 Error loadClangModule(ObjFileLoaderTy Loader, const DWARFDie &CUDie,
231 const std::string &PCMFile,
232 CompileUnitHandlerTy OnCUDieLoaded,
233 unsigned Indent = 0);
234
235 /// Add Compile Unit corresponding to the module.
237
238 /// Computes the total size of the debug info.
240 uint64_t Size = 0;
241
242 if (InputDWARFFile.Dwarf == nullptr)
243 return Size;
244
245 for (auto &Unit : InputDWARFFile.Dwarf->compile_units())
246 Size += Unit->getLength();
247
248 return Size;
249 }
250
251 /// Section + local offset of a .debug_frame CIE that has been (or will
252 /// be) emitted by some LinkContext. Stored in CIERegistry so that any
253 /// FDE referencing the same CIE bytes can resolve its CIE_pointer to
254 /// OwnerSection->StartOffset + LocalOffset at output time, even when
255 /// the FDE lives in a different LinkContext's section.
260
261 /// Linker-wide registry for .debug_frame CIEs. The key is the raw CIE
262 /// bytes. Populated by a serial pass over ObjectContexts (so ownership
263 /// is deterministic — first LinkContext wins) and then consumed
264 /// read-only by a parallel emission pass that writes each context's
265 /// .debug_frame section. SectionDescriptor pointers remain valid until
266 /// linking completes because they live in std::map-held shared_ptrs.
268
269 /// Result of scanning one LinkContext's input .debug_frame. Produced
270 /// by scanFrameData() during the parallel link phase and consumed by
271 /// the serial CIE-registry merge and parallel emission passes. Owns a
272 /// copy of the raw frame bytes so the StringRef views below remain
273 /// valid after the input DWARFContext is unloaded.
275 /// Owning copy of the input .debug_frame bytes.
277
278 /// Address size of the input object, used by emitFDE to size the
279 /// FDE's initial_location field.
280 unsigned AddressSize = 0;
281
282 /// Unique CIEs referenced by at least one retained FDE in this
283 /// context, in first-reference order. Each element is a view into
284 /// FrameData and is a key into the linker-wide CIERegistry.
286
287 /// FDEs retained for emission. CIEBytes is the registry key;
288 /// Instructions is the FDE body after the initial_length /
289 /// CIE_pointer / initial_location fields.
296
297 /// CIEs this context owns, set during the serial CIE-registry
298 /// merge. Emission writes these at local offsets 0,
299 /// OwnedCIEs[0].size(), ... in order.
301 };
302 std::unique_ptr<FrameScanResult> FrameScan;
303
304 /// Link compile units for this context.
306
307 /// Link specified compile unit until specified stage.
311
312 /// Emit invariant sections.
314
315 /// Unload the input DWARFContext after scanning the input .debug_frame into
316 /// FrameScan.
318
319 /// Parse this context's input .debug_frame into FrameScan. Deferred
320 /// CIE/FDE emission happens later against the scan result alone.
322
323 /// Register this context's CIEs with the linker-wide registry.
324 void registerCIEs(CIERegistry &CIEs);
325
326 /// Emit this context's .debug_frame section. Safe to call in parallel
327 /// across contexts because each call writes only to its own
328 /// SectionDescriptor.
329 Error emitDebugFrame(const CIERegistry &CIEs);
330
331 /// Emit FDE record.
332 void emitFDE(uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address,
333 StringRef FDEBytes, SectionDescriptor &Section);
334
336 [&](uint64_t Offset) -> CompileUnit * {
337 auto CU = llvm::upper_bound(
339 [](uint64_t LHS, const std::unique_ptr<CompileUnit> &RHS) {
340 return LHS < RHS->getOrigUnit().getNextUnitOffset();
341 });
342
343 return CU != CompileUnits.end() ? CU->get() : nullptr;
344 };
345 };
346
347 /// Enumerate all compile units and assign offsets to their sections and
348 /// strings.
349 void assignOffsets();
350
351 /// Enumerate all compile units and assign offsets to their sections.
353
354 /// Enumerate all compile units and assign offsets to their strings.
356
357 /// Print statistic for processed Debug Info.
358 void printStatistic();
359
361
362 /// Enumerates all strings.
365 StringHandler);
366
367 /// Enumerates sections for modules, invariant for object files, compile
368 /// units.
370 function_ref<void(OutputSections &SectionsSet)> SectionsSetHandler);
371
372 /// Enumerates all compile and type units.
373 void forEachCompileAndTypeUnit(function_ref<void(DwarfUnit *CU)> UnitHandler);
374
375 /// Enumerates all comple units.
376 void forEachCompileUnit(function_ref<void(CompileUnit *CU)> UnitHandler);
377
378 /// Enumerates all patches and update them with the correct values.
380
381 /// Emit debug sections common for all input files.
383
384 /// Emit apple accelerator sections.
385 void emitAppleAcceleratorSections(const Triple &TargetTriple);
386
387 /// Emit .debug_names section.
388 void emitDWARFv5DebugNamesSection(const Triple &TargetTriple);
389
390 /// Emit string sections.
391 void emitStringSections();
392
393 /// Cleanup data(string pools) after output sections are generated.
395
396 /// Enumerate all compile units and put their data into the output stream.
398
399 /// Enumerate common sections and put their data into the output stream.
401
402 /// \defgroup Data members accessed asinchroniously.
403 ///
404 /// @{
405
406 /// Unique ID for compile unit.
407 std::atomic<size_t> UniqueUnitID;
408
409 /// Mapping the PCM filename to the DwoId.
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!")
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:128
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:47
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.
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.
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.
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:558
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
@ Other
Any other memory.
Definition ModRef.h:68
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.
Keep information for referenced clang module: already loaded DWARF info of the clang module and a Com...
RefModuleUnit(DWARFFile &File, std::unique_ptr< CompileUnit > Unit)
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 ...
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 addModulesCompileUnit(RefModuleUnit &&Unit)
Add Compile Unit corresponding to the module.
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.
void registerCIEs(CIERegistry &CIEs)
Register this context's CIEs with the linker-wide registry.
LinkContext(LinkingGlobalData &GlobalData, DWARFFile &File, uint64_t ObjFileIdx, StringMap< uint64_t > &ClangModules, std::atomic< size_t > &UniqueUnitID)
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
ModuleUnitListTy ModulesCompileUnits
Set of Compile Units for modules.
This structure is used to keep data of the concrete section.