Use open+fstat instead of stat+open.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Jul 2013 03:34:31 +0000 (03:34 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Jul 2013 03:34:31 +0000 (03:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186381 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-ar/llvm-ar.cpp

index e082687643dbe543f079e5acd1f3298e95736985..32bcb49a1db9a64c86ba939817035e0f847fad1b 100644 (file)
@@ -555,13 +555,23 @@ static void performWriteOperation(ArchiveOperation Operation,
     printWithSpacePadding(Out, Name, 16);
 
     if (I->isNewMember()) {
-      // FIXME: we do a stat + open. We should do a open + fstat.
       const char *FileName = I->getNew();
+
+      int OpenFlags = O_RDONLY;
+#ifdef O_BINARY
+      OpenFlags |= O_BINARY;
+#endif
+      int FD = ::open(FileName, OpenFlags);
+      if (FD == -1)
+        return failIfError(error_code(errno, posix_category()), FileName);
+
       sys::fs::file_status Status;
-      failIfError(sys::fs::status(FileName, Status), FileName);
+      failIfError(sys::fs::status(FD, Status), FileName);
 
       OwningPtr<MemoryBuffer> File;
-      failIfError(MemoryBuffer::getFile(FileName, File), FileName);
+      failIfError(
+          MemoryBuffer::getOpenFile(FD, FileName, File, Status.getSize()),
+          FileName);
 
       uint64_t secondsSinceEpoch =
           Status.getLastModificationTime().toEpochTime();