<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 14, 2016 at 2:02 PM, Lang Hames via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: lhames<br>
Date: Thu Jan 14 16:02:03 2016<br>
New Revision: 257816<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=257816&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=257816&view=rev</a><br>
Log:<br>
[Orc] Add support for EH-frame registration to the Orc Remote Target utility<br>
classes.<br>
<br>
OrcRemoteTargetClient::RCMemoryManager will now register EH frames with the<br>
server automatically. This allows remote-execution of code that uses exceptions.<br>
<br>
<br>
Added:<br>
    llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll<br>
    llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h<br>
    llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp<br>
    llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h Thu Jan 14 16:02:03 2016<br>
@@ -144,10 +144,18 @@ public:<br>
     bool needsToReserveAllocationSpace() override { return true; }<br>
<br>
     void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,<br>
-                          size_t Size) override {}<br>
+                          size_t Size) override {<br>
+      UnfinalizedEHFrames.push_back(<br>
+          std::make_pair(LoadAddr, static_cast<uint32_t>(Size)));<br>
+    }<br>
<br>
-    void deregisterEHFrames(uint8_t *addr, uint64_t LoadAddr,<br>
-                            size_t Size) override {}<br>
+    void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr,<br>
+                            size_t Size) override {<br>
+      auto EC = Client.deregisterEHFrames(LoadAddr, Size);<br>
+      // FIXME: Add error poll.<br>
+      assert(!EC && "Failed to register remote EH frames.");<br>
+      (void)EC;<br>
+    }<br>
<br>
     void notifyObjectLoaded(RuntimeDyld &Dyld,<br>
                             const object::ObjectFile &Obj) override {<br>
@@ -253,6 +261,14 @@ public:<br>
       }<br>
       Unfinalized.clear();<br>
<br>
+      for (auto &EHFrame : UnfinalizedEHFrames) {<br>
+        auto EC = Client.registerEHFrames(EHFrame.first, EHFrame.second);<br>
+        // FIXME: Add error poll.<br>
+        assert(!EC && "Failed to register remote EH frames.");<br>
+        (void)EC;<br>
+      }<br>
+      UnfinalizedEHFrames.clear();<br>
+<br>
       return false;<br>
     }<br>
<br>
@@ -331,6 +347,7 @@ public:<br>
     ResourceIdMgr::ResourceId Id;<br>
     std::vector<ObjectAllocs> Unmapped;<br>
     std::vector<ObjectAllocs> Unfinalized;<br>
+    std::vector<std::pair<uint64_t, uint32_t>> UnfinalizedEHFrames;<br>
   };<br>
<br>
   /// Remote indirect stubs manager.ation list t<br>
@@ -620,6 +637,10 @@ private:<br>
                           RemoteTrampolineSize, RemoteIndirectStubSize));<br>
   }<br>
<br>
+  std::error_code deregisterEHFrames(TargetAddress Addr, uint32_t Size) {<br>
+    return call<RegisterEHFrames>(Channel, Addr, Size);<br>
+  }<br>
+<br>
   void destroyRemoteAllocator(ResourceIdMgr::ResourceId Id) {<br>
     if (auto EC = call<DestroyRemoteAllocator>(Channel, Id)) {<br>
       // FIXME: This will be triggered by a removeModuleSet call: Propagate<br>
@@ -716,6 +737,10 @@ private:<br>
     return std::error_code();<br>
   }<br>
<br>
+  std::error_code registerEHFrames(TargetAddress &RAddr, uint32_t Size) {<br>
+    return call<RegisterEHFrames>(Channel, RAddr, Size);<br>
+  }<br>
+<br>
   std::error_code reserveMem(TargetAddress &RemoteAddr,<br>
                              ResourceIdMgr::ResourceId Id, uint64_t Size,<br>
                              uint32_t Align) {<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.h Thu Jan 14 16:02:03 2016<br>
@@ -56,6 +56,7 @@ public:<br>
     CallVoidVoidResponseId,<br>
     CreateRemoteAllocatorId,<br>
     CreateIndirectStubsOwnerId,<br>
+    DeregisterEHFramesId,<br>
     DestroyRemoteAllocatorId,<br>
     DestroyIndirectStubsOwnerId,<br>
     EmitIndirectStubsId,<br>
@@ -69,6 +70,7 @@ public:<br>
     GetRemoteInfoResponseId,<br>
     ReadMemId,<br>
     ReadMemResponseId,<br>
+    RegisterEHFramesId,<br>
     ReserveMemId,<br>
     ReserveMemResponseId,<br>
     RequestCompileId,<br>
@@ -104,6 +106,10 @@ public:<br>
                     ResourceIdMgr::ResourceId /* StubsOwner ID */><br>
       CreateIndirectStubsOwner;<br>
<br>
+  typedef Procedure<DeregisterEHFramesId, TargetAddress /* Addr */,<br>
+                    uint32_t /* Size */><br>
+      DeregisterEHFrames;<br>
+<br>
   typedef Procedure<DestroyRemoteAllocatorId,<br>
                     ResourceIdMgr::ResourceId /* Allocator ID */><br>
       DestroyRemoteAllocator;<br>
@@ -150,6 +156,10 @@ public:<br>
<br>
   typedef Procedure<ReadMemResponseId> ReadMemResponse;<br>
<br>
+  typedef Procedure<RegisterEHFramesId, TargetAddress /* Addr */,<br>
+                    uint32_t /* Size */><br>
+      RegisterEHFrames;<br>
+<br>
   typedef Procedure<ReserveMemId, ResourceIdMgr::ResourceId /* Id */,<br>
                     uint64_t /* Size */, uint32_t /* Align */><br>
       ReserveMem;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h Thu Jan 14 16:02:03 2016<br>
@@ -35,8 +35,15 @@ public:<br>
   typedef std::function<TargetAddress(const std::string &Name)><br>
       SymbolLookupFtor;<br>
<br>
-  OrcRemoteTargetServer(ChannelT &Channel, SymbolLookupFtor SymbolLookup)<br>
-      : Channel(Channel), SymbolLookup(std::move(SymbolLookup)) {}<br>
+  typedef std::function<void(uint8_t *Addr, uint32_t Size)><br>
+      EHFrameRegistrationFtor;<br>
+<br>
+  OrcRemoteTargetServer(ChannelT &Channel, SymbolLookupFtor SymbolLookup,<br>
+                        EHFrameRegistrationFtor EHFramesRegister,<br>
+                        EHFrameRegistrationFtor EHFramesDeregister)<br>
+      : Channel(Channel), SymbolLookup(std::move(SymbolLookup)),<br>
+        EHFramesRegister(std::move(EHFramesRegister)),<br>
+        EHFramesDeregister(std::move(EHFramesDeregister)) {}<br>
<br>
   std::error_code getNextProcId(JITProcId &Id) {<br>
     return deserialize(Channel, Id);<br>
@@ -60,6 +67,9 @@ public:<br>
     case CreateIndirectStubsOwnerId:<br>
       return handle<CreateIndirectStubsOwner>(<br>
           Channel, *this, &ThisT::handleCreateIndirectStubsOwner);<br>
+    case DeregisterEHFramesId:<br>
+      return handle<DeregisterEHFrames>(Channel, *this,<br>
+                                        &ThisT::handleDeregisterEHFrames);<br>
     case DestroyRemoteAllocatorId:<br>
       return handle<DestroyRemoteAllocator>(<br>
           Channel, *this, &ThisT::handleDestroyRemoteAllocator);<br>
@@ -82,6 +92,9 @@ public:<br>
       return handle<GetRemoteInfo>(Channel, *this, &ThisT::handleGetRemoteInfo);<br>
     case ReadMemId:<br>
       return handle<ReadMem>(Channel, *this, &ThisT::handleReadMem);<br>
+    case RegisterEHFramesId:<br>
+      return handle<RegisterEHFrames>(Channel, *this,<br>
+                                      &ThisT::handleRegisterEHFrames);<br>
     case ReserveMemId:<br>
       return handle<ReserveMem>(Channel, *this, &ThisT::handleReserveMem);<br>
     case SetProtectionsId:<br>
@@ -236,6 +249,14 @@ private:<br>
     return std::error_code();<br>
   }<br>
<br>
+  std::error_code handleDeregisterEHFrames(TargetAddress TAddr, uint32_t Size) {<br>
+    uint8_t *Addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(TAddr));<br>
+    DEBUG(dbgs() << "  Registering EH frames at " << format("0x%016x", TAddr)<br>
+                 << ", Size = " << Size << " bytes\n");<br>
+    EHFramesDeregister(Addr, Size);<br>
+    return std::error_code();<br>
+  }<br>
+<br>
   std::error_code handleDestroyRemoteAllocator(ResourceIdMgr::ResourceId Id) {<br>
     auto I = Allocators.find(Id);<br>
     if (I == Allocators.end())<br>
@@ -365,6 +386,14 @@ private:<br>
     return Channel.send();<br>
   }<br>
<br>
+  std::error_code handleRegisterEHFrames(TargetAddress TAddr, uint32_t Size) {<br>
+    uint8_t *Addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(TAddr));<br>
+    DEBUG(dbgs() << "  Registering EH frames at " << format("0x%016x", TAddr)<br>
+                 << ", Size = " << Size << " bytes\n");<br>
+    EHFramesRegister(Addr, Size);<br>
+    return std::error_code();<br>
+  }<br>
+<br>
   std::error_code handleReserveMem(ResourceIdMgr::ResourceId Id, uint64_t Size,<br>
                                    uint32_t Align) {<br>
     auto I = Allocators.find(Id);<br>
@@ -416,6 +445,7 @@ private:<br>
<br>
   ChannelT &Channel;<br>
   SymbolLookupFtor SymbolLookup;<br>
+  EHFrameRegistrationFtor EHFramesRegister, EHFramesDeregister;<br>
   std::map<ResourceIdMgr::ResourceId, Allocator> Allocators;<br>
   typedef std::vector<typename TargetT::IndirectStubsInfo> ISBlockOwnerList;<br>
   std::map<ResourceIdMgr::ResourceId, ISBlockOwnerList> IndirectStubsOwners;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h Thu Jan 14 16:02:03 2016<br>
@@ -62,8 +62,19 @@ public:<br>
   RTDyldMemoryManager() {}<br>
   ~RTDyldMemoryManager() override;<br>
<br>
-  void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override;<br>
-  void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override;<br>
+  /// Register EH frames in the current process.<br>
+  static void registerEHFramesInProcess(uint8_t *Addr, size_t Size);<br>
+<br>
+  /// Deregister EH frames in the current proces.<br>
+  static void deregisterEHFramesInProcess(uint8_t *Addr, size_t Size);<br>
+<br>
+  void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override {<br>
+    registerEHFramesInProcess(Addr, Size);<br>
+  }<br>
+<br>
+  void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override {<br>
+    registerEHFramesInProcess(Addr, Size);<br>
+  }<br>
<br>
   /// This method returns the address of the specified function or variable in<br>
   /// the current process.<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcRemoteTargetRPCAPI.cpp Thu Jan 14 16:02:03 2016<br>
@@ -33,6 +33,8 @@ const char *OrcRemoteTargetRPCAPI::getJI<br>
     return "CreateRemoteAllocator";<br>
   case CreateIndirectStubsOwnerId:<br>
     return "CreateIndirectStubsOwner";<br>
+  case DeregisterEHFramesId:<br>
+    return "DeregisterEHFrames";<br>
   case DestroyRemoteAllocatorId:<br>
     return "DestroyRemoteAllocator";<br>
   case DestroyIndirectStubsOwnerId:<br>
@@ -59,6 +61,8 @@ const char *OrcRemoteTargetRPCAPI::getJI<br>
     return "ReadMem";<br>
   case ReadMemResponseId:<br>
     return "ReadMemResponse";<br>
+  case RegisterEHFramesId:<br>
+    return "RegisterEHFrames";<br>
   case ReserveMemId:<br>
     return "ReserveMem";<br>
   case ReserveMemResponseId:<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp Thu Jan 14 16:02:03 2016<br>
@@ -94,9 +94,8 @@ static const char *processFDE(const char<br>
 // This implementation handles frame registration for local targets.<br>
 // Memory managers for remote targets should re-implement this function<br>
 // and use the LoadAddr parameter.<br>
-void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr,<br>
-                                           uint64_t LoadAddr,<br>
-                                           size_t Size) {<br>
+void RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr,<br>
+                                                    size_t Size) {<br>
   // On OS X OS X __register_frame takes a single FDE as an argument.<br>
   // See <a href="http://lists.llvm.org/pipermail/llvm-dev/2013-April/061768.html" rel="noreferrer" target="_blank">http://lists.llvm.org/pipermail/llvm-dev/2013-April/061768.html</a><br>
   const char *P = (const char *)Addr;<br>
@@ -106,9 +105,8 @@ void RTDyldMemoryManager::registerEHFram<br>
   } while(P != End);<br>
 }<br>
<br>
-void RTDyldMemoryManager::deregisterEHFrames(uint8_t *Addr,<br>
-                                           uint64_t LoadAddr,<br>
-                                           size_t Size) {<br>
+void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr,<br>
+                                                      size_t Size) {<br>
   const char *P = (const char *)Addr;<br>
   const char *End = P + Size;<br>
   do  {<br>
@@ -118,9 +116,8 @@ void RTDyldMemoryManager::deregisterEHFr<br>
<br>
 #else<br>
<br>
-void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr,<br>
-                                           uint64_t LoadAddr,<br>
-                                           size_t Size) {<br>
+void RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr,<br>
+                                                    size_t Size) {<br>
   // On Linux __register_frame takes a single argument:<br>
   // a pointer to the start of the .eh_frame section.<br>
<br>
@@ -129,9 +126,8 @@ void RTDyldMemoryManager::registerEHFram<br>
   __register_frame(Addr);<br>
 }<br>
<br>
-void RTDyldMemoryManager::deregisterEHFrames(uint8_t *Addr,<br>
-                                           uint64_t LoadAddr,<br>
-                                           size_t Size) {<br>
+void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr,<br>
+                                                      size_t Size) {<br>
   __deregister_frame(Addr);<br>
 }<br>
<br>
<br>
Added: llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll?rev=257816&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll?rev=257816&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll (added)<br>
+++ llvm/trunk/test/ExecutionEngine/MCJIT/remote/eh.ll Thu Jan 14 16:02:03 2016<br>
@@ -0,0 +1,32 @@<br>
+; RUN: %lli -remote-mcjit -mcjit-remote-process=lli-child-target%exeext %s<br>
+; XFAIL: arm, cygwin, win32, mingw<br>
+declare i8* @__cxa_allocate_exception(i64)<br>
+declare void @__cxa_throw(i8*, i8*, i8*)<br>
+declare i32 @__gxx_personality_v0(...)<br>
+declare void @__cxa_end_catch()<br>
+declare i8* @__cxa_begin_catch(i8*)<br>
+<br>
+@_ZTIi = external constant i8*<br>
+<br>
+define void @throwException() {<br>
+  %exception = tail call i8* @__cxa_allocate_exception(i64 4)<br>
+  call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null)<br>
+  unreachable<br>
+}<br>
+<br>
+define i32 @main() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
+entry:<br>
+  invoke void @throwException()<br>
+          to label %try.cont unwind label %lpad<br>
+<br>
+lpad:<br>
+  %p = landingpad { i8*, i32 }<br>
+          catch i8* bitcast (i8** @_ZTIi to i8*)<br>
+  %e = extractvalue { i8*, i32 } %p, 0<br>
+  call i8* @__cxa_begin_catch(i8* %e)<br>
+  call void @__cxa_end_catch()<br>
+  br label %try.cont<br>
+<br>
+try.cont:<br>
+  ret i32 0<br>
+}<br>
<br>
Added: llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll?rev=257816&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll?rev=257816&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll (added)<br>
+++ llvm/trunk/test/ExecutionEngine/OrcMCJIT/remote/eh.ll Thu Jan 14 16:02:03 2016<br>
@@ -0,0 +1,32 @@<br>
+; RUN: %lli -remote-mcjit -mcjit-remote-process=lli-child-target%exeext %s<br></blockquote><div><br></div><div>Do these two tests actually verify any particular behavior? Perhaps the catch block could return 0 and the non-exceptional exit could return non-zero, then the zero exit (that lit will check) demonstrates that the exception occurred and was handled correctly?<br><br>(semi-relatedly: How would these tests behave if the rest of the patch was reverted? I guess it probably crashes somewhere in the EH runtime code?)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+; XFAIL: arm, cygwin, win32, mingw<br>
+declare i8* @__cxa_allocate_exception(i64)<br>
+declare void @__cxa_throw(i8*, i8*, i8*)<br>
+declare i32 @__gxx_personality_v0(...)<br>
+declare void @__cxa_end_catch()<br>
+declare i8* @__cxa_begin_catch(i8*)<br>
+<br>
+@_ZTIi = external constant i8*<br>
+<br>
+define void @throwException() {<br>
+  %exception = tail call i8* @__cxa_allocate_exception(i64 4)<br>
+  call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null)<br>
+  unreachable<br>
+}<br>
+<br>
+define i32 @main() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
+entry:<br>
+  invoke void @throwException()<br>
+          to label %try.cont unwind label %lpad<br>
+<br>
+lpad:<br>
+  %p = landingpad { i8*, i32 }<br>
+          catch i8* bitcast (i8** @_ZTIi to i8*)<br>
+  %e = extractvalue { i8*, i32 } %p, 0<br>
+  call i8* @__cxa_begin_catch(i8* %e)<br>
+  call void @__cxa_end_catch()<br>
+  br label %try.cont<br>
+<br>
+try.cont:<br>
+  ret i32 0<br>
+}<br>
<br>
Modified: llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp?rev=257816&r1=257815&r2=257816&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp?rev=257816&r1=257815&r2=257816&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp (original)<br>
+++ llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp Thu Jan 14 16:02:03 2016<br>
@@ -41,9 +41,17 @@ int main(int argc, char *argv[]) {<br>
     return RTDyldMemoryManager::getSymbolAddressInProcess(Name);<br>
   };<br>
<br>
+  auto RegisterEHFrames = [](uint8_t *Addr, uint32_t Size) {<br>
+    RTDyldMemoryManager::registerEHFramesInProcess(Addr, Size);<br>
+  };<br>
+<br>
+  auto DeregisterEHFrames = [](uint8_t *Addr, uint32_t Size) {<br>
+    RTDyldMemoryManager::deregisterEHFramesInProcess(Addr, Size);<br>
+  };<br>
+<br>
   FDRPCChannel Channel(InFD, OutFD);<br>
   typedef remote::OrcRemoteTargetServer<FDRPCChannel, HostOrcArch> JITServer;<br>
-  JITServer Server(Channel, SymbolLookup);<br>
+  JITServer Server(Channel, SymbolLookup, RegisterEHFrames, DeregisterEHFrames);<br>
<br>
   while (1) {<br>
     JITServer::JITProcId Id = JITServer::InvalidId;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>