From 5ea7d07d2ab204144f1f36c4673a17a122a514bc Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 23 Nov 2010 22:32:37 +0000 Subject: The final result of all this refactoring: instead of doing stat immediately followed by an open for every source file we open, probe the file system with 'open' and then do an fstat when it succeeds. open+fstat is faster than stat+open because the kernel only has to perform the string->inode mapping once. Presumably it gets faster the deeper in your filesystem a lookup happens. For -Eonly on cocoa.h, this reduces system time from 0.042s to 0.039s on my machine, a 7.7% speedup. llvm-svn: 120066 --- clang/lib/Basic/FileManager.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'clang/lib/Basic/FileManager.cpp') diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index 00c449e1973..a80fae7bfae 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -400,11 +400,24 @@ void FileManager::FixupRelativePath(llvm::sys::Path &path, llvm::MemoryBuffer *FileManager:: getBufferForFile(const FileEntry *Entry, std::string *ErrorStr) { - llvm::StringRef Filename = Entry->getName(); - if (FileSystemOpts.WorkingDir.empty()) + if (FileSystemOpts.WorkingDir.empty()) { + const char *Filename = Entry->getName(); + // If the file is already open, use the open file descriptor. + if (Entry->FD != -1) { + llvm::MemoryBuffer *Buf = + llvm::MemoryBuffer::getOpenFile(Entry->FD, Filename, ErrorStr, + Entry->getSize()); + // getOpenFile will have closed the file descriptor, don't reuse or + // reclose it. + Entry->FD = -1; + return Buf; + } + + // Otherwise, open the file. return llvm::MemoryBuffer::getFile(Filename, ErrorStr, Entry->getSize()); + } - llvm::sys::Path FilePath(Filename); + llvm::sys::Path FilePath(Entry->getName()); FixupRelativePath(FilePath, FileSystemOpts); return llvm::MemoryBuffer::getFile(FilePath.c_str(), ErrorStr, Entry->getSize()); -- cgit v1.2.3