summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/FileManager.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-11-23 22:32:37 +0000
committerChris Lattner <sabre@nondot.org>2010-11-23 22:32:37 +0000
commit5ea7d07d2ab204144f1f36c4673a17a122a514bc (patch)
tree8a0b9f4fbd36e9420ca3d613c3f6c63c0c0cfd8a /clang/lib/Basic/FileManager.cpp
parent6bf4e6d8b20d25d9263d61d5f9ae1967806a0807 (diff)
downloadbcm5719-llvm-5ea7d07d2ab204144f1f36c4673a17a122a514bc.tar.gz
bcm5719-llvm-5ea7d07d2ab204144f1f36c4673a17a122a514bc.zip
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
Diffstat (limited to 'clang/lib/Basic/FileManager.cpp')
-rw-r--r--clang/lib/Basic/FileManager.cpp19
1 files changed, 16 insertions, 3 deletions
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());
OpenPOWER on IntegriCloud