[PATCH] [DebugInfo] Add a getParent method to DWARFDebugInformationEntryMinimal.
David Blaikie
dblaikie at gmail.com
Sat Jan 17 14:39:48 PST 2015
On Fri, Jan 16, 2015 at 4:16 PM, Frederic Riss <friss at apple.com> wrote:
> Hi samsonov, dblaikie,
>
> The DIE representation of libDebugInfo is designed to be minimal
> (as the class name implies). The information that's there allows
> to walk the DIE tree down, but you can't get back to the root
> from an arbitrary node.
>
> This patch adds this ability with the goal of using it in
> llvm-dsymutil. I could also use this information in dwarfdump
> itself to easily support dumping the full DIE hierarchy of a
> selected DIE when I finally implement a search option.
>
> The added information definitely has a cost: the size of
> the structure is increased by 8 bytes on 64 bits archs
> due to padding and this combined to the added logic makes
> the raw parsing between 5 and 10% slower.
>
> Just for llvm-dsymutil, this is optional. I can gather the
> parent chains in a separate path and store them, but I think
> that the performance/aded functionality benefit is worth
> it. WDYT?
>
I doubt the performance of dwarfdump is terribly important - but I would
imagine the performance of dsymutil will be/is, so it might be worth
looking at the alternatives that don't increase the memory cost of all DIEs?
(I imagine a search query that responds with a path, rather than a node,
would be a reasonable API, for example - but I dunno)
>
> http://reviews.llvm.org/D7025
>
> Files:
> include/llvm/DebugInfo/DWARFDebugInfoEntry.h
> lib/DebugInfo/DWARFUnit.cpp
>
> Index: include/llvm/DebugInfo/DWARFDebugInfoEntry.h
> ===================================================================
> --- include/llvm/DebugInfo/DWARFDebugInfoEntry.h
> +++ include/llvm/DebugInfo/DWARFDebugInfoEntry.h
> @@ -30,13 +30,16 @@
> /// Offset within the .debug_info of the start of this entry.
> uint32_t Offset;
>
> + /// How many to substract to "this" to get the parent.
> + uint32_t ParentIdx;
> +
> /// How many to add to "this" to get the sibling.
> uint32_t SiblingIdx;
>
> const DWARFAbbreviationDeclaration *AbbrevDecl;
> public:
> DWARFDebugInfoEntryMinimal()
> - : Offset(0), SiblingIdx(0), AbbrevDecl(nullptr) {}
> + : Offset(0), ParentIdx(0), SiblingIdx(0), AbbrevDecl(nullptr) {}
>
> void dump(raw_ostream &OS, DWARFUnit *u, unsigned recurseDepth,
> unsigned indent = 0) const;
> @@ -66,6 +69,11 @@
> return SiblingIdx > 0 ? this + SiblingIdx : nullptr;
> }
>
> + // Returns the parent DIE or null if this is the root DIE.
> + const DWARFDebugInfoEntryMinimal *getParent() const {
> + return ParentIdx ? this - ParentIdx : nullptr;
> + }
> +
> // We know we are kept in a vector of contiguous entries, so we know
> // we don't need to store our child pointer, if we have a child it will
> // be the next entry in the list...
> @@ -82,6 +90,15 @@
> SiblingIdx = 0;
> }
>
> + void setParent(const DWARFDebugInfoEntryMinimal *Parent) {
> + if (Parent) {
> + // We know we are kept in a vector of contiguous entries, so we know
> + // our parent will be soewhere before "this".
> + ParentIdx = this - Parent;
> + } else
> + ParentIdx = 0;
> + }
> +
> const DWARFAbbreviationDeclaration *getAbbreviationDeclarationPtr()
> const {
> return AbbrevDecl;
> }
> Index: lib/DebugInfo/DWARFUnit.cpp
> ===================================================================
> --- lib/DebugInfo/DWARFUnit.cpp
> +++ lib/DebugInfo/DWARFUnit.cpp
> @@ -143,12 +143,18 @@
> if (DieArray.size() <= 1)
> return;
>
> - std::vector<DWARFDebugInfoEntryMinimal *> ParentChain;
> + // Make sure the vector is never empty so that we don't have to
> + // check for emptyness inside the loop bellow.
> + std::vector<DWARFDebugInfoEntryMinimal *> ParentChain(1,&DieArray[0]);
> DWARFDebugInfoEntryMinimal *SiblingChain = nullptr;
> for (auto &DIE : DieArray) {
> if (SiblingChain) {
> SiblingChain->setSibling(&DIE);
> }
> + // Note that this will call setParent with itself on the root
> + // node. This will result in a null offset which is handled as 'no
> + // parent'.
> + DIE.setParent(ParentChain.back());
> if (const DWARFAbbreviationDeclaration *AbbrDecl =
> DIE.getAbbreviationDeclarationPtr()) {
> // Normal DIE.
> @@ -165,7 +171,7 @@
> }
> }
> assert(SiblingChain == nullptr || SiblingChain == &DieArray[0]);
> - assert(ParentChain.empty());
> + assert(ParentChain.size() == 1 && ParentChain[0] == &DieArray[0]);
> }
>
> void DWARFUnit::extractDIEsToVector(
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150117/25e5e5cd/attachment.html>
More information about the llvm-commits
mailing list