diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp | 24 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 31 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcError.cpp | 5 |
4 files changed, 55 insertions, 26 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp index 2503654a403..4095a3b98ee 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp @@ -94,9 +94,9 @@ void OrcX86_64::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr, Trampolines[I] = CallIndirPCRel | ((OffsetToPtr - 6) << 16); } -std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, - unsigned MinStubs, - void *InitialPtrVal) { +Error OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, + unsigned MinStubs, + void *InitialPtrVal) { // Stub format is: // // .section __orc_stubs @@ -134,7 +134,7 @@ std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, EC)); if (EC) - return EC; + return errorCodeToError(EC); // Create separate MemoryBlocks representing the stubs and pointers. sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize); @@ -152,7 +152,7 @@ std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, if (auto EC = sys::Memory::protectMappedMemory(StubsBlock, sys::Memory::MF_READ | sys::Memory::MF_EXEC)) - return EC; + return errorCodeToError(EC); // Initialize all pointers to point at FailureAddress. void **Ptr = reinterpret_cast<void**>(PtrsBlock.base()); @@ -161,7 +161,7 @@ std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem)); - return std::error_code(); + return Error::success(); } void OrcI386::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn, @@ -223,9 +223,9 @@ void OrcI386::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr, Trampolines[I] = CallRelImm | (ResolverRel << 8); } -std::error_code OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, - unsigned MinStubs, - void *InitialPtrVal) { +Error OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, + unsigned MinStubs, + void *InitialPtrVal) { // Stub format is: // // .section __orc_stubs @@ -263,7 +263,7 @@ std::error_code OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, EC)); if (EC) - return EC; + return errorCodeToError(EC); // Create separate MemoryBlocks representing the stubs and pointers. sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize); @@ -280,7 +280,7 @@ std::error_code OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, if (auto EC = sys::Memory::protectMappedMemory(StubsBlock, sys::Memory::MF_READ | sys::Memory::MF_EXEC)) - return EC; + return errorCodeToError(EC); // Initialize all pointers to point at FailureAddress. void **Ptr = reinterpret_cast<void**>(PtrsBlock.base()); @@ -289,7 +289,7 @@ std::error_code OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo, StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem)); - return std::error_code(); + return Error::success(); } } // End namespace orc. diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp index d2379cd441d..565a9d03ec9 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp @@ -28,6 +28,11 @@ LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { return wrap(JITStack); } +const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { + OrcCBindingsStack &J = *unwrap(JITStack); + return J.getErrorMessage().c_str(); +} + void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, const char *SymbolName) { OrcCBindingsStack &J = *unwrap(JITStack); @@ -48,18 +53,18 @@ LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, return J.createLazyCompileCallback(Callback, CallbackCtx); } -void LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, - const char *StubName, - LLVMOrcTargetAddress InitAddr) { +LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, + const char *StubName, + LLVMOrcTargetAddress InitAddr) { OrcCBindingsStack &J = *unwrap(JITStack); - J.createIndirectStub(StubName, InitAddr); + return J.createIndirectStub(StubName, InitAddr); } -void LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, - const char *StubName, - LLVMOrcTargetAddress NewAddr) { +LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, + const char *StubName, + LLVMOrcTargetAddress NewAddr) { OrcCBindingsStack &J = *unwrap(JITStack); - J.setIndirectStubPointer(StubName, NewAddr); + return J.setIndirectStubPointer(StubName, NewAddr); } LLVMOrcModuleHandle diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index def11dd3e93..6b84c7b523f 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -17,6 +17,7 @@ #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/Support/Error.h" #include "llvm-c/OrcBindings.h" namespace llvm { @@ -131,12 +132,16 @@ public: return CCInfo.getAddress(); } - void createIndirectStub(StringRef StubName, orc::TargetAddress Addr) { - IndirectStubsMgr->createStub(StubName, Addr, JITSymbolFlags::Exported); + LLVMOrcErrorCode + createIndirectStub(StringRef StubName, orc::TargetAddress Addr) { + return mapError( + IndirectStubsMgr->createStub(StubName, Addr, + JITSymbolFlags::Exported)); } - void setIndirectStubPointer(StringRef Name, orc::TargetAddress Addr) { - IndirectStubsMgr->updatePointer(Name, Addr); + LLVMOrcErrorCode + setIndirectStubPointer(StringRef Name, orc::TargetAddress Addr) { + return mapError(IndirectStubsMgr->updatePointer(Name, Addr)); } std::shared_ptr<RuntimeDyld::SymbolResolver> @@ -243,6 +248,10 @@ public: return GenericHandles[H]->findSymbolIn(Name, ExportedSymbolsOnly); } + const std::string& getErrorMessage() const { + return ErrMsg; + } + private: template <typename LayerT> @@ -261,6 +270,19 @@ private: return NewHandle; } + LLVMOrcErrorCode mapError(Error Err) { + LLVMOrcErrorCode Result = LLVMOrcErrSuccess; + handleAllErrors(std::move(Err), + [&](ErrorInfoBase &EIB) { + // Handler of last resort. + Result = LLVMOrcErrGeneric; + ErrMsg = ""; + raw_string_ostream ErrStream(ErrMsg); + EIB.log(ErrStream); + }); + return Result; + } + DataLayout DL; SectionMemoryManager CCMgrMemMgr; @@ -276,6 +298,7 @@ private: orc::LocalCXXRuntimeOverrides CXXRuntimeOverrides; std::vector<orc::CtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners; + std::string ErrMsg; }; } // end namespace llvm diff --git a/llvm/lib/ExecutionEngine/Orc/OrcError.cpp b/llvm/lib/ExecutionEngine/Orc/OrcError.cpp index 5e12c86c704..37b49903ba7 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcError.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcError.cpp @@ -51,9 +51,10 @@ static ManagedStatic<OrcErrorCategory> OrcErrCat; namespace llvm { namespace orc { -std::error_code orcError(OrcErrorCode ErrCode) { +Error orcError(OrcErrorCode ErrCode) { typedef std::underlying_type<OrcErrorCode>::type UT; - return std::error_code(static_cast<UT>(ErrCode), *OrcErrCat); + return errorCodeToError(std::error_code(static_cast<UT>(ErrCode), + *OrcErrCat)); } } } |