]> granicus.if.org Git - clang/commitdiff
Notify the AST writer (via ASTDeserializationListener) when a
authorDouglas Gregor <dgregor@apple.com>
Fri, 2 Dec 2011 17:30:13 +0000 (17:30 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 2 Dec 2011 17:30:13 +0000 (17:30 +0000)
(sub)module is read from an AST file. This makes sure that the AST
writer knows how to map all modules to their global IDs.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145685 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 588fe0e63c046aa6b247e82311f4d3ed5f38d2c4..731148ecf8ffae840c9fe418b9f5e3103322b33a 100644 (file)
@@ -23,6 +23,7 @@ class Decl;
 class ASTReader;
 class QualType;
 class MacroDefinition;
+class Module;
   
 class ASTDeserializationListener {
 protected:
@@ -47,6 +48,8 @@ public:
   /// \brief A macro definition was read from the AST file.
   virtual void MacroDefinitionRead(serialization::PreprocessedEntityID, 
                                    MacroDefinition *MD) { }
+  /// \brief A module definition was read from the AST file.
+  virtual void ModuleRead(serialization::SubmoduleID ID, Module *Mod) { }
 };
 
 }
index 1abce1869b70be8cc661db761cd9b9089aaa5700..fd2b9ec77eec1c1beb595acda5551ca0244d2d34 100644 (file)
@@ -667,7 +667,8 @@ public:
   void SelectorRead(serialization::SelectorID ID, Selector Sel);
   void MacroDefinitionRead(serialization::PreprocessedEntityID ID,
                            MacroDefinition *MD);
-
+  void ModuleRead(serialization::SubmoduleID ID, Module *Mod);
+                    
   // ASTMutationListener implementation.
   virtual void CompletedTagDefinition(const TagDecl *D);
   virtual void AddedVisibleDecl(const DeclContext *DC, const Decl *D);
index 4594a393ddb2b57348f275c74c16da8d6d85c332..d8fb3113d5cdbd19af47103add150cb7c83fc5ae 100644 (file)
@@ -2973,6 +2973,12 @@ ASTReader::ASTReadResult ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
         Error("too many submodules");
         return Failure;
       }
+      
+      if (DeserializationListener)
+        DeserializationListener->ModuleRead(
+          CurrentModuleGlobalIndex + NUM_PREDEF_SUBMODULE_IDS, 
+          CurrentModule);
+      
       SubmodulesLoaded[CurrentModuleGlobalIndex++] = CurrentModule;
       break;
     }
index 5580f90b83bf5f0bee64b5714c337fe89d7c96c5..6d51dbce3e2bdcf03ec9e90d1ecf3afdb7220eca 100644 (file)
@@ -4167,6 +4167,11 @@ void ASTWriter::MacroDefinitionRead(serialization::PreprocessedEntityID ID,
   MacroDefinitions[MD] = ID;
 }
 
+void ASTWriter::ModuleRead(serialization::SubmoduleID ID, Module *Mod) {
+  assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end());
+  SubmoduleIDs[Mod] = ID;
+}
+
 void ASTWriter::CompletedTagDefinition(const TagDecl *D) {
   assert(D->isCompleteDefinition());
   assert(!WritingAST && "Already writing the AST!");