From c6fe32a91c7372caf09152ee31a24c4b5d24deed Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Jan 2009 03:48:08 +0000 Subject: [PATCH] Instead of iterating over FileID's, have PTH generation iterate over the content cache directly. Content cache has a 1-1 mapping with fileentries, whereas multiple FileIDs can be the same FileEntry. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62401 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/CacheTokens.cpp | 24 ++++++++++------------- include/clang/Basic/SourceManager.h | 30 +++++------------------------ lib/Lex/Lexer.cpp | 3 +-- 3 files changed, 16 insertions(+), 41 deletions(-) diff --git a/Driver/CacheTokens.cpp b/Driver/CacheTokens.cpp index d791e09d6c..33986f8254 100644 --- a/Driver/CacheTokens.cpp +++ b/Driver/CacheTokens.cpp @@ -467,17 +467,13 @@ void PTHWriter::EmitCachedSpellings() { void PTHWriter::GeneratePTH() { // Iterate over all the files in SourceManager. Create a lexer // for each file and cache the tokens. - SourceManager& SM = PP.getSourceManager(); - const LangOptions& LOpts = PP.getLangOptions(); + SourceManager &SM = PP.getSourceManager(); + const LangOptions &LOpts = PP.getLangOptions(); - for (SourceManager::fileid_iterator I=SM.fileid_begin(), E=SM.fileid_end(); - I!=E; ++I) { - - const SrcMgr::ContentCache* C = I.getFileIDInfo().getContentCache(); - if (!C) continue; - - const FileEntry* FE = C->Entry; // Does this entry correspond to a file? - if (!FE) continue; + for (SourceManager::fileinfo_iterator I = SM.fileinfo_begin(), + E = SM.fileinfo_end(); I != E; ++I) { + const SrcMgr::ContentCache &C = *I; + const FileEntry *FE = C.Entry; // FIXME: Handle files with non-absolute paths. llvm::sys::Path P(FE->getName()); @@ -487,12 +483,12 @@ void PTHWriter::GeneratePTH() { PCHMap::iterator PI = PM.find(FE); // Have we already processed this file? if (PI != PM.end()) continue; - const llvm::MemoryBuffer* B = C->getBuffer(); + const llvm::MemoryBuffer *B = C.getBuffer(); if (!B) continue; - - Lexer L(SourceLocation::getFileLoc(I.getFileID(), 0), LOpts, - B->getBufferStart(), B->getBufferEnd(), B); + unsigned FID = SM.createFileID(FE, SourceLocation(), SrcMgr::C_User); + Lexer L(SourceLocation::getFileLoc(FID, 0), LOpts, + B->getBufferStart(), B->getBufferEnd(), B); PM[FE] = LexTokens(L); } diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 1eac4f15de..9a67627485 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -478,31 +478,11 @@ public: return getFIDInfo(FileID)->getFileCharacteristic(); } - // Iterators over FileIDs. - - class fileid_iterator { - std::vector::iterator I; - unsigned fid; - public: - fileid_iterator(std::vector::iterator i, unsigned f) - : I(i), fid(f) {} - - bool operator==(const fileid_iterator& X) const { return X.fid == fid; } - bool operator!=(const fileid_iterator& X) const { return X.fid != fid; } - fileid_iterator& operator++() { ++fid; ++I; return *this; } - - unsigned getFileID() const { return fid; } - SrcMgr::FileIDInfo& getFileIDInfo() { return *I; } - }; - - fileid_iterator fileid_begin() { - return fileid_iterator(FileIDs.begin(), 1); - } - - fileid_iterator fileid_end() { - return fileid_iterator(FileIDs.end(), FileIDs.size()+1); - } - + // Iterators over FileInfos. + typedef std::set::const_iterator fileinfo_iterator; + fileinfo_iterator fileinfo_begin() const { return FileInfos.begin(); } + fileinfo_iterator fileinfo_end() const { return FileInfos.end(); } + /// PrintStats - Print statistics to stderr. /// void PrintStats() const; diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index fa29d0a38e..5a14c1356a 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -112,8 +112,7 @@ Lexer::Lexer(SourceLocation fileloc, Preprocessor &pp, Lexer::Lexer(SourceLocation fileloc, const LangOptions &features, const char *BufStart, const char *BufEnd, const llvm::MemoryBuffer *FromFile) - : PreprocessorLexer(), FileLoc(fileloc), - Features(features) { + : FileLoc(fileloc), Features(features) { Is_PragmaLexer = false; InitCharacterInfo(); -- 2.40.0