diff options
author | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
---|---|---|
committer | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
commit | 06e5c21a835c0e923506c4ff27929f34e00761c2 (patch) | |
tree | 75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp | |
parent | 03f024c4412e3aa613bb543cf1660176320ba8f4 (diff) | |
download | ydb-06e5c21a835c0e923506c4ff27929f34e00761c2.tar.gz |
fix ya.make
Diffstat (limited to 'contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp')
-rw-r--r-- | contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp b/contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp new file mode 100644 index 0000000000..a52aeff826 --- /dev/null +++ b/contrib/libs/llvm12/tools/llvm-elfabi/ErrorCollector.cpp @@ -0,0 +1,65 @@ +//===- ErrorCollector.cpp -------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===-----------------------------------------------------------------------===/ + +#include "ErrorCollector.h" +#include "llvm/Support/Errc.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/WithColor.h" +#include "llvm/Support/raw_ostream.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(); +} |