//===-- FindBugs.cpp - Run Many Different Optimizations -------------------===// // // The LLVM Compiler Infrastructure // // This file was developed by Patrick Jenkins and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines an interface that allows bugpoint to choose different // combinations of optimizations to run on the selected input. Bugpoint will // run these optimizations and record the success/failure of each. This way // we can hopefully spot bugs in the optimizations. // //===----------------------------------------------------------------------===// #include "BugDriver.h" #include "ToolRunner.h" #include "llvm/Bytecode/WriteBytecodePass.h" #include #include using namespace llvm; /// runManyPasses - Take the specified pass list and create different /// combinations of passes to compile the program with. Compile the program with /// each set and mark test to see if it compiled correctly. If the passes /// compiled correctly output nothing and rearrange the passes into a new order. /// If the passes did not compile correctly, output the command required to /// recreate the failure. This returns true if a compiler error is found. /// bool BugDriver::runManyPasses(const std::vector &AllPasses) { std::string Filename; std::vector TempPass(AllPasses); std::cout << "Starting bug finding procedure...\n\n"; // Creating a reference output if necessary if (initializeExecutionEnvironment()) return false; std::cout << "\n"; if (ReferenceOutputFile.empty()) { std::cout << "Generating reference output from raw program: \n"; if(!createReferenceFile(Program)){ return false; } } srand(time(NULL)); std::vector::iterator I = TempPass.begin(); std::vector::iterator E = TempPass.end(); int num=1; while(1){ // // Step 1: Randomize the order of the optimizer passes. // std::random_shuffle(TempPass.begin(), TempPass.end()); // // Step 2: Run optimizer passes on the program and check for success. // std::cout << "Running selected passes on program to test for crash: "; for(int i=0, e=TempPass.size(); i!=e; i++) { std::cout << "-" << TempPass[i]->getPassArgument( )<< " "; } std::string Filename; if(runPasses(TempPass, Filename, false)) { std::cout << "\n"; std::cout << "Optimizer passes caused failure!\n\n"; debugOptimizerCrash(); return true; } else{ std::cout << "Combination "<