mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-10 05:41:40 +00:00
[RegionInfo] Fix dangling references created by moving RegionInfo objects
Summary: Region objects capture the address of the creating RegionInfo instance. Because the RegionInfo class is movable, moving a RegionInfo object creates dangling references. This patch fixes these references by walking the Regions post-move, and updating references to the new parent. Reviewers: Meinersbur, grosser Reviewed By: Meinersbur, grosser Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D31719 llvm-svn: 301175
This commit is contained in:
parent
3bfc0de252
commit
07010fd961
@ -708,10 +708,24 @@ class RegionInfoBase {
|
||||
/// The top level region.
|
||||
RegionT *TopLevelRegion;
|
||||
|
||||
private:
|
||||
/// Map every BB to the smallest region, that contains BB.
|
||||
BBtoRegionMap BBtoRegion;
|
||||
|
||||
protected:
|
||||
/// \brief Update refences to a RegionInfoT held by the RegionT managed here
|
||||
///
|
||||
/// This is a post-move helper. Regions hold references to the owning
|
||||
/// RegionInfo object. After a move these need to be fixed.
|
||||
template<typename TheRegionT>
|
||||
void updateRegionTree(RegionInfoT &RI, TheRegionT *R) {
|
||||
if (!R)
|
||||
return;
|
||||
R->RI = &RI;
|
||||
for (auto &SubR : *R)
|
||||
updateRegionTree(RI, SubR.get());
|
||||
}
|
||||
|
||||
private:
|
||||
/// \brief Wipe this region tree's state without releasing any resources.
|
||||
///
|
||||
/// This is essentially a post-move helper only. It leaves the object in an
|
||||
@ -879,10 +893,12 @@ public:
|
||||
|
||||
~RegionInfo() override;
|
||||
|
||||
RegionInfo(RegionInfo &&Arg)
|
||||
: Base(std::move(static_cast<Base &>(Arg))) {}
|
||||
RegionInfo(RegionInfo &&Arg) : Base(std::move(static_cast<Base &>(Arg))) {
|
||||
updateRegionTree(*this, TopLevelRegion);
|
||||
}
|
||||
RegionInfo &operator=(RegionInfo &&RHS) {
|
||||
Base::operator=(std::move(static_cast<Base &>(RHS)));
|
||||
updateRegionTree(*this, TopLevelRegion);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user