[llvm-commits] [llvm] r167407 - /llvm/trunk/lib/Support/MemoryBuffer.cpp

Shankar Easwaran shankare at codeaurora.org
Tue Nov 6 06:43:07 PST 2012


Hi Daniel,

Where do we use this functionality ?

Is there a accompanying test case that tests this change ?

Thanks

Shankar Easwaran

On 11/5/2012 3:55 PM, Daniel Dunbar wrote:
> Author: ddunbar
> Date: Mon Nov  5 15:55:40 2012
> New Revision: 167407
>
> URL: http://llvm.org/viewvc/llvm-project?rev=167407&view=rev
> Log:
> MemoryBuffer: Support reading named pipes in getFile().
>
>   - We only support this when the client didn't claim to know the file size.
>
> Modified:
>      llvm/trunk/lib/Support/MemoryBuffer.cpp
>
> Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=167407&r1=167406&r2=167407&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original)
> +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Mon Nov  5 15:55:40 2012
> @@ -201,6 +201,27 @@
>   };
>   }
>   
> +static error_code getMemoryBufferForStream(int FD,
> +                                           StringRef BufferName,
> +                                           OwningPtr<MemoryBuffer> &result) {
> +  const ssize_t ChunkSize = 4096*4;
> +  SmallString<ChunkSize> Buffer;
> +  ssize_t ReadBytes;
> +  // Read into Buffer until we hit EOF.
> +  do {
> +    Buffer.reserve(Buffer.size() + ChunkSize);
> +    ReadBytes = read(FD, Buffer.end(), ChunkSize);
> +    if (ReadBytes == -1) {
> +      if (errno == EINTR) continue;
> +      return error_code(errno, posix_category());
> +    }
> +    Buffer.set_size(Buffer.size() + ReadBytes);
> +  } while (ReadBytes != 0);
> +
> +  result.reset(MemoryBuffer::getMemBufferCopy(Buffer, BufferName));
> +  return error_code::success();
> +}
> +
>   error_code MemoryBuffer::getFile(StringRef Filename,
>                                    OwningPtr<MemoryBuffer> &result,
>                                    int64_t FileSize,
> @@ -297,6 +318,13 @@
>         if (fstat(FD, &FileInfo) == -1) {
>           return error_code(errno, posix_category());
>         }
> +
> +      // If this is a named pipe, we can't trust the size. Create the memory
> +      // buffer by copying off the stream.
> +      if (FileInfo.st_mode & S_IFIFO) {
> +        return getMemoryBufferForStream(FD, Filename, result);
> +      }
> +
>         FileSize = FileInfo.st_size;
>       }
>       MapSize = FileSize;
> @@ -370,20 +398,5 @@
>     // fallback if it fails.
>     sys::Program::ChangeStdinToBinary();
>   
> -  const ssize_t ChunkSize = 4096*4;
> -  SmallString<ChunkSize> Buffer;
> -  ssize_t ReadBytes;
> -  // Read into Buffer until we hit EOF.
> -  do {
> -    Buffer.reserve(Buffer.size() + ChunkSize);
> -    ReadBytes = read(0, Buffer.end(), ChunkSize);
> -    if (ReadBytes == -1) {
> -      if (errno == EINTR) continue;
> -      return error_code(errno, posix_category());
> -    }
> -    Buffer.set_size(Buffer.size() + ReadBytes);
> -  } while (ReadBytes != 0);
> -
> -  result.reset(getMemBufferCopy(Buffer, "<stdin>"));
> -  return error_code::success();
> +  return getMemoryBufferForStream(0, "<stdin>", result);
>   }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list