diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:19:15 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:19:15 +0000 |
commit | d93e1dfac8711cfed1a9d9cd1876a788b83945cd (patch) | |
tree | 5896fa6c02a262a6148b215487e545d937de58b7 /ELF/Error.h | |
parent | 8d43286d630f9224de07809ea253e83ebb9cdee6 (diff) | |
download | src-test2-d93e1dfac8711cfed1a9d9cd1876a788b83945cd.tar.gz src-test2-d93e1dfac8711cfed1a9d9cd1876a788b83945cd.zip |
Notes
Diffstat (limited to 'ELF/Error.h')
-rw-r--r-- | ELF/Error.h | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/ELF/Error.h b/ELF/Error.h index 552f50498464..1ec683595cf4 100644 --- a/ELF/Error.h +++ b/ELF/Error.h @@ -6,31 +6,47 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// +// +// In LLD, we have three levels of errors: fatal, error or warn. +// +// Fatal makes the program exit immediately with an error message. +// You shouldn't use it except for reporting a corrupted input file. +// +// Error prints out an error message and increment a global variable +// ErrorCount to record the fact that we met an error condition. It does +// not exit, so it is safe for a lld-as-a-library use case. It is generally +// useful because it can report more than one errors in a single run. +// +// Warn doesn't do anything but printing out a given message. +// +//===----------------------------------------------------------------------===// -#ifndef LLD_COFF_ERROR_H -#define LLD_COFF_ERROR_H +#ifndef LLD_ELF_ERROR_H +#define LLD_ELF_ERROR_H #include "lld/Core/LLVM.h" +#include "llvm/Support/Error.h" + namespace lld { namespace elf { -extern bool HasError; +extern uint64_t ErrorCount; extern llvm::raw_ostream *ErrorOS; +extern llvm::StringRef Argv0; void log(const Twine &Msg); -void warning(const Twine &Msg); +void warn(const Twine &Msg); void error(const Twine &Msg); void error(std::error_code EC, const Twine &Prefix); -template <typename T> void error(const ErrorOr<T> &V, const Twine &Prefix) { - error(V.getError(), Prefix); -} - +LLVM_ATTRIBUTE_NORETURN void exitLld(int Val); LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg); -LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg, const Twine &Prefix); +LLVM_ATTRIBUTE_NORETURN void fatal(std::error_code EC, const Twine &Prefix); +// check() functions are convenient functions to strip errors +// from error-or-value objects. template <class T> T check(ErrorOr<T> E) { if (auto EC = E.getError()) fatal(EC.message()); @@ -39,19 +55,23 @@ template <class T> T check(ErrorOr<T> E) { template <class T> T check(Expected<T> E) { if (!E) - fatal(errorToErrorCode(E.takeError()).message()); + handleAllErrors(std::move(E.takeError()), + [](llvm::ErrorInfoBase &EIB) -> Error { + fatal(EIB.message()); + return Error::success(); + }); return std::move(*E); } template <class T> T check(ErrorOr<T> E, const Twine &Prefix) { if (auto EC = E.getError()) - fatal(EC.message(), Prefix); + fatal(Prefix + ": " + EC.message()); return std::move(*E); } template <class T> T check(Expected<T> E, const Twine &Prefix) { if (!E) - fatal(errorToErrorCode(E.takeError()).message(), Prefix); + fatal(Prefix + ": " + errorToErrorCode(E.takeError()).message()); return std::move(*E); } |