Files
Lang Hames 58c0dace6f [orc-rt] Add ORC_RT_C_NOTHROW and apply it to the Error C API. (#203674)
Adds an ORC_RT_C_NOTHROW macro that expands to `noexcept` in C++ mode,
and `__attribute__((nothrow))` where that attribute is supported.

Also applies the new ORC_RT_C_NOTHROW macro to orc-rt-c/Error.h (and
adds `noexcept` to the corresponding C++ implementation in
lib/executor/Error.cpp).
2026-06-13 15:58:42 +10:00

83 lines
2.2 KiB
C++

//===- Error.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
//
//===----------------------------------------------------------------------===//
//
// Contains the implementation of APIs in the orc-rt/Error.h and
// orc-rt-c/Error.h headers.
//
//===----------------------------------------------------------------------===//
#include "orc-rt/Error.h"
#include "orc-rt-c/Error.h"
#include <cstring>
#include <system_error>
namespace orc_rt {
#if ORC_RT_ENABLE_EXCEPTIONS
std::string ExceptionError::toString() const noexcept {
std::string Result;
try {
std::rethrow_exception(E);
} catch (std::exception &SE) {
Result = SE.what();
E = std::current_exception();
} catch (std::error_code &EC) {
try {
// Technically 'message' itself can throw.
Result = EC.message();
} catch (...) {
Result = "std::error_code (.message() call failed)";
}
E = std::current_exception();
} catch (std::string &ErrMsg) {
Result = ErrMsg;
E = std::current_exception();
} catch (...) {
Result = "C++ exception of unknown type";
E = std::current_exception();
}
return Result;
}
#endif // ORC_RT_ENABLE_EXCEPTIONS
extern "C" orc_rt_Error_TypeId
orc_rt_Error_getTypeId(orc_rt_ErrorRef Err) noexcept {
assert(Err && "Err must not be null");
return reinterpret_cast<ErrorInfoBase *>(Err)->dynamicClassID();
}
extern "C" void orc_rt_Error_consume(orc_rt_ErrorRef Err) noexcept {
consumeError(unwrap(Err));
}
extern "C" void orc_rt_Error_cantFail(orc_rt_ErrorRef Err) noexcept {
cantFail(unwrap(Err));
}
extern "C" char *orc_rt_Error_toString(orc_rt_ErrorRef Err) noexcept {
return strdup(toString(unwrap(Err)).c_str());
}
extern "C" void orc_rt_Error_freeErrorMessage(char *ErrMsg) noexcept {
free(ErrMsg);
}
extern "C" orc_rt_Error_TypeId orc_rt_StringError_getTypeId(void) noexcept {
return StringError::classID();
}
extern "C" orc_rt_ErrorRef
orc_rt_StringError_create(const char *ErrMsg) noexcept {
return wrap(make_error<StringError>(ErrMsg));
}
} // namespace orc_rt