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()

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: