Partial PCH support for FileScopeAsmDecl and BlockDecl. Both require
expression or statement serialization before we can test them.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69002 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index a5e29dc..328ed84 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -58,7 +58,8 @@
     void VisitVarDecl(VarDecl *VD);
     void VisitParmVarDecl(ParmVarDecl *PD);
     void VisitOriginalParmVarDecl(OriginalParmVarDecl *PD);
-
+    void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
+    void VisitBlockDecl(BlockDecl *BD);
     std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
   };
 }
@@ -177,6 +178,21 @@
   PD->setOriginalType(Reader.GetType(Record[Idx++]));
 }
 
+void PCHDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
+  VisitDecl(AD);
+  // FIXME: read asm string
+}
+
+void PCHDeclReader::VisitBlockDecl(BlockDecl *BD) {
+  VisitDecl(BD);
+  unsigned NumParams = Record[Idx++];
+  llvm::SmallVector<ParmVarDecl *, 16> Params;
+  Params.reserve(NumParams);
+  for (unsigned I = 0; I != NumParams; ++I)
+    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
+  BD->setParams(Reader.getContext(), &Params[0], NumParams);  
+}
+
 std::pair<uint64_t, uint64_t> 
 PCHDeclReader::VisitDeclContext(DeclContext *DC) {
   uint64_t LexicalOffset = Record[Idx++];
@@ -1105,6 +1121,23 @@
     break;
   }
 
+  case pch::DECL_FILE_SCOPE_ASM: {
+    FileScopeAsmDecl *Asm = FileScopeAsmDecl::Create(Context, 0,
+                                                     SourceLocation(), 0);
+    LoadedDecl(Index, Asm);
+    Reader.VisitFileScopeAsmDecl(Asm);
+    D = Asm;
+    break;
+  }
+
+  case pch::DECL_BLOCK: {
+    BlockDecl *Block = BlockDecl::Create(Context, 0, SourceLocation());
+    LoadedDecl(Index, Block);
+    Reader.VisitBlockDecl(Block);
+    D = Block;
+    break;
+  }
+
   default:
     assert(false && "Cannot de-serialize this kind of declaration");
     break;