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

Rafael Espindola rafael.espindola at gmail.com
Thu Mar 10 12:54:07 PST 2011


Author: rafael
Date: Thu Mar 10 14:54:07 2011
New Revision: 127426

URL: http://llvm.org/viewvc/llvm-project?rev=127426&view=rev
Log:
Don't compute the file size if we don't need to.

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=127426&r1=127425&r2=127426&view=diff
==============================================================================
--- llvm/trunk/lib/Support/MemoryBuffer.cpp (original)
+++ llvm/trunk/lib/Support/MemoryBuffer.cpp Thu Mar 10 14:54:07 2011
@@ -216,7 +216,8 @@
   return ret;
 }
 
-static bool shouldUseMmap(size_t FileSize,
+static bool shouldUseMmap(int FD,
+                          size_t FileSize,
                           size_t MapSize,
                           off_t Offset,
                           bool RequiresNullTerminator,
@@ -229,6 +230,20 @@
   if (!RequiresNullTerminator)
     return true;
 
+
+  // 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.
+  // FIXME: this chunk of code is duplicated, but it avoids a fstat when
+  // RequiresNullTerminator = false and MapSize != -1.
+  if (FileSize == size_t(-1)) {
+    struct stat FileInfo;
+    // TODO: This should use fstat64 when available.
+    if (fstat(FD, &FileInfo) == -1) {
+      return error_code(errno, posix_category());
+    }
+    FileSize = FileInfo.st_size;
+  }
+
   // 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;
@@ -251,22 +266,22 @@
                                      bool RequiresNullTerminator) {
   static int PageSize = sys::Process::GetPageSize();
 
-  // 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)) {
-    struct stat FileInfo;
-    // TODO: This should use fstat64 when available.
-    if (fstat(FD, &FileInfo) == -1) {
-      return error_code(errno, posix_category());
-    }
-    FileSize = FileInfo.st_size;
-  }
-
   // Default is to map the full file.
-  if (MapSize == size_t(-1))
+  if (MapSize == size_t(-1)) {
+    // 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)) {
+      struct stat FileInfo;
+      // TODO: This should use fstat64 when available.
+      if (fstat(FD, &FileInfo) == -1) {
+        return error_code(errno, posix_category());
+      }
+      FileSize = FileInfo.st_size;
+    }
     MapSize = FileSize;
+  }
 
-  if (shouldUseMmap(FileSize, MapSize, Offset, RequiresNullTerminator,
+  if (shouldUseMmap(FD, FileSize, MapSize, Offset, RequiresNullTerminator,
                     PageSize)) {
     off_t RealMapOffset = Offset & ~(PageSize - 1);
     off_t Delta = Offset - RealMapOffset;





More information about the llvm-commits mailing list