[PATCH] D28303: Add iterator support to DWARFDie to allow child DIE iteration.
Greg Clayton via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 5 12:38:34 PST 2017
> On Jan 5, 2017, at 11:33 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
> Looks like it might be missing test coverage for the "skip null" in the iterator ctor.
I have added a test for this that I’ll post in the next diff.
> Also - I'd like a good sense of what's going to happen with the child iteration inconsistency between this and the getChild/Sibling API before this is committed.
DWARFDie::getSibling() will still return a NULL DIE at the end. Iteration won’t. What are you suggesting happen?
We could add a bool to the getSibling() API:
DWARFDie DWARFDie::getSibling(bool IncludeNull = false);
Then we could get rid of the code in DWARFDie::iterator and have it call DWARFDie::getSibling() with false. The DWARFDie::dump would call it with true.
Am I missing something? Let me know what you were thinking.
Greg
>
> On Thu, Jan 5, 2017 at 11:31 AM Greg Clayton <clayborg at gmail.com <mailto:clayborg at gmail.com>> wrote:
>> On Jan 5, 2017, at 10:53 AM, David Blaikie <dblaikie at gmail.com <mailto:dblaikie at gmail.com>> wrote:
>>
>>
>>
>> On Thu, Jan 5, 2017 at 10:46 AM Greg Clayton via Phabricator <reviews at reviews.llvm.org <mailto:reviews at reviews.llvm.org>> wrote:
>> clayborg marked an inline comment as done.
>> clayborg added inline comments.
>>
>>
>> ================
>> Comment at: include/llvm/DebugInfo/DWARF/DWARFDie.h:391
>> + if (Die.isNULL())
>> + Die = DWARFDie();
>> + return *this;
>> ----------------
>> I would rather not tackle reconstituting the NULL Die in this patch.
>>
>> Sure - sorry, didn't mean to suggest doing it in this patch - but potentially frontloading the NULL DIE removal, then committing this patch, rather than creating an inconsistent state.
>>
>> I would rather do that if we remove the NULL dies. I think it is fair to say that when iterating across the children that we skip the NULL DIEs. I can fix the issue where we have only a NULL DIE as the only child.
>>
>> Sure - worst case, could commit this with that fixed & tested, but would want a plan/decision on that inconsistency before committing this so we don't get left in that weird state.
>>
>>
>>
>> ================
>> Comment at: include/llvm/DebugInfo/DWARF/DWARFDie.h:397
>> + bool operator==(const iterator &X) const { return Die == X.Die; }
>> + const DWARFDie *operator->() const { return &Die; }
>> +};
>> ----------------
>> dblaikie wrote:
>> > If you have op* return a reference (as it's meant to to conform to the iterator concept in the C++ standard) do you still need to write op->, or do you get that for free from the facade?
>> If I return a "const DWARFDie &" from operator* I get:
>>
>> ```
>> /Volumes/Data/Users/gclayton/Documents/src/llvm/tot/llvm/include/llvm/ADT/iterator.h:138:12: error: cannot initialize return object of type 'llvm::DWARFDie *' with an rvalue of type 'const llvm::DWARFDie *'
>> ```
>>
>> For the following code in iterator.h:
>>
>> ```
>> PointerT operator->() const {
>> return &static_cast<const DerivedT *>(this)->operator*();
>> }
>> ```
>>
>> If I make operator* return a "DWARFDie &" then it works and I can remove operator->:
>>
>> ```
>> DWARFDie &operator*() const { return const_cast<DWARFDie &>(Die); }
>> ```
>>
>> Without the cast it complains about a const function converting to a non const DWARFDie &. Which solution do you prefer?
>>
>> I think this might be addressable by passing "const DWARFDie" as the last type parameter to the facade helper. Hopefully.
>
> Yep, that did the trick. See latest diff which should be good to go.
>
>>
>>
>> ================
>> Comment at: include/llvm/DebugInfo/DWARF/DWARFDie.h:410-412
>> +inline iterator_range<DWARFDie::iterator> DWARFDie::children() const {
>> + return make_range(begin(), end());
>> +}
>> ----------------
>> dblaikie wrote:
>> > Probably just put this one directly inline in the class, since it can be
>> It can't it needs to know what a DWARFDie::iterator is. I tried but got a compile error.
>>
>> Ah, right - thanks for the explanation, sorry I didn't spot/understand that.
>>
>>
>>
>> https://reviews.llvm.org/D28303 <https://reviews.llvm.org/D28303>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170105/ef8c9640/attachment.html>
More information about the llvm-commits
mailing list