11d0676b5SLang Hames //===---------------- OrcError.cpp - Error codes for ORC ------------------===// 21d0676b5SLang Hames // 31d0676b5SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41d0676b5SLang Hames // See https://llvm.org/LICENSE.txt for license information. 51d0676b5SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61d0676b5SLang Hames // 71d0676b5SLang Hames //===----------------------------------------------------------------------===// 81d0676b5SLang Hames // 91d0676b5SLang Hames // Error codes for ORC. 101d0676b5SLang Hames // 111d0676b5SLang Hames //===----------------------------------------------------------------------===// 121d0676b5SLang Hames 1324672ddeSLang Hames #include "llvm/ExecutionEngine/Orc/Shared/OrcError.h" 141d0676b5SLang Hames #include "llvm/Support/ErrorHandling.h" 151d0676b5SLang Hames 161d0676b5SLang Hames #include <type_traits> 171d0676b5SLang Hames 181d0676b5SLang Hames using namespace llvm; 191d0676b5SLang Hames using namespace llvm::orc; 201d0676b5SLang Hames 211d0676b5SLang Hames namespace { 221d0676b5SLang Hames 231d0676b5SLang Hames // FIXME: This class is only here to support the transition to llvm::Error. It 241d0676b5SLang Hames // will be removed once this transition is complete. Clients should prefer to 251d0676b5SLang Hames // deal with the Error value directly, rather than converting to error_code. 261d0676b5SLang Hames class OrcErrorCategory : public std::error_category { 271d0676b5SLang Hames public: name() const281d0676b5SLang Hames const char *name() const noexcept override { return "orc"; } 291d0676b5SLang Hames message(int condition) const301d0676b5SLang Hames std::string message(int condition) const override { 311d0676b5SLang Hames switch (static_cast<OrcErrorCode>(condition)) { 321d0676b5SLang Hames case OrcErrorCode::UnknownORCError: 331d0676b5SLang Hames return "Unknown ORC error"; 341d0676b5SLang Hames case OrcErrorCode::DuplicateDefinition: 351d0676b5SLang Hames return "Duplicate symbol definition"; 361d0676b5SLang Hames case OrcErrorCode::JITSymbolNotFound: 371d0676b5SLang Hames return "JIT symbol not found"; 381d0676b5SLang Hames case OrcErrorCode::RemoteAllocatorDoesNotExist: 391d0676b5SLang Hames return "Remote allocator does not exist"; 401d0676b5SLang Hames case OrcErrorCode::RemoteAllocatorIdAlreadyInUse: 411d0676b5SLang Hames return "Remote allocator Id already in use"; 421d0676b5SLang Hames case OrcErrorCode::RemoteMProtectAddrUnrecognized: 431d0676b5SLang Hames return "Remote mprotect call references unallocated memory"; 441d0676b5SLang Hames case OrcErrorCode::RemoteIndirectStubsOwnerDoesNotExist: 451d0676b5SLang Hames return "Remote indirect stubs owner does not exist"; 461d0676b5SLang Hames case OrcErrorCode::RemoteIndirectStubsOwnerIdAlreadyInUse: 471d0676b5SLang Hames return "Remote indirect stubs owner Id already in use"; 481d0676b5SLang Hames case OrcErrorCode::RPCConnectionClosed: 491d0676b5SLang Hames return "RPC connection closed"; 501d0676b5SLang Hames case OrcErrorCode::RPCCouldNotNegotiateFunction: 511d0676b5SLang Hames return "Could not negotiate RPC function"; 521d0676b5SLang Hames case OrcErrorCode::RPCResponseAbandoned: 531d0676b5SLang Hames return "RPC response abandoned"; 541d0676b5SLang Hames case OrcErrorCode::UnexpectedRPCCall: 551d0676b5SLang Hames return "Unexpected RPC call"; 561d0676b5SLang Hames case OrcErrorCode::UnexpectedRPCResponse: 571d0676b5SLang Hames return "Unexpected RPC response"; 581d0676b5SLang Hames case OrcErrorCode::UnknownErrorCodeFromRemote: 591d0676b5SLang Hames return "Unknown error returned from remote RPC function " 601d0676b5SLang Hames "(Use StringError to get error message)"; 611d0676b5SLang Hames case OrcErrorCode::UnknownResourceHandle: 621d0676b5SLang Hames return "Unknown resource handle"; 631d0676b5SLang Hames case OrcErrorCode::MissingSymbolDefinitions: 641d0676b5SLang Hames return "MissingSymbolsDefinitions"; 651d0676b5SLang Hames case OrcErrorCode::UnexpectedSymbolDefinitions: 661d0676b5SLang Hames return "UnexpectedSymbolDefinitions"; 671d0676b5SLang Hames } 681d0676b5SLang Hames llvm_unreachable("Unhandled error code"); 691d0676b5SLang Hames } 701d0676b5SLang Hames }; 711d0676b5SLang Hames getOrcErrCat()72ede60037SNicolai HähnleOrcErrorCategory &getOrcErrCat() { 73ede60037SNicolai Hähnle static OrcErrorCategory OrcErrCat; 74ede60037SNicolai Hähnle return OrcErrCat; 75ede60037SNicolai Hähnle } 761d0676b5SLang Hames } // namespace 771d0676b5SLang Hames 781d0676b5SLang Hames namespace llvm { 791d0676b5SLang Hames namespace orc { 801d0676b5SLang Hames 811d0676b5SLang Hames char DuplicateDefinition::ID = 0; 821d0676b5SLang Hames char JITSymbolNotFound::ID = 0; 831d0676b5SLang Hames orcError(OrcErrorCode ErrCode)841d0676b5SLang Hamesstd::error_code orcError(OrcErrorCode ErrCode) { 85*06b1e5fdSKazu Hirata typedef std::underlying_type_t<OrcErrorCode> UT; 86ede60037SNicolai Hähnle return std::error_code(static_cast<UT>(ErrCode), getOrcErrCat()); 871d0676b5SLang Hames } 881d0676b5SLang Hames DuplicateDefinition(std::string SymbolName)891d0676b5SLang HamesDuplicateDefinition::DuplicateDefinition(std::string SymbolName) 901d0676b5SLang Hames : SymbolName(std::move(SymbolName)) {} 911d0676b5SLang Hames convertToErrorCode() const921d0676b5SLang Hamesstd::error_code DuplicateDefinition::convertToErrorCode() const { 931d0676b5SLang Hames return orcError(OrcErrorCode::DuplicateDefinition); 941d0676b5SLang Hames } 951d0676b5SLang Hames log(raw_ostream & OS) const961d0676b5SLang Hamesvoid DuplicateDefinition::log(raw_ostream &OS) const { 971d0676b5SLang Hames OS << "Duplicate definition of symbol '" << SymbolName << "'"; 981d0676b5SLang Hames } 991d0676b5SLang Hames getSymbolName() const1001d0676b5SLang Hamesconst std::string &DuplicateDefinition::getSymbolName() const { 1011d0676b5SLang Hames return SymbolName; 1021d0676b5SLang Hames } 1031d0676b5SLang Hames JITSymbolNotFound(std::string SymbolName)1041d0676b5SLang HamesJITSymbolNotFound::JITSymbolNotFound(std::string SymbolName) 1051d0676b5SLang Hames : SymbolName(std::move(SymbolName)) {} 1061d0676b5SLang Hames convertToErrorCode() const1071d0676b5SLang Hamesstd::error_code JITSymbolNotFound::convertToErrorCode() const { 108*06b1e5fdSKazu Hirata typedef std::underlying_type_t<OrcErrorCode> UT; 1091d0676b5SLang Hames return std::error_code(static_cast<UT>(OrcErrorCode::JITSymbolNotFound), 110ede60037SNicolai Hähnle getOrcErrCat()); 1111d0676b5SLang Hames } 1121d0676b5SLang Hames log(raw_ostream & OS) const1131d0676b5SLang Hamesvoid JITSymbolNotFound::log(raw_ostream &OS) const { 1141d0676b5SLang Hames OS << "Could not find symbol '" << SymbolName << "'"; 1151d0676b5SLang Hames } 1161d0676b5SLang Hames getSymbolName() const1171d0676b5SLang Hamesconst std::string &JITSymbolNotFound::getSymbolName() const { 1181d0676b5SLang Hames return SymbolName; 1191d0676b5SLang Hames } 1201d0676b5SLang Hames 1211d0676b5SLang Hames } // namespace orc 1221d0676b5SLang Hames } // namespace llvm 123