forked from OSchip/llvm-project
[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:
parent
f590e094ad
commit
d4fcf58070
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue