[llvm] [bolt] A better DIEBuilder for the llvm API change in #98905 (PR #99324)
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 17 06:32:40 PDT 2024
https://github.com/labath created https://github.com/llvm/llvm-project/pull/99324
The caller (cloneAttribute) already switches on the reference type. By aligning the cases with the retrieval functions, we can avoid branching twice.
>From 8f4287e1cc7ffc399c5aff464907edd299ea002f Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Wed, 17 Jul 2024 15:05:15 +0200
Subject: [PATCH] [bolt] A better DIEBuilder for the llvm API change in #98905
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 c562373c718ba..0b840c142ed81 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 7815a305c0518..b0f550fd77318 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<uint64_t> 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<uint64_t> 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<uint64_t> SigVal = Val.getRawUValue();
+ const std::optional<uint64_t> 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:
More information about the llvm-commits
mailing list