xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/Shared/OrcError.cpp (revision 06b1e5fdc32db61b59ad9ca605137d2a369e562e)
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ähnle OrcErrorCategory &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 Hames std::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 Hames DuplicateDefinition::DuplicateDefinition(std::string SymbolName)
901d0676b5SLang Hames     : SymbolName(std::move(SymbolName)) {}
911d0676b5SLang Hames 
convertToErrorCode() const921d0676b5SLang Hames std::error_code DuplicateDefinition::convertToErrorCode() const {
931d0676b5SLang Hames   return orcError(OrcErrorCode::DuplicateDefinition);
941d0676b5SLang Hames }
951d0676b5SLang Hames 
log(raw_ostream & OS) const961d0676b5SLang Hames void DuplicateDefinition::log(raw_ostream &OS) const {
971d0676b5SLang Hames   OS << "Duplicate definition of symbol '" << SymbolName << "'";
981d0676b5SLang Hames }
991d0676b5SLang Hames 
getSymbolName() const1001d0676b5SLang Hames const std::string &DuplicateDefinition::getSymbolName() const {
1011d0676b5SLang Hames   return SymbolName;
1021d0676b5SLang Hames }
1031d0676b5SLang Hames 
JITSymbolNotFound(std::string SymbolName)1041d0676b5SLang Hames JITSymbolNotFound::JITSymbolNotFound(std::string SymbolName)
1051d0676b5SLang Hames     : SymbolName(std::move(SymbolName)) {}
1061d0676b5SLang Hames 
convertToErrorCode() const1071d0676b5SLang Hames std::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 Hames void JITSymbolNotFound::log(raw_ostream &OS) const {
1141d0676b5SLang Hames   OS << "Could not find symbol '" << SymbolName << "'";
1151d0676b5SLang Hames }
1161d0676b5SLang Hames 
getSymbolName() const1171d0676b5SLang Hames const std::string &JITSymbolNotFound::getSymbolName() const {
1181d0676b5SLang Hames   return SymbolName;
1191d0676b5SLang Hames }
1201d0676b5SLang Hames 
1211d0676b5SLang Hames } // namespace orc
1221d0676b5SLang Hames } // namespace llvm
123