diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/FileManager.h | 4 | ||||
-rw-r--r-- | clang/tools/clang-cc/CacheTokens.cpp | 66 |
2 files changed, 36 insertions, 34 deletions
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h index 6aa88629ce9..a8ed87011ff 100644 --- a/clang/include/clang/Basic/FileManager.h +++ b/clang/include/clang/Basic/FileManager.h @@ -126,7 +126,9 @@ public: /// setStatCache - Installs the provided StatSysCallCache object within /// the FileManager. Ownership of this object is transferred to the /// FileManager. - void setStatCache(StatSysCallCache *statCache) { StatCache.reset(statCache); } + void setStatCache(StatSysCallCache *statCache) { + StatCache.reset(statCache); + } /// getDirectory - Lookup, cache, and verify the specified directory. This /// returns null if the directory doesn't exist. diff --git a/clang/tools/clang-cc/CacheTokens.cpp b/clang/tools/clang-cc/CacheTokens.cpp index 8a6f1aa51b4..6e693bbfe6b 100644 --- a/clang/tools/clang-cc/CacheTokens.cpp +++ b/clang/tools/clang-cc/CacheTokens.cpp @@ -375,43 +375,12 @@ class VISIBILITY_HIDDEN PTHWriter { PTHEntry LexTokens(Lexer& L); Offset EmitCachedSpellings(); - /// StatListener - A simple "interpose" object used to monitor stat calls - /// invoked by FileManager while processing the original sources used - /// as input to PTH generation. StatListener populates the PTHWriter's - /// file map with stat information for directories as well as negative stats. - /// Stat information for files are populated elsewhere. - class StatListener : public StatSysCallCache { - PTHMap& PM; - public: - StatListener(PTHMap& pm) : PM(pm) {} - ~StatListener() {} - - int stat(const char *path, struct stat *buf) { - int result = ::stat(path, buf); - - if (result != 0) // Failed 'stat'. - PM.insert(path, PTHEntry()); - else if (S_ISDIR(buf->st_mode)) { - // Only cache directories with absolute paths. - if (!llvm::sys::Path(path).isAbsolute()) - return result; - - PM.insert(PTHEntryKeyVariant(buf, path), PTHEntry()); - } - - return result; - } - }; - public: PTHWriter(llvm::raw_fd_ostream& out, Preprocessor& pp) : Out(out), PP(pp), idcount(0), CurStrOffset(0) {} + PTHMap &getPM() { return PM; } void GeneratePTH(const std::string *MainFile = 0); - - StatSysCallCache *createStatListener() { - return new StatListener(PM); - } }; } // end anonymous namespace @@ -687,6 +656,37 @@ void PTHWriter::GeneratePTH(const std::string *MainFile) { Emit32(SpellingOff); } +namespace { +/// StatListener - A simple "interpose" object used to monitor stat calls +/// invoked by FileManager while processing the original sources used +/// as input to PTH generation. StatListener populates the PTHWriter's +/// file map with stat information for directories as well as negative stats. +/// Stat information for files are populated elsewhere. +class StatListener : public StatSysCallCache { + PTHMap ± +public: + StatListener(PTHMap &pm) : PM(pm) {} + ~StatListener() {} + + int stat(const char *path, struct stat *buf) { + int result = ::stat(path, buf); + + if (result != 0) // Failed 'stat'. + PM.insert(path, PTHEntry()); + else if (S_ISDIR(buf->st_mode)) { + // Only cache directories with absolute paths. + if (!llvm::sys::Path(path).isAbsolute()) + return result; + + PM.insert(PTHEntryKeyVariant(buf, path), PTHEntry()); + } + + return result; + } +}; +} // end anonymous namespace + + void clang::CacheTokens(Preprocessor &PP, const std::string &OutFile) { // Open up the PTH file. std::string ErrMsg; @@ -715,7 +715,7 @@ void clang::CacheTokens(Preprocessor &PP, const std::string &OutFile) { PTHWriter PW(Out, PP); // Install the 'stat' system call listener in the FileManager. - PP.getFileManager().setStatCache(PW.createStatListener()); + PP.getFileManager().setStatCache(new StatListener(PW.getPM())); // Lex through the entire file. This will populate SourceManager with // all of the header information. |