Mercurial > projects > ldc
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 |