Implement inferred submodules support, which (when requested)
implicitly generates submodules corresponding to the headers that fall
within a module.

llvm-svn: 145887
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index ebc1795..636574a 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -3049,18 +3049,19 @@
         return Failure;
       }
 
-      if (Record.size() < 6) {
+      if (Record.size() < 7) {
         Error("malformed module definition");
         return Failure;
       }
       
       StringRef Name(BlobStart, BlobLen);
-      unsigned Parent = getGlobalSubmoduleID(F, Record[0]);
-      bool IsFramework = Record[1];
-      bool IsExplicit = Record[2];
-      bool InferSubmodules = Record[3];
-      bool InferExplicitSubmodules = Record[4];
-      bool InferExportWildcard = Record[5];
+      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
+      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
+      bool IsFramework = Record[2];
+      bool IsExplicit = Record[3];
+      bool InferSubmodules = Record[4];
+      bool InferExplicitSubmodules = Record[5];
+      bool InferExportWildcard = Record[6];
       
       Module *ParentModule = 0;
       if (Parent)
@@ -3071,9 +3072,9 @@
       CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, 
                                                 IsFramework, 
                                                 IsExplicit).first;
-      
-      if (CurrentModuleGlobalIndex >= SubmodulesLoaded.size() ||
-          SubmodulesLoaded[CurrentModuleGlobalIndex]) {
+      SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
+      if (GlobalIndex >= SubmodulesLoaded.size() ||
+          SubmodulesLoaded[GlobalIndex]) {
         Error("too many submodules");
         return Failure;
       }
@@ -3082,11 +3083,9 @@
       CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
       CurrentModule->InferExportWildcard = InferExportWildcard;
       if (DeserializationListener)
-        DeserializationListener->ModuleRead(
-          CurrentModuleGlobalIndex + NUM_PREDEF_SUBMODULE_IDS, 
-          CurrentModule);
+        DeserializationListener->ModuleRead(GlobalID, CurrentModule);
       
-      SubmodulesLoaded[CurrentModuleGlobalIndex++] = CurrentModule;
+      SubmodulesLoaded[GlobalIndex] = CurrentModule;
       break;
     }
         
@@ -3102,7 +3101,7 @@
       StringRef FileName(BlobStart, BlobLen);
       if (const FileEntry *Umbrella = PP.getFileManager().getFile(FileName)) {
         if (!CurrentModule->UmbrellaHeader)
-          CurrentModule->UmbrellaHeader = Umbrella;
+          ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
         else if (CurrentModule->UmbrellaHeader != Umbrella) {
           Error("mismatched umbrella headers in submodule");
           return Failure;
@@ -3126,7 +3125,7 @@
         if (std::find(CurrentModule->Headers.begin(), 
                       CurrentModule->Headers.end(), 
                       File) == CurrentModule->Headers.end())
-          CurrentModule->Headers.push_back(File);
+          ModMap.addHeader(CurrentModule, File);
       }
       break;      
     }