diff options
author | Zachary Turner <zturner@google.com> | 2016-05-25 20:37:03 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-05-25 20:37:03 +0000 |
commit | d5d37dcf8329b7c5774aadc60c4474c8e4a4e55f (patch) | |
tree | d6b8dde6b19a10110b013544b3288848120add80 /llvm/lib/DebugInfo/CodeView/CodeViewError.cpp | |
parent | 1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec (diff) | |
download | bcm5719-llvm-d5d37dcf8329b7c5774aadc60c4474c8e4a4e55f.tar.gz bcm5719-llvm-d5d37dcf8329b7c5774aadc60c4474c8e4a4e55f.zip |
[codeview] Move StreamInterface and StreamReader to libcodeview.
We have need to reuse this functionality, including making
additional generic stream types that are smarter about how and
when they copy memory versus referencing the original memory.
So all of these structures belong in the common library
rather than being pdb specific.
llvm-svn: 270751
Diffstat (limited to 'llvm/lib/DebugInfo/CodeView/CodeViewError.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/CodeViewError.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp new file mode 100644 index 00000000000..4db6b2941a6 --- /dev/null +++ b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp @@ -0,0 +1,65 @@ +//===- CodeViewError.cpp - Error extensions for CodeView --------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/CodeView/CodeViewError.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/ManagedStatic.h" + +using namespace llvm; +using namespace llvm::codeview; + +namespace { +// FIXME: This class is only here to support the transition to llvm::Error. It +// will be removed once this transition is complete. Clients should prefer to +// deal with the Error value directly, rather than converting to error_code. +class CodeViewErrorCategory : public std::error_category { +public: + const char *name() const LLVM_NOEXCEPT override { return "llvm.codeview"; } + + std::string message(int Condition) const override { + switch (static_cast<cv_error_code>(Condition)) { + case cv_error_code::unspecified: + return "An unknown error has occurred."; + case cv_error_code::insufficient_buffer: + return "The buffer is not large enough to read the requested number of " + "bytes."; + case cv_error_code::corrupt_record: + return "The CodeView record is corrupted."; + } + llvm_unreachable("Unrecognized cv_error_code"); + } +}; +} // end anonymous namespace + +static ManagedStatic<CodeViewErrorCategory> Category; + +char CodeViewError::ID = 0; + +CodeViewError::CodeViewError(cv_error_code C) : CodeViewError(C, "") {} + +CodeViewError::CodeViewError(const std::string &Context) + : CodeViewError(cv_error_code::unspecified, Context) {} + +CodeViewError::CodeViewError(cv_error_code C, const std::string &Context) + : Code(C) { + ErrMsg = "CodeView Error: "; + std::error_code EC = convertToErrorCode(); + if (Code != cv_error_code::unspecified) + ErrMsg += EC.message() + " "; + if (!Context.empty()) + ErrMsg += Context; +} + +void CodeViewError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } + +const std::string &CodeViewError::getErrorMessage() const { return ErrMsg; } + +std::error_code CodeViewError::convertToErrorCode() const { + return std::error_code(static_cast<int>(Code), *Category); +} |