[ORC] Thread Error/Expected through the RPC library.

This replaces use of std::error_code and ErrorOr in the ORC RPC support library
with Error and Expected. This required updating the OrcRemoteTarget API, Client,
and server code, as well as updating the Orc C API.

This patch also fixes several instances where Errors were dropped.

llvm-svn: 267457
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
index 2503654..4095a3b 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
@@ -94,9 +94,9 @@
     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 @@
                                         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 @@
   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 @@
 
   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 @@
     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 @@
                                         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 @@
   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 @@
 
   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 d2379cd..565a9d0 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp
@@ -28,6 +28,11 @@
   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 @@
   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 def11dd..6b84c7b 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 @@
     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 @@
     return GenericHandles[H]->findSymbolIn(Name, ExportedSymbolsOnly);
   }
 
+  const std::string& getErrorMessage() const {
+    return ErrMsg;
+  }
+
 private:
 
   template <typename LayerT>
@@ -261,6 +270,19 @@
     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 @@
 
   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 5e12c86..37b4990 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcError.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcError.cpp
@@ -51,9 +51,10 @@
 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));
 }
 }
 }