Preserve Sema::UndefinedInternals across PCH boundaries. Fixes
-Wundefined-internal warnings with PCH.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173538 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index fd1b896..0261ad8 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -2461,7 +2461,24 @@
       for (unsigned I = 0, N = Record.size(); I != N; ++I)
         KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
       break;
-        
+
+    case UNDEFINED_INTERNALS:
+      if (UndefinedInternals.size() % 2 != 0) {
+        Error("Invalid existing UndefinedInternals");
+        return true;
+      }
+
+      if (Record.size() % 2 != 0) {
+        Error("invalid undefined internals record");
+        return true;
+      }
+      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
+        UndefinedInternals.push_back(getGlobalDeclID(F, Record[I++]));
+        UndefinedInternals.push_back(
+            ReadSourceLocation(F, Record, I).getRawEncoding());
+      }
+      break;
+
     case IMPORTED_MODULES: {
       if (F.Kind != MK_Module) {
         // If we aren't loading a module (which has its own exports), make
@@ -5934,6 +5951,17 @@
   }
 }
 
+void ASTReader::ReadUndefinedInternals(
+                       llvm::MapVector<NamedDecl*, SourceLocation> &Undefined) {
+  for (unsigned Idx = 0, N = UndefinedInternals.size(); Idx != N;) {
+    NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedInternals[Idx++]));
+    SourceLocation Loc =
+        SourceLocation::getFromRawEncoding(UndefinedInternals[Idx++]);
+    Undefined.insert(std::make_pair(D, Loc));
+  }
+}
+    
+
 void ASTReader::ReadTentativeDefinitions(
                   SmallVectorImpl<VarDecl *> &TentativeDefs) {
   for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp
index 5a690b3..d398153 100644
--- a/lib/Serialization/ASTWriter.cpp
+++ b/lib/Serialization/ASTWriter.cpp
@@ -824,6 +824,7 @@
   RECORD(OPENCL_EXTENSIONS);
   RECORD(DELEGATING_CTORS);
   RECORD(KNOWN_NAMESPACES);
+  RECORD(UNDEFINED_INTERNALS);
   RECORD(MODULE_OFFSET_MAP);
   RECORD(SOURCE_MANAGER_LINE_TABLE);
   RECORD(OBJC_CATEGORIES_MAP);
@@ -3581,7 +3582,7 @@
 
   // Build a record containing all of the known namespaces.
   RecordData KnownNamespaces;
-  for (llvm::DenseMap<NamespaceDecl*, bool>::iterator 
+  for (llvm::MapVector<NamespaceDecl*, bool>::iterator
             I = SemaRef.KnownNamespaces.begin(),
          IEnd = SemaRef.KnownNamespaces.end();
        I != IEnd; ++I) {
@@ -3589,6 +3590,16 @@
       AddDeclRef(I->first, KnownNamespaces);
   }
 
+  // Build a record of all used, undefined objects with internal linkage.
+  RecordData UndefinedInternals;
+  for (llvm::MapVector<NamedDecl*, SourceLocation>::iterator
+            I = SemaRef.UndefinedInternals.begin(),
+         IEnd = SemaRef.UndefinedInternals.end();
+       I != IEnd; ++I) {
+    AddDeclRef(I->first, UndefinedInternals);
+    AddSourceLocation(I->second, UndefinedInternals);
+  }
+
   // Write the control block
   WriteControlBlock(PP, Context, isysroot, OutputFile);
 
@@ -3803,6 +3814,10 @@
   // Write the known namespaces.
   if (!KnownNamespaces.empty())
     Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces);
+
+  // Write the undefined internal functions and variables.
+  if (!UndefinedInternals.empty())
+    Stream.EmitRecord(UNDEFINED_INTERNALS, UndefinedInternals);
   
   // Write the visible updates to DeclContexts.
   for (llvm::SmallPtrSet<const DeclContext *, 16>::iterator