diff options
| author | Justin Bogner <mail@justinbogner.com> | 2015-12-04 23:00:54 +0000 |
|---|---|---|
| committer | Justin Bogner <mail@justinbogner.com> | 2015-12-04 23:00:54 +0000 |
| commit | a0a9d75e3c0daae6fce15e250b48f3cb0157ad4f (patch) | |
| tree | 0fdaa0957d1d5039056b716e6bed74e3acd813f7 | |
| parent | 5000ce8a632c701aba09ddfa6d4bc33ae1b6f5a5 (diff) | |
| download | bcm5719-llvm-a0a9d75e3c0daae6fce15e250b48f3cb0157ad4f.tar.gz bcm5719-llvm-a0a9d75e3c0daae6fce15e250b48f3cb0157ad4f.zip | |
CodeGen: Move the SlotIndexes BumpPtrAllocator before the list it allocates
When a `SlotIndexes` is destroyed, `ileAllocator` will currently be
destructed before `IndexList`, but all of `IndexList`'s storage has
been allocated by `ileAllocator`. This means we'll call destructors on
garbage data, which is very bad. This can be avoided by putting the
BumpPtrAllocator earlier in the class than anything it allocates.
Unfortunately, I don't know how to test this. It depends very much on
memory layout, and the only evidence I have that this is actually
happening in practice are backtraces that might be explained by this.
By inspection though, the code is obviously dangerous/wrong, and this
is the right thing to do.
I'll follow up later with a patch that calls clearAndLeakNodesUnsafely
on the list, since there isn't much point in destructing them when
they're allocated in a BPA anyway, but I figured it makes sense to
commit the correctness fix separately from that optimization.
llvm-svn: 254794
| -rw-r--r-- | llvm/include/llvm/CodeGen/SlotIndexes.h | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/llvm/include/llvm/CodeGen/SlotIndexes.h b/llvm/include/llvm/CodeGen/SlotIndexes.h index bd3a9062fb9..5dc42e20deb 100644 --- a/llvm/include/llvm/CodeGen/SlotIndexes.h +++ b/llvm/include/llvm/CodeGen/SlotIndexes.h @@ -333,6 +333,8 @@ namespace llvm { /// This pass assigns indexes to each instruction. class SlotIndexes : public MachineFunctionPass { private: + // IndexListEntry allocator. + BumpPtrAllocator ileAllocator; typedef ilist<IndexListEntry> IndexList; IndexList indexList; @@ -353,9 +355,6 @@ namespace llvm { /// and MBB id. SmallVector<IdxMBBPair, 8> idx2MBBMap; - // IndexListEntry allocator. - BumpPtrAllocator ileAllocator; - IndexListEntry* createEntry(MachineInstr *mi, unsigned index) { IndexListEntry *entry = static_cast<IndexListEntry*>( |

