From 7623716e613032cff6c3d6808a19f0091ba9f4e8 Mon Sep 17 00:00:00 2001 From: Andrew Lenharth Date: Fri, 21 Mar 2008 16:46:53 +0000 Subject: FunctionExtractorPass has been superceded by GVExtractorPass git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48648 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/IPO.h | 8 -- lib/Transforms/IPO/ExtractFunction.cpp | 147 --------------------------------- 2 files changed, 155 deletions(-) delete mode 100644 lib/Transforms/IPO/ExtractFunction.cpp diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h index f9890ac6d0..09ad9437a7 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -78,14 +78,6 @@ ModulePass *createDeadTypeEliminationPass(); ModulePass *createGlobalDCEPass(); -//===----------------------------------------------------------------------===// -/// createFunctionExtractionPass - If deleteFn is true, this pass deletes as -/// the specified function. Otherwise, it deletes as much of the module as -/// possible, except for the function specified. -/// -ModulePass *createFunctionExtractionPass(Function *F, bool deleteFn = false, - bool relinkCallees = false); - //===----------------------------------------------------------------------===// /// createGVExtractionPass - If deleteFn is true, this pass deletes as /// the specified global values. Otherwise, it deletes as much of the module as diff --git a/lib/Transforms/IPO/ExtractFunction.cpp b/lib/Transforms/IPO/ExtractFunction.cpp deleted file mode 100644 index 918d52d17a..0000000000 --- a/lib/Transforms/IPO/ExtractFunction.cpp +++ /dev/null @@ -1,147 +0,0 @@ -//===-- ExtractFunction.cpp - Function extraction pass --------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This pass extracts -// -//===----------------------------------------------------------------------===// - -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Pass.h" -#include "llvm/Transforms/IPO.h" -#include "llvm/Support/Compiler.h" -using namespace llvm; - -namespace { - /// @brief A pass to extract specific functions and their dependencies. - class VISIBILITY_HIDDEN FunctionExtractorPass : public ModulePass { - Function *Named; - bool deleteFunc; - bool reLink; - public: - static char ID; // Pass identification, replacement for typeid - - /// FunctionExtractorPass - If deleteFn is true, this pass deletes as the - /// specified function. Otherwise, it deletes as much of the module as - /// possible, except for the function specified. - /// - explicit FunctionExtractorPass(Function *F = 0, bool deleteFn = true, - bool relinkCallees = false) - : ModulePass((intptr_t)&ID), Named(F), deleteFunc(deleteFn), - reLink(relinkCallees) {} - - bool runOnModule(Module &M) { - if (Named == 0) { - Named = M.getFunction("main"); - if (Named == 0) return false; // No function to extract - } - - if (deleteFunc) - return deleteFunction(); - M.setModuleInlineAsm(""); - return isolateFunction(M); - } - - bool deleteFunction() { - // If we're in relinking mode, set linkage of all internal callees to - // external. This will allow us extract function, and then - link - // everything together - if (reLink) { - for (Function::iterator B = Named->begin(), BE = Named->end(); - B != BE; ++B) { - for (BasicBlock::iterator I = B->begin(), E = B->end(); - I != E; ++I) { - if (CallInst* callInst = dyn_cast(&*I)) { - Function* Callee = callInst->getCalledFunction(); - if (Callee && Callee->hasInternalLinkage()) - Callee->setLinkage(GlobalValue::ExternalLinkage); - } - } - } - } - - Named->setLinkage(GlobalValue::ExternalLinkage); - Named->deleteBody(); - assert(Named->isDeclaration() && "This didn't make the function external!"); - return true; - } - - bool isolateFunction(Module &M) { - // Make sure our result is globally accessible... - Named->setLinkage(GlobalValue::ExternalLinkage); - - // Mark all global variables internal - for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) - if (!I->isDeclaration()) { - I->setInitializer(0); // Make all variables external - I->setLinkage(GlobalValue::ExternalLinkage); - } - - // 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 NewFunctions; - - Function *Last = --M.end(); // Figure out where the last real fn is. - - for (Module::iterator I = M.begin(); ; ++I) { - if (&*I != Named) { - Function *New = new Function(I->getFunctionType(), - GlobalValue::ExternalLinkage); - New->setCallingConv(I->getCallingConv()); - New->setParamAttrs(I->getParamAttrs()); - if (I->hasCollector()) - New->setCollector(I->getCollector()); - - // If it's not the named function, delete the body of the function - I->dropAllReferences(); - - M.getFunctionList().push_back(New); - NewFunctions.push_back(New); - New->takeName(I); - } - - 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 != Named) { - // 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]); - } - - return true; - } - }; - - char FunctionExtractorPass::ID = 0; - RegisterPass X("extract", "Function Extractor"); -} - -ModulePass *llvm::createFunctionExtractionPass(Function *F, bool deleteFn, - bool relinkCallees) { - return new FunctionExtractorPass(F, deleteFn, relinkCallees); -} -- cgit v1.2.3