diff options
Diffstat (limited to 'bolt/lib/Rewrite/BinaryPassManager.cpp')
| -rw-r--r-- | bolt/lib/Rewrite/BinaryPassManager.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp index 9946608c96d8..489b33fe1c7c 100644 --- a/bolt/lib/Rewrite/BinaryPassManager.cpp +++ b/bolt/lib/Rewrite/BinaryPassManager.cpp @@ -268,7 +268,7 @@ const char BinaryFunctionPassManager::TimerGroupName[] = "passman"; const char BinaryFunctionPassManager::TimerGroupDesc[] = "Binary Function Pass Manager"; -void BinaryFunctionPassManager::runPasses() { +Error BinaryFunctionPassManager::runPasses() { auto &BFs = BC.getBinaryFunctions(); for (size_t PassIdx = 0; PassIdx < Passes.size(); PassIdx++) { const std::pair<const bool, std::unique_ptr<BinaryFunctionPass>> @@ -281,13 +281,20 @@ void BinaryFunctionPassManager::runPasses() { formatv("{0:2}_{1}", PassIdx, Pass->getName()).str(); if (opts::Verbosity > 0) - outs() << "BOLT-INFO: Starting pass: " << Pass->getName() << "\n"; + BC.outs() << "BOLT-INFO: Starting pass: " << Pass->getName() << "\n"; NamedRegionTimer T(Pass->getName(), Pass->getName(), TimerGroupName, TimerGroupDesc, TimeOpts); - callWithDynoStats([this, &Pass] { Pass->runOnFunctions(BC); }, BFs, - Pass->getName(), opts::DynoStatsAll, BC.isAArch64()); + Error E = Error::success(); + callWithDynoStats( + BC.outs(), + [this, &E, &Pass] { + E = joinErrors(std::move(E), Pass->runOnFunctions(BC)); + }, + BFs, Pass->getName(), opts::DynoStatsAll, BC.isAArch64()); + if (E) + return Error(std::move(E)); if (opts::VerifyCFG && !std::accumulate( @@ -296,13 +303,13 @@ void BinaryFunctionPassManager::runPasses() { const std::pair<const uint64_t, BinaryFunction> &It) { return Valid && It.second.validateCFG(); })) { - errs() << "BOLT-ERROR: Invalid CFG detected after pass " - << Pass->getName() << "\n"; - exit(1); + return createFatalBOLTError( + Twine("BOLT-ERROR: Invalid CFG detected after pass ") + + Twine(Pass->getName()) + Twine("\n")); } if (opts::Verbosity > 0) - outs() << "BOLT-INFO: Finished pass: " << Pass->getName() << "\n"; + BC.outs() << "BOLT-INFO: Finished pass: " << Pass->getName() << "\n"; if (!opts::PrintAll && !opts::DumpDotAll && !Pass->printPass()) continue; @@ -315,15 +322,16 @@ void BinaryFunctionPassManager::runPasses() { if (!Pass->shouldPrint(Function)) continue; - Function.print(outs(), Message); + Function.print(BC.outs(), Message); if (opts::DumpDotAll) Function.dumpGraphForPass(PassIdName); } } + return Error::success(); } -void BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) { +Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) { BinaryFunctionPassManager Manager(BC); const DynoStats InitialDynoStats = @@ -516,7 +524,7 @@ void BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) { // in parallel and restore them Manager.registerPass(std::make_unique<CleanMCState>(NeverPrint)); - Manager.runPasses(); + return Manager.runPasses(); } } // namespace bolt |
