/// \brief The AST consumer.
ASTConsumer *Consumer;
- /// \brief Information that is needed for every file in the chain.
+ /// \brief Information that is needed for every module.
struct PerFileData {
PerFileData();
~PerFileData();
///
/// The dynamic type of this stat cache is always ASTStatCache
void *StatCache;
-
+
/// \brief The number of preallocated preprocessing entities in the
/// preprocessing record.
unsigned NumPreallocatedPreprocessingEntities;
+
+ /// \brief The next module in source order.
+ PerFileData *NextInSource;
+
+ /// \brief All the modules that loaded this one. Can contain NULL for
+ /// directly loaded modules.
+ llvm::SmallVector<PerFileData *, 1> Loaders;
};
+ /// \brief All loaded modules, indexed by name.
+ llvm::StringMap<PerFileData*> Modules;
+
+ /// \brief The first module in source order.
+ PerFileData *FirstInSource;
+
/// \brief The chain of AST files. The first entry is the one named by the
/// user, the last one is the one that doesn't depend on anything further.
/// That is, the entry I was created with -include-pch I+1.
}
ASTReader::ASTReadResult ASTReader::ReadASTCore(llvm::StringRef FileName) {
+ PerFileData *Prev = Chain.empty() ? 0 : Chain.back();
Chain.push_back(new PerFileData());
PerFileData &F = *Chain.back();
+ if (Prev)
+ Prev->NextInSource = &F;
+ else
+ FirstInSource = &F;
+ F.Loaders.push_back(Prev);
// Set the AST file name.
F.FileName = FileName;
MacroDefinitionOffsets(0), LocalNumSelectors(0), SelectorOffsets(0),
SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0),
DeclOffsets(0), LocalNumTypes(0), TypeOffsets(0), StatCache(0),
- NumPreallocatedPreprocessingEntities(0)
+ NumPreallocatedPreprocessingEntities(0), NextInSource(0)
{}
ASTReader::PerFileData::~PerFileData() {