LLVM: llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext Struct Reference (original) (raw)
Keeps track of data associated with one object during linking. More...
#include "[DWARFLinker/Parallel/DWARFLinkerImpl.h](DWARFLinkerImpl%5F8h%5Fsource.html)"
| Classes | |
|---|---|
| struct | RefModuleUnit |
| Keep information for referenced clang module: already loaded DWARF info of the clang module and a CompileUnit of the module. More... |
| Public Member Functions | |
|---|---|
| LinkContext (LinkingGlobalData &GlobalData, DWARFFile &File, StringMap< uint64_t > &ClangModules, std::atomic< size_t > &UniqueUnitID) | |
| std::pair< bool, bool > | isClangModuleRef (const DWARFDie &CUDie, std::string &PCMFile, unsigned Indent, bool Quiet) |
| Check whether specified CUDie is a Clang module reference. | |
| 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 ClangModules and return true. | |
| 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 a bottom-up fashion) to ModuleUnits. | |
| void | addModulesCompileUnit (RefModuleUnit &&Unit) |
| Add Compile Unit corresponding to the module. | |
| uint64_t | getInputDebugInfoSize () const |
| Computes the total size of the debug info. | |
| Error | link (TypeUnit *ArtificialTypeUnit) |
| Link compile units for this context. | |
| void | linkSingleCompileUnit (CompileUnit &CU, TypeUnit *ArtificialTypeUnit, enum CompileUnit::Stage DoUntilStage=CompileUnit::Stage::Cleaned) |
| Link specified compile unit until specified stage. | |
| Error | emitInvariantSections () |
| Emit invariant sections. | |
| Error | cloneAndEmitDebugFrame () |
| Clone and emit .debug_frame. | |
| void | emitFDE (uint32_t CIEOffset, uint32_t AddrSize, uint64_t Address, StringRef FDEBytes, SectionDescriptor &Section) |
| Emit FDE record. | |
| Public Member Functions inherited from llvm::dwarf_linker::parallel::OutputSections | |
| OutputSections (LinkingGlobalData &GlobalData) | |
| void | setOutputFormat (dwarf::FormParams Format, llvm::endianness Endianness) |
| Sets output format for all keeping sections. | |
| const SectionDescriptor & | getSectionDescriptor (DebugSectionKind SectionKind) const |
| Returns descriptor for the specified section of SectionKind. | |
| SectionDescriptor & | getSectionDescriptor (DebugSectionKind SectionKind) |
| Returns descriptor for the specified section of SectionKind. | |
| std::optional< const SectionDescriptor * > | tryGetSectionDescriptor (DebugSectionKind SectionKind) const |
| Returns descriptor for the specified section of SectionKind. | |
| std::optional< SectionDescriptor * > | tryGetSectionDescriptor (DebugSectionKind SectionKind) |
| Returns descriptor for the specified section of SectionKind. | |
| SectionDescriptor & | getOrCreateSectionDescriptor (DebugSectionKind SectionKind) |
| Returns descriptor for the specified section of SectionKind. | |
| void | eraseSections () |
| Erases data of all sections. | |
| void | forEach (function_ref< void(SectionDescriptor &)> Handler) |
| Enumerate all sections and call Handler for each. | |
| void | forEach (function_ref< void(std::shared_ptr< SectionDescriptor > Section)> Handler) |
| Enumerate all sections and call Handler for each. | |
| void | assignSectionsOffsetAndAccumulateSize (std::array< uint64_t, SectionKindsNum > &SectionSizesAccumulator) |
| Enumerate all sections, for each section set current offset (kept by SectionSizesAccumulator), update current offset with section length. | |
| void | applyPatches (SectionDescriptor &Section, StringEntryToDwarfStringPoolEntryMap &DebugStrStrings, StringEntryToDwarfStringPoolEntryMap &DebugLineStrStrings, TypeUnit *TypeUnitPtr) |
| Enumerate all sections, for each section apply all section patches. | |
| llvm::endianness | getEndianness () const |
| Endiannes for the sections. | |
| uint16_t | getVersion () const |
| Return DWARF version. | |
| uint16_t | getDebugInfoHeaderSize () const |
| Return size of header of debug_info table. | |
| uint16_t | getDebugAddrHeaderSize () const |
| Return size of header of debug_ table. | |
| uint16_t | getDebugStrOffsetsHeaderSize () const |
| Return size of header of debug_str_offsets table. | |
| const dwarf::FormParams & | getFormParams () const |
| Return size of address. |
| Public Attributes | |
|---|---|
| DWARFFile & | InputDWARFFile |
| Object file descriptor. | |
| UnitListTy | CompileUnits |
| Set of Compilation Units(may be accessed asynchroniously for reading). | |
| ModuleUnitListTy | ModulesCompileUnits |
| Set of Compile Units for modules. | |
| uint64_t | OriginalDebugInfoSize = 0 |
| Size of Debug info before optimizing. | |
| bool | InterCUProcessingStarted = false |
| Flag indicating that all inter-connected units are loaded and the dwarf linking process for these units is started. | |
| StringMap< uint64_t > & | ClangModules |
| std::atomic< bool > | HasNewInterconnectedCUs = {false} |
| Flag indicating that new inter-connected compilation units were discovered. | |
| std::atomic< bool > | HasNewGlobalDependency = {false} |
| std::atomic< size_t > & | UniqueUnitID |
| Counter for compile units ID. | |
| std::function< CompileUnit *(uint64_t)> | getUnitForOffset |
| Additional Inherited Members | |
|---|---|
| Protected Types inherited from llvm::dwarf_linker::parallel::OutputSections | |
| using | SectionsSetTy |
| All keeping sections. | |
| Protected Attributes inherited from llvm::dwarf_linker::parallel::OutputSections | |
| LinkingGlobalData & | GlobalData |
| dwarf::FormParams | Format = {4, 4, dwarf::DWARF32} |
| Format for sections. | |
| llvm::endianness | Endianness = llvm::endianness::native |
| Endiannes for sections. | |
| SectionsSetTy | SectionDescriptors |
Keeps track of data associated with one object during linking.
i.e. source file descriptor, compilation units, output data for compilation units common tables.
Definition at line 161 of file DWARFLinkerImpl.h.
◆ ModuleUnitListTy
◆ UnitListTy
◆ addModulesCompileUnit()
◆ cloneAndEmitDebugFrame()
| Error DWARFLinkerImpl::LinkContext::cloneAndEmitDebugFrame | ( | ) |
|---|
Clone and emit .debug_frame.
The CIEs that have been emitted in the output section. The actual CIE data serves a the key to this [StringMap](classllvm%5F1%5F1StringMap.html "StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...").
Definition at line 730 of file DWARFLinkerImpl.cpp.
References CompileUnits, llvm::createFileError(), llvm::createStringError(), llvm::Data, llvm::DWARFSection::Data, llvm::dwarf_linker::DebugFrame, emitFDE(), llvm::StringRef::empty(), llvm::DWARFObject::getAddressSize(), llvm::DWARFObject::getFileName(), llvm::DWARFObject::getFrameSection(), llvm::dwarf_linker::parallel::OutputSections::getOrCreateSectionDescriptor(), llvm::AddressRangesBase< T >::getRangeThatContains(), llvm::dwarf_linker::parallel::OutputSections::GlobalData, InputDWARFFile, llvm::AddressRangesMap::insert(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), llvm::DWARFObject::isLittleEndian(), llvm::dwarf_linker::parallel::SectionDescriptor::OS, Range, llvm::StringRef::substr(), llvm::Error::success(), and llvm::raw_ostream::tell().
Referenced by link().
◆ emitFDE()
◆ emitInvariantSections()
| Error DWARFLinkerImpl::LinkContext::emitInvariantSections | ( | ) |
|---|
Emit invariant sections.
Definition at line 708 of file DWARFLinkerImpl.cpp.
References llvm::dwarf_linker::DebugAddr, llvm::dwarf_linker::DebugARanges, llvm::dwarf_linker::DebugFrame, llvm::dwarf_linker::DebugLoc, llvm::dwarf_linker::DebugLocLists, llvm::dwarf_linker::DebugRange, llvm::dwarf_linker::DebugRngLists, llvm::dwarf_linker::parallel::OutputSections::getOrCreateSectionDescriptor(), llvm::dwarf_linker::parallel::OutputSections::GlobalData, InputDWARFFile, llvm::dwarf_linker::parallel::SectionDescriptor::OS, and llvm::Error::success().
Referenced by link().
◆ getInputDebugInfoSize()
| uint64_t llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::getInputDebugInfoSize ( ) const | inline |
|---|
◆ isClangModuleRef()
◆ link()
| Error DWARFLinkerImpl::LinkContext::link | ( | TypeUnit * | ArtificialTypeUnit | ) |
|---|
Link compile units for this context.
Definition at line 446 of file DWARFLinkerImpl.cpp.
References llvm::dwarf_linker::parallel::DWARFLinkerImpl::ArtificialTypeUnit, llvm::dwarf_linker::parallel::CompileUnit::Cleaned, cloneAndEmitDebugFrame(), llvm::dwarf_linker::parallel::CompileUnit::Cloned, CompileUnits, emitInvariantSections(), llvm::dwarf_linker::finiteLoop(), llvm::dwarf_linker::parallel::OutputSections::getEndianness(), getInputDebugInfoSize(), llvm::getPCMFile(), getUnitForOffset, llvm::dwarf_linker::parallel::OutputSections::GlobalData, HasNewGlobalDependency, HasNewInterconnectedCUs, InputDWARFFile, InterCUProcessingStarted, isClangModuleRef(), linkSingleCompileUnit(), llvm::dwarf_linker::parallel::CompileUnit::LivenessAnalysisDone, llvm::dwarf_linker::parallel::CompileUnit::Loaded, ModulesCompileUnits, OriginalDebugInfoSize, llvm::outs(), llvm::parallelForEach(), llvm::dwarf_linker::parallel::CompileUnit::PatchesUpdated, llvm::parallel::TaskGroup::spawn(), llvm::Error::success(), llvm::dwarf_linker::parallel::CompileUnit::TypeNamesAssigned, UniqueUnitID, llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::RefModuleUnit::Unit, and llvm::dwarf_linker::parallel::CompileUnit::UpdateDependenciesCompleteness.
◆ linkSingleCompileUnit()
Link specified compile unit until specified stage.
Definition at line 590 of file DWARFLinkerImpl.cpp.
References llvm::dwarf_linker::parallel::DWARFLinkerImpl::ArtificialTypeUnit, assert(), llvm::dwarf_linker::parallel::CompileUnit::Cleaned, llvm::dwarf_linker::parallel::CompileUnit::Cloned, llvm::dwarf_linker::parallel::CompileUnit::CreatedNotLoaded, llvm::dwarf_linker::finiteLoop(), llvm::dwarf_linker::parallel::OutputSections::GlobalData, HasNewGlobalDependency, HasNewInterconnectedCUs, InterCUProcessingStarted, llvm::dwarf_linker::parallel::CompileUnit::LivenessAnalysisDone, llvm::dwarf_linker::parallel::CompileUnit::Loaded, llvm::dwarf_linker::parallel::CompileUnit::PatchesUpdated, registerModuleReference(), llvm::dwarf_linker::parallel::CompileUnit::Skipped, llvm::dwarf_linker::parallel::CompileUnit::TypeNamesAssigned, and llvm::dwarf_linker::parallel::CompileUnit::UpdateDependenciesCompleteness.
Referenced by link().
◆ loadClangModule()
Recursively add the debug info in this clang module .pcm file (and all the modules imported by it in a bottom-up fashion) to ModuleUnits.
Using a SmallString<0> because loadClangModule() is recursive.
Definition at line 371 of file DWARFLinkerImpl.cpp.
References llvm::sys::path::append(), ClangModules, llvm::DWARFDie::find(), llvm::getDwoId(), llvm::dwarf_linker::parallel::OutputSections::getEndianness(), getUnitForOffset, llvm::dwarf_linker::parallel::OutputSections::GlobalData, llvm::inconvertibleErrorCode(), InputDWARFFile, llvm::sys::path::is_relative(), llvm::make_error(), ModulesCompileUnits, registerModuleReference(), llvm::resolveRelativeObjectPath(), llvm::Error::success(), llvm::dwarf::toString(), and UniqueUnitID.
Referenced by registerModuleReference().
◆ registerModuleReference()
If this compile unit is really a skeleton CU that points to a clang module, register it in ClangModules and return true.
A skeleton CU is a CU without children, a DW_AT_gnu_dwo_name pointing to the module, and a DW_AT_gnu_dwo_id with the module hash.
Definition at line 342 of file DWARFLinkerImpl.cpp.
References ClangModules, llvm::consumeError(), llvm::getDwoId(), llvm::getPCMFile(), llvm::dwarf_linker::parallel::OutputSections::GlobalData, isClangModuleRef(), loadClangModule(), and llvm::outs().
Referenced by linkSingleCompileUnit(), and loadClangModule().
◆ ClangModules
StringMap<uint64_t>& llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::ClangModules
◆ CompileUnits
UnitListTy llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::CompileUnits
◆ getUnitForOffset
std::function<CompileUnit *(uint64_t)> llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::getUnitForOffset
Initial value:
=
[](uint64_t LHS, const std::unique_ptr &RHS) {
return LHS < RHS->getOrigUnit().getNextUnitOffset();
});
return CU != CompileUnits.end() ? CU->get() : nullptr;
}
Stores all information related to a compile unit, be it in its original instance of the object file o...
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
UnitListTy CompileUnits
Set of Compilation Units(may be accessed asynchroniously for reading).
Definition at line 268 of file DWARFLinkerImpl.h.
Referenced by link(), and loadClangModule().
◆ HasNewGlobalDependency
std::atomic<bool> llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::HasNewGlobalDependency = {false}
◆ HasNewInterconnectedCUs
std::atomic<bool> llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::HasNewInterconnectedCUs = {false}
Flag indicating that new inter-connected compilation units were discovered.
It is used for restarting units processing if new inter-connected units were found.
Definition at line 197 of file DWARFLinkerImpl.h.
Referenced by link(), and linkSingleCompileUnit().
◆ InputDWARFFile
DWARFFile& llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::InputDWARFFile
◆ InterCUProcessingStarted
bool llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::InterCUProcessingStarted = false
◆ ModulesCompileUnits
ModuleUnitListTy llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::ModulesCompileUnits
◆ OriginalDebugInfoSize
uint64_t llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::OriginalDebugInfoSize = 0
◆ UniqueUnitID
std::atomic<size_t>& llvm::dwarf_linker::parallel::DWARFLinkerImpl::LinkContext::UniqueUnitID
The documentation for this struct was generated from the following files:
- lib/DWARFLinker/Parallel/DWARFLinkerImpl.h
- lib/DWARFLinker/Parallel/DWARFLinkerImpl.cpp