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

Daniel Dunbar daniel.dunbar at gmail.com
Tue Nov 6 08:14:58 PST 2012


On Nov 6, 2012, at 6:43, Shankar Easwaran <shankare at codeaurora.org> wrote:

> Hi Daniel,
>
> Where do we use this functionality ?

We use this all over the place, for example this is how all the LLVM
tools read their input files.

> Is there a accompanying test case that tests this change ?

No, I didn't think it was worth the effort to try and make a portable
one. Here is a trivial non-portable one (for bash):
$ opt -S -o - <(echo)

 - Daniel

>
> 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