[llvm] r200017 - Report lli remote IO errors consistently

Alp Toker alp at nuanti.com
Fri Jan 24 09:28:40 PST 2014


Hi Renato,

Can you give this a spin on ARM? Both client and server error logs will 
be generated on stderr now. It doesn't yet make a distinction between 
the two but I'm hopeful this is already sufficient to shed light on PR18057.

Alp.


On 24/01/2014 17:18, Alp Toker wrote:
> 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() {}
>   
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-- 
http://www.nuanti.com
the browser experts




More information about the llvm-commits mailing list