17 #include "llvm/Config/config.h"
31 #include <sys/types.h>
32 #if !defined(_MSC_VER) && !defined(__MINGW32__)
38 #define S_ISREG(x) (1)
41 #define S_ISBLK(x) (0)
55 bool RequiresNullTerminator) {
56 assert((!RequiresNullTerminator || BufEnd[0] == 0) &&
57 "Buffer is not null terminated!");
58 BufferStart = BufStart;
70 Memory[Data.
size()] = 0;
74 struct NamedBufferAlloc {
80 void *
operator new(
size_t N,
const NamedBufferAlloc &Alloc) {
81 char *Mem =
static_cast<char *
>(
operator new(
N + Alloc.Name.size() + 1));
90 MemoryBufferMem(
StringRef InputData,
bool RequiresNullTerminator) {
91 init(InputData.
begin(), InputData.
end(), RequiresNullTerminator);
94 virtual const char *getBufferIdentifier() const
LLVM_OVERRIDE {
96 return reinterpret_cast<const char*
>(
this + 1);
100 return MemoryBuffer_Malloc;
109 bool RequiresNullTerminator) {
110 return new (NamedBufferAlloc(BufferName))
111 MemoryBufferMem(InputData, RequiresNullTerminator);
134 size_t AlignedStringLen =
137 size_t RealLen = AlignedStringLen + Size + 1;
138 char *Mem =
static_cast<char*
>(
operator new(RealLen, std::nothrow));
145 char *Buf = Mem + AlignedStringLen;
148 return new (Mem) MemoryBufferMem(
StringRef(Buf, Size),
true);
172 return getFile(Filename, result, FileSize);
186 static uint64_t getLegalMapOffset(uint64_t Offset) {
190 static uint64_t getLegalMapSize(uint64_t Len, uint64_t Offset) {
191 return Len + (Offset - getLegalMapOffset(Offset));
194 const char *getStart(uint64_t Len, uint64_t Offset) {
195 return MFR.
const_data() + (Offset - getLegalMapOffset(Offset));
199 MemoryBufferMMapFile(
bool RequiresNullTerminator,
int FD, uint64_t Len,
201 : MFR(FD,
false, sys::fs::mapped_file_region::readonly,
202 getLegalMapSize(Len, Offset), getLegalMapOffset(Offset), EC) {
204 const char *Start = getStart(Len, Offset);
205 init(Start, Start + Len, RequiresNullTerminator);
209 virtual const char *getBufferIdentifier() const
LLVM_OVERRIDE {
211 return reinterpret_cast<const char *
>(
this + 1);
215 return MemoryBuffer_MMap;
223 const ssize_t ChunkSize = 4096*4;
229 ReadBytes =
read(FD, Buffer.
end(), ChunkSize);
230 if (ReadBytes == -1) {
231 if (errno == EINTR)
continue;
235 }
while (ReadBytes != 0);
243 bool RequiresNullTerminator);
248 bool RequiresNullTerminator) {
253 RequiresNullTerminator);
258 uint64_t FileSize, uint64_t MapSize,
259 int64_t Offset,
bool RequiresNullTerminator);
263 bool RequiresNullTerminator) {
270 RequiresNullTerminator);
279 bool RequiresNullTerminator,
283 if (MapSize < 4 * 4096 || MapSize < (
unsigned)PageSize)
286 if (!RequiresNullTerminator)
294 if (FileSize ==
size_t(-1)) {
299 FileSize = Status.getSize();
304 size_t End = Offset + MapSize;
305 assert(End <= FileSize);
309 #if defined(_WIN32) || defined(__CYGWIN__)
314 if ((FileSize & (4096 - 1)) == 0)
320 if ((FileSize & (PageSize -1)) == 0)
328 uint64_t FileSize, uint64_t MapSize,
329 int64_t Offset,
bool RequiresNullTerminator) {
333 if (MapSize == uint64_t(-1)) {
336 if (FileSize == uint64_t(-1)) {
350 FileSize = Status.getSize();
355 if (
shouldUseMmap(FD, FileSize, MapSize, Offset, RequiresNullTerminator,
358 result.
reset(
new (NamedBufferAlloc(Filename)) MemoryBufferMMapFile(
359 RequiresNullTerminator, FD, MapSize, Offset, EC));
374 size_t BytesLeft = MapSize;
376 if (lseek(FD, Offset, SEEK_SET) == -1)
382 ssize_t NumRead =
::pread(FD, BufPtr, BytesLeft, MapSize-BytesLeft+Offset);
384 ssize_t NumRead =
::read(FD, BufPtr, BytesLeft);
393 assert(0 &&
"We got inaccurate FileSize value or fstat reported an "
394 "invalid file size.");
398 BytesLeft -= NumRead;
409 bool RequiresNullTerminator) {
411 RequiresNullTerminator);
416 uint64_t MapSize, int64_t Offset) {
417 return getOpenFileImpl(FD, Filename, Result, -1, MapSize, Offset,
false);
static MemoryBuffer * getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
void init(const char *BufStart, const char *BufEnd, bool RequiresNullTerminator)
void set_size(unsigned N)
size_t size() const
size - Get the string size.
const char * getBufferStart() const
An abstraction for memory operations.
static MemoryBuffer * getNewMemBuffer(size_t Size, StringRef BufferName="")
error_code openFileForRead(const Twine &Name, int &ResultFD)
ssize_t read(int fildes, void *buf, size_t nbyte);
error_code ChangeStdinToBinary()
const char * const_data() const
static bool shouldUseMmap(int FD, size_t FileSize, size_t MapSize, off_t Offset, bool RequiresNullTerminator, int PageSize)
static error_code getOpenFileImpl(int FD, const char *Filename, OwningPtr< MemoryBuffer > &Result, uint64_t FileSize, uint64_t MapSize, int64_t Offset, bool RequiresNullTerminator)
static error_code getOpenFile(int FD, const char *Filename, OwningPtr< MemoryBuffer > &Result, uint64_t FileSize, bool RequiresNullTerminator=true)
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
const error_category & posix_category()
const char * data() const
static void CopyStringRef(char *Memory, StringRef Data)
static error_code getFileOrSTDIN(StringRef Filename, OwningPtr< MemoryBuffer > &result, int64_t FileSize=-1)
initializer< Ty > init(const Ty &Val)
error_code status(const Twine &path, file_status &result)
Get file status as if by POSIX stat().
static self_process * get_self()
Get the process object for the current process.
static error_code getFile(Twine Filename, OwningPtr< MemoryBuffer > &result, int64_t FileSize=-1, bool RequiresNullTerminator=true)
static MemoryBuffer * getMemBufferCopy(StringRef InputData, StringRef BufferName="")
static error_code getFileAux(const char *Filename, OwningPtr< MemoryBuffer > &result, int64_t FileSize, bool RequiresNullTerminator)
static error_code getOpenFileSlice(int FD, const char *Filename, OwningPtr< MemoryBuffer > &Result, uint64_t MapSize, int64_t Offset)
uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align)
static error_code success()
size_t page_size() const
Get the virtual memory page size.
static MemoryBuffer * getNewUninitMemBuffer(size_t Size, StringRef BufferName="")
StringRef toNullTerminatedStringRef(SmallVectorImpl< char > &Out) const
error_code make_error_code(errc _e)
static error_code getSTDIN(OwningPtr< MemoryBuffer > &result)
void swap(OwningPtr &RHS)
static error_code getMemoryBufferForStream(int FD, StringRef BufferName, OwningPtr< MemoryBuffer > &result)