diff options
Diffstat (limited to 'llvm/tools/llvm-elfabi/ErrorCollector.cpp')
| -rw-r--r-- | llvm/tools/llvm-elfabi/ErrorCollector.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/llvm/tools/llvm-elfabi/ErrorCollector.cpp b/llvm/tools/llvm-elfabi/ErrorCollector.cpp new file mode 100644 index 00000000000..0d74979c9a3 --- /dev/null +++ b/llvm/tools/llvm-elfabi/ErrorCollector.cpp @@ -0,0 +1,70 @@ +//===- ErrorCollector.cpp -------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===-----------------------------------------------------------------------===/ + +#include "ErrorCollector.h" +#include "llvm/Support/Errc.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/WithColor.h" +#include <vector> + +using namespace llvm; +using namespace llvm::elfabi; + +void ErrorCollector::escalateToFatal() { + ErrorsAreFatal = true; +} + +void ErrorCollector::addError(Error &&Err, StringRef Tag) { + if (Err) { + Errors.push_back(std::move(Err)); + Tags.push_back(Tag.str()); + } +} + +Error ErrorCollector::makeError() { + // TODO: Make this return something (an AggregateError?) that gives more + // individual control over each error and which might be of interest. + Error JoinedErrors = Error::success(); + for (Error &E : Errors) { + JoinedErrors = joinErrors(std::move(JoinedErrors), std::move(E)); + } + Errors.clear(); + Tags.clear(); + return JoinedErrors; +} + +void ErrorCollector::log(raw_ostream &OS) { + OS << "Encountered multiple errors:\n"; + for (size_t i = 0; i < Errors.size(); ++i) { + WithColor::error(OS) << "(" << Tags[i] << ") " << Errors[i]; + if (i != Errors.size() - 1) + OS << "\n"; + } +} + +bool ErrorCollector::allErrorsHandled() const { + return Errors.empty(); +} + +ErrorCollector::~ErrorCollector() { + if (ErrorsAreFatal && !allErrorsHandled()) + fatalUnhandledError(); + + for (Error &E : Errors) { + consumeError(std::move(E)); + } +} + +LLVM_ATTRIBUTE_NORETURN void ErrorCollector::fatalUnhandledError() { + errs() << "Program aborted due to unhandled Error(s):\n"; + log(errs()); + errs() << "\n"; + abort(); +} |

