[llvm] r200017 - Report lli remote IO errors consistently

Alp Toker alp at nuanti.com
Fri Jan 24 09:18:53 PST 2014


Author: alp
Date: Fri Jan 24 11:18:52 2014
New Revision: 200017

URL: http://llvm.org/viewvc/llvm-project?rev=200017&view=rev
Log:
Report lli remote IO errors consistently

This enables IO error reports in both the child and server processes.

The scheme still isn't entirely satisfactory and output is jumbled but it beats
having no output at all. This will hopefully unblock ARM support (PR18057).

Modified:
    llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp
    llvm/trunk/tools/lli/RPCChannel.h
    llvm/trunk/tools/lli/RemoteTargetExternal.h
    llvm/trunk/tools/lli/Unix/RPCChannel.inc
    llvm/trunk/tools/lli/Windows/RPCChannel.inc

Modified: llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp?rev=200017&r1=200016&r2=200017&view=diff
==============================================================================
--- llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp (original)
+++ llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp Fri Jan 24 11:18:52 2014
@@ -34,9 +34,11 @@ private:
   // OS-specific functions
   void initializeConnection();
   int WriteBytes(const void *Data, size_t Size) {
-    return RPC.WriteBytes(Data, Size);
+    return RPC.WriteBytes(Data, Size) ? Size : -1;
+  }
+  int ReadBytes(void *Data, size_t Size) {
+    return RPC.ReadBytes(Data, Size) ? Size : -1;
   }
-  int ReadBytes(void *Data, size_t Size) { return RPC.ReadBytes(Data, Size); }
 
   // Communication handles (OS-specific)
   void *ConnectionData;

Modified: llvm/trunk/tools/lli/RPCChannel.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/RPCChannel.h?rev=200017&r1=200016&r2=200017&view=diff
==============================================================================
--- llvm/trunk/tools/lli/RPCChannel.h (original)
+++ llvm/trunk/tools/lli/RPCChannel.h Fri Jan 24 11:18:52 2014
@@ -27,8 +27,6 @@ public:
   RPCChannel() {}
   ~RPCChannel();
 
-  static void ReportError(int rc, size_t Size, std::string &ErrorMsg);
-
   /// Start the remote process.
   ///
   /// @returns True on success. On failure, ErrorMsg is updated with
@@ -40,8 +38,8 @@ public:
   // This will get filled in as a point to an OS-specific structure.
   void *ConnectionData;
 
-  int WriteBytes(const void *Data, size_t Size);
-  int ReadBytes(void *Data, size_t Size);
+  bool WriteBytes(const void *Data, size_t Size);
+  bool ReadBytes(void *Data, size_t Size);
 
   void Wait();
 };

Modified: llvm/trunk/tools/lli/RemoteTargetExternal.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/RemoteTargetExternal.h?rev=200017&r1=200016&r2=200017&view=diff
==============================================================================
--- llvm/trunk/tools/lli/RemoteTargetExternal.h (original)
+++ llvm/trunk/tools/lli/RemoteTargetExternal.h Fri Jan 24 11:18:52 2014
@@ -32,24 +32,10 @@ class RemoteTargetExternal : public Remo
   RPCChannel RPC;
 
   bool WriteBytes(const void *Data, size_t Size) {
-    int rc = RPC.WriteBytes(Data, Size);
-    if (rc != -1 && (size_t)rc == Size)
-      return true;
-
-    ErrorMsg = "WriteBytes: ";
-    RPC.ReportError(rc, Size, ErrorMsg);
-    return false;
+    return RPC.WriteBytes(Data, Size);
   }
 
-  bool ReadBytes(void *Data, size_t Size) {
-    int rc = RPC.ReadBytes(Data, Size);
-    if (rc != -1 && (size_t)rc == Size)
-      return true;
-
-    ErrorMsg = "ReadBytes: ";
-    RPC.ReportError(rc, Size, ErrorMsg);
-    return false;
-  }
+  bool ReadBytes(void *Data, size_t Size) { return RPC.ReadBytes(Data, Size); }
 
 public:
   /// Allocate space in the remote target address space.

Modified: llvm/trunk/tools/lli/Unix/RPCChannel.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/Unix/RPCChannel.inc?rev=200017&r1=200016&r2=200017&view=diff
==============================================================================
--- llvm/trunk/tools/lli/Unix/RPCChannel.inc (original)
+++ llvm/trunk/tools/lli/Unix/RPCChannel.inc Fri Jan 24 11:18:52 2014
@@ -12,6 +12,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Support/Errno.h"
+#include "llvm/Support/raw_ostream.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/wait.h>
@@ -82,15 +85,14 @@ bool RPCChannel::createClient() {
   return true;
 }
 
-void RPCChannel::ReportError(int rc, size_t Size, std::string &ErrorMsg) {
-  if (rc == -1) {
-    if (errno == EPIPE)
-      ErrorMsg += "pipe closed";
-    else if (errno == EINTR)
-      ErrorMsg += "interrupted";
-    else
-      ErrorMsg += "file descriptor error";
-  } else {
+void RPCChannel::Wait() { wait(NULL); }
+
+static bool CheckError(int rc, size_t Size, const char *Desc) {
+  if (rc < 0) {
+    llvm::errs() << "IO Error: " << Desc << ": " << sys::StrError() << '\n';
+    return false;
+  } else if ((size_t)rc != Size) {
+    std::string ErrorMsg;
     char Number[10] = { 0 };
     ErrorMsg += "Expecting ";
     sprintf(Number, "%d", (uint32_t)Size);
@@ -98,19 +100,22 @@ void RPCChannel::ReportError(int rc, siz
     ErrorMsg += " bytes, Got ";
     sprintf(Number, "%d", rc);
     ErrorMsg += Number;
+    llvm::errs() << "RPC Error: " << Desc << ": " << ErrorMsg << '\n';
+    return false;
   }
+  return true;
 }
 
-int RPCChannel::WriteBytes(const void *Data, size_t Size) {
-  return write(((ConnectionData_t *)ConnectionData)->OutputPipe, Data, Size);
+bool RPCChannel::WriteBytes(const void *Data, size_t Size) {
+  int rc = write(((ConnectionData_t *)ConnectionData)->OutputPipe, Data, Size);
+  return CheckError(rc, Size, "WriteBytes");
 }
 
-int RPCChannel::ReadBytes(void *Data, size_t Size) {
-  return read(((ConnectionData_t *)ConnectionData)->InputPipe, Data, Size);
+bool RPCChannel::ReadBytes(void *Data, size_t Size) {
+  int rc = read(((ConnectionData_t *)ConnectionData)->InputPipe, Data, Size);
+  return CheckError(rc, Size, "ReadBytes");
 }
 
-void RPCChannel::Wait() { wait(NULL); }
-
 RPCChannel::~RPCChannel() {
   delete static_cast<ConnectionData_t *>(ConnectionData);
 }

Modified: llvm/trunk/tools/lli/Windows/RPCChannel.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/Windows/RPCChannel.inc?rev=200017&r1=200016&r2=200017&view=diff
==============================================================================
--- llvm/trunk/tools/lli/Windows/RPCChannel.inc (original)
+++ llvm/trunk/tools/lli/Windows/RPCChannel.inc Fri Jan 24 11:18:52 2014
@@ -18,11 +18,9 @@ bool RPCChannel::createServer() { return
 
 bool RPCChannel::createClient() { return false; }
 
-void RPCChannel::ReportError(int rc, size_t Size, std::string &ErrorMsg) {}
+bool RPCChannel::WriteBytes(const void *Data, size_t Size) { return false; }
 
-int RPCChannel::WriteBytes(const void *Data, size_t Size) { return -1; }
-
-int RPCChannel::ReadBytes(void *Data, size_t Size) { return -1; }
+bool RPCChannel::ReadBytes(void *Data, size_t Size) { return false; }
 
 void RPCChannel::Wait() {}
 





More information about the llvm-commits mailing list