Fixed a segfault in gccld.
authorJohn Criswell <criswell@uiuc.edu>
Thu, 7 Aug 2003 14:43:13 +0000 (14:43 +0000)
committerJohn Criswell <criswell@uiuc.edu>
Thu, 7 Aug 2003 14:43:13 +0000 (14:43 +0000)
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

lib/Transforms/IPO/GlobalDCE.cpp

index c7fddc99139139af669e6d3260e8260e09e5eaea..f991229e9852a3a152f0558e3e52a34acc87fd14 100644 (file)
@@ -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;
     }