diff options
Diffstat (limited to 'parallel-libs/streamexecutor/lib/Error.cpp')
-rw-r--r-- | parallel-libs/streamexecutor/lib/Error.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/parallel-libs/streamexecutor/lib/Error.cpp b/parallel-libs/streamexecutor/lib/Error.cpp new file mode 100644 index 00000000000..1f9d4a7834d --- /dev/null +++ b/parallel-libs/streamexecutor/lib/Error.cpp @@ -0,0 +1,71 @@ +//===-- Error.cpp - Error handling ----------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Types for returning recoverable errors. +/// +//===----------------------------------------------------------------------===// + +#include "streamexecutor/Error.h" + +#include "llvm/ADT/StringRef.h" + +namespace { + +// An error with a string message describing the cause. +class StreamExecutorError : public llvm::ErrorInfo<StreamExecutorError> { +public: + StreamExecutorError(llvm::StringRef Message) : Message(Message.str()) {} + + void log(llvm::raw_ostream &OS) const override { OS << Message; } + + std::error_code convertToErrorCode() const override { + llvm_unreachable( + "StreamExecutorError does not support conversion to std::error_code"); + } + + std::string getErrorMessage() const { return Message; } + + static char ID; + +private: + std::string Message; +}; + +char StreamExecutorError::ID = 0; + +} // namespace + +namespace streamexecutor { + +Error make_error(Twine Message) { + return llvm::make_error<StreamExecutorError>(Message.str()); +} + +std::string consumeAndGetMessage(Error &&E) { + if (!E) { + return "success"; + } + std::string Message; + llvm::handleAllErrors(std::move(E), + [&Message](const StreamExecutorError &SEE) { + Message = SEE.getErrorMessage(); + }); + return Message; +} + +void dieIfError(Error &&E) { + if (E) { + std::fprintf(stderr, "Error encountered: %s.\n", + streamexecutor::consumeAndGetMessage(std::move(E)).c_str()); + std::exit(EXIT_FAILURE); + } +} + +} // namespace streamexecutor |