From 09cbb45edd149d30766c87be4628e4df13f3496d Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Thu, 18 Jul 2024 09:46:29 +0200 Subject: [PATCH] [BOLT][DWARF][NFC] A better DIEBuilder for the llvm API change in #98905 (#99324) The caller (cloneAttribute) already switches on the reference type. By aligning the cases with the retrieval functions, we can avoid branching twice. --- bolt/include/bolt/Core/DIEBuilder.h | 12 ++------ bolt/lib/Core/DIEBuilder.cpp | 43 +++++++---------------------- 2 files changed, 12 insertions(+), 43 deletions(-) diff --git a/bolt/include/bolt/Core/DIEBuilder.h b/bolt/include/bolt/Core/DIEBuilder.h index c562373c718baf..0b840c142ed812 100644 --- a/bolt/include/bolt/Core/DIEBuilder.h +++ b/bolt/include/bolt/Core/DIEBuilder.h @@ -135,13 +135,6 @@ class DIEBuilder { /// Returns current state of the DIEBuilder State &getState() { return *BuilderState.get(); } - /// Resolve the reference in DIE, if target is not loaded into IR, - /// pre-allocate it. \p RefCU will be updated to the Unit specific by \p - /// RefValue. - DWARFDie resolveDIEReference( - const DWARFFormValue &RefValue, - const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, - DWARFUnit *&RefCU, DWARFDebugInfoEntry &DwarfDebugInfoEntry); /// Resolve the reference in DIE, if target is not loaded into IR, /// pre-allocate it. \p RefCU will be updated to the Unit specific by \p @@ -165,10 +158,9 @@ class DIEBuilder { const DWARFFormValue &Val); /// Clone an attribute in reference format. - void cloneDieReferenceAttribute( + void cloneDieOffsetReferenceAttribute( DIE &Die, const DWARFUnit &U, const DWARFDie &InputDIE, - const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, - const DWARFFormValue &Val); + const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, uint64_t Ref); /// Clone an attribute in block format. void cloneBlockAttribute( diff --git a/bolt/lib/Core/DIEBuilder.cpp b/bolt/lib/Core/DIEBuilder.cpp index 7815a305c05182..b0f550fd77318e 100644 --- a/bolt/lib/Core/DIEBuilder.cpp +++ b/bolt/lib/Core/DIEBuilder.cpp @@ -551,25 +551,6 @@ void DIEBuilder::finish() { updateReferences(); } -DWARFDie DIEBuilder::resolveDIEReference( - const DWARFFormValue &RefValue, - const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, - DWARFUnit *&RefCU, DWARFDebugInfoEntry &DwarfDebugInfoEntry) { - assert(RefValue.isFormClass(DWARFFormValue::FC_Reference)); - uint64_t RefOffset; - if (std::optional Off = RefValue.getAsRelativeReference()) { - RefOffset = RefValue.getUnit()->getOffset() + *Off; - } else if (Off = RefValue.getAsDebugInfoReference(); Off) { - RefOffset = *Off; - } else { - BC.errs() - << "BOLT-WARNING: [internal-dwarf-error]: unsupported reference type: " - << FormEncodingString(RefValue.getForm()) << ".\n"; - return DWARFDie(); - } - return resolveDIEReference(AttrSpec, RefOffset, RefCU, DwarfDebugInfoEntry); -} - DWARFDie DIEBuilder::resolveDIEReference( const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, const uint64_t RefOffset, DWARFUnit *&RefCU, @@ -613,23 +594,14 @@ DWARFDie DIEBuilder::resolveDIEReference( return DWARFDie(); } -void DIEBuilder::cloneDieReferenceAttribute( +void DIEBuilder::cloneDieOffsetReferenceAttribute( DIE &Die, const DWARFUnit &U, const DWARFDie &InputDIE, - const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, - const DWARFFormValue &Val) { - uint64_t Ref; - if (std::optional Off = Val.getAsRelativeReference()) - Ref = Val.getUnit()->getOffset() + *Off; - else if (Off = Val.getAsDebugInfoReference(); Off) - Ref = *Off; - else - return; - + const DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, uint64_t Ref) { DIE *NewRefDie = nullptr; DWARFUnit *RefUnit = nullptr; DWARFDebugInfoEntry DDIEntry; - const DWARFDie RefDie = resolveDIEReference(Val, AttrSpec, RefUnit, DDIEntry); + const DWARFDie RefDie = resolveDIEReference(AttrSpec, Ref, RefUnit, DDIEntry); if (!RefDie) return; @@ -834,7 +806,7 @@ void DIEBuilder::cloneAddressAttribute( void DIEBuilder::cloneRefsigAttribute( DIE &Die, DWARFAbbreviationDeclaration::AttributeSpec AttrSpec, const DWARFFormValue &Val) { - const std::optional SigVal = Val.getRawUValue(); + const std::optional SigVal = Val.getAsSignatureReference(); Die.addValue(getState().DIEAlloc, AttrSpec.Attr, dwarf::DW_FORM_ref_sig8, DIEInteger(*SigVal)); } @@ -902,11 +874,16 @@ void DIEBuilder::cloneAttribute( cloneStringAttribute(Die, U, AttrSpec, Val); break; case dwarf::DW_FORM_ref_addr: + cloneDieOffsetReferenceAttribute(Die, U, InputDIE, AttrSpec, + *Val.getAsDebugInfoReference()); + break; case dwarf::DW_FORM_ref1: case dwarf::DW_FORM_ref2: case dwarf::DW_FORM_ref4: case dwarf::DW_FORM_ref8: - cloneDieReferenceAttribute(Die, U, InputDIE, AttrSpec, Val); + cloneDieOffsetReferenceAttribute(Die, U, InputDIE, AttrSpec, + Val.getUnit()->getOffset() + + *Val.getAsRelativeReference()); break; case dwarf::DW_FORM_block: case dwarf::DW_FORM_block1: