[libclang] When indexing an AST file, only deserialize the preprocessing record

entities of the current primary module.

llvm-svn: 165023
This commit is contained in:
Argyrios Kyrtzidis 2012-10-02 16:10:51 +00:00
parent f590e094ad
commit d4fcf58070
6 changed files with 48 additions and 12 deletions

View File

@ -607,6 +607,12 @@ public:
return CachedCompletionResults.size();
}
/// \brief Returns an iterator range for the local preprocessing entities
/// of the local Preprocessor, if this is a parsed source file, or the loaded
/// preprocessing entities of the primary module if this is an AST file.
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
getLocalPreprocessingEntities() const;
llvm::MemoryBuffer *getBufferForFile(StringRef Filename,
std::string *ErrorStr = 0);

View File

@ -548,6 +548,17 @@ namespace clang {
return iterator(this, PreprocessedEntities.size());
}
/// \brief begin/end iterator pair for the given range of loaded
/// preprocessed entities.
std::pair<iterator, iterator>
getIteratorsForLoadedRange(unsigned start, unsigned count) {
unsigned end = start + count;
assert(end <= LoadedPreprocessedEntities.size());
return std::make_pair(
iterator(this, int(start)-LoadedPreprocessedEntities.size()),
iterator(this, int(end)-LoadedPreprocessedEntities.size()));
}
/// \brief Returns a pair of [Begin, End) iterators of preprocessed entities
/// that source range \p R encompasses.
///

View File

@ -855,6 +855,11 @@ private:
std::pair<ModuleFile *, unsigned>
getModulePreprocessedEntity(unsigned GlobalIndex);
/// \brief Returns (begin, end) pair for the preprocessed entities of a
/// particular module.
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
getModulePreprocessedEntities(ModuleFile &Mod) const;
void PassInterestingDeclsToConsumer();
void PassInterestingDeclToConsumer(Decl *D);

View File

@ -2777,6 +2777,21 @@ SourceLocation ASTUnit::getStartOfMainFileID() {
return SourceMgr->getLocForStartOfFile(FID);
}
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
ASTUnit::getLocalPreprocessingEntities() const {
if (isMainFileAST()) {
serialization::ModuleFile &
Mod = Reader->getModuleManager().getPrimaryModule();
return Reader->getModulePreprocessedEntities(Mod);
}
if (PreprocessingRecord *PPRec = PP->getPreprocessingRecord())
return std::make_pair(PPRec->local_begin(), PPRec->local_end());
return std::make_pair(PreprocessingRecord::iterator(),
PreprocessingRecord::iterator());
}
void ASTUnit::PreambleData::countLines() const {
NumLines = 0;
if (empty())

View File

@ -3381,6 +3381,16 @@ ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
return std::make_pair(M, LocalIndex);
}
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
Mod.NumPreprocessedEntities);
return std::make_pair(PreprocessingRecord::iterator(),
PreprocessingRecord::iterator());
}
PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
PreprocessedEntityID PPID = Index+1;
std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);

View File

@ -455,21 +455,10 @@ static void indexPreprocessingRecord(ASTUnit &Unit, IndexingContext &IdxCtx) {
if (!PP.getPreprocessingRecord())
return;
PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
// FIXME: Only deserialize inclusion directives.
// FIXME: Only deserialize stuff from the last chained PCH, not the PCH/Module
// that it depends on.
bool OnlyLocal = !Unit.isMainFileAST() && Unit.getOnlyLocalDecls();
PreprocessingRecord::iterator I, E;
if (OnlyLocal) {
I = PPRec.local_begin();
E = PPRec.local_end();
} else {
I = PPRec.begin();
E = PPRec.end();
}
llvm::tie(I, E) = Unit.getLocalPreprocessingEntities();
for (; I != E; ++I) {
PreprocessedEntity *PPE = *I;