[llvm-commits] CVS: llvm/tools/extract/extract.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sat Oct 12 15:51:01 PDT 2002
Changes in directory llvm/tools/extract:
extract.cpp updated: 1.11 -> 1.12
---
Log message:
* Fix extract to work with constant pointer refs correctly
* Extract makes all global vars external, so they don't have initializers
---
Diffs of the changes:
Index: llvm/tools/extract/extract.cpp
diff -u llvm/tools/extract/extract.cpp:1.11 llvm/tools/extract/extract.cpp:1.12
--- llvm/tools/extract/extract.cpp:1.11 Mon Oct 7 13:33:53 2002
+++ llvm/tools/extract/extract.cpp Sat Oct 12 15:50:16 2002
@@ -30,14 +30,16 @@
bool run(Module &M) {
// Mark all global variables to be internal
for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
- if (!I->isExternal())
- I->setInternalLinkage(true);
+ if (!I->isExternal()) {
+ I->setInitializer(0); // Make all variables external
+ I->setInternalLinkage(false); // Make sure it's not internal
+ }
Function *Named = 0;
// Loop over all of the functions in the module, dropping all references in
// functions that are not the named function.
- for (Module::iterator I = M.begin(), E = M.end(); I != E;)
+ for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
// Check to see if this is the named function!
if (I->getName() == ExtractFunc && !I->isExternal()) {
if (Named) { // Two functions, same name?
@@ -51,41 +53,59 @@
// Make sure it's globally accessable...
Named->setInternalLinkage(false);
-
- // Remove the named function from the module.
- M.getFunctionList().remove(I);
- } else {
- // Nope it's not the named function, delete the body of the function
- I->dropAllReferences();
- ++I;
}
-
- // All of the functions that still have uses now must be used by global
- // variables or the named function. Loop through them and create a new,
- // external function for the used ones... making all uses point to the new
- // functions.
+
+ if (Named == 0) {
+ std::cerr << "Warning: Function '" << ExtractFunc << "' not found!\n";
+ return false;
+ }
+
+ // All of the functions may be used by global variables or the named
+ // function. Loop through them and create a new, external functions that
+ // can be "used", instead of ones with bodies.
+ //
std::vector<Function*> NewFunctions;
- for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
- if (!I->use_empty()) {
+ Function *Last = &M.back(); // Figure out where the last real fn is...
+
+ for (Module::iterator I = M.begin(); ; ++I) {
+ if (I->getName() != ExtractFunc) {
Function *New = new Function(I->getFunctionType(), false, I->getName());
- I->replaceAllUsesWith(New);
+ I->setName(""); // Remove Old name
+
+ // If it's not the named function, delete the body of the function
+ I->dropAllReferences();
+
+ M.getFunctionList().push_back(New);
NewFunctions.push_back(New);
}
+
+ if (&*I == Last) break; // Stop after processing the last function
+ }
+
+ // Now that we have replacements all set up, loop through the module,
+ // deleting the old functions, replacing them with the newly created
+ // functions.
+ if (!NewFunctions.empty()) {
+ unsigned FuncNum = 0;
+ Module::iterator I = M.begin();
+ do {
+ if (I->getName() != ExtractFunc) {
+ // Make everything that uses the old function use the new dummy fn
+ I->replaceAllUsesWith(NewFunctions[FuncNum++]);
+
+ Function *Old = I;
+ ++I; // Move the iterator to the new function
+
+ // Delete the old function!
+ M.getFunctionList().erase(Old);
+
+ } else {
+ ++I; // Skip the function we are extracting
+ }
+ } while (&*I != NewFunctions[0]);
+ }
- // Now the module only has unused functions with their references dropped.
- // Delete them all now!
- M.getFunctionList().clear();
-
- // Re-insert the named function...
- if (Named)
- M.getFunctionList().push_back(Named);
- else
- std::cerr << "Warning: Function '" << ExtractFunc << "' not found!\n";
-
- // Insert all of the function stubs...
- M.getFunctionList().insert(M.end(), NewFunctions.begin(),
- NewFunctions.end());
return true;
}
};
@@ -109,6 +129,7 @@
PassManager Passes;
Passes.add(new FunctionExtractorPass());
Passes.add(createGlobalDCEPass()); // Delete unreachable globals
+ Passes.add(createFunctionResolvingPass()); // Delete prototypes
Passes.add(createConstantMergePass()); // Merge dup global constants
Passes.add(createDeadTypeEliminationPass()); // Remove dead types...
Passes.add(new WriteBytecodePass(&std::cout)); // Write bytecode to file...
More information about the llvm-commits
mailing list