173a6bdd9SChris Lattner //===- ExtractFunction.cpp - Extract a function from Program --------------===// 273a6bdd9SChris Lattner // 309344dcfSJohn Criswell // The LLVM Compiler Infrastructure 409344dcfSJohn Criswell // 509344dcfSJohn Criswell // This file was developed by the LLVM research group and is distributed under 609344dcfSJohn Criswell // the University of Illinois Open Source License. See LICENSE.TXT for details. 709344dcfSJohn Criswell // 809344dcfSJohn Criswell //===----------------------------------------------------------------------===// 909344dcfSJohn Criswell // 10fd72bed3SChris Lattner // This file implements several methods that are used to extract functions, 11fd72bed3SChris Lattner // loops, or portions of a module from the rest of the module. 1273a6bdd9SChris Lattner // 1373a6bdd9SChris Lattner //===----------------------------------------------------------------------===// 1473a6bdd9SChris Lattner 1573a6bdd9SChris Lattner #include "BugDriver.h" 16fdb533a1SChris Lattner #include "llvm/Constants.h" 17fdb533a1SChris Lattner #include "llvm/DerivedTypes.h" 1873a6bdd9SChris Lattner #include "llvm/Module.h" 1973a6bdd9SChris Lattner #include "llvm/PassManager.h" 20ef432703SBrian Gaeke #include "llvm/Pass.h" 21*b417a5c1SPatrick Jenkins #include "llvm/SymbolTable.h" 220c2305b1SMisha Brukman #include "llvm/Analysis/Verifier.h" 2373a6bdd9SChris Lattner #include "llvm/Transforms/IPO.h" 240eb5ce94SChris Lattner #include "llvm/Transforms/Scalar.h" 2573a6bdd9SChris Lattner #include "llvm/Transforms/Utils/Cloning.h" 26a060b10eSChris Lattner #include "llvm/Transforms/Utils/FunctionUtils.h" 27f3e8f97dSChris Lattner #include "llvm/Target/TargetData.h" 287c16caa3SReid Spencer #include "llvm/Support/CommandLine.h" 297c16caa3SReid Spencer #include "llvm/Support/Debug.h" 307c16caa3SReid Spencer #include "llvm/Support/FileUtilities.h" 313838243dSChris Lattner #include <set> 3203c032ceSChris Lattner #include <iostream> 333f1ad878SChris Lattner using namespace llvm; 34960707c3SBrian Gaeke 35960707c3SBrian Gaeke namespace llvm { 36d1e2aaefSChris Lattner bool DisableSimplifyCFG = false; 37960707c3SBrian Gaeke } // End llvm namespace 38960707c3SBrian Gaeke 398d8de422SChris Lattner namespace { 408d8de422SChris Lattner cl::opt<bool> 418d8de422SChris Lattner NoDCE ("disable-dce", 428d8de422SChris Lattner cl::desc("Do not use the -dce pass to reduce testcases")); 43d1e2aaefSChris Lattner cl::opt<bool, true> 44d1e2aaefSChris Lattner NoSCFG("disable-simplifycfg", cl::location(DisableSimplifyCFG), 458d8de422SChris Lattner cl::desc("Do not use the -simplifycfg pass to reduce testcases")); 468d8de422SChris Lattner } 4773a6bdd9SChris Lattner 480eb5ce94SChris Lattner /// deleteInstructionFromProgram - This method clones the current Program and 490eb5ce94SChris Lattner /// deletes the specified instruction from the cloned module. It then runs a 500eb5ce94SChris Lattner /// series of cleanup passes (ADCE and SimplifyCFG) to eliminate any code which 510eb5ce94SChris Lattner /// depends on the value. The modified module is then returned. 520eb5ce94SChris Lattner /// 53b943b6b0SChris Lattner Module *BugDriver::deleteInstructionFromProgram(const Instruction *I, 540eb5ce94SChris Lattner unsigned Simplification) const { 550eb5ce94SChris Lattner Module *Result = CloneModule(Program); 560eb5ce94SChris Lattner 57b943b6b0SChris Lattner const BasicBlock *PBB = I->getParent(); 58b943b6b0SChris Lattner const Function *PF = PBB->getParent(); 590eb5ce94SChris Lattner 600eb5ce94SChris Lattner Module::iterator RFI = Result->begin(); // Get iterator to corresponding fn 61b943b6b0SChris Lattner std::advance(RFI, std::distance(PF->getParent()->begin(), 62b943b6b0SChris Lattner Module::const_iterator(PF))); 630eb5ce94SChris Lattner 640eb5ce94SChris Lattner Function::iterator RBI = RFI->begin(); // Get iterator to corresponding BB 65b943b6b0SChris Lattner std::advance(RBI, std::distance(PF->begin(), Function::const_iterator(PBB))); 660eb5ce94SChris Lattner 670eb5ce94SChris Lattner BasicBlock::iterator RI = RBI->begin(); // Get iterator to corresponding inst 68b943b6b0SChris Lattner std::advance(RI, std::distance(PBB->begin(), BasicBlock::const_iterator(I))); 69b943b6b0SChris Lattner Instruction *TheInst = RI; // Got the corresponding instruction! 700eb5ce94SChris Lattner 710eb5ce94SChris Lattner // If this instruction produces a value, replace any users with null values 72b943b6b0SChris Lattner if (TheInst->getType() != Type::VoidTy) 73b943b6b0SChris Lattner TheInst->replaceAllUsesWith(Constant::getNullValue(TheInst->getType())); 740eb5ce94SChris Lattner 750eb5ce94SChris Lattner // Remove the instruction from the program. 76b943b6b0SChris Lattner TheInst->getParent()->getInstList().erase(TheInst); 770eb5ce94SChris Lattner 78fdb533a1SChris Lattner 79fdb533a1SChris Lattner //writeProgramToFile("current.bc", Result); 80fdb533a1SChris Lattner 8110c0469bSChris Lattner // Spiff up the output a little bit. 820eb5ce94SChris Lattner PassManager Passes; 83f3e8f97dSChris Lattner // Make sure that the appropriate target data is always used... 8416cf8130SChris Lattner Passes.add(new TargetData(Result)); 85f3e8f97dSChris Lattner 86fd72bed3SChris Lattner /// FIXME: If this used runPasses() like the methods below, we could get rid 87fd72bed3SChris Lattner /// of the -disable-* options! 888d8de422SChris Lattner if (Simplification > 1 && !NoDCE) 890eb5ce94SChris Lattner Passes.add(createDeadCodeEliminationPass()); 90d1e2aaefSChris Lattner if (Simplification && !DisableSimplifyCFG) 910eb5ce94SChris Lattner Passes.add(createCFGSimplificationPass()); // Delete dead control flow 9244ffd7c3SChris Lattner 9344ffd7c3SChris Lattner Passes.add(createVerifierPass()); 940eb5ce94SChris Lattner Passes.run(*Result); 950eb5ce94SChris Lattner return Result; 960eb5ce94SChris Lattner } 97514c02ebSChris Lattner 982920100eSChris Lattner static const PassInfo *getPI(Pass *P) { 992920100eSChris Lattner const PassInfo *PI = P->getPassInfo(); 1002920100eSChris Lattner delete P; 1012920100eSChris Lattner return PI; 1022920100eSChris Lattner } 1032920100eSChris Lattner 104514c02ebSChris Lattner /// performFinalCleanups - This method clones the current Program and performs 105514c02ebSChris Lattner /// a series of cleanups intended to get rid of extra cruft on the module 1065e166a5fSChris Lattner /// before handing it to the user. 107514c02ebSChris Lattner /// 1082920100eSChris Lattner Module *BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) { 1092b3ab562SChris Lattner // Make all functions external, so GlobalDCE doesn't delete them... 1102b3ab562SChris Lattner for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) 1112b3ab562SChris Lattner I->setLinkage(GlobalValue::ExternalLinkage); 1122b3ab562SChris Lattner 1132920100eSChris Lattner std::vector<const PassInfo*> CleanupPasses; 1142920100eSChris Lattner CleanupPasses.push_back(getPI(createFunctionResolvingPass())); 1152920100eSChris Lattner CleanupPasses.push_back(getPI(createGlobalDCEPass())); 1162920100eSChris Lattner CleanupPasses.push_back(getPI(createDeadTypeEliminationPass())); 1173f1ad878SChris Lattner 1183f1ad878SChris Lattner if (MayModifySemantics) 1192920100eSChris Lattner CleanupPasses.push_back(getPI(createDeadArgHackingPass())); 1203f1ad878SChris Lattner else 1213f1ad878SChris Lattner CleanupPasses.push_back(getPI(createDeadArgEliminationPass())); 1222920100eSChris Lattner 1236ce2d033SChris Lattner Module *New = runPassesOn(M, CleanupPasses); 1246ce2d033SChris Lattner if (New == 0) { 1253fe96bc9SChris Lattner std::cerr << "Final cleanups failed. Sorry. :( Please report a bug!\n"; 1265e166a5fSChris Lattner return M; 1276ce2d033SChris Lattner } 1282920100eSChris Lattner delete M; 1296ce2d033SChris Lattner return New; 130514c02ebSChris Lattner } 131567543f0SChris Lattner 132567543f0SChris Lattner 1333fe96bc9SChris Lattner /// ExtractLoop - Given a module, extract up to one loop from it into a new 1343fe96bc9SChris Lattner /// function. This returns null if there are no extractable loops in the 1353fe96bc9SChris Lattner /// program or if the loop extractor crashes. 1363fe96bc9SChris Lattner Module *BugDriver::ExtractLoop(Module *M) { 1373fe96bc9SChris Lattner std::vector<const PassInfo*> LoopExtractPasses; 1383fe96bc9SChris Lattner LoopExtractPasses.push_back(getPI(createSingleLoopExtractorPass())); 1393fe96bc9SChris Lattner 1406ce2d033SChris Lattner Module *NewM = runPassesOn(M, LoopExtractPasses); 1416ce2d033SChris Lattner if (NewM == 0) { 142bcec7875SChris Lattner Module *Old = swapProgramIn(M); 143bcec7875SChris Lattner std::cout << "*** Loop extraction failed: "; 144bcec7875SChris Lattner EmitProgressBytecode("loopextraction", true); 145bcec7875SChris Lattner std::cout << "*** Sorry. :( Please report a bug!\n"; 146bcec7875SChris Lattner swapProgramIn(Old); 1473fe96bc9SChris Lattner return 0; 1483fe96bc9SChris Lattner } 1493fe96bc9SChris Lattner 1503fe96bc9SChris Lattner // Check to see if we created any new functions. If not, no loops were 1518cb483b3SChris Lattner // extracted and we should return null. Limit the number of loops we extract 1528cb483b3SChris Lattner // to avoid taking forever. 1538cb483b3SChris Lattner static unsigned NumExtracted = 32; 154d308797cSChris Lattner if (M->size() == NewM->size() || --NumExtracted == 0) { 1553fe96bc9SChris Lattner delete NewM; 1563fe96bc9SChris Lattner return 0; 157d308797cSChris Lattner } else { 158d308797cSChris Lattner assert(M->size() < NewM->size() && "Loop extract removed functions?"); 159d308797cSChris Lattner Module::iterator MI = NewM->begin(); 160d308797cSChris Lattner for (unsigned i = 0, e = M->size(); i != e; ++i) 161d308797cSChris Lattner ++MI; 1623fe96bc9SChris Lattner } 1633fe96bc9SChris Lattner 1643fe96bc9SChris Lattner return NewM; 1653fe96bc9SChris Lattner } 1663fe96bc9SChris Lattner 1673fe96bc9SChris Lattner 168567543f0SChris Lattner // DeleteFunctionBody - "Remove" the function by deleting all of its basic 169567543f0SChris Lattner // blocks, making it external. 170567543f0SChris Lattner // 171567543f0SChris Lattner void llvm::DeleteFunctionBody(Function *F) { 172567543f0SChris Lattner // delete the body of the function... 173567543f0SChris Lattner F->deleteBody(); 174567543f0SChris Lattner assert(F->isExternal() && "This didn't make the function external!"); 175567543f0SChris Lattner } 176567543f0SChris Lattner 177fdb533a1SChris Lattner /// GetTorInit - Given a list of entries for static ctors/dtors, return them 178fdb533a1SChris Lattner /// as a constant array. 179fdb533a1SChris Lattner static Constant *GetTorInit(std::vector<std::pair<Function*, int> > &TorList) { 180fdb533a1SChris Lattner assert(!TorList.empty() && "Don't create empty tor list!"); 181fdb533a1SChris Lattner std::vector<Constant*> ArrayElts; 182fdb533a1SChris Lattner for (unsigned i = 0, e = TorList.size(); i != e; ++i) { 183fdb533a1SChris Lattner std::vector<Constant*> Elts; 184fdb533a1SChris Lattner Elts.push_back(ConstantSInt::get(Type::IntTy, TorList[i].second)); 185fdb533a1SChris Lattner Elts.push_back(TorList[i].first); 186fdb533a1SChris Lattner ArrayElts.push_back(ConstantStruct::get(Elts)); 187fdb533a1SChris Lattner } 188fdb533a1SChris Lattner return ConstantArray::get(ArrayType::get(ArrayElts[0]->getType(), 189fdb533a1SChris Lattner ArrayElts.size()), 190fdb533a1SChris Lattner ArrayElts); 191fdb533a1SChris Lattner } 192fdb533a1SChris Lattner 193fdb533a1SChris Lattner /// SplitStaticCtorDtor - A module was recently split into two parts, M1/M2, and 194fdb533a1SChris Lattner /// M1 has all of the global variables. If M2 contains any functions that are 195fdb533a1SChris Lattner /// static ctors/dtors, we need to add an llvm.global_[cd]tors global to M2, and 196fdb533a1SChris Lattner /// prune appropriate entries out of M1s list. 197fdb533a1SChris Lattner static void SplitStaticCtorDtor(const char *GlobalName, Module *M1, Module *M2){ 198fdb533a1SChris Lattner GlobalVariable *GV = M1->getNamedGlobal(GlobalName); 199fdb533a1SChris Lattner if (!GV || GV->isExternal() || GV->hasInternalLinkage() || 200fdb533a1SChris Lattner !GV->use_empty()) return; 201fdb533a1SChris Lattner 202fdb533a1SChris Lattner std::vector<std::pair<Function*, int> > M1Tors, M2Tors; 203fdb533a1SChris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 204fdb533a1SChris Lattner if (!InitList) return; 205fdb533a1SChris Lattner 206fdb533a1SChris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 207fdb533a1SChris Lattner if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 208fdb533a1SChris Lattner if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 209fdb533a1SChris Lattner 210fdb533a1SChris Lattner if (CS->getOperand(1)->isNullValue()) 211fdb533a1SChris Lattner break; // Found a null terminator, stop here. 212fdb533a1SChris Lattner 213fdb533a1SChris Lattner ConstantSInt *CI = dyn_cast<ConstantSInt>(CS->getOperand(0)); 214fdb533a1SChris Lattner int Priority = CI ? CI->getValue() : 0; 215fdb533a1SChris Lattner 216fdb533a1SChris Lattner Constant *FP = CS->getOperand(1); 217fdb533a1SChris Lattner if (ConstantExpr *CE = dyn_cast<ConstantExpr>(FP)) 218fdb533a1SChris Lattner if (CE->getOpcode() == Instruction::Cast) 219fdb533a1SChris Lattner FP = CE->getOperand(0); 220fdb533a1SChris Lattner if (Function *F = dyn_cast<Function>(FP)) { 221fdb533a1SChris Lattner if (!F->isExternal()) 222fdb533a1SChris Lattner M1Tors.push_back(std::make_pair(F, Priority)); 223fdb533a1SChris Lattner else { 224fdb533a1SChris Lattner // Map to M2's version of the function. 225fdb533a1SChris Lattner F = M2->getFunction(F->getName(), F->getFunctionType()); 226fdb533a1SChris Lattner M2Tors.push_back(std::make_pair(F, Priority)); 227fdb533a1SChris Lattner } 228fdb533a1SChris Lattner } 229fdb533a1SChris Lattner } 230fdb533a1SChris Lattner } 231fdb533a1SChris Lattner 232fdb533a1SChris Lattner GV->eraseFromParent(); 233fdb533a1SChris Lattner if (!M1Tors.empty()) { 234fdb533a1SChris Lattner Constant *M1Init = GetTorInit(M1Tors); 235fdb533a1SChris Lattner new GlobalVariable(M1Init->getType(), false, GlobalValue::AppendingLinkage, 236fdb533a1SChris Lattner M1Init, GlobalName, M1); 237fdb533a1SChris Lattner } 238fdb533a1SChris Lattner 239fdb533a1SChris Lattner GV = M2->getNamedGlobal(GlobalName); 240fdb533a1SChris Lattner assert(GV && "Not a clone of M1?"); 241fdb533a1SChris Lattner assert(GV->use_empty() && "llvm.ctors shouldn't have uses!"); 242fdb533a1SChris Lattner 243fdb533a1SChris Lattner GV->eraseFromParent(); 244fdb533a1SChris Lattner if (!M2Tors.empty()) { 245fdb533a1SChris Lattner Constant *M2Init = GetTorInit(M2Tors); 246fdb533a1SChris Lattner new GlobalVariable(M2Init->getType(), false, GlobalValue::AppendingLinkage, 247fdb533a1SChris Lattner M2Init, GlobalName, M2); 248fdb533a1SChris Lattner } 249fdb533a1SChris Lattner } 250fdb533a1SChris Lattner 251*b417a5c1SPatrick Jenkins //// RewriteUsesInNewModule - takes a Module and a reference to a globalvalue 252*b417a5c1SPatrick Jenkins //// (OrigVal) in that module and changes the reference to a different 253*b417a5c1SPatrick Jenkins //// globalvalue (NewVal) in a seperate module. 254*b417a5c1SPatrick Jenkins static void RewriteUsesInNewModule(Constant *OrigVal, Constant *NewVal, 255*b417a5c1SPatrick Jenkins Module *TargetMod) { 256*b417a5c1SPatrick Jenkins assert(OrigVal->getType() == NewVal->getType() && 257*b417a5c1SPatrick Jenkins "Can't replace something with a different type"); 258*b417a5c1SPatrick Jenkins for (Value::use_iterator UI = OrigVal->use_begin(), E = OrigVal->use_end(); 259*b417a5c1SPatrick Jenkins UI != E; ) { 260*b417a5c1SPatrick Jenkins Value::use_iterator TmpUI = UI++; 261*b417a5c1SPatrick Jenkins User *U = *TmpUI; 262*b417a5c1SPatrick Jenkins if (Instruction *Inst = dyn_cast<Instruction>(U)) { 263*b417a5c1SPatrick Jenkins Module *InstM = Inst->getParent()->getParent()->getParent(); 264*b417a5c1SPatrick Jenkins if (InstM != TargetMod) { 265*b417a5c1SPatrick Jenkins TmpUI.getUse() = NewVal; 266*b417a5c1SPatrick Jenkins } 267*b417a5c1SPatrick Jenkins } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(U)) { 268*b417a5c1SPatrick Jenkins if (GV->getParent() != TargetMod) { 269*b417a5c1SPatrick Jenkins TmpUI.getUse() = NewVal; 270*b417a5c1SPatrick Jenkins } 271*b417a5c1SPatrick Jenkins } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) { 272*b417a5c1SPatrick Jenkins // If nothing uses this, don't bother making a copy. 273*b417a5c1SPatrick Jenkins if (CE->use_empty()) continue; 274*b417a5c1SPatrick Jenkins Constant *NewCE = CE->getWithOperandReplaced(TmpUI.getOperandNo(), 275*b417a5c1SPatrick Jenkins NewVal); 276*b417a5c1SPatrick Jenkins RewriteUsesInNewModule(CE, NewCE, TargetMod); 277*b417a5c1SPatrick Jenkins } else if (ConstantStruct *CS = dyn_cast<ConstantStruct>(U)) { 278*b417a5c1SPatrick Jenkins // If nothing uses this, don't bother making a copy. 279*b417a5c1SPatrick Jenkins if (CS->use_empty()) continue; 280*b417a5c1SPatrick Jenkins unsigned OpNo = TmpUI.getOperandNo(); 281*b417a5c1SPatrick Jenkins std::vector<Constant*> Ops; 282*b417a5c1SPatrick Jenkins for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) 283*b417a5c1SPatrick Jenkins Ops.push_back(i == OpNo ? NewVal : CS->getOperand(i)); 284*b417a5c1SPatrick Jenkins Constant *NewStruct = ConstantStruct::get(Ops); 285*b417a5c1SPatrick Jenkins RewriteUsesInNewModule(CS, NewStruct, TargetMod); 286*b417a5c1SPatrick Jenkins } else if (ConstantPacked *CP = dyn_cast<ConstantPacked>(U)) { 287*b417a5c1SPatrick Jenkins // If nothing uses this, don't bother making a copy. 288*b417a5c1SPatrick Jenkins if (CP->use_empty()) continue; 289*b417a5c1SPatrick Jenkins unsigned OpNo = TmpUI.getOperandNo(); 290*b417a5c1SPatrick Jenkins std::vector<Constant*> Ops; 291*b417a5c1SPatrick Jenkins for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) 292*b417a5c1SPatrick Jenkins Ops.push_back(i == OpNo ? NewVal : CP->getOperand(i)); 293*b417a5c1SPatrick Jenkins Constant *NewPacked = ConstantPacked::get(Ops); 294*b417a5c1SPatrick Jenkins RewriteUsesInNewModule(CP, NewPacked, TargetMod); 295*b417a5c1SPatrick Jenkins } else if (ConstantArray *CA = dyn_cast<ConstantArray>(U)) { 296*b417a5c1SPatrick Jenkins // If nothing uses this, don't bother making a copy. 297*b417a5c1SPatrick Jenkins if (CA->use_empty()) continue; 298*b417a5c1SPatrick Jenkins unsigned OpNo = TmpUI.getOperandNo(); 299*b417a5c1SPatrick Jenkins std::vector<Constant*> Ops; 300*b417a5c1SPatrick Jenkins for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) { 301*b417a5c1SPatrick Jenkins Ops.push_back(i == OpNo ? NewVal : CA->getOperand(i)); 302*b417a5c1SPatrick Jenkins } 303*b417a5c1SPatrick Jenkins Constant *NewArray = ConstantArray::get(CA->getType(), Ops); 304*b417a5c1SPatrick Jenkins RewriteUsesInNewModule(CA, NewArray, TargetMod); 305*b417a5c1SPatrick Jenkins } else { 306*b417a5c1SPatrick Jenkins assert(0 && "Unexpected user"); 307*b417a5c1SPatrick Jenkins } 308*b417a5c1SPatrick Jenkins } 309*b417a5c1SPatrick Jenkins } 310*b417a5c1SPatrick Jenkins 311*b417a5c1SPatrick Jenkins 312567543f0SChris Lattner /// SplitFunctionsOutOfModule - Given a module and a list of functions in the 313567543f0SChris Lattner /// module, split the functions OUT of the specified module, and place them in 314567543f0SChris Lattner /// the new module. 3155a5e414bSChris Lattner /// 3165a5e414bSChris Lattner /// FIXME: this could be made DRAMATICALLY more efficient for large programs if 3175a5e414bSChris Lattner /// we just MOVED functions from one module to the other, instead of cloning the 3185a5e414bSChris Lattner /// whole module, then proceeding to delete an entire module's worth of stuff. 3195a5e414bSChris Lattner /// 320567543f0SChris Lattner Module *llvm::SplitFunctionsOutOfModule(Module *M, 321567543f0SChris Lattner const std::vector<Function*> &F) { 322567543f0SChris Lattner // Make sure functions & globals are all external so that linkage 323567543f0SChris Lattner // between the two modules will work. 324567543f0SChris Lattner for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) 325567543f0SChris Lattner I->setLinkage(GlobalValue::ExternalLinkage); 326fdb533a1SChris Lattner for (Module::global_iterator I = M->global_begin(), E = M->global_end(); 327fdb533a1SChris Lattner I != E; ++I) 328567543f0SChris Lattner I->setLinkage(GlobalValue::ExternalLinkage); 329567543f0SChris Lattner 330*b417a5c1SPatrick Jenkins // First off, we need to create the new module... 331*b417a5c1SPatrick Jenkins Module *New = new Module(M->getModuleIdentifier()); 332*b417a5c1SPatrick Jenkins New->setEndianness(M->getEndianness()); 333*b417a5c1SPatrick Jenkins New->setPointerSize(M->getPointerSize()); 334*b417a5c1SPatrick Jenkins New->setTargetTriple(M->getTargetTriple()); 335*b417a5c1SPatrick Jenkins New->setModuleInlineAsm(M->getModuleInlineAsm()); 336567543f0SChris Lattner 337*b417a5c1SPatrick Jenkins // Copy all of the dependent libraries over. 338*b417a5c1SPatrick Jenkins for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) 339*b417a5c1SPatrick Jenkins New->addLibrary(*I); 340567543f0SChris Lattner 341*b417a5c1SPatrick Jenkins // build a set of the functions to search later... 3423838243dSChris Lattner std::set<std::pair<std::string, const PointerType*> > TestFunctions; 343567543f0SChris Lattner for (unsigned i = 0, e = F.size(); i != e; ++i) { 3443838243dSChris Lattner TestFunctions.insert(std::make_pair(F[i]->getName(), F[i]->getType())); 345567543f0SChris Lattner } 346567543f0SChris Lattner 347*b417a5c1SPatrick Jenkins std::map<GlobalValue*, GlobalValue*> GlobalToPrototypeMap; 348*b417a5c1SPatrick Jenkins std::vector<GlobalValue*> OrigGlobals; 349*b417a5c1SPatrick Jenkins 350*b417a5c1SPatrick Jenkins // Adding specified functions to new module... 351*b417a5c1SPatrick Jenkins for (Module::iterator I = M->begin(), E = M->end(); I != E;) { 352*b417a5c1SPatrick Jenkins OrigGlobals.push_back(I); 353*b417a5c1SPatrick Jenkins if(TestFunctions.count(std::make_pair(I->getName(), I->getType()))) { 354*b417a5c1SPatrick Jenkins Module::iterator tempI = I; 355*b417a5c1SPatrick Jenkins I++; 356*b417a5c1SPatrick Jenkins Function * func = new Function(tempI->getFunctionType(), 357*b417a5c1SPatrick Jenkins GlobalValue::ExternalLinkage); 358*b417a5c1SPatrick Jenkins M->getFunctionList().insert(tempI, func); 359*b417a5c1SPatrick Jenkins New->getFunctionList().splice(New->end(), 360*b417a5c1SPatrick Jenkins M->getFunctionList(), 361*b417a5c1SPatrick Jenkins tempI); 362*b417a5c1SPatrick Jenkins func->setName(tempI->getName()); 363*b417a5c1SPatrick Jenkins func->setCallingConv(tempI->getCallingConv()); 364*b417a5c1SPatrick Jenkins GlobalToPrototypeMap[tempI] = func; 365*b417a5c1SPatrick Jenkins // NEW TO OLD 366*b417a5c1SPatrick Jenkins } else { 367*b417a5c1SPatrick Jenkins Function * func = new Function(I->getFunctionType(), 368*b417a5c1SPatrick Jenkins GlobalValue::ExternalLinkage, 369*b417a5c1SPatrick Jenkins I->getName(), 370*b417a5c1SPatrick Jenkins New); 371*b417a5c1SPatrick Jenkins func->setCallingConv(I->getCallingConv()); 372*b417a5c1SPatrick Jenkins GlobalToPrototypeMap[I] = func; 373*b417a5c1SPatrick Jenkins // NEW TO OLD 374*b417a5c1SPatrick Jenkins I++; 375*b417a5c1SPatrick Jenkins } 376*b417a5c1SPatrick Jenkins } 377*b417a5c1SPatrick Jenkins 378*b417a5c1SPatrick Jenkins //copy over global list 379*b417a5c1SPatrick Jenkins for (Module::global_iterator I = M->global_begin(), 380*b417a5c1SPatrick Jenkins E = M->global_end(); I != E; ++I) { 381*b417a5c1SPatrick Jenkins OrigGlobals.push_back(I); 382*b417a5c1SPatrick Jenkins GlobalVariable *glob = new GlobalVariable (I->getType()->getElementType(), 383*b417a5c1SPatrick Jenkins I->isConstant(), 384*b417a5c1SPatrick Jenkins GlobalValue::ExternalLinkage, 385*b417a5c1SPatrick Jenkins 0, 386*b417a5c1SPatrick Jenkins I->getName(), 387*b417a5c1SPatrick Jenkins New); 388*b417a5c1SPatrick Jenkins GlobalToPrototypeMap[I] = glob; 389*b417a5c1SPatrick Jenkins } 390*b417a5c1SPatrick Jenkins 391*b417a5c1SPatrick Jenkins // Copy all of the type symbol table entries over. 392*b417a5c1SPatrick Jenkins const SymbolTable &SymTab = M->getSymbolTable(); 393*b417a5c1SPatrick Jenkins SymbolTable::type_const_iterator TypeI = SymTab.type_begin(); 394*b417a5c1SPatrick Jenkins SymbolTable::type_const_iterator TypeE = SymTab.type_end(); 395*b417a5c1SPatrick Jenkins for (; TypeI != TypeE; ++TypeI) 396*b417a5c1SPatrick Jenkins New->addTypeName(TypeI->first, TypeI->second); 397*b417a5c1SPatrick Jenkins 398*b417a5c1SPatrick Jenkins // Loop over globals, rewriting uses in the module the prototype is in to use 399*b417a5c1SPatrick Jenkins // the prototype. 400*b417a5c1SPatrick Jenkins for (unsigned i = 0, e = OrigGlobals.size(); i != e; ++i) { 401*b417a5c1SPatrick Jenkins assert(OrigGlobals[i]->getName() == 402*b417a5c1SPatrick Jenkins GlobalToPrototypeMap[OrigGlobals[i]]->getName()); 403*b417a5c1SPatrick Jenkins RewriteUsesInNewModule(OrigGlobals[i], GlobalToPrototypeMap[OrigGlobals[i]], 404*b417a5c1SPatrick Jenkins OrigGlobals[i]->getParent()); 405*b417a5c1SPatrick Jenkins } 406fdb533a1SChris Lattner 407fdb533a1SChris Lattner // Make sure that there is a global ctor/dtor array in both halves of the 408fdb533a1SChris Lattner // module if they both have static ctor/dtor functions. 409fdb533a1SChris Lattner SplitStaticCtorDtor("llvm.global_ctors", M, New); 410fdb533a1SChris Lattner SplitStaticCtorDtor("llvm.global_dtors", M, New); 411fdb533a1SChris Lattner 412567543f0SChris Lattner return New; 413567543f0SChris Lattner } 414a060b10eSChris Lattner 415a060b10eSChris Lattner //===----------------------------------------------------------------------===// 416a060b10eSChris Lattner // Basic Block Extraction Code 417a060b10eSChris Lattner //===----------------------------------------------------------------------===// 418a060b10eSChris Lattner 419a060b10eSChris Lattner namespace { 420a060b10eSChris Lattner std::vector<BasicBlock*> BlocksToNotExtract; 421a060b10eSChris Lattner 422a060b10eSChris Lattner /// BlockExtractorPass - This pass is used by bugpoint to extract all blocks 423a060b10eSChris Lattner /// from the module into their own functions except for those specified by the 424a060b10eSChris Lattner /// BlocksToNotExtract list. 4254f2cf030SChris Lattner class BlockExtractorPass : public ModulePass { 4264f2cf030SChris Lattner bool runOnModule(Module &M); 427a060b10eSChris Lattner }; 428a060b10eSChris Lattner RegisterOpt<BlockExtractorPass> 429a060b10eSChris Lattner XX("extract-bbs", "Extract Basic Blocks From Module (for bugpoint use)"); 430a060b10eSChris Lattner } 431a060b10eSChris Lattner 4324f2cf030SChris Lattner bool BlockExtractorPass::runOnModule(Module &M) { 433a060b10eSChris Lattner std::set<BasicBlock*> TranslatedBlocksToNotExtract; 434a060b10eSChris Lattner for (unsigned i = 0, e = BlocksToNotExtract.size(); i != e; ++i) { 435a060b10eSChris Lattner BasicBlock *BB = BlocksToNotExtract[i]; 436a060b10eSChris Lattner Function *F = BB->getParent(); 437a060b10eSChris Lattner 438a060b10eSChris Lattner // Map the corresponding function in this module. 439a060b10eSChris Lattner Function *MF = M.getFunction(F->getName(), F->getFunctionType()); 440a060b10eSChris Lattner 441a060b10eSChris Lattner // Figure out which index the basic block is in its function. 442a060b10eSChris Lattner Function::iterator BBI = MF->begin(); 443a060b10eSChris Lattner std::advance(BBI, std::distance(F->begin(), Function::iterator(BB))); 444a060b10eSChris Lattner TranslatedBlocksToNotExtract.insert(BBI); 445a060b10eSChris Lattner } 446a060b10eSChris Lattner 447a060b10eSChris Lattner // Now that we know which blocks to not extract, figure out which ones we WANT 448a060b10eSChris Lattner // to extract. 449a060b10eSChris Lattner std::vector<BasicBlock*> BlocksToExtract; 450a060b10eSChris Lattner for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) 451a060b10eSChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 452a060b10eSChris Lattner if (!TranslatedBlocksToNotExtract.count(BB)) 453a060b10eSChris Lattner BlocksToExtract.push_back(BB); 454a060b10eSChris Lattner 455a060b10eSChris Lattner for (unsigned i = 0, e = BlocksToExtract.size(); i != e; ++i) 456a060b10eSChris Lattner ExtractBasicBlock(BlocksToExtract[i]); 457a060b10eSChris Lattner 458a060b10eSChris Lattner return !BlocksToExtract.empty(); 459a060b10eSChris Lattner } 460a060b10eSChris Lattner 461a060b10eSChris Lattner /// ExtractMappedBlocksFromModule - Extract all but the specified basic blocks 462a060b10eSChris Lattner /// into their own functions. The only detail is that M is actually a module 463a060b10eSChris Lattner /// cloned from the one the BBs are in, so some mapping needs to be performed. 464a060b10eSChris Lattner /// If this operation fails for some reason (ie the implementation is buggy), 465a060b10eSChris Lattner /// this function should return null, otherwise it returns a new Module. 466a060b10eSChris Lattner Module *BugDriver::ExtractMappedBlocksFromModule(const 467a060b10eSChris Lattner std::vector<BasicBlock*> &BBs, 468a060b10eSChris Lattner Module *M) { 469a060b10eSChris Lattner // Set the global list so that pass will be able to access it. 470a060b10eSChris Lattner BlocksToNotExtract = BBs; 471a060b10eSChris Lattner 472a060b10eSChris Lattner std::vector<const PassInfo*> PI; 473a060b10eSChris Lattner PI.push_back(getPI(new BlockExtractorPass())); 474a060b10eSChris Lattner Module *Ret = runPassesOn(M, PI); 475a060b10eSChris Lattner BlocksToNotExtract.clear(); 476af32dfa0SChris Lattner if (Ret == 0) { 477a060b10eSChris Lattner std::cout << "*** Basic Block extraction failed, please report a bug!\n"; 478af32dfa0SChris Lattner M = swapProgramIn(M); 479af32dfa0SChris Lattner EmitProgressBytecode("basicblockextractfail", true); 480917f8fd1SChris Lattner swapProgramIn(M); 481af32dfa0SChris Lattner } 482a060b10eSChris Lattner return Ret; 483a060b10eSChris Lattner } 484