]> granicus.if.org Git - clang/commitdiff
Record module loaders and module source order.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 1 Oct 2010 19:59:12 +0000 (19:59 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 1 Oct 2010 19:59:12 +0000 (19:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115334 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Serialization/ASTReader.h
lib/Serialization/ASTReader.cpp

index 2b3dbf1569aba1aa9dd742a1b35bd24a3b30c79b..b2f08c183f2799408c7981f2888ceccd793dba42 100644 (file)
@@ -193,7 +193,7 @@ private:
   /// \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();
@@ -318,12 +318,25 @@ private:
     ///
     /// 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.
index ac7385976c09974e3e69e6c7208345a50b1a5333..adb233ac144a24d3b1e18bcc8ba2f542ee260ec7 100644 (file)
@@ -2122,8 +2122,14 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName) {
 }
 
 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;
@@ -4199,7 +4205,7 @@ ASTReader::PerFileData::PerFileData()
     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() {