diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-11-22 12:31:53 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-11-22 12:31:53 +0000 |
commit | e1effb0da220059f95fd6dd2f0d33ac26024994e (patch) | |
tree | 43e4df79205205f2b3d243b5e9b782f052b99be5 /llvm/lib/Support/MemoryBuffer.cpp | |
parent | e2530dc8892c157aa684f434975ec6c43b61b51d (diff) | |
download | bcm5719-llvm-e1effb0da220059f95fd6dd2f0d33ac26024994e.tar.gz bcm5719-llvm-e1effb0da220059f95fd6dd2f0d33ac26024994e.zip |
Add configure checking for pread(2) and use it to save a syscall when reading files.
llvm-svn: 145061
Diffstat (limited to 'llvm/lib/Support/MemoryBuffer.cpp')
-rw-r--r-- | llvm/lib/Support/MemoryBuffer.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Support/MemoryBuffer.cpp b/llvm/lib/Support/MemoryBuffer.cpp index 580338117b8..1a409720c02 100644 --- a/llvm/lib/Support/MemoryBuffer.cpp +++ b/llvm/lib/Support/MemoryBuffer.cpp @@ -14,6 +14,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallString.h" +#include "llvm/Config/config.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/Errno.h" #include "llvm/Support/Path.h" @@ -320,11 +321,17 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, char *BufPtr = const_cast<char*>(SB->getBufferStart()); size_t BytesLeft = MapSize; +#ifndef HAVE_PREAD if (lseek(FD, Offset, SEEK_SET) == -1) return error_code(errno, posix_category()); +#endif while (BytesLeft) { +#ifdef HAVE_PREAD + ssize_t NumRead = ::pread(FD, BufPtr, BytesLeft, MapSize-BytesLeft+Offset); +#else ssize_t NumRead = ::read(FD, BufPtr, BytesLeft); +#endif if (NumRead == -1) { if (errno == EINTR) continue; |