diff options
author | Lang Hames <lhames@gmail.com> | 2018-08-15 18:42:11 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-08-15 18:42:11 +0000 |
commit | 00fb14da274efc35afa4eba6019050bbcf605ead (patch) | |
tree | 4bc31d4a6a20d3091c7406ba15bafcca3d3bfc5f /llvm/include | |
parent | 5222cb601b9a04df93cc3603ede80cc0e3dc9940 (diff) | |
download | bcm5719-llvm-00fb14da274efc35afa4eba6019050bbcf605ead.tar.gz bcm5719-llvm-00fb14da274efc35afa4eba6019050bbcf605ead.zip |
[Support] Add a basic C API for llvm::Error.
Summary:
The C-API supports consuming errors, converting an error to a string error
message, and querying an error's type. Other LLVM C APIs that wish to use
llvm::Error can supply error-type-id checkers and custom
error-to-structured-type converters for any custom errors they provide.
Reviewers: bogner, zturner, labath, dblaikie
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D50716
llvm-svn: 339802
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm-c/Error.h | 65 | ||||
-rw-r--r-- | llvm/include/llvm/Support/Error.h | 17 |
2 files changed, 81 insertions, 1 deletions
diff --git a/llvm/include/llvm-c/Error.h b/llvm/include/llvm-c/Error.h new file mode 100644 index 00000000000..00714ec950e --- /dev/null +++ b/llvm/include/llvm-c/Error.h @@ -0,0 +1,65 @@ +/*===------- llvm-c/Error.h - llvm::Error class C Interface -------*- C -*-===*\ +|* *| +|* The LLVM Compiler Infrastructure *| +|* *| +|* This file is distributed under the University of Illinois Open Source *| +|* License. See LICENSE.TXT for details. *| +|* *| +|*===----------------------------------------------------------------------===*| +|* *| +|* This file defines the C interface to LLVM's Error class. *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifndef LLVM_C_ERROR_H +#define LLVM_C_ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Opaque reference to an error instance. Null serves as the 'success' value. + */ +typedef struct LLVMOpaqueError *LLVMErrorRef; + +/** + * Error type identifier. + */ +typedef const void *LLVMErrorTypeId; + +/** + * Returns the type id for the given error instance, which must be a failure + * value (i.e. non-null). + */ +LLVMErrorTypeId LLVMGetErrorTypeId(LLVMErrorRef Err); + +/** + * Dispose of the given error without handling it. This operation consumes the + * error, and the given LLVMErrorRef value is not usable once this call returns. + * Note: This method *only* needs to be called if the error is not being passed + * to some other consuming operation, e.g. LLVMGetErrorMessage. + */ +void LLVMConsumeError(LLVMErrorRef Err); + +/** + * Returns the given string's error message. This operation consumes the error, + * and the given LLVMErrorRef value is not usable once this call returns. + */ +char *LLVMGetErrorMessage(LLVMErrorRef Err); + +/** + * Dispose of the given error message. + */ +void LLVMDisposeErrorMessage(char *ErrMsg); + +/** + * Returns the type id for llvm StringError. + */ +LLVMErrorTypeId LLVMGetStringErrorTypeId(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h index 8015cab45a0..b82663d5d87 100644 --- a/llvm/include/llvm/Support/Error.h +++ b/llvm/include/llvm/Support/Error.h @@ -14,8 +14,9 @@ #ifndef LLVM_SUPPORT_ERROR_H #define LLVM_SUPPORT_ERROR_H -#include "llvm/ADT/SmallVector.h" +#include "llvm-c/Error.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Config/abi-breaking.h" @@ -167,6 +168,9 @@ class LLVM_NODISCARD Error { // error. template <typename T> friend class Expected; + // wrap needs to be able to steal the payload. + friend LLVMErrorRef wrap(Error); + protected: /// Create a success value. Prefer using 'Error::success()' for readability Error() { @@ -1183,6 +1187,17 @@ private: std::function<int(const Error &)> GetExitCode; }; +/// Conversion from Error to LLVMErrorRef for C error bindings. +inline LLVMErrorRef wrap(Error Err) { + return reinterpret_cast<LLVMErrorRef>(Err.takePayload().release()); +} + +/// Conversion from LLVMErrorRef to Error for C error bindings. +inline Error unwrap(LLVMErrorRef ErrRef) { + return Error(std::unique_ptr<ErrorInfoBase>( + reinterpret_cast<ErrorInfoBase *>(ErrRef))); +} + } // end namespace llvm #endif // LLVM_SUPPORT_ERROR_H |