comparison gen/passes/StripExternals.cpp @ 1493:7cca8cf730de

Increment the iterator before deleting redundant functions or globals in the StripExternals pass.
author Christian Kamm <kamm incasoftware de>
date Thu, 11 Jun 2009 21:48:10 +0200
parents defafbabbe32
children c88b16d4a13c
comparison
equal deleted inserted replaced
1492:ef76f6e1693c 1493:7cca8cf730de
52 ModulePass *createStripExternalsPass() { return new StripExternals(); } 52 ModulePass *createStripExternalsPass() { return new StripExternals(); }
53 53
54 bool StripExternals::runOnModule(Module &M) { 54 bool StripExternals::runOnModule(Module &M) {
55 bool Changed = false; 55 bool Changed = false;
56 56
57 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 57 for (Module::iterator I = M.begin(); I != M.end(); ) {
58 if (I->hasAvailableExternallyLinkage()) { 58 if (I->hasAvailableExternallyLinkage()) {
59 assert(!I->isDeclaration()&&"Declarations can't be available_externally"); 59 assert(!I->isDeclaration()&&"Declarations can't be available_externally");
60 Changed = true; 60 Changed = true;
61 ++NumFunctions; 61 ++NumFunctions;
62 if (I->use_empty()) { 62 if (I->use_empty()) {
63 DOUT << "Deleting function: " << *I; 63 DOUT << "Deleting function: " << *I;
64 I->eraseFromParent(); 64 Module::iterator todelete = I;
65 ++I;
66 todelete->eraseFromParent();
67 continue;
65 } else { 68 } else {
66 I->deleteBody(); 69 I->deleteBody();
67 DOUT << "Deleted function body: " << *I; 70 DOUT << "Deleted function body: " << *I;
68 } 71 }
69 } 72 }
73 ++I;
70 } 74 }
71 75
72 for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 76 for (Module::global_iterator I = M.global_begin();
73 I != E; ++I) { 77 I != M.global_end(); ) {
74 if (I->hasAvailableExternallyLinkage()) { 78 if (I->hasAvailableExternallyLinkage()) {
75 assert(!I->isDeclaration()&&"Declarations can't be available_externally"); 79 assert(!I->isDeclaration()&&"Declarations can't be available_externally");
76 Changed = true; 80 Changed = true;
77 ++NumVariables; 81 ++NumVariables;
78 if (I->use_empty()) { 82 if (I->use_empty()) {
79 DOUT << "Deleting global: " << *I; 83 DOUT << "Deleting global: " << *I;
80 I->eraseFromParent(); 84 Module::global_iterator todelete = I;
85 ++I;
86 todelete->eraseFromParent();
87 continue;
81 } else { 88 } else {
82 I->setInitializer(0); 89 I->setInitializer(0);
83 I->setLinkage(GlobalValue::ExternalLinkage); 90 I->setLinkage(GlobalValue::ExternalLinkage);
84 DOUT << "Deleted initializer: " << *I; 91 DOUT << "Deleted initializer: " << *I;
85 } 92 }
86 } 93 }
94 ++I;
87 } 95 }
88 96
89 return Changed; 97 return Changed;
90 } 98 }
91 99