HomePhabricator

[DebugInfo] Have custom std::reverse_iterator<DWARFDie>

Description

[DebugInfo] Have custom std::reverse_iterator<DWARFDie>

The DWARFDie is a lightweight utility wrapper that stores a pointer to a
compile unit and a debug info entry. Currently, its iterator (used for
walking over its children) stores a DWARFDie and returns a const
reference when dereferencing it.

When the iterator is modified (by incrementing or decrementing it), this
reference becomes invalid. This was happening when calling reverse on
it, because the std::reverse_iterator is keeping a temporary copy of the
iterator (see
https://en.cppreference.com/w/cpp/iterator/reverse_iterator for a good
illustration).

The relevant code in libcxx:

reference operator*() const {_Iter __tmp = current; return *--__tmp;}

When dereferencing the reverse iterator, we decrement and return a
reference to a DWARFDie stored in the stack frame of this function,
resulting in UB at runtime.

This patch specifies the std::reverse_iterator for DWARFDie to do the
right thing.

Differential revision: https://reviews.llvm.org/D49679

Details

Committed
JDevlieghereAug 1 2018, 3:24 AM
Differential Revision
D49679: [DebugInfo] Have custom std::reverse_iterator<DWARFDie>
Parents
rL338505: [isl++] drop the isl namespace qualifiers [NFC]
Branches
Unknown
Tags
Unknown