1 | //===---------------- OrcError.cpp - Error codes for ORC ------------------===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // Error codes for ORC. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "llvm/ExecutionEngine/Orc/Shared/OrcError.h" |
14 | #include "llvm/Support/ErrorHandling.h" |
15 | |
16 | #include <type_traits> |
17 | |
18 | using namespace llvm; |
19 | using namespace llvm::orc; |
20 | |
21 | namespace { |
22 | |
23 | // FIXME: This class is only here to support the transition to llvm::Error. It |
24 | // will be removed once this transition is complete. Clients should prefer to |
25 | // deal with the Error value directly, rather than converting to error_code. |
26 | class OrcErrorCategory : public std::error_category { |
27 | public: |
28 | const char *name() const noexcept override { return "orc"; } |
29 | |
30 | std::string message(int condition) const override { |
31 | switch (static_cast<OrcErrorCode>(condition)) { |
32 | case OrcErrorCode::UnknownORCError: |
33 | return "Unknown ORC error"; |
34 | case OrcErrorCode::DuplicateDefinition: |
35 | return "Duplicate symbol definition"; |
36 | case OrcErrorCode::JITSymbolNotFound: |
37 | return "JIT symbol not found"; |
38 | case OrcErrorCode::RemoteAllocatorDoesNotExist: |
39 | return "Remote allocator does not exist"; |
40 | case OrcErrorCode::RemoteAllocatorIdAlreadyInUse: |
41 | return "Remote allocator Id already in use"; |
42 | case OrcErrorCode::RemoteMProtectAddrUnrecognized: |
43 | return "Remote mprotect call references unallocated memory"; |
44 | case OrcErrorCode::RemoteIndirectStubsOwnerDoesNotExist: |
45 | return "Remote indirect stubs owner does not exist"; |
46 | case OrcErrorCode::RemoteIndirectStubsOwnerIdAlreadyInUse: |
47 | return "Remote indirect stubs owner Id already in use"; |
48 | case OrcErrorCode::RPCConnectionClosed: |
49 | return "RPC connection closed"; |
50 | case OrcErrorCode::RPCCouldNotNegotiateFunction: |
51 | return "Could not negotiate RPC function"; |
52 | case OrcErrorCode::RPCResponseAbandoned: |
53 | return "RPC response abandoned"; |
54 | case OrcErrorCode::UnexpectedRPCCall: |
55 | return "Unexpected RPC call"; |
56 | case OrcErrorCode::UnexpectedRPCResponse: |
57 | return "Unexpected RPC response"; |
58 | case OrcErrorCode::UnknownErrorCodeFromRemote: |
59 | return "Unknown error returned from remote RPC function " |
60 | "(Use StringError to get error message)"; |
61 | case OrcErrorCode::UnknownResourceHandle: |
62 | return "Unknown resource handle"; |
63 | case OrcErrorCode::MissingSymbolDefinitions: |
64 | return "MissingSymbolsDefinitions"; |
65 | case OrcErrorCode::UnexpectedSymbolDefinitions: |
66 | return "UnexpectedSymbolDefinitions"; |
67 | } |
68 | llvm_unreachable("Unhandled error code"); |
69 | } |
70 | }; |
71 | |
72 | OrcErrorCategory &getOrcErrCat() { |
73 | static OrcErrorCategory OrcErrCat; |
74 | return OrcErrCat; |
75 | } |
76 | } // namespace |
77 | |
78 | namespace llvm { |
79 | namespace orc { |
80 | |
81 | char DuplicateDefinition::ID = 0; |
82 | char JITSymbolNotFound::ID = 0; |
83 | |
84 | std::error_code orcError(OrcErrorCode ErrCode) { |
85 | typedef std::underlying_type_t<OrcErrorCode> UT; |
86 | return std::error_code(static_cast<UT>(ErrCode), getOrcErrCat()); |
87 | } |
88 | |
89 | DuplicateDefinition::DuplicateDefinition(std::string SymbolName) |
90 | : SymbolName(std::move(SymbolName)) {} |
91 | |
92 | std::error_code DuplicateDefinition::convertToErrorCode() const { |
93 | return orcError(ErrCode: OrcErrorCode::DuplicateDefinition); |
94 | } |
95 | |
96 | void DuplicateDefinition::log(raw_ostream &OS) const { |
97 | OS << "Duplicate definition of symbol '"<< SymbolName << "'"; |
98 | } |
99 | |
100 | const std::string &DuplicateDefinition::getSymbolName() const { |
101 | return SymbolName; |
102 | } |
103 | |
104 | JITSymbolNotFound::JITSymbolNotFound(std::string SymbolName) |
105 | : SymbolName(std::move(SymbolName)) {} |
106 | |
107 | std::error_code JITSymbolNotFound::convertToErrorCode() const { |
108 | typedef std::underlying_type_t<OrcErrorCode> UT; |
109 | return std::error_code(static_cast<UT>(OrcErrorCode::JITSymbolNotFound), |
110 | getOrcErrCat()); |
111 | } |
112 | |
113 | void JITSymbolNotFound::log(raw_ostream &OS) const { |
114 | OS << "Could not find symbol '"<< SymbolName << "'"; |
115 | } |
116 | |
117 | const std::string &JITSymbolNotFound::getSymbolName() const { |
118 | return SymbolName; |
119 | } |
120 | |
121 | } // namespace orc |
122 | } // namespace llvm |
123 |