1 //===- ErrorCollector.cpp -------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===-----------------------------------------------------------------------===/ 8 9 #include "ErrorCollector.h" 10 #include "llvm/Support/Errc.h" 11 #include "llvm/Support/Error.h" 12 #include "llvm/Support/WithColor.h" 13 #include "llvm/Support/raw_ostream.h" 14 #include <vector> 15 16 using namespace llvm; 17 using namespace llvm::elfabi; 18 escalateToFatal()19void ErrorCollector::escalateToFatal() { 20 ErrorsAreFatal = true; 21 } 22 addError(Error && Err,StringRef Tag)23void ErrorCollector::addError(Error &&Err, StringRef Tag) { 24 if (Err) { 25 Errors.push_back(std::move(Err)); 26 Tags.push_back(Tag.str()); 27 } 28 } 29 makeError()30Error ErrorCollector::makeError() { 31 // TODO: Make this return something (an AggregateError?) that gives more 32 // individual control over each error and which might be of interest. 33 Error JoinedErrors = Error::success(); 34 for (Error &E : Errors) { 35 JoinedErrors = joinErrors(std::move(JoinedErrors), std::move(E)); 36 } 37 Errors.clear(); 38 Tags.clear(); 39 return JoinedErrors; 40 } 41 log(raw_ostream & OS)42void ErrorCollector::log(raw_ostream &OS) { 43 OS << "Encountered multiple errors:\n"; 44 for (size_t i = 0; i < Errors.size(); ++i) { 45 WithColor::error(OS) << "(" << Tags[i] << ") " << Errors[i]; 46 if (i != Errors.size() - 1) 47 OS << "\n"; 48 } 49 } 50 allErrorsHandled() const51bool ErrorCollector::allErrorsHandled() const { 52 return Errors.empty(); 53 } 54 ~ErrorCollector()55ErrorCollector::~ErrorCollector() { 56 if (ErrorsAreFatal && !allErrorsHandled()) 57 fatalUnhandledError(); 58 59 for (Error &E : Errors) { 60 consumeError(std::move(E)); 61 } 62 } 63 fatalUnhandledError()64LLVM_ATTRIBUTE_NORETURN void ErrorCollector::fatalUnhandledError() { 65 errs() << "Program aborted due to unhandled Error(s):\n"; 66 log(errs()); 67 errs() << "\n"; 68 abort(); 69 } 70