aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/BasicBlock.cpp
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse@sony.com>2023-12-05 15:41:00 +0000
committerGitHub <noreply@github.com>2023-12-05 15:41:00 +0000
commit71809cfc7ae2fc69b5f6a2069354e74b320ec8d3 (patch)
tree6ce6e5d5ff168fc54cd02aeeb97d7674595a259e /llvm/lib/IR/BasicBlock.cpp
parent80fa79609e9adf0e2ccd71b9838d7fdb6ab2d07a (diff)
downloadllvm-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.cpp10
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();
}
}