diff options
Diffstat (limited to 'llvm/lib/DWARFLinkerParallel/DIEAttributeCloner.h')
| -rw-r--r-- | llvm/lib/DWARFLinkerParallel/DIEAttributeCloner.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/llvm/lib/DWARFLinkerParallel/DIEAttributeCloner.h b/llvm/lib/DWARFLinkerParallel/DIEAttributeCloner.h new file mode 100644 index 000000000000..e18c0a15cefc --- /dev/null +++ b/llvm/lib/DWARFLinkerParallel/DIEAttributeCloner.h @@ -0,0 +1,184 @@ +//===- DIEAttributeCloner.h -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_DWARFLINKERPARALLEL_DIEATTRIBUTECLONER_H +#define LLVM_LIB_DWARFLINKERPARALLEL_DIEATTRIBUTECLONER_H + +#include "ArrayList.h" +#include "DIEGenerator.h" +#include "DWARFLinkerCompileUnit.h" +#include "DWARFLinkerGlobalData.h" +#include "DWARFLinkerTypeUnit.h" + +namespace llvm { +namespace dwarflinker_parallel { + +/// Information gathered and exchanged between the various +/// clone*Attr helpers about the attributes of a particular DIE. +struct AttributesInfo { + /// Short Name. + StringEntry *Name = nullptr; + + /// Mangled Name. + StringEntry *MangledName = nullptr; + + /// Does the DIE have an address pointing to live code section? + bool HasLiveAddress = false; + + /// Is this DIE only a declaration? + bool IsDeclaration = false; + + /// Does the DIE have a ranges attribute? + bool HasRanges = false; + + /// Does the DIE have a string offset attribute? + bool HasStringOffsetBaseAttr = false; +}; + +/// This class creates clones of input DIE attributes. +/// It enumerates attributes of input DIE, creates clone for each +/// attribute, adds cloned attribute to the output DIE. +class DIEAttributeCloner { +public: + DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, CompileUnit *OutUnit, + const DWARFDebugInfoEntry *InputDieEntry, + DIEGenerator &Generator, + std::optional<int64_t> FuncAddressAdjustment, + std::optional<int64_t> VarAddressAdjustment, + bool HasLocationExpressionAddress) + : DIEAttributeCloner(OutDIE, InUnit, + CompileUnit::OutputUnitVariantPtr(OutUnit), + InputDieEntry, Generator, FuncAddressAdjustment, + VarAddressAdjustment, HasLocationExpressionAddress) { + } + + DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, TypeUnit *OutUnit, + const DWARFDebugInfoEntry *InputDieEntry, + DIEGenerator &Generator, + std::optional<int64_t> FuncAddressAdjustment, + std::optional<int64_t> VarAddressAdjustment, + bool HasLocationExpressionAddress) + : DIEAttributeCloner(OutDIE, InUnit, + CompileUnit::OutputUnitVariantPtr(OutUnit), + InputDieEntry, Generator, FuncAddressAdjustment, + VarAddressAdjustment, HasLocationExpressionAddress) { + } + + /// Clone attributes of input DIE. + void clone(); + + /// Create abbreviations for the output DIE after all attributes are cloned. + unsigned finalizeAbbreviations(bool HasChildrenToClone); + + /// Cannot be used concurrently. + AttributesInfo AttrInfo; + + unsigned getOutOffset() { return AttrOutOffset; } + +protected: + DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, + CompileUnit::OutputUnitVariantPtr OutUnit, + const DWARFDebugInfoEntry *InputDieEntry, + DIEGenerator &Generator, + std::optional<int64_t> FuncAddressAdjustment, + std::optional<int64_t> VarAddressAdjustment, + bool HasLocationExpressionAddress) + : OutDIE(OutDIE), InUnit(InUnit), OutUnit(OutUnit), + DebugInfoOutputSection( + OutUnit->getSectionDescriptor(DebugSectionKind::DebugInfo)), + InputDieEntry(InputDieEntry), Generator(Generator), + FuncAddressAdjustment(FuncAddressAdjustment), + VarAddressAdjustment(VarAddressAdjustment), + HasLocationExpressionAddress(HasLocationExpressionAddress) { + InputDIEIdx = InUnit.getDIEIndex(InputDieEntry); + + // Use DW_FORM_strp form for string attributes for DWARF version less than 5 + // or if output unit is type unit and we need to produce deterministic + // result. (We can not generate deterministic results for debug_str_offsets + // section when attributes are cloned parallelly). + Use_DW_FORM_strp = + (InUnit.getVersion() < 5) || + (OutUnit.isTypeUnit() && + ((InUnit.getGlobalData().getOptions().Threads != 1) && + !InUnit.getGlobalData().getOptions().AllowNonDeterministicOutput)); + } + + /// Clone string attribute. + size_t + cloneStringAttr(const DWARFFormValue &Val, + const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec); + + /// Clone attribute referencing another DIE. + size_t + cloneDieRefAttr(const DWARFFormValue &Val, + const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec); + + /// Clone scalar attribute. + size_t + cloneScalarAttr(const DWARFFormValue &Val, + const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec); + + /// Clone block or exprloc attribute. + size_t + cloneBlockAttr(const DWARFFormValue &Val, + const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec); + + /// Clone address attribute. + size_t + cloneAddressAttr(const DWARFFormValue &Val, + const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec); + + /// Returns true if attribute should be skipped. + bool + shouldSkipAttribute(DWARFAbbreviationDeclaration::AttributeSpec AttrSpec); + + /// Output DIE. + DIE *OutDIE = nullptr; + + /// Input compilation unit. + CompileUnit &InUnit; + + /// Output unit(either "plain" compilation unit, either artificial type unit). + CompileUnit::OutputUnitVariantPtr OutUnit; + + /// .debug_info section descriptor. + SectionDescriptor &DebugInfoOutputSection; + + /// Input DIE entry. + const DWARFDebugInfoEntry *InputDieEntry = nullptr; + + /// Input DIE index. + uint32_t InputDIEIdx = 0; + + /// Output DIE generator. + DIEGenerator &Generator; + + /// Relocation adjustment for the function address ranges. + std::optional<int64_t> FuncAddressAdjustment; + + /// Relocation adjustment for the variable locations. + std::optional<int64_t> VarAddressAdjustment; + + /// Indicates whether InputDieEntry has an location attribute + /// containg address expression. + bool HasLocationExpressionAddress = false; + + /// Output offset after all attributes. + unsigned AttrOutOffset = 0; + + /// Patches for the cloned attributes. + OffsetsPtrVector PatchesOffsets; + + /// This flag forces using DW_FORM_strp for string attributes. + bool Use_DW_FORM_strp = false; +}; + +} // end of namespace dwarflinker_parallel +} // end namespace llvm + +#endif // LLVM_LIB_DWARFLINKERPARALLEL_DIEATTRIBUTECLONER_H |
