diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h index a7de7e7fb30..3342ea89c56 100644 --- a/include/llvm/LinkAllPasses.h +++ b/include/llvm/LinkAllPasses.h @@ -124,7 +124,6 @@ namespace { (void) llvm::createCondPropagationPass(); (void) llvm::createNullProfilerRSPass(); (void) llvm::createRSProfilingPass(); - (void) llvm::createIndMemRemPass(); (void) llvm::createInstCountPass(); (void) llvm::createCodeGenLICMPass(); (void) llvm::createCodeGenPreparePass(); diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h index d66ed896d80..9189c430cbb 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -185,10 +185,6 @@ Pass *createSingleLoopExtractorPass(); /// ModulePass *createBlockExtractorPass(const std::vector &BTNE); -/// createIndMemRemPass - This pass removes potential indirect calls of -/// malloc and free -ModulePass *createIndMemRemPass(); - /// createStripDeadPrototypesPass - This pass removes any function declarations /// (prototypes) that are not used. ModulePass *createStripDeadPrototypesPass(); diff --git a/lib/Transforms/IPO/CMakeLists.txt b/lib/Transforms/IPO/CMakeLists.txt index ec0f1e193ad..5c288015554 100644 --- a/lib/Transforms/IPO/CMakeLists.txt +++ b/lib/Transforms/IPO/CMakeLists.txt @@ -9,7 +9,6 @@ add_llvm_library(LLVMipo GlobalOpt.cpp IPConstantPropagation.cpp IPO.cpp - IndMemRemoval.cpp InlineAlways.cpp InlineSimple.cpp Inliner.cpp diff --git a/lib/Transforms/IPO/IndMemRemoval.cpp b/lib/Transforms/IPO/IndMemRemoval.cpp deleted file mode 100644 index 9bd5a92772b..00000000000 --- a/lib/Transforms/IPO/IndMemRemoval.cpp +++ /dev/null @@ -1,99 +0,0 @@ -//===-- IndMemRemoval.cpp - Remove indirect allocations and frees ---------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This pass finds places where memory allocation functions may escape into -// indirect land. Some transforms are much easier (aka possible) only if free -// or malloc are not called indirectly. -// Thus find places where the address of memory functions are taken and -// construct bounce functions with direct calls of those functions. -// -//===----------------------------------------------------------------------===// - -#define DEBUG_TYPE "indmemrem" -#include "llvm/Transforms/IPO.h" -#include "llvm/Pass.h" -#include "llvm/Module.h" -#include "llvm/Instructions.h" -#include "llvm/Type.h" -#include "llvm/DerivedTypes.h" -#include "llvm/ADT/Statistic.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Target/TargetData.h" -using namespace llvm; - -STATISTIC(NumBounceSites, "Number of sites modified"); -STATISTIC(NumBounce , "Number of bounce functions created"); - -namespace { - class VISIBILITY_HIDDEN IndMemRemPass : public ModulePass { - public: - static char ID; // Pass identification, replacement for typeid - IndMemRemPass() : ModulePass(&ID) {} - - virtual bool runOnModule(Module &M); - }; -} // end anonymous namespace - -char IndMemRemPass::ID = 0; -static RegisterPass -X("indmemrem","Indirect Malloc and Free Removal"); - -bool IndMemRemPass::runOnModule(Module &M) { - // In theory, all direct calls of malloc and free should be promoted - // to intrinsics. Therefore, this goes through and finds where the - // address of free or malloc are taken and replaces those with bounce - // functions, ensuring that all malloc and free that might happen - // happen through intrinsics. - bool changed = false; - if (Function* F = M.getFunction("free")) { - if (F->isDeclaration() && F->arg_size() == 1 && !F->use_empty()) { - Function* FN = Function::Create(F->getFunctionType(), - GlobalValue::LinkOnceAnyLinkage, - "free_llvm_bounce", &M); - BasicBlock* bb = BasicBlock::Create(M.getContext(), "entry",FN); - Instruction* R = ReturnInst::Create(M.getContext(), bb); - new FreeInst(FN->arg_begin(), R); - ++NumBounce; - NumBounceSites += F->getNumUses(); - F->replaceAllUsesWith(FN); - changed = true; - } - } - if (Function* F = M.getFunction("malloc")) { - if (F->isDeclaration() && F->arg_size() == 1 && !F->use_empty()) { - TargetData* TD = getAnalysisIfAvailable(); - if (TD) { - Function* FN = Function::Create(F->getFunctionType(), - GlobalValue::LinkOnceAnyLinkage, - "malloc_llvm_bounce", &M); - F->replaceAllUsesWith(FN); - FN->setDoesNotAlias(0); - BasicBlock* bb = BasicBlock::Create(M.getContext(), "entry", FN); - const Type* IntPtrTy = TD->getIntPtrType(M.getContext()); - Value* c = FN->arg_begin(); - if (FN->arg_begin()->getType() != IntPtrTy) - c = CastInst::CreateIntegerCast(FN->arg_begin(), IntPtrTy, false, - "c", bb); - Value* a = CallInst::CreateMalloc(bb, IntPtrTy, - Type::getInt8Ty(M.getContext()), - c, NULL, "m"); - bb->getInstList().push_back(cast(a)); - ReturnInst::Create(M.getContext(), a, bb); - ++NumBounce; - NumBounceSites += F->getNumUses(); - changed = true; - } - } - } - return changed; -} - -ModulePass *llvm::createIndMemRemPass() { - return new IndMemRemPass(); -}