[llvm-commits] [llvm] r127413 - in /llvm/trunk: include/llvm/Support/MemoryBuffer.h include/llvm/Support/PathV1.h lib/Support/MemoryBuffer.cpp lib/Support/Unix/Path.inc

Jakob Stoklund Olesen stoklund at 2pi.dk
Thu Mar 10 10:01:43 PST 2011


Author: stoklund
Date: Thu Mar 10 12:01:43 2011
New Revision: 127413

URL: http://llvm.org/viewvc/llvm-project?rev=127413&view=rev
Log:
Revert r127409 which broke all the Windows bots.

Modified:
    llvm/trunk/include/llvm/Support/MemoryBuffer.h
    llvm/trunk/include/llvm/Support/PathV1.h
    llvm/trunk/lib/Support/MemoryBuffer.cpp
    llvm/trunk/lib/Support/Unix/Path.inc

Modified: llvm/trunk/include/llvm/Support/MemoryBuffer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MemoryBuffer.h?rev=127413&r1=127412&r2=127413&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/MemoryBuffer.h (original)
+++ llvm/trunk/include/llvm/Support/MemoryBuffer.h Thu Mar 10 12:01:43 2011
@@ -40,8 +40,7 @@
   MemoryBuffer &operator=(const MemoryBuffer &); // DO NOT IMPLEMENT
 protected:
   MemoryBuffer() {}
-  void init(const char *BufStart, const char *BufEnd,
-            bool RequiresNullTerminator);
+  void init(const char *BufStart, const char *BufEnd);
 public:
   virtual ~MemoryBuffer();
 
@@ -73,10 +72,7 @@
   /// return a MemoryBuffer.
   static error_code getOpenFile(int FD, const char *Filename,
                                 OwningPtr<MemoryBuffer> &result,
-                                size_t FileSize = -1,
-                                size_t MapSize = -1,
-                                off_t Offset = 0,
-                                bool RequiresNullTerminator = true);
+                                int64_t FileSize = -1);
 
   /// getMemBuffer - Open the specified memory range as a MemoryBuffer.  Note
   /// that InputData must be null terminated.

Modified: llvm/trunk/include/llvm/Support/PathV1.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV1.h?rev=127413&r1=127412&r2=127413&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/PathV1.h (original)
+++ llvm/trunk/include/llvm/Support/PathV1.h Thu Mar 10 12:01:43 2011
@@ -608,15 +608,14 @@
       ///
       /// This API is not intended for general use, clients should use
       /// MemoryBuffer::getFile instead.
-      static const char *MapInFilePages(int FD, size_t FileSize,
-                                        off_t Offset);
+      static const char *MapInFilePages(int FD, uint64_t FileSize);
 
       /// UnMapFilePages - Free pages mapped into the current process by
       /// MapInFilePages.
       ///
       /// This API is not intended for general use, clients should use
       /// MemoryBuffer::getFile instead.
-      static void UnMapFilePages(const char *Base, size_t FileSize);
+      static void UnMapFilePages(const char *Base, uint64_t FileSize);
 
     /// @}
     /// @name Data

Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=127413&r1=127412&r2=127413&view=diff
==============================================================================
--- llvm/trunk/lib/Support/MemoryBuffer.cpp (original)
+++ llvm/trunk/lib/Support/MemoryBuffer.cpp Thu Mar 10 12:01:43 2011
@@ -46,10 +46,8 @@
 
 /// init - Initialize this MemoryBuffer as a reference to externally allocated
 /// memory, memory that we know is already null terminated.
-void MemoryBuffer::init(const char *BufStart, const char *BufEnd,
-                        bool RequiresNullTerminator) {
-  assert((BufEnd[0] == 0 || !RequiresNullTerminator) &&
-         "Buffer is not null terminated!");
+void MemoryBuffer::init(const char *BufStart, const char *BufEnd) {
+  assert(BufEnd[0] == 0 && "Buffer is not null terminated!");
   BufferStart = BufStart;
   BufferEnd = BufEnd;
 }
@@ -67,19 +65,18 @@
 
 /// GetNamedBuffer - Allocates a new MemoryBuffer with Name copied after it.
 template <typename T>
-static T* GetNamedBuffer(StringRef Buffer, StringRef Name,
-                         bool RequiresNullTerminator) {
+static T* GetNamedBuffer(StringRef Buffer, StringRef Name) {
   char *Mem = static_cast<char*>(operator new(sizeof(T) + Name.size() + 1));
   CopyStringRef(Mem + sizeof(T), Name);
-  return new (Mem) T(Buffer, RequiresNullTerminator);
+  return new (Mem) T(Buffer);
 }
 
 namespace {
 /// MemoryBufferMem - Named MemoryBuffer pointing to a block of memory.
 class MemoryBufferMem : public MemoryBuffer {
 public:
-  MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) {
-    init(InputData.begin(), InputData.end(), RequiresNullTerminator);
+  MemoryBufferMem(StringRef InputData) {
+    init(InputData.begin(), InputData.end());
   }
 
   virtual const char *getBufferIdentifier() const {
@@ -93,7 +90,7 @@
 /// that EndPtr[0] must be a null byte and be accessible!
 MemoryBuffer *MemoryBuffer::getMemBuffer(StringRef InputData,
                                          StringRef BufferName) {
-  return GetNamedBuffer<MemoryBufferMem>(InputData, BufferName, true);
+  return GetNamedBuffer<MemoryBufferMem>(InputData, BufferName);
 }
 
 /// getMemBufferCopy - Open the specified memory range as a MemoryBuffer,
@@ -130,7 +127,7 @@
   char *Buf = Mem + AlignedStringLen;
   Buf[Size] = 0; // Null terminate buffer.
 
-  return new (Mem) MemoryBufferMem(StringRef(Buf, Size), true);
+  return new (Mem) MemoryBufferMem(StringRef(Buf, Size));
 }
 
 /// getNewMemBuffer - Allocate a new MemoryBuffer of the specified size that
@@ -175,19 +172,11 @@
 /// sys::Path::UnMapFilePages method.
 class MemoryBufferMMapFile : public MemoryBufferMem {
 public:
-  MemoryBufferMMapFile(StringRef Buffer, bool RequiresNullTerminator)
-    : MemoryBufferMem(Buffer, RequiresNullTerminator) { }
+  MemoryBufferMMapFile(StringRef Buffer)
+    : MemoryBufferMem(Buffer) { }
 
   ~MemoryBufferMMapFile() {
-    static int PageSize = sys::Process::GetPageSize();
-
-    uintptr_t Start = reinterpret_cast<uintptr_t>(getBufferStart());
-    size_t Size = getBufferSize();
-    uintptr_t RealStart = Start & ~(PageSize - 1);
-    size_t RealSize = Size + (Start - RealStart);
-
-    sys::Path::UnMapFilePages(reinterpret_cast<const char*>(RealStart),
-                              RealSize);
+    sys::Path::UnMapFilePages(getBufferStart(), getBufferSize());
   }
 };
 }
@@ -216,44 +205,12 @@
   return ret;
 }
 
-static bool shouldUseMmap(size_t FileSize,
-                          size_t MapSize,
-                          off_t Offset,
-                          bool RequiresNullTerminator,
-                          int PageSize) {
-  // We don't use mmap for small files because this can severely fragment our
-  // address space.
-  if (MapSize < 4096*4)
-    return false;
-
-  if (!RequiresNullTerminator)
-    return true;
-
-  // If we need a null terminator and the end of the map is inside the file,
-  // we cannot use mmap.
-  size_t End = Offset + MapSize;
-  assert(End <= FileSize);
-  if (End != FileSize)
-    return false;
-
-  // Don't try to map files that are exactly a multiple of the system page size
-  // if we need a null terminator.
-  if ((FileSize & (PageSize -1)) == 0)
-    return false;
-
-  return true;
-}
-
 error_code MemoryBuffer::getOpenFile(int FD, const char *Filename,
                                      OwningPtr<MemoryBuffer> &result,
-                                     size_t FileSize, size_t MapSize,
-                                     off_t Offset,
-                                     bool RequiresNullTerminator) {
-  static int PageSize = sys::Process::GetPageSize();
-
+                                     int64_t FileSize) {
   // If we don't know the file size, use fstat to find out.  fstat on an open
   // file descriptor is cheaper than stat on a random path.
-  if (FileSize == size_t(-1)) {
+  if (FileSize == -1) {
     struct stat FileInfo;
     // TODO: This should use fstat64 when available.
     if (fstat(FD, &FileInfo) == -1) {
@@ -262,26 +219,23 @@
     FileSize = FileInfo.st_size;
   }
 
-  // Default is to map the full file.
-  if (MapSize == size_t(-1))
-    MapSize = FileSize;
-
-  if (shouldUseMmap(FileSize, MapSize, Offset, RequiresNullTerminator,
-                    PageSize)) {
-    off_t RealMapOffset = Offset & ~(PageSize - 1);
-    off_t Delta = Offset - RealMapOffset;
-    size_t RealMapSize = MapSize + Delta;
-
-    if (const char *Pages = sys::Path::MapInFilePages(FD,
-                                                      RealMapSize,
-                                                      RealMapOffset)) {
+
+  // If the file is large, try to use mmap to read it in.  We don't use mmap
+  // for small files, because this can severely fragment our address space. Also
+  // don't try to map files that are exactly a multiple of the system page size,
+  // as the file would not have the required null terminator.
+  //
+  // FIXME: Can we just mmap an extra page in the latter case?
+  if (FileSize >= 4096*4 &&
+      (FileSize & (sys::Process::GetPageSize()-1)) != 0) {
+    if (const char *Pages = sys::Path::MapInFilePages(FD, FileSize)) {
       result.reset(GetNamedBuffer<MemoryBufferMMapFile>(
-          StringRef(Pages + Delta, MapSize), Filename, RequiresNullTerminator));
+        StringRef(Pages, FileSize), Filename));
       return success;
     }
   }
 
-  MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(MapSize, Filename);
+  MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename);
   if (!Buf) {
     // Failed to create a buffer. The only way it can fail is if
     // new(std::nothrow) returns 0.
@@ -291,10 +245,7 @@
   OwningPtr<MemoryBuffer> SB(Buf);
   char *BufPtr = const_cast<char*>(SB->getBufferStart());
 
-  size_t BytesLeft = MapSize;
-  if (lseek(FD, Offset, SEEK_SET) == -1)
-    return error_code(errno, posix_category());
-
+  size_t BytesLeft = FileSize;
   while (BytesLeft) {
     ssize_t NumRead = ::read(FD, BufPtr, BytesLeft);
     if (NumRead == -1) {

Modified: llvm/trunk/lib/Support/Unix/Path.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Path.inc?rev=127413&r1=127412&r2=127413&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Unix/Path.inc (original)
+++ llvm/trunk/lib/Support/Unix/Path.inc Thu Mar 10 12:01:43 2011
@@ -869,18 +869,18 @@
   return false;
 }
 
-const char *Path::MapInFilePages(int FD, size_t FileSize, off_t Offset) {
+const char *Path::MapInFilePages(int FD, uint64_t FileSize) {
   int Flags = MAP_PRIVATE;
 #ifdef MAP_FILE
   Flags |= MAP_FILE;
 #endif
-  void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, Offset);
+  void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0);
   if (BasePtr == MAP_FAILED)
     return 0;
   return (const char*)BasePtr;
 }
 
-void Path::UnMapFilePages(const char *BasePtr, size_t FileSize) {
+void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) {
   ::munmap((void*)BasePtr, FileSize);
 }
 





More information about the llvm-commits mailing list