• Home
  • Raw
  • Download

Lines Matching +full:- +full:bd

1 //===- Miscompilation.cpp - Debug program miscompilations -----------------===//
8 //===----------------------------------------------------------------------===//
13 //===----------------------------------------------------------------------===//
39 DisableLoopExtraction("disable-loop-extraction",
43 DisableBlockExtraction("disable-block-extraction",
48 BugDriver &BD; member in __anon707bc4810111::ReduceMiscompilingPasses
50 ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} in ReduceMiscompilingPasses() argument
58 /// TestResult - After passes have been split into a test group and a control
71 if (BD.runPasses(BD.getProgram(), Suffix, BitcodeResult, false/*delete*/, in doTest()
75 BD.setPassesToRun(Suffix); in doTest()
76 BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); in doTest()
77 exit(BD.debugOptimizerCrash()); in doTest()
81 bool Diff = BD.diffProgram(BD.getProgram(), BitcodeResult, "", in doTest()
88 errs() << BD.getToolName() << ": I'm confused: the test fails when " in doTest()
109 if (BD.runPasses(BD.getProgram(), Prefix, BitcodeResult, false/*delete*/, in doTest()
113 BD.setPassesToRun(Prefix); in doTest()
114 BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); in doTest()
115 exit(BD.debugOptimizerCrash()); in doTest()
119 Diff = BD.diffProgram(BD.getProgram(), BitcodeResult, "", false, &Error); in doTest()
133 parseInputFile(BitcodeResult, BD.getContext()); in doTest()
135 errs() << BD.getToolName() << ": Error reading bitcode file '" in doTest()
150 BD.swapProgramIn(PrefixOutput.release())); in doTest()
151 if (BD.runPasses(BD.getProgram(), Suffix, BitcodeResult, false/*delete*/, in doTest()
155 BD.setPassesToRun(Suffix); in doTest()
156 BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); in doTest()
157 exit(BD.debugOptimizerCrash()); in doTest()
161 Diff = BD.diffProgram(BD.getProgram(), BitcodeResult, "", in doTest()
173 delete BD.swapProgramIn(OriginalInput.release()); in doTest()
179 BugDriver &BD; member in __anon707bc4810211::ReduceMiscompilingFunctions
184 ReduceMiscompilingFunctions(BugDriver &bd, in ReduceMiscompilingFunctions() argument
188 : BD(bd), TestFn(F) {} in ReduceMiscompilingFunctions()
220 static std::unique_ptr<Module> testMergedProgram(const BugDriver &BD, in testMergedProgram() argument
229 Broken = BD.diffProgram(M1.get(), "", "", false, &Error); in testMergedProgram()
235 /// TestFuncs - split functions in a Module into two groups: those that are
246 << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":"; in TestFuncs()
258 Module *Clone = CloneModule(BD.getProgram(), VMap).release(); in TestFuncs()
259 Module *Orig = BD.swapProgramIn(Clone); in TestFuncs()
269 std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); in TestFuncs()
274 TestFn(BD, std::move(ToOptimize), std::move(ToNotOptimize), Error); in TestFuncs()
276 delete BD.swapProgramIn(Orig); in TestFuncs()
281 /// DisambiguateGlobalSymbols - Give anonymous global values names.
284 for (Module::global_iterator I = M->global_begin(), E = M->global_end(); in DisambiguateGlobalSymbols()
286 if (!I->hasName()) in DisambiguateGlobalSymbols()
287 I->setName("anon_global"); in DisambiguateGlobalSymbols()
288 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) in DisambiguateGlobalSymbols()
289 if (!I->hasName()) in DisambiguateGlobalSymbols()
290 I->setName("anon_fn"); in DisambiguateGlobalSymbols()
297 static bool ExtractLoops(BugDriver &BD, in ExtractLoops() argument
307 std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); in ExtractLoops()
312 BD.extractLoop(ToOptimize); in ExtractLoops()
327 AbstractInterpreter *AI = BD.switchToSafeInterpreter(); in ExtractLoops()
330 testMergedProgram(BD, std::move(ToOptimizeLoopExtracted), in ExtractLoops()
336 Module *Old = BD.swapProgramIn(New.release()); in ExtractLoops()
342 BD.switchToInterpreter(AI); in ExtractLoops()
347 errs() << " Continuing on with un-loop-extracted version.\n"; in ExtractLoops()
349 BD.writeProgramToFile(OutputPrefix + "-loop-extract-fail-tno.bc", in ExtractLoops()
351 BD.writeProgramToFile(OutputPrefix + "-loop-extract-fail-to.bc", in ExtractLoops()
353 BD.writeProgramToFile(OutputPrefix + "-loop-extract-fail-to-le.bc", in ExtractLoops()
357 << OutputPrefix << "-loop-extract-fail-*.bc files.\n"; in ExtractLoops()
362 BD.switchToInterpreter(AI); in ExtractLoops()
373 Failure = TestFn(BD, std::move(ToOptimizeLoopExtracted), in ExtractLoops()
388 MisCompFunctions.emplace_back(F->getName(), F->getFunctionType()); in ExtractLoops()
397 Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first); in ExtractLoops()
403 BD.setNewProgram(ToNotOptimize.release()); in ExtractLoops()
410 for (Module::iterator I = ToOptimizeLoopExtracted->begin(), in ExtractLoops()
411 E = ToOptimizeLoopExtracted->end(); I != E; ++I) in ExtractLoops()
412 if (!I->isDeclaration()) in ExtractLoops()
413 MisCompFunctions.emplace_back(I->getName(), I->getFunctionType()); in ExtractLoops()
427 Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first); in ExtractLoops()
433 BD.setNewProgram(ToNotOptimize.release()); in ExtractLoops()
440 BugDriver &BD; member in __anon707bc4810311::ReduceMiscompiledBlocks
445 ReduceMiscompiledBlocks(BugDriver &bd, in ReduceMiscompiledBlocks() argument
449 : BD(bd), TestFn(F), FunctionsBeingTested(Fns) {} in ReduceMiscompiledBlocks()
475 /// TestFuncs - Extract all blocks for the miscompiled functions except for the
486 outs() << BBs[i]->getName() << " "; in TestFuncs()
495 Module *Clone = CloneModule(BD.getProgram(), VMap).release(); in TestFuncs()
496 Module *Orig = BD.swapProgramIn(Clone); in TestFuncs()
509 std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); in TestFuncs()
516 BD.extractMappedBlocksFromModule(BBsOnClone, ToOptimize.get())) { in TestFuncs()
517 bool Ret = TestFn(BD, std::move(New), std::move(ToNotOptimize), Error); in TestFuncs()
518 delete BD.swapProgramIn(Orig); in TestFuncs()
521 delete BD.swapProgramIn(Orig); in TestFuncs()
528 static bool ExtractBlocks(BugDriver &BD, in ExtractBlocks() argument
547 bool Ret = ReduceMiscompiledBlocks(BD, TestFn, MiscompiledFunctions) in ExtractBlocks()
554 ReduceMiscompiledBlocks(BD, TestFn, in ExtractBlocks()
563 Module *ProgClone = CloneModule(BD.getProgram(), VMap).release(); in ExtractBlocks()
568 BD.extractMappedBlocksFromModule(Blocks, ToExtract); in ExtractBlocks()
582 for (Module::iterator I = Extracted->begin(), E = Extracted->end(); in ExtractBlocks()
584 if (!I->isDeclaration()) in ExtractBlocks()
585 MisCompFunctions.emplace_back(I->getName(), I->getFunctionType()); in ExtractBlocks()
591 BD.setNewProgram(ProgClone); in ExtractBlocks()
597 Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first); in ExtractBlocks()
609 DebugAMiscompilation(BugDriver &BD, in DebugAMiscompilation() argument
615 // miscompiled... first build a list of all of the non-external functions in in DebugAMiscompilation()
618 Module *Prog = BD.getProgram(); in DebugAMiscompilation()
625 ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions, in DebugAMiscompilation()
641 bool Ret = ExtractLoops(BD, TestFn, MiscompiledFunctions, Error); in DebugAMiscompilation()
647 DisambiguateGlobalSymbols(BD.getProgram()); in DebugAMiscompilation()
651 ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions, in DebugAMiscompilation()
665 bool Ret = ExtractBlocks(BD, TestFn, MiscompiledFunctions, Error); in DebugAMiscompilation()
671 DisambiguateGlobalSymbols(BD.getProgram()); in DebugAMiscompilation()
674 ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions, in DebugAMiscompilation()
694 static bool TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test, in TestOptimizer() argument
700 BD.runPassesOn(Test.get(), BD.getPassesToRun()); in TestOptimizer()
704 delete BD.swapProgramIn(Test.get()); in TestOptimizer()
705 BD.EmitProgressBitcode(Test.get(), "pass-error", false); in TestOptimizer()
706 return BD.debugOptimizerCrash(); in TestOptimizer()
713 BD, std::move(Optimized), std::move(Safe), Error, Broken); in TestOptimizer()
717 delete BD.swapProgramIn(New.release()); in TestOptimizer()
722 /// debugMiscompilation - This method is used when the passes selected are not
730 if (Error->empty()) in debugMiscompilation()
743 if (!Error->empty()) in debugMiscompilation()
754 outs() << " Non-optimized portion: "; in debugMiscompilation()
765 static void CleanupAndPrepareModules(BugDriver &BD, in CleanupAndPrepareModules() argument
769 Test = BD.performFinalCleanups(Test.get()); in CleanupAndPrepareModules()
772 if (!BD.isExecutingJIT()) return; in CleanupAndPrepareModules()
777 if (Function *oldMain = Safe->getFunction("main")) in CleanupAndPrepareModules()
778 if (!oldMain->isDeclaration()) { in CleanupAndPrepareModules()
780 oldMain->setName("llvm_bugpoint_old_main"); in CleanupAndPrepareModules()
783 Function::Create(oldMain->getFunctionType(), in CleanupAndPrepareModules()
787 Function *oldMainProto = Function::Create(oldMain->getFunctionType(), in CleanupAndPrepareModules()
789 oldMain->getName(), Test.get()); in CleanupAndPrepareModules()
793 I = newMain->arg_begin(), E = newMain->arg_end(), in CleanupAndPrepareModules()
794 OI = oldMain->arg_begin(); I != E; ++I, ++OI) { in CleanupAndPrepareModules()
795 I->setName(OI->getName()); // Copy argument names from oldMain in CleanupAndPrepareModules()
800 BasicBlock *BB = BasicBlock::Create(Safe->getContext(), "entry", newMain); in CleanupAndPrepareModules()
804 ReturnInst::Create(Safe->getContext(), call, BB); in CleanupAndPrepareModules()
815 Safe->getOrInsertFunction("getPointerToNamedFunction", in CleanupAndPrepareModules()
816 Type::getInt8PtrTy(Safe->getContext()), in CleanupAndPrepareModules()
817 Type::getInt8PtrTy(Safe->getContext()), in CleanupAndPrepareModules()
821 for (Module::iterator F = Safe->begin(), E = Safe->end(); F != E; ++F) { in CleanupAndPrepareModules()
822 if (F->isDeclaration() && !F->use_empty() && &*F != resolverFunc && in CleanupAndPrepareModules()
823 !F->isIntrinsic() /* ignore intrinsics */) { in CleanupAndPrepareModules()
824 Function *TestFn = Test->getFunction(F->getName()); in CleanupAndPrepareModules()
827 if (TestFn && !TestFn->isDeclaration()) { in CleanupAndPrepareModules()
830 ConstantDataArray::getString(F->getContext(), F->getName()); in CleanupAndPrepareModules()
832 new GlobalVariable(*Safe, InitArray->getType(), true /*isConstant*/, in CleanupAndPrepareModules()
834 F->getName() + "_name"); in CleanupAndPrepareModules()
841 Constant::getNullValue(Type::getInt32Ty(F->getContext()))); in CleanupAndPrepareModules()
842 Value *GEP = ConstantExpr::getGetElementPtr(InitArray->getType(), in CleanupAndPrepareModules()
849 if (!F->use_empty()) { in CleanupAndPrepareModules()
851 Constant *NullPtr = ConstantPointerNull::get(F->getType()); in CleanupAndPrepareModules()
853 new GlobalVariable(*F->getParent(), F->getType(), in CleanupAndPrepareModules()
855 NullPtr,F->getName()+".fpcache"); in CleanupAndPrepareModules()
857 // Construct a new stub function that will re-route calls to F in CleanupAndPrepareModules()
858 FunctionType *FuncTy = F->getFunctionType(); in CleanupAndPrepareModules()
861 F->getName() + "_wrapper", in CleanupAndPrepareModules()
862 F->getParent()); in CleanupAndPrepareModules()
863 BasicBlock *EntryBB = BasicBlock::Create(F->getContext(), in CleanupAndPrepareModules()
865 BasicBlock *DoCallBB = BasicBlock::Create(F->getContext(), in CleanupAndPrepareModules()
867 BasicBlock *LookupBB = BasicBlock::Create(F->getContext(), in CleanupAndPrepareModules()
882 // Cast the result from the resolver to correctly-typed function. in CleanupAndPrepareModules()
885 PointerType::getUnqual(F->getFunctionType()), in CleanupAndPrepareModules()
892 PHINode *FuncPtr = PHINode::Create(NullPtr->getType(), 2, in CleanupAndPrepareModules()
894 FuncPtr->addIncoming(CastedResolver, LookupBB); in CleanupAndPrepareModules()
895 FuncPtr->addIncoming(CachedVal, EntryBB); in CleanupAndPrepareModules()
899 for (Argument &A : FuncWrapper->args()) in CleanupAndPrepareModules()
903 if (F->getReturnType()->isVoidTy()) { in CleanupAndPrepareModules()
905 ReturnInst::Create(F->getContext(), DoCallBB); in CleanupAndPrepareModules()
909 ReturnInst::Create(F->getContext(),Call, DoCallBB); in CleanupAndPrepareModules()
913 F->replaceAllUsesWith(FuncWrapper); in CleanupAndPrepareModules()
929 static bool TestCodeGenerator(BugDriver &BD, std::unique_ptr<Module> Test, in TestCodeGenerator() argument
932 CleanupAndPrepareModules(BD, Test, Safe.get()); in TestCodeGenerator()
939 errs() << BD.getToolName() << "Error making unique filename: " in TestCodeGenerator()
943 if (BD.writeProgramToFile(TestModuleBC.str(), TestModuleFD, Test.get())) { in TestCodeGenerator()
957 errs() << BD.getToolName() << "Error making unique filename: " in TestCodeGenerator()
962 if (BD.writeProgramToFile(SafeModuleBC.str(), SafeModuleFD, Safe.get())) { in TestCodeGenerator()
970 std::string SharedObject = BD.compileSharedObject(SafeModuleBC.str(), Error); in TestCodeGenerator()
978 bool Result = BD.diffProgram(BD.getProgram(), TestModuleBC.str(), in TestCodeGenerator()
991 /// debugCodeGenerator - debug errors in LLC, LLI, or CBE.
997 if (Error->empty()) { in debugCodeGenerator()
999 << "the reference diff. This may be due to a\n front-end " in debugCodeGenerator()
1014 if (!Error->empty()) in debugCodeGenerator()
1060 if (!Error->empty()) in debugCodeGenerator()
1065 outs() << " lli -load " << SharedObject << " " << TestModuleBC; in debugCodeGenerator()
1067 outs() << " llc " << TestModuleBC << " -o " << TestModuleBC in debugCodeGenerator()
1070 << ".s -o " << TestModuleBC << ".exe"; in debugCodeGenerator()
1072 outs() << " -Wl,-R."; in debugCodeGenerator()
1080 outs() << "The shared object was created with:\n llc -march=c " in debugCodeGenerator()
1081 << SafeModuleBC.str() << " -o temporary.c\n" in debugCodeGenerator()
1082 << " cc -xc temporary.c -O2 -o " << SharedObject; in debugCodeGenerator()
1084 outs() << " -G"; // Compile a shared library, `-G' for Sparc in debugCodeGenerator()
1086 outs() << " -fPIC -shared"; // `-shared' for Linux/X86, maybe others in debugCodeGenerator()
1088 outs() << " -fno-strict-aliasing\n"; in debugCodeGenerator()