Chris Lattner | afade92 | 2002-11-20 22:28:10 +0000 | [diff] [blame] | 1 | //===- ExtractFunction.cpp - Extract a function from Program --------------===// |
| 2 | // |
| 3 | // This file implements a method that extracts a function from program, cleans |
| 4 | // it up, and returns it as a new module. |
| 5 | // |
| 6 | //===----------------------------------------------------------------------===// |
| 7 | |
| 8 | #include "BugDriver.h" |
| 9 | #include "llvm/Module.h" |
| 10 | #include "llvm/PassManager.h" |
| 11 | #include "llvm/Transforms/IPO.h" |
| 12 | #include "llvm/Transforms/Utils/Cloning.h" |
| 13 | |
| 14 | /// extractFunctionFromModule - This method is used to extract the specified |
| 15 | /// (non-external) function from the current program, slim down the module, and |
| 16 | /// then return it. This does not modify Program at all, it modifies a copy, |
| 17 | /// which it returns. |
| 18 | Module *BugDriver::extractFunctionFromModule(Function *F) const { |
| 19 | Module *Result = CloneModule(Program); |
| 20 | |
| 21 | // Translate from the old module to the new copied module... |
| 22 | F = Result->getFunction(F->getName(), F->getFunctionType()); |
| 23 | |
| 24 | // In addition to just parsing the input from GCC, we also want to spiff it up |
| 25 | // a little bit. Do this now. |
| 26 | // |
| 27 | PassManager Passes; |
| 28 | Passes.add(createFunctionExtractionPass(F)); // Extract the function |
| 29 | Passes.add(createGlobalDCEPass()); // Delete unreachable globals |
| 30 | Passes.add(createFunctionResolvingPass()); // Delete prototypes |
| 31 | Passes.add(createDeadTypeEliminationPass()); // Remove dead types... |
| 32 | Passes.run(*Result); |
| 33 | return Result; |
| 34 | } |