187 lines · c
1//===- DIEAttributeCloner.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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H10#define LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H11 12#include "ArrayList.h"13#include "DIEGenerator.h"14#include "DWARFLinkerCompileUnit.h"15#include "DWARFLinkerGlobalData.h"16#include "DWARFLinkerTypeUnit.h"17 18namespace llvm {19namespace dwarf_linker {20namespace parallel {21 22/// Information gathered and exchanged between the various23/// clone*Attr helpers about the attributes of a particular DIE.24struct AttributesInfo {25 /// Short Name.26 StringEntry *Name = nullptr;27 28 /// Mangled Name.29 StringEntry *MangledName = nullptr;30 31 /// Does the DIE have an address pointing to live code section?32 bool HasLiveAddress = false;33 34 /// Is this DIE only a declaration?35 bool IsDeclaration = false;36 37 /// Does the DIE have a ranges attribute?38 bool HasRanges = false;39 40 /// Does the DIE have a string offset attribute?41 bool HasStringOffsetBaseAttr = false;42};43 44/// This class creates clones of input DIE attributes.45/// It enumerates attributes of input DIE, creates clone for each46/// attribute, adds cloned attribute to the output DIE.47class DIEAttributeCloner {48public:49 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, CompileUnit *OutUnit,50 const DWARFDebugInfoEntry *InputDieEntry,51 DIEGenerator &Generator,52 std::optional<int64_t> FuncAddressAdjustment,53 std::optional<int64_t> VarAddressAdjustment,54 bool HasLocationExpressionAddress)55 : DIEAttributeCloner(OutDIE, InUnit,56 CompileUnit::OutputUnitVariantPtr(OutUnit),57 InputDieEntry, Generator, FuncAddressAdjustment,58 VarAddressAdjustment, HasLocationExpressionAddress) {59 }60 61 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, TypeUnit *OutUnit,62 const DWARFDebugInfoEntry *InputDieEntry,63 DIEGenerator &Generator,64 std::optional<int64_t> FuncAddressAdjustment,65 std::optional<int64_t> VarAddressAdjustment,66 bool HasLocationExpressionAddress)67 : DIEAttributeCloner(OutDIE, InUnit,68 CompileUnit::OutputUnitVariantPtr(OutUnit),69 InputDieEntry, Generator, FuncAddressAdjustment,70 VarAddressAdjustment, HasLocationExpressionAddress) {71 }72 73 /// Clone attributes of input DIE.74 void clone();75 76 /// Create abbreviations for the output DIE after all attributes are cloned.77 unsigned finalizeAbbreviations(bool HasChildrenToClone);78 79 /// Cannot be used concurrently.80 AttributesInfo AttrInfo;81 82 unsigned getOutOffset() { return AttrOutOffset; }83 84protected:85 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit,86 CompileUnit::OutputUnitVariantPtr OutUnit,87 const DWARFDebugInfoEntry *InputDieEntry,88 DIEGenerator &Generator,89 std::optional<int64_t> FuncAddressAdjustment,90 std::optional<int64_t> VarAddressAdjustment,91 bool HasLocationExpressionAddress)92 : OutDIE(OutDIE), InUnit(InUnit), OutUnit(OutUnit),93 DebugInfoOutputSection(94 OutUnit->getSectionDescriptor(DebugSectionKind::DebugInfo)),95 InputDieEntry(InputDieEntry), Generator(Generator),96 FuncAddressAdjustment(FuncAddressAdjustment),97 VarAddressAdjustment(VarAddressAdjustment),98 HasLocationExpressionAddress(HasLocationExpressionAddress) {99 InputDIEIdx = InUnit.getDIEIndex(InputDieEntry);100 101 // Use DW_FORM_strp form for string attributes for DWARF version less than 5102 // or if output unit is type unit and we need to produce deterministic103 // result. (We can not generate deterministic results for debug_str_offsets104 // section when attributes are cloned parallelly).105 Use_DW_FORM_strp =106 (InUnit.getVersion() < 5) ||107 (OutUnit.isTypeUnit() &&108 ((InUnit.getGlobalData().getOptions().Threads != 1) &&109 !InUnit.getGlobalData().getOptions().AllowNonDeterministicOutput));110 }111 112 /// Clone string attribute.113 size_t114 cloneStringAttr(const DWARFFormValue &Val,115 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);116 117 /// Clone attribute referencing another DIE.118 size_t119 cloneDieRefAttr(const DWARFFormValue &Val,120 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);121 122 /// Clone scalar attribute.123 size_t124 cloneScalarAttr(const DWARFFormValue &Val,125 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);126 127 /// Clone block or exprloc attribute.128 size_t129 cloneBlockAttr(const DWARFFormValue &Val,130 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);131 132 /// Clone address attribute.133 size_t134 cloneAddressAttr(const DWARFFormValue &Val,135 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);136 137 /// Returns true if attribute should be skipped.138 bool139 shouldSkipAttribute(DWARFAbbreviationDeclaration::AttributeSpec AttrSpec);140 141 /// Output DIE.142 DIE *OutDIE = nullptr;143 144 /// Input compilation unit.145 CompileUnit &InUnit;146 147 /// Output unit(either "plain" compilation unit, either artificial type unit).148 CompileUnit::OutputUnitVariantPtr OutUnit;149 150 /// .debug_info section descriptor.151 SectionDescriptor &DebugInfoOutputSection;152 153 /// Input DIE entry.154 const DWARFDebugInfoEntry *InputDieEntry = nullptr;155 156 /// Input DIE index.157 uint32_t InputDIEIdx = 0;158 159 /// Output DIE generator.160 DIEGenerator &Generator;161 162 /// Relocation adjustment for the function address ranges.163 std::optional<int64_t> FuncAddressAdjustment;164 165 /// Relocation adjustment for the variable locations.166 std::optional<int64_t> VarAddressAdjustment;167 168 /// Indicates whether InputDieEntry has an location attribute169 /// containg address expression.170 bool HasLocationExpressionAddress = false;171 172 /// Output offset after all attributes.173 unsigned AttrOutOffset = 0;174 175 /// Patches for the cloned attributes.176 OffsetsPtrVector PatchesOffsets;177 178 /// This flag forces using DW_FORM_strp for string attributes.179 bool Use_DW_FORM_strp = false;180};181 182} // end of namespace parallel183} // end of namespace dwarf_linker184} // end of namespace llvm185 186#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H187