diff options
author | Jeremy Morse <jeremy.morse@sony.com> | 2023-12-05 15:41:00 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-05 15:41:00 +0000 |
commit | 71809cfc7ae2fc69b5f6a2069354e74b320ec8d3 (patch) | |
tree | 6ce6e5d5ff168fc54cd02aeeb97d7674595a259e /llvm/lib/IR/BasicBlock.cpp | |
parent | 80fa79609e9adf0e2ccd71b9838d7fdb6ab2d07a (diff) | |
download | llvm-71809cfc7ae2fc69b5f6a2069354e74b320ec8d3.zip llvm-71809cfc7ae2fc69b5f6a2069354e74b320ec8d3.tar.gz llvm-71809cfc7ae2fc69b5f6a2069354e74b320ec8d3.tar.bz2 |
[DebugInfo][RemoveDIs] Avoid leaking trailing DPMarkers (#74458)
In the debug-info-splice implementation, we need to be careful to delete
trailing DPMarkers from blocks when we splice their contents out. This
is equivalent to removing the terminator from a block, then splicing the
rest of it's contents to another block: any DPValues trailing at the end
of the block get moved and we need to clean up afterwards.
Diffstat (limited to 'llvm/lib/IR/BasicBlock.cpp')
-rw-r--r-- | llvm/lib/IR/BasicBlock.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 3ac5faf..872386d 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -770,6 +770,7 @@ void BasicBlock::flushTerminatorDbgValues() { // Transfer DPValues from the trailing position onto the terminator. Term->DbgMarker->absorbDebugValues(*TrailingDPValues, false); + TrailingDPValues->eraseFromParent(); deleteTrailingDPValues(); } @@ -813,6 +814,7 @@ void BasicBlock::spliceDebugInfoEmptyBlock(BasicBlock::iterator Dest, DPMarker *M = Dest->DbgMarker; M->absorbDebugValues(*SrcTrailingDPValues, InsertAtHead); + SrcTrailingDPValues->eraseFromParent(); Src->deleteTrailingDPValues(); return; } @@ -920,6 +922,7 @@ void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src, // Use this flag to signal the abnormal case, where we don't want to copy the // DPValues ahead of the "Last" position. bool ReadFromTail = !Last.getTailBit(); + bool LastIsEnd = (Last == Src->end()); /* Here's an illustration of what we're about to do. We have two blocks, this @@ -995,12 +998,16 @@ void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src, DPMarker *OntoDest = getMarker(Dest); DPMarker *FromLast = Src->getMarker(Last); OntoDest->absorbDebugValues(*FromLast, true); + if (LastIsEnd) { + FromLast->eraseFromParent(); + deleteTrailingDPValues(); + } } // If we're _not_ reading from the head of First, i.e. the "++++" DPValues, // move their markers onto Last. They remain in the Src block. No action // needed. - if (!ReadFromHead) { + if (!ReadFromHead && First->hasDbgValues()) { DPMarker *OntoLast = Src->createMarker(Last); DPMarker *FromFirst = Src->createMarker(First); OntoLast->absorbDebugValues(*FromFirst, @@ -1030,6 +1037,7 @@ void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src, DPMarker *TrailingDPValues = getTrailingDPValues(); if (TrailingDPValues) { FirstMarker->absorbDebugValues(*TrailingDPValues, true); + TrailingDPValues->eraseFromParent(); deleteTrailingDPValues(); } } |