summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Criswell <criswell@uiuc.edu>2003-08-07 14:43:13 +0000
committerJohn Criswell <criswell@uiuc.edu>2003-08-07 14:43:13 +0000
commit7d3c5795f9624cd2fd9cdf9a61a9eb055bbead4b (patch)
treee4d0f9bc47e8eb13688a99d589d8577b11f8ef70
parentec4f52317819e24cb2661559af58593f0a444bd8 (diff)
downloadllvm-7d3c5795f9624cd2fd9cdf9a61a9eb055bbead4b.tar.gz
llvm-7d3c5795f9624cd2fd9cdf9a61a9eb055bbead4b.tar.bz2
llvm-7d3c5795f9624cd2fd9cdf9a61a9eb055bbead4b.tar.xz
Fixed a segfault in gccld.
The original code does not work because the value from WorkList.end() is invalidated once WorkList.erase() is called. To ensure proper functionality, we must ensure that WorkList.erase() is always called before WorkList.end(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7673 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/IPO/GlobalDCE.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Transforms/IPO/GlobalDCE.cpp b/lib/Transforms/IPO/GlobalDCE.cpp
index c7fddc9913..f991229e98 100644
--- a/lib/Transforms/IPO/GlobalDCE.cpp
+++ b/lib/Transforms/IPO/GlobalDCE.cpp
@@ -123,8 +123,10 @@ bool GlobalDCE::RemoveIfDead(GlobalValue *GV) {
// If the global variable is still on the worklist, remove it now.
std::vector<GlobalValue*>::iterator I = std::find(WorkList.begin(),
WorkList.end(), GV);
- while (I != WorkList.end())
- I = std::find(WorkList.erase(I), WorkList.end(), GV);
+ while (I != WorkList.end()) {
+ I = WorkList.erase(I);
+ I = std::find(I, WorkList.end(), GV);
+ }
return true;
}