<div dir="ltr">Richard,<div><br></div><div>I'm sorry but it seems that your patch broke many tests on on the bots so I'm going to revert it (one example <a href="http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/5984">http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/5984</a>).</div><div><br></div><div>    Dmitry</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 6, 2016 at 9:26 AM, Richard Smith via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Wed Apr  6 01:26:08 2016<br>
New Revision: 265518<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=265518&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=265518&view=rev</a><br>
Log:<br>
[modules] Continue factoring encoding of AST records out of ASTWriter.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/DeclCXX.h<br>
    cfe/trunk/include/clang/Serialization/ASTWriter.h<br>
    cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
    cfe/trunk/lib/Serialization/ASTWriterDecl.cpp<br>
    cfe/trunk/lib/Serialization/ASTWriterStmt.cpp<br>
    cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/DeclCXX.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)<br>
+++ cfe/trunk/include/clang/AST/DeclCXX.h Wed Apr  6 01:26:08 2016<br>
@@ -1714,6 +1714,7 @@ public:<br>
<br>
   friend class ASTDeclReader;<br>
   friend class ASTDeclWriter;<br>
+  friend class ASTRecordWriter;<br>
   friend class ASTReader;<br>
   friend class ASTWriter;<br>
 };<br>
<br>
Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)<br>
+++ cfe/trunk/include/clang/Serialization/ASTWriter.h Wed Apr  6 01:26:08 2016<br>
@@ -90,6 +90,7 @@ public:<br>
<br>
   friend class ASTDeclWriter;<br>
   friend class ASTStmtWriter;<br>
+  friend class ASTTypeWriter;<br>
   friend class ASTRecordWriter;<br>
 private:<br>
   /// \brief Map that provides the ID numbers of each type within the<br>
@@ -391,14 +392,6 @@ private:<br>
   /// redeclaration chains.<br>
   llvm::DenseMap<const Decl *, const Decl *> FirstLocalDeclCache;<br>
<br>
-  /// \brief Statements that we've encountered while serializing a<br>
-  /// declaration or type.<br>
-  SmallVector<Stmt *, 16> StmtsToEmit;<br>
-<br>
-  /// \brief Statements collection to use for ASTWriter::AddStmt().<br>
-  /// It will point to StmtsToEmit unless it is overriden.<br>
-  SmallVector<Stmt *, 16> *CollectedStmts;<br>
-<br>
   /// \brief Mapping from SwitchCase statements to IDs.<br>
   llvm::DenseMap<SwitchCase *, unsigned> SwitchCaseIDs;<br>
<br>
@@ -555,7 +548,6 @@ private:<br>
<br>
   void WriteDeclAbbrevs();<br>
   void WriteDecl(ASTContext &Context, Decl *D);<br>
-  void AddFunctionDefinition(const FunctionDecl *FD, RecordDataImpl &Record);<br>
<br>
   uint64_t WriteASTCore(Sema &SemaRef,<br>
                         StringRef isysroot, const std::string &OutputFile,<br>
@@ -649,26 +641,6 @@ public:<br>
   /// \brief Determine the type ID of an already-emitted type.<br>
   serialization::TypeID getTypeID(QualType T) const;<br>
<br>
-  /// \brief Emits a reference to a declarator info.<br>
-  void AddTypeSourceInfo(TypeSourceInfo *TInfo, RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emits a type with source-location information.<br>
-  void AddTypeLoc(TypeLoc TL, RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emits a template argument location info.<br>
-  void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind,<br>
-                                  const TemplateArgumentLocInfo &Arg,<br>
-                                  RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emits a template argument location.<br>
-  void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg,<br>
-                              RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emits an AST template argument list info.<br>
-  void AddASTTemplateArgumentListInfo(<br>
-                          const ASTTemplateArgumentListInfo *ASTTemplArgList,<br>
-                          RecordDataImpl &Record);<br>
-<br>
   /// \brief Find the first local declaration of a given local redeclarable<br>
   /// decl.<br>
   const Decl *getFirstLocalDecl(const Decl *D);<br>
@@ -684,59 +656,26 @@ public:<br>
   /// declaration.<br>
   serialization::DeclID getDeclID(const Decl *D);<br>
<br>
-  void AddAttributes(ArrayRef<const Attr*> Attrs, RecordDataImpl &Record);<br>
-<br>
   /// \brief Emit a declaration name.<br>
   void AddDeclarationName(DeclarationName Name, RecordDataImpl &Record);<br>
-  void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,<br>
-                             DeclarationName Name, RecordDataImpl &Record);<br>
-  void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo,<br>
-                              RecordDataImpl &Record);<br>
-  unsigned getAnonymousDeclarationNumber(const NamedDecl *D);<br>
<br>
-  void AddQualifierInfo(const QualifierInfo &Info, RecordDataImpl &Record);<br>
+  unsigned getAnonymousDeclarationNumber(const NamedDecl *D);<br>
<br>
   /// \brief Emit a nested name specifier.<br>
   void AddNestedNameSpecifier(NestedNameSpecifier *NNS, RecordDataImpl &Record);<br>
<br>
-  /// \brief Emit a nested name specifier with source-location information.<br>
-  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,<br>
-                                 RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emit a template name.<br>
-  void AddTemplateName(TemplateName Name, RecordDataImpl &Record);<br>
-<br>
-  /// \brief Emit a template argument.<br>
-  void AddTemplateArgument(const TemplateArgument &Arg, RecordDataImpl &Record);<br>
-<br>
   /// \brief Emit a template parameter list.<br>
   void AddTemplateParameterList(const TemplateParameterList *TemplateParams,<br>
                                 RecordDataImpl &Record);<br>
<br>
-  /// \brief Emit a template argument list.<br>
-  void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs,<br>
-                                RecordDataImpl &Record);<br>
-<br>
   /// \brief Emit a UnresolvedSet structure.<br>
   void AddUnresolvedSet(const ASTUnresolvedSet &Set, RecordDataImpl &Record);<br>
<br>
-  /// \brief Emit a C++ base specifier.<br>
-  void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base,<br>
-                           RecordDataImpl &Record);<br>
-<br>
   /// \brief Emit the ID for a CXXCtorInitializer array and register the array<br>
   /// for later serialization.<br>
   void AddCXXCtorInitializersRef(ArrayRef<CXXCtorInitializer *> Inits,<br>
                                  RecordDataImpl &Record);<br>
<br>
-  /// \brief Emit a CXXCtorInitializer array.<br>
-  void AddCXXCtorInitializers(<br>
-                             const CXXCtorInitializer * const *CtorInitializers,<br>
-                             unsigned NumCtorInitializers,<br>
-                             RecordDataImpl &Record);<br>
-<br>
-  void AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Record);<br>
-<br>
   /// \brief Add a string to the given record.<br>
   void AddString(StringRef Str, RecordDataImpl &Record);<br>
<br>
@@ -771,22 +710,6 @@ public:<br>
   /// within the method pool/selector table.<br>
   void SetSelectorOffset(Selector Sel, uint32_t Offset);<br>
<br>
-  /// \brief Add the given statement or expression to the queue of<br>
-  /// statements to emit.<br>
-  ///<br>
-  /// This routine should be used when emitting types and declarations<br>
-  /// that have expressions as part of their formulation. Once the<br>
-  /// type or declaration has been written, call FlushStmts() to write<br>
-  /// the corresponding statements just after the type or<br>
-  /// declaration.<br>
-  void AddStmt(Stmt *S) {<br>
-      CollectedStmts->push_back(S);<br>
-  }<br>
-<br>
-  /// \brief Flush all of the statements and expressions that have<br>
-  /// been added to the queue via AddStmt().<br>
-  void FlushStmts();<br>
-<br>
   /// \brief Flush all of the C++ base specifier sets that have been added<br>
   /// via \c AddCXXBaseSpecifiersRef().<br>
   void FlushCXXBaseSpecifiers();<br>
@@ -798,7 +721,6 @@ public:<br>
   /// \brief Flush all pending records that are tacked onto the end of<br>
   /// decl and decl update records.<br>
   void FlushPendingAfterDecl() {<br>
-    FlushStmts();<br>
     FlushCXXBaseSpecifiers();<br>
     FlushCXXCtorInitializers();<br>
   }<br>
@@ -871,6 +793,15 @@ class ASTRecordWriter {<br>
   ASTWriter *Writer;<br>
   ASTWriter::RecordDataImpl *Record;<br>
<br>
+  /// \brief Statements that we've encountered while serializing a<br>
+  /// declaration or type.<br>
+  SmallVector<Stmt *, 16> StmtsToEmit;<br>
+<br>
+  /// \brief Flush all of the statements and expressions that have<br>
+  /// been added to the queue via AddStmt().<br>
+  void FlushStmts();<br>
+  void FlushSubStmts();<br>
+<br>
 public:<br>
   /// Construct a ASTRecordWriter that uses the default encoding scheme.<br>
   ASTRecordWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record)<br>
@@ -896,15 +827,37 @@ public:<br>
   uint64_t &operator[](size_t N) { return (*Record)[N]; }<br>
   /// @}<br>
<br>
-<br>
-  /// \brief Emit the record to the stream, and return its offset.<br>
+  /// \brief Emit the record to the stream, followed by its substatements, and<br>
+  /// return its offset.<br>
   // FIXME: Allow record producers to suggest Abbrevs.<br>
   uint64_t Emit(unsigned Code, unsigned Abbrev = 0) {<br>
     uint64_t Offset = Writer->Stream.GetCurrentBitNo();<br>
-    Writer->Stream.EmitRecord(Code, *Record);<br>
+    Writer->Stream.EmitRecord(Code, *Record, Abbrev);<br>
+    FlushStmts();<br>
     return Offset;<br>
   }<br>
<br>
+  /// \brief Emit the record to the stream, preceded by its substatements.<br>
+  uint64_t EmitStmt(unsigned Code, unsigned Abbrev = 0) {<br>
+    FlushSubStmts();<br>
+    Writer->Stream.EmitRecord(Code, *Record, Abbrev);<br>
+    return Writer->Stream.GetCurrentBitNo();<br>
+  }<br>
+<br>
+  /// \brief Add the given statement or expression to the queue of<br>
+  /// statements to emit.<br>
+  ///<br>
+  /// This routine should be used when emitting types and declarations<br>
+  /// that have expressions as part of their formulation. Once the<br>
+  /// type or declaration has been written, Emit() will write<br>
+  /// the corresponding statements just after the record.<br>
+  void AddStmt(Stmt *S) {<br>
+    StmtsToEmit.push_back(S);<br>
+  }<br>
+<br>
+  /// \brief Add a definition for the given function to the queue of statements<br>
+  /// to emit.<br>
+  void AddFunctionDefinition(const FunctionDecl *FD);<br>
<br>
   /// \brief Emit a source location.<br>
   void AddSourceLocation(SourceLocation Loc) {<br>
@@ -958,26 +911,21 @@ public:<br>
   }<br>
<br>
   /// \brief Emits a reference to a declarator info.<br>
-  void AddTypeSourceInfo(TypeSourceInfo *TInfo) {<br>
-    return Writer->AddTypeSourceInfo(TInfo, *Record);<br>
-  }<br>
+  void AddTypeSourceInfo(TypeSourceInfo *TInfo);<br>
+<br>
+  /// \brief Emits a type with source-location information.<br>
+  void AddTypeLoc(TypeLoc TL);<br>
<br>
   /// \brief Emits a template argument location info.<br>
   void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind,<br>
-                                  const TemplateArgumentLocInfo &Arg) {<br>
-    return Writer->AddTemplateArgumentLocInfo(Kind, Arg, *Record);<br>
-  }<br>
+                                  const TemplateArgumentLocInfo &Arg);<br>
<br>
   /// \brief Emits a template argument location.<br>
-  void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg) {<br>
-    return Writer->AddTemplateArgumentLoc(Arg, *Record);<br>
-  }<br>
+  void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg);<br>
<br>
   /// \brief Emits an AST template argument list info.<br>
   void AddASTTemplateArgumentListInfo(<br>
-      const ASTTemplateArgumentListInfo *ASTTemplArgList) {<br>
-    return Writer->AddASTTemplateArgumentListInfo(ASTTemplArgList, *Record);<br>
-  }<br>
+      const ASTTemplateArgumentListInfo *ASTTemplArgList);<br>
<br>
   /// \brief Emit a reference to a declaration.<br>
   void AddDeclRef(const Decl *D) {<br>
@@ -989,17 +937,10 @@ public:<br>
   }<br>
<br>
   void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,<br>
-                             DeclarationName Name) {<br>
-    return Writer->AddDeclarationNameLoc(DNLoc, Name, *Record);<br>
-  }<br>
+                             DeclarationName Name);<br>
+  void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo);<br>
<br>
-  void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {<br>
-    return Writer->AddDeclarationNameInfo(NameInfo, *Record);<br>
-  }<br>
-<br>
-  void AddQualifierInfo(const QualifierInfo &Info) {<br>
-    return Writer->AddQualifierInfo(Info, *Record);<br>
-  }<br>
+  void AddQualifierInfo(const QualifierInfo &Info);<br>
<br>
   /// \brief Emit a nested name specifier.<br>
   void AddNestedNameSpecifier(NestedNameSpecifier *NNS) {<br>
@@ -1007,19 +948,13 @@ public:<br>
   }<br>
<br>
   /// \brief Emit a nested name specifier with source-location information.<br>
-  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) {<br>
-    return Writer->AddNestedNameSpecifierLoc(NNS, *Record);<br>
-  }<br>
+  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS);<br>
<br>
   /// \brief Emit a template name.<br>
-  void AddTemplateName(TemplateName Name) {<br>
-    return Writer->AddTemplateName(Name, *Record);<br>
-  }<br>
+  void AddTemplateName(TemplateName Name);<br>
<br>
   /// \brief Emit a template argument.<br>
-  void AddTemplateArgument(const TemplateArgument &Arg) {<br>
-    return Writer->AddTemplateArgument(Arg, *Record);<br>
-  }<br>
+  void AddTemplateArgument(const TemplateArgument &Arg);<br>
<br>
   /// \brief Emit a template parameter list.<br>
   void AddTemplateParameterList(const TemplateParameterList *TemplateParams) {<br>
@@ -1027,9 +962,7 @@ public:<br>
   }<br>
<br>
   /// \brief Emit a template argument list.<br>
-  void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs) {<br>
-    return Writer->AddTemplateArgumentList(TemplateArgs, *Record);<br>
-  }<br>
+  void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs);<br>
<br>
   /// \brief Emit a UnresolvedSet structure.<br>
   void AddUnresolvedSet(const ASTUnresolvedSet &Set) {<br>
@@ -1037,9 +970,7 @@ public:<br>
   }<br>
<br>
   /// \brief Emit a C++ base specifier.<br>
-  void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base) {<br>
-    return Writer->AddCXXBaseSpecifier(Base, *Record);<br>
-  }<br>
+  void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base);<br>
<br>
   /// \brief Emit the ID for a CXXCtorInitializer array and register the array<br>
   /// for later serialization.<br>
@@ -1049,14 +980,9 @@ public:<br>
<br>
   /// \brief Emit a CXXCtorInitializer array.<br>
   void AddCXXCtorInitializers(const CXXCtorInitializer *const *CtorInitializers,<br>
-                              unsigned NumCtorInitializers) {<br>
-    return Writer->AddCXXCtorInitializers(CtorInitializers, NumCtorInitializers,<br>
-                                          *Record);<br>
-  }<br>
+                              unsigned NumCtorInitializers);<br>
<br>
-  void AddCXXDefinitionData(const CXXRecordDecl *D) {<br>
-    return Writer->AddCXXDefinitionData(D, *Record);<br>
-  }<br>
+  void AddCXXDefinitionData(const CXXRecordDecl *D);<br>
<br>
   /// \brief Emit a string.<br>
   void AddString(StringRef Str) {<br>
@@ -1074,9 +1000,7 @@ public:<br>
   }<br>
<br>
   /// \brief Emit a list of attributes.<br>
-  void AddAttributes(ArrayRef<const Attr*> Attrs) {<br>
-    return Writer->AddAttributes(Attrs, *Record);<br>
-  }<br>
+  void AddAttributes(ArrayRef<const Attr*> Attrs);<br>
 };<br>
<br>
 /// \brief AST and semantic-analysis consumer that generates a<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Apr  6 01:26:08 2016<br>
@@ -82,19 +82,42 @@ static StringRef bytes(const SmallVector<br>
 // Type serialization<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-namespace {<br>
+namespace clang {<br>
   class ASTTypeWriter {<br>
     ASTWriter &Writer;<br>
     ASTRecordWriter Record;<br>
<br>
-  public:<br>
     /// \brief Type code that corresponds to the record generated.<br>
     TypeCode Code;<br>
     /// \brief Abbreviation to use for the record, if any.<br>
     unsigned AbbrevToUse;<br>
<br>
+  public:<br>
     ASTTypeWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record)<br>
-      : Writer(Writer), Record(Writer, Record), Code(TYPE_EXT_QUAL) { }<br>
+      : Writer(Writer), Record(Writer, Record), Code((TypeCode)0), AbbrevToUse(0) { }<br>
+<br>
+    uint64_t Emit() {<br>
+      return Record.Emit(Code, AbbrevToUse);<br>
+    }<br>
+<br>
+    void Visit(QualType T) {<br>
+      if (T.hasLocalNonFastQualifiers()) {<br>
+        Qualifiers Qs = T.getLocalQualifiers();<br>
+        Record.AddTypeRef(T.getLocalUnqualifiedType());<br>
+        Record.push_back(Qs.getAsOpaqueValue());<br>
+        Code = TYPE_EXT_QUAL;<br>
+        AbbrevToUse = Writer.TypeExtQualAbbrev;<br>
+      } else {<br>
+        switch (T->getTypeClass()) {<br>
+          // For all of the concrete, non-dependent types, call the<br>
+          // appropriate visitor function.<br>
+#define TYPE(Class, Base) \<br>
+        case Type::Class: Visit##Class##Type(cast<Class##Type>(T)); break;<br>
+#define ABSTRACT_TYPE(Class, Base)<br>
+#include "clang/AST/TypeNodes.def"<br>
+        }<br>
+      }<br>
+    }<br>
<br>
     void VisitArrayType(const ArrayType *T);<br>
     void VisitFunctionType(const FunctionType *T);<br>
@@ -104,7 +127,7 @@ namespace {<br>
 #define ABSTRACT_TYPE(Class, Base)<br>
 #include "clang/AST/TypeNodes.def"<br>
   };<br>
-} // end anonymous namespace<br>
+} // end namespace clang<br>
<br>
 void ASTTypeWriter::VisitBuiltinType(const BuiltinType *T) {<br>
   llvm_unreachable("Built-in types are never serialized");<br>
@@ -174,7 +197,7 @@ void ASTTypeWriter::VisitVariableArrayTy<br>
   VisitArrayType(T);<br>
   Record.AddSourceLocation(T->getLBracketLoc());<br>
   Record.AddSourceLocation(T->getRBracketLoc());<br>
-  Writer.AddStmt(T->getSizeExpr());<br>
+  Record.AddStmt(T->getSizeExpr());<br>
   Code = TYPE_VARIABLE_ARRAY;<br>
 }<br>
<br>
@@ -209,15 +232,15 @@ void ASTTypeWriter::VisitFunctionNoProto<br>
   Code = TYPE_FUNCTION_NO_PROTO;<br>
 }<br>
<br>
-static void addExceptionSpec(ASTWriter &Writer, const FunctionProtoType *T,<br>
-                             ASTRecordWriter Record) {<br>
+static void addExceptionSpec(const FunctionProtoType *T,<br>
+                             ASTRecordWriter &Record) {<br>
   Record.push_back(T->getExceptionSpecType());<br>
   if (T->getExceptionSpecType() == EST_Dynamic) {<br>
     Record.push_back(T->getNumExceptions());<br>
     for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I)<br>
       Record.AddTypeRef(T->getExceptionType(I));<br>
   } else if (T->getExceptionSpecType() == EST_ComputedNoexcept) {<br>
-    Writer.AddStmt(T->getNoexceptExpr());<br>
+    Record.AddStmt(T->getNoexceptExpr());<br>
   } else if (T->getExceptionSpecType() == EST_Uninstantiated) {<br>
     Record.AddDeclRef(T->getExceptionSpecDecl());<br>
     Record.AddDeclRef(T->getExceptionSpecTemplate());<br>
@@ -233,7 +256,7 @@ void ASTTypeWriter::VisitFunctionProtoTy<br>
   Record.push_back(T->hasTrailingReturn());<br>
   Record.push_back(T->getTypeQuals());<br>
   Record.push_back(static_cast<unsigned>(T->getRefQualifier()));<br>
-  addExceptionSpec(Writer, T, Record);<br>
+  addExceptionSpec(T, Record);<br>
<br>
   Record.push_back(T->getNumParams());<br>
   for (unsigned I = 0, N = T->getNumParams(); I != N; ++I)<br>
@@ -265,7 +288,7 @@ void ASTTypeWriter::VisitTypedefType(con<br>
 }<br>
<br>
 void ASTTypeWriter::VisitTypeOfExprType(const TypeOfExprType *T) {<br>
-  Writer.AddStmt(T->getUnderlyingExpr());<br>
+  Record.AddStmt(T->getUnderlyingExpr());<br>
   Code = TYPE_TYPEOF_EXPR;<br>
 }<br>
<br>
@@ -276,7 +299,7 @@ void ASTTypeWriter::VisitTypeOfType(cons<br>
<br>
 void ASTTypeWriter::VisitDecltypeType(const DecltypeType *T) {<br>
   Record.AddTypeRef(T->getUnderlyingType());<br>
-  Writer.AddStmt(T->getUnderlyingExpr());<br>
+  Record.AddStmt(T->getUnderlyingExpr());<br>
   Code = TYPE_DECLTYPE;<br>
 }<br>
<br>
@@ -353,7 +376,7 @@ ASTTypeWriter::VisitTemplateSpecializati<br>
 void<br>
 ASTTypeWriter::VisitDependentSizedArrayType(const DependentSizedArrayType *T) {<br>
   VisitArrayType(T);<br>
-  Writer.AddStmt(T->getSizeExpr());<br>
+  Record.AddStmt(T->getSizeExpr());<br>
   Record.AddSourceRange(T->getBracketsRange());<br>
   Code = TYPE_DEPENDENT_SIZED_ARRAY;<br>
 }<br>
@@ -461,12 +484,11 @@ ASTTypeWriter::VisitPipeType(const PipeT<br>
 namespace {<br>
<br>
 class TypeLocWriter : public TypeLocVisitor<TypeLocWriter> {<br>
-  ASTWriter &Writer;<br>
-  ASTRecordWriter Record;<br>
+  ASTRecordWriter &Record;<br>
<br>
 public:<br>
-  TypeLocWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record)<br>
-    : Writer(Writer), Record(Writer, Record) { }<br>
+  TypeLocWriter(ASTRecordWriter &Record)<br>
+    : Record(Record) { }<br>
<br>
 #define ABSTRACT_TYPELOC(CLASS, PARENT)<br>
 #define TYPELOC(CLASS, PARENT) \<br>
@@ -521,7 +543,7 @@ void TypeLocWriter::VisitArrayTypeLoc(Ar<br>
   Record.AddSourceLocation(TL.getRBracketLoc());<br>
   Record.push_back(TL.getSizeExpr() ? 1 : 0);<br>
   if (TL.getSizeExpr())<br>
-    Writer.AddStmt(TL.getSizeExpr());<br>
+    Record.AddStmt(TL.getSizeExpr());<br>
 }<br>
 void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {<br>
   VisitArrayTypeLoc(TL);<br>
@@ -605,7 +627,7 @@ void TypeLocWriter::VisitAttributedTypeL<br>
   if (TL.hasAttrExprOperand()) {<br>
     Expr *operand = TL.getAttrExprOperand();<br>
     Record.push_back(operand ? 1 : 0);<br>
-    if (operand) Writer.AddStmt(operand);<br>
+    if (operand) Record.AddStmt(operand);<br>
   } else if (TL.hasAttrEnumOperand()) {<br>
     Record.AddSourceLocation(TL.getAttrEnumOperandLoc());<br>
   }<br>
@@ -2743,43 +2765,23 @@ void ASTWriter::WriteType(QualType T) {<br>
<br>
   assert(Idx.getIndex() >= FirstTypeID && "Re-writing a type from a prior AST");<br>
<br>
-  // Record the offset for this type.<br>
-  unsigned Index = Idx.getIndex() - FirstTypeID;<br>
-  if (TypeOffsets.size() == Index)<br>
-    TypeOffsets.push_back(Stream.GetCurrentBitNo());<br>
-  else if (TypeOffsets.size() < Index) {<br>
-    TypeOffsets.resize(Index + 1);<br>
-    TypeOffsets[Index] = Stream.GetCurrentBitNo();<br>
-  }<br>
-<br>
   RecordData Record;<br>
<br>
   // Emit the type's representation.<br>
   ASTTypeWriter W(*this, Record);<br>
-  W.AbbrevToUse = 0;<br>
+  W.Visit(T);<br>
+  uint64_t Offset = W.Emit();<br>
<br>
-  if (T.hasLocalNonFastQualifiers()) {<br>
-    Qualifiers Qs = T.getLocalQualifiers();<br>
-    AddTypeRef(T.getLocalUnqualifiedType(), Record);<br>
-    Record.push_back(Qs.getAsOpaqueValue());<br>
-    W.Code = TYPE_EXT_QUAL;<br>
-    W.AbbrevToUse = TypeExtQualAbbrev;<br>
+  // Record the offset for this type.<br>
+  unsigned Index = Idx.getIndex() - FirstTypeID;<br>
+  if (TypeOffsets.size() == Index)<br>
+    TypeOffsets.push_back(Offset);<br>
+  else if (TypeOffsets.size() < Index) {<br>
+    TypeOffsets.resize(Index + 1);<br>
+    TypeOffsets[Index] = Offset;<br>
   } else {<br>
-    switch (T->getTypeClass()) {<br>
-      // For all of the concrete, non-dependent types, call the<br>
-      // appropriate visitor function.<br>
-#define TYPE(Class, Base) \<br>
-    case Type::Class: W.Visit##Class##Type(cast<Class##Type>(T)); break;<br>
-#define ABSTRACT_TYPE(Class, Base)<br>
-#include "clang/AST/TypeNodes.def"<br>
-    }<br>
+    llvm_unreachable("Types emitted in wrong order");<br>
   }<br>
-<br>
-  // Emit the serialized record.<br>
-  Stream.EmitRecord(W.Code, Record, W.AbbrevToUse);<br>
-<br>
-  // Flush any expressions that were written as part of this type.<br>
-  FlushStmts();<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
@@ -3989,12 +3991,12 @@ void ASTWriter::WriteModuleFileExtension<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 /// \brief Emit the list of attributes to the specified record.<br>
-void ASTWriter::AddAttributes(ArrayRef<const Attr *> Attrs,<br>
-                              RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddAttributes(ArrayRef<const Attr *> Attrs) {<br>
+  auto &Record = *this;<br>
   Record.push_back(Attrs.size());<br>
   for (const auto *A : Attrs) {<br>
     Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs<br>
-    AddSourceRange(A->getRange(), Record);<br>
+    Record.AddSourceRange(A->getRange());<br>
<br>
 #include "clang/Serialization/AttrPCHWrite.inc"<br>
<br>
@@ -4099,7 +4101,7 @@ ASTWriter::ASTWriter(<br>
       NextMacroID(FirstMacroID), FirstSubmoduleID(NUM_PREDEF_SUBMODULE_IDS),<br>
       NextSubmoduleID(FirstSubmoduleID),<br>
       FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID),<br>
-      CollectedStmts(&StmtsToEmit), NumStatements(0), NumMacros(0),<br>
+      NumStatements(0), NumMacros(0),<br>
       NumLexicalDeclContexts(0), NumVisibleDeclContexts(0),<br>
       NextCXXBaseSpecifiersID(1), NextCXXCtorInitializersID(1),<br>
       TypeExtQualAbbrev(0), TypeFunctionProtoAbbrev(0), DeclParmVarAbbrev(0),<br>
@@ -4683,8 +4685,8 @@ void ASTWriter::WriteDeclUpdatesBlocks(R<br>
         break;<br>
<br>
       case UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT:<br>
-        AddStmt(const_cast<Expr*>(<br>
-                  cast<ParmVarDecl>(Update.getDecl())->getDefaultArg()));<br>
+        Record.AddStmt(const_cast<Expr *>(<br>
+            cast<ParmVarDecl>(Update.getDecl())->getDefaultArg()));<br>
         break;<br>
<br>
       case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: {<br>
@@ -4738,7 +4740,6 @@ void ASTWriter::WriteDeclUpdatesBlocks(R<br>
<br>
       case UPD_CXX_RESOLVED_EXCEPTION_SPEC:<br>
         addExceptionSpec(<br>
-            *this,<br>
             cast<FunctionDecl>(D)->getType()->castAs<FunctionProtoType>(),<br>
             Record);<br>
         break;<br>
@@ -4775,7 +4776,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(R<br>
       Record.push_back(UPD_CXX_ADDED_FUNCTION_DEFINITION);<br>
       Record.push_back(Def->isInlined());<br>
       Record.AddSourceLocation(Def->getInnerLocStart());<br>
-      AddFunctionDefinition(Def, Record.getRecordData());<br>
+      Record.AddFunctionDefinition(Def);<br>
     }<br>
<br>
     OffsetsRecord.push_back(GetDeclRef(D));<br>
@@ -4897,24 +4898,23 @@ void ASTWriter::AddCXXBaseSpecifiersRef(<br>
   Record.push_back(NextCXXBaseSpecifiersID++);<br>
 }<br>
<br>
-void ASTWriter::AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind,<br>
-                                           const TemplateArgumentLocInfo &Arg,<br>
-                                           RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddTemplateArgumentLocInfo(<br>
+    TemplateArgument::ArgKind Kind, const TemplateArgumentLocInfo &Arg) {<br>
   switch (Kind) {<br>
   case TemplateArgument::Expression:<br>
     AddStmt(Arg.getAsExpr());<br>
     break;<br>
   case TemplateArgument::Type:<br>
-    AddTypeSourceInfo(Arg.getAsTypeSourceInfo(), Record);<br>
+    AddTypeSourceInfo(Arg.getAsTypeSourceInfo());<br>
     break;<br>
   case TemplateArgument::Template:<br>
-    AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc(), Record);<br>
-    AddSourceLocation(Arg.getTemplateNameLoc(), Record);<br>
+    AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc());<br>
+    AddSourceLocation(Arg.getTemplateNameLoc());<br>
     break;<br>
   case TemplateArgument::TemplateExpansion:<br>
-    AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc(), Record);<br>
-    AddSourceLocation(Arg.getTemplateNameLoc(), Record);<br>
-    AddSourceLocation(Arg.getTemplateEllipsisLoc(), Record);<br>
+    AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc());<br>
+    AddSourceLocation(Arg.getTemplateNameLoc());<br>
+    AddSourceLocation(Arg.getTemplateEllipsisLoc());<br>
     break;<br>
   case TemplateArgument::Null:<br>
   case TemplateArgument::Integral:<br>
@@ -4926,35 +4926,32 @@ void ASTWriter::AddTemplateArgumentLocIn<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg,<br>
-                                       RecordDataImpl &Record) {<br>
-  AddTemplateArgument(Arg.getArgument(), Record);<br>
+void ASTRecordWriter::AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg) {<br>
+  AddTemplateArgument(Arg.getArgument());<br>
<br>
   if (Arg.getArgument().getKind() == TemplateArgument::Expression) {<br>
     bool InfoHasSameExpr<br>
       = Arg.getArgument().getAsExpr() == Arg.getLocInfo().getAsExpr();<br>
-    Record.push_back(InfoHasSameExpr);<br>
+    Record->push_back(InfoHasSameExpr);<br>
     if (InfoHasSameExpr)<br>
       return; // Avoid storing the same expr twice.<br>
   }<br>
-  AddTemplateArgumentLocInfo(Arg.getArgument().getKind(), Arg.getLocInfo(),<br>
-                             Record);<br>
+  AddTemplateArgumentLocInfo(Arg.getArgument().getKind(), Arg.getLocInfo());<br>
 }<br>
<br>
-void ASTWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo,<br>
-                                  RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo) {<br>
   if (!TInfo) {<br>
-    AddTypeRef(QualType(), Record);<br>
+    AddTypeRef(QualType());<br>
     return;<br>
   }<br>
<br>
-  AddTypeLoc(TInfo->getTypeLoc(), Record);<br>
+  AddTypeLoc(TInfo->getTypeLoc());<br>
 }<br>
<br>
-void ASTWriter::AddTypeLoc(TypeLoc TL, RecordDataImpl &Record) {<br>
-  AddTypeRef(TL.getType(), Record);<br>
+void ASTRecordWriter::AddTypeLoc(TypeLoc TL) {<br>
+  AddTypeRef(TL.getType());<br>
<br>
-  TypeLocWriter TLW(*this, Record);<br>
+  TypeLocWriter TLW(*this);<br>
   for (; !TL.isNull(); TL = TL.getNextTypeLoc())<br>
     TLW.Visit(TL);<br>
 }<br>
@@ -5144,28 +5141,25 @@ unsigned ASTWriter::getAnonymousDeclarat<br>
   return It->second;<br>
 }<br>
<br>
-void ASTWriter::AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,<br>
-                                     DeclarationName Name, RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,<br>
+                                            DeclarationName Name) {<br>
   switch (Name.getNameKind()) {<br>
   case DeclarationName::CXXConstructorName:<br>
   case DeclarationName::CXXDestructorName:<br>
   case DeclarationName::CXXConversionFunctionName:<br>
-    AddTypeSourceInfo(DNLoc.NamedType.TInfo, Record);<br>
+    AddTypeSourceInfo(DNLoc.NamedType.TInfo);<br>
     break;<br>
<br>
   case DeclarationName::CXXOperatorName:<br>
+    AddSourceLocation(SourceLocation::getFromRawEncoding(<br>
+        DNLoc.CXXOperatorName.BeginOpNameLoc));<br>
     AddSourceLocation(<br>
-       SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.BeginOpNameLoc),<br>
-       Record);<br>
-    AddSourceLocation(<br>
-        SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.EndOpNameLoc),<br>
-        Record);<br>
+        SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.EndOpNameLoc));<br>
     break;<br>
<br>
   case DeclarationName::CXXLiteralOperatorName:<br>
-    AddSourceLocation(<br>
-     SourceLocation::getFromRawEncoding(DNLoc.CXXLiteralOperatorName.OpNameLoc),<br>
-     Record);<br>
+    AddSourceLocation(SourceLocation::getFromRawEncoding(<br>
+        DNLoc.CXXLiteralOperatorName.OpNameLoc));<br>
     break;<br>
<br>
   case DeclarationName::Identifier:<br>
@@ -5177,19 +5171,18 @@ void ASTWriter::AddDeclarationNameLoc(co<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo,<br>
-                                       RecordDataImpl &Record) {<br>
-  AddDeclarationName(NameInfo.getName(), Record);<br>
-  AddSourceLocation(NameInfo.getLoc(), Record);<br>
-  AddDeclarationNameLoc(NameInfo.getInfo(), NameInfo.getName(), Record);<br>
+void ASTRecordWriter::AddDeclarationNameInfo(<br>
+    const DeclarationNameInfo &NameInfo) {<br>
+  AddDeclarationName(NameInfo.getName());<br>
+  AddSourceLocation(NameInfo.getLoc());<br>
+  AddDeclarationNameLoc(NameInfo.getInfo(), NameInfo.getName());<br>
 }<br>
<br>
-void ASTWriter::AddQualifierInfo(const QualifierInfo &Info,<br>
-                                 RecordDataImpl &Record) {<br>
-  AddNestedNameSpecifierLoc(Info.QualifierLoc, Record);<br>
-  Record.push_back(Info.NumTemplParamLists);<br>
+void ASTRecordWriter::AddQualifierInfo(const QualifierInfo &Info) {<br>
+  AddNestedNameSpecifierLoc(Info.QualifierLoc);<br>
+  Record->push_back(Info.NumTemplParamLists);<br>
   for (unsigned i=0, e=Info.NumTemplParamLists; i != e; ++i)<br>
-    AddTemplateParameterList(Info.TemplParamLists[i], Record);<br>
+    AddTemplateParameterList(Info.TemplParamLists[i]);<br>
 }<br>
<br>
 void ASTWriter::AddNestedNameSpecifier(NestedNameSpecifier *NNS,<br>
@@ -5239,8 +5232,7 @@ void ASTWriter::AddNestedNameSpecifier(N<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,<br>
-                                          RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) {<br>
   // Nested name specifiers usually aren't too long. I think that 8 would<br>
   // typically accommodate the vast majority.<br>
   SmallVector<NestedNameSpecifierLoc , 8> NestedNames;<br>
@@ -5252,137 +5244,136 @@ void ASTWriter::AddNestedNameSpecifierLo<br>
     NNS = NNS.getPrefix();<br>
   }<br>
<br>
-  Record.push_back(NestedNames.size());<br>
+  Record->push_back(NestedNames.size());<br>
   while(!NestedNames.empty()) {<br>
     NNS = NestedNames.pop_back_val();<br>
     NestedNameSpecifier::SpecifierKind Kind<br>
       = NNS.getNestedNameSpecifier()->getKind();<br>
-    Record.push_back(Kind);<br>
+    Record->push_back(Kind);<br>
     switch (Kind) {<br>
     case NestedNameSpecifier::Identifier:<br>
-      AddIdentifierRef(NNS.getNestedNameSpecifier()->getAsIdentifier(), Record);<br>
-      AddSourceRange(NNS.getLocalSourceRange(), Record);<br>
+      AddIdentifierRef(NNS.getNestedNameSpecifier()->getAsIdentifier());<br>
+      AddSourceRange(NNS.getLocalSourceRange());<br>
       break;<br>
<br>
     case NestedNameSpecifier::Namespace:<br>
-      AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespace(), Record);<br>
-      AddSourceRange(NNS.getLocalSourceRange(), Record);<br>
+      AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespace());<br>
+      AddSourceRange(NNS.getLocalSourceRange());<br>
       break;<br>
<br>
     case NestedNameSpecifier::NamespaceAlias:<br>
-      AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespaceAlias(), Record);<br>
-      AddSourceRange(NNS.getLocalSourceRange(), Record);<br>
+      AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespaceAlias());<br>
+      AddSourceRange(NNS.getLocalSourceRange());<br>
       break;<br>
<br>
     case NestedNameSpecifier::TypeSpec:<br>
     case NestedNameSpecifier::TypeSpecWithTemplate:<br>
-      Record.push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate);<br>
-      AddTypeLoc(NNS.getTypeLoc(), Record);<br>
-      AddSourceLocation(NNS.getLocalSourceRange().getEnd(), Record);<br>
+      Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate);<br>
+      AddTypeLoc(NNS.getTypeLoc());<br>
+      AddSourceLocation(NNS.getLocalSourceRange().getEnd());<br>
       break;<br>
<br>
     case NestedNameSpecifier::Global:<br>
-      AddSourceLocation(NNS.getLocalSourceRange().getEnd(), Record);<br>
+      AddSourceLocation(NNS.getLocalSourceRange().getEnd());<br>
       break;<br>
<br>
     case NestedNameSpecifier::Super:<br>
-      AddDeclRef(NNS.getNestedNameSpecifier()->getAsRecordDecl(), Record);<br>
-      AddSourceRange(NNS.getLocalSourceRange(), Record);<br>
+      AddDeclRef(NNS.getNestedNameSpecifier()->getAsRecordDecl());<br>
+      AddSourceRange(NNS.getLocalSourceRange());<br>
       break;<br>
     }<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddTemplateName(TemplateName Name, RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddTemplateName(TemplateName Name) {<br>
   TemplateName::NameKind Kind = Name.getKind();<br>
-  Record.push_back(Kind);<br>
+  Record->push_back(Kind);<br>
   switch (Kind) {<br>
   case TemplateName::Template:<br>
-    AddDeclRef(Name.getAsTemplateDecl(), Record);<br>
+    AddDeclRef(Name.getAsTemplateDecl());<br>
     break;<br>
<br>
   case TemplateName::OverloadedTemplate: {<br>
     OverloadedTemplateStorage *OvT = Name.getAsOverloadedTemplate();<br>
-    Record.push_back(OvT->size());<br>
+    Record->push_back(OvT->size());<br>
     for (const auto &I : *OvT)<br>
-      AddDeclRef(I, Record);<br>
+      AddDeclRef(I);<br>
     break;<br>
   }<br>
<br>
   case TemplateName::QualifiedTemplate: {<br>
     QualifiedTemplateName *QualT = Name.getAsQualifiedTemplateName();<br>
-    AddNestedNameSpecifier(QualT->getQualifier(), Record);<br>
-    Record.push_back(QualT->hasTemplateKeyword());<br>
-    AddDeclRef(QualT->getTemplateDecl(), Record);<br>
+    AddNestedNameSpecifier(QualT->getQualifier());<br>
+    Record->push_back(QualT->hasTemplateKeyword());<br>
+    AddDeclRef(QualT->getTemplateDecl());<br>
     break;<br>
   }<br>
<br>
   case TemplateName::DependentTemplate: {<br>
     DependentTemplateName *DepT = Name.getAsDependentTemplateName();<br>
-    AddNestedNameSpecifier(DepT->getQualifier(), Record);<br>
-    Record.push_back(DepT->isIdentifier());<br>
+    AddNestedNameSpecifier(DepT->getQualifier());<br>
+    Record->push_back(DepT->isIdentifier());<br>
     if (DepT->isIdentifier())<br>
-      AddIdentifierRef(DepT->getIdentifier(), Record);<br>
+      AddIdentifierRef(DepT->getIdentifier());<br>
     else<br>
-      Record.push_back(DepT->getOperator());<br>
+      Record->push_back(DepT->getOperator());<br>
     break;<br>
   }<br>
<br>
   case TemplateName::SubstTemplateTemplateParm: {<br>
     SubstTemplateTemplateParmStorage *subst<br>
       = Name.getAsSubstTemplateTemplateParm();<br>
-    AddDeclRef(subst->getParameter(), Record);<br>
-    AddTemplateName(subst->getReplacement(), Record);<br>
+    AddDeclRef(subst->getParameter());<br>
+    AddTemplateName(subst->getReplacement());<br>
     break;<br>
   }<br>
<br>
   case TemplateName::SubstTemplateTemplateParmPack: {<br>
     SubstTemplateTemplateParmPackStorage *SubstPack<br>
       = Name.getAsSubstTemplateTemplateParmPack();<br>
-    AddDeclRef(SubstPack->getParameterPack(), Record);<br>
-    AddTemplateArgument(SubstPack->getArgumentPack(), Record);<br>
+    AddDeclRef(SubstPack->getParameterPack());<br>
+    AddTemplateArgument(SubstPack->getArgumentPack());<br>
     break;<br>
   }<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddTemplateArgument(const TemplateArgument &Arg,<br>
-                                    RecordDataImpl &Record) {<br>
-  Record.push_back(Arg.getKind());<br>
+void ASTRecordWriter::AddTemplateArgument(const TemplateArgument &Arg) {<br>
+  Record->push_back(Arg.getKind());<br>
   switch (Arg.getKind()) {<br>
   case TemplateArgument::Null:<br>
     break;<br>
   case TemplateArgument::Type:<br>
-    AddTypeRef(Arg.getAsType(), Record);<br>
+    AddTypeRef(Arg.getAsType());<br>
     break;<br>
   case TemplateArgument::Declaration:<br>
-    AddDeclRef(Arg.getAsDecl(), Record);<br>
-    AddTypeRef(Arg.getParamTypeForDecl(), Record);<br>
+    AddDeclRef(Arg.getAsDecl());<br>
+    AddTypeRef(Arg.getParamTypeForDecl());<br>
     break;<br>
   case TemplateArgument::NullPtr:<br>
-    AddTypeRef(Arg.getNullPtrType(), Record);<br>
+    AddTypeRef(Arg.getNullPtrType());<br>
     break;<br>
   case TemplateArgument::Integral:<br>
-    AddAPSInt(Arg.getAsIntegral(), Record);<br>
-    AddTypeRef(Arg.getIntegralType(), Record);<br>
+    AddAPSInt(Arg.getAsIntegral());<br>
+    AddTypeRef(Arg.getIntegralType());<br>
     break;<br>
   case TemplateArgument::Template:<br>
-    AddTemplateName(Arg.getAsTemplateOrTemplatePattern(), Record);<br>
+    AddTemplateName(Arg.getAsTemplateOrTemplatePattern());<br>
     break;<br>
   case TemplateArgument::TemplateExpansion:<br>
-    AddTemplateName(Arg.getAsTemplateOrTemplatePattern(), Record);<br>
+    AddTemplateName(Arg.getAsTemplateOrTemplatePattern());<br>
     if (Optional<unsigned> NumExpansions = Arg.getNumTemplateExpansions())<br>
-      Record.push_back(*NumExpansions + 1);<br>
+      Record->push_back(*NumExpansions + 1);<br>
     else<br>
-      Record.push_back(0);<br>
+      Record->push_back(0);<br>
     break;<br>
   case TemplateArgument::Expression:<br>
     AddStmt(Arg.getAsExpr());<br>
     break;<br>
   case TemplateArgument::Pack:<br>
-    Record.push_back(Arg.pack_size());<br>
+    Record->push_back(Arg.pack_size());<br>
     for (const auto &P : Arg.pack_elements())<br>
-      AddTemplateArgument(P, Record);<br>
+      AddTemplateArgument(P);<br>
     break;<br>
   }<br>
 }<br>
@@ -5400,25 +5391,23 @@ ASTWriter::AddTemplateParameterList(cons<br>
 }<br>
<br>
 /// \brief Emit a template argument list.<br>
-void<br>
-ASTWriter::AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs,<br>
-                                   RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddTemplateArgumentList(<br>
+    const TemplateArgumentList *TemplateArgs) {<br>
   assert(TemplateArgs && "No TemplateArgs!");<br>
-  Record.push_back(TemplateArgs->size());<br>
+  Record->push_back(TemplateArgs->size());<br>
   for (int i=0, e = TemplateArgs->size(); i != e; ++i)<br>
-    AddTemplateArgument(TemplateArgs->get(i), Record);<br>
+    AddTemplateArgument(TemplateArgs->get(i));<br>
 }<br>
<br>
-void<br>
-ASTWriter::AddASTTemplateArgumentListInfo<br>
-(const ASTTemplateArgumentListInfo *ASTTemplArgList, RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddASTTemplateArgumentListInfo(<br>
+    const ASTTemplateArgumentListInfo *ASTTemplArgList) {<br>
   assert(ASTTemplArgList && "No ASTTemplArgList!");<br>
-  AddSourceLocation(ASTTemplArgList->LAngleLoc, Record);<br>
-  AddSourceLocation(ASTTemplArgList->RAngleLoc, Record);<br>
-  Record.push_back(ASTTemplArgList->NumTemplateArgs);<br>
+  AddSourceLocation(ASTTemplArgList->LAngleLoc);<br>
+  AddSourceLocation(ASTTemplArgList->RAngleLoc);<br>
+  Record->push_back(ASTTemplArgList->NumTemplateArgs);<br>
   const TemplateArgumentLoc *TemplArgs = ASTTemplArgList->getTemplateArgs();<br>
   for (int i=0, e = ASTTemplArgList->NumTemplateArgs; i != e; ++i)<br>
-    AddTemplateArgumentLoc(TemplArgs[i], Record);<br>
+    AddTemplateArgumentLoc(TemplArgs[i]);<br>
 }<br>
<br>
 void<br>
@@ -5431,17 +5420,16 @@ ASTWriter::AddUnresolvedSet(const ASTUnr<br>
   }<br>
 }<br>
<br>
-void ASTWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base,<br>
-                                    RecordDataImpl &Record) {<br>
-  Record.push_back(Base.isVirtual());<br>
-  Record.push_back(Base.isBaseOfClass());<br>
-  Record.push_back(Base.getAccessSpecifierAsWritten());<br>
-  Record.push_back(Base.getInheritConstructors());<br>
-  AddTypeSourceInfo(Base.getTypeSourceInfo(), Record);<br>
-  AddSourceRange(Base.getSourceRange(), Record);<br>
+// FIXME: Move this out of the main ASTRecordWriter interface.<br>
+void ASTRecordWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base) {<br>
+  Record->push_back(Base.isVirtual());<br>
+  Record->push_back(Base.isBaseOfClass());<br>
+  Record->push_back(Base.getAccessSpecifierAsWritten());<br>
+  Record->push_back(Base.getInheritConstructors());<br>
+  AddTypeSourceInfo(Base.getTypeSourceInfo());<br>
+  AddSourceRange(Base.getSourceRange());<br>
   AddSourceLocation(Base.isPackExpansion()? Base.getEllipsisLoc()<br>
-                                          : SourceLocation(),<br>
-                    Record);<br>
+                                          : SourceLocation());<br>
 }<br>
<br>
 void ASTWriter::FlushCXXBaseSpecifiers() {<br>
@@ -5449,26 +5437,30 @@ void ASTWriter::FlushCXXBaseSpecifiers()<br>
   unsigned N = CXXBaseSpecifiersToWrite.size();<br>
   for (unsigned I = 0; I != N; ++I) {<br>
     Record.clear();<br>
+<br>
+    const CXXBaseSpecifier *B = CXXBaseSpecifiersToWrite[I].Bases,<br>
+                        *BEnd = CXXBaseSpecifiersToWrite[I].BasesEnd;<br>
+<br>
+    // Write the base specifier set.<br>
+    ASTRecordWriter Writer(*this, Record);<br>
+    Writer.push_back(BEnd - B);<br>
+    for (; B != BEnd; ++B)<br>
+      Writer.AddCXXBaseSpecifier(*B);<br>
+    uint64_t Offset = Writer.Emit(serialization::DECL_CXX_BASE_SPECIFIERS);<br>
<br>
     // Record the offset of this base-specifier set.<br>
+    //<br>
+    // FIXME: We don't need an indirect lookup table for these; instead, write<br>
+    // the base specifier record prior to the decl record and store its offset<br>
+    // from the decl record rather than its ID.<br>
     unsigned Index = CXXBaseSpecifiersToWrite[I].ID - 1;<br>
     if (Index == CXXBaseSpecifiersOffsets.size())<br>
-      CXXBaseSpecifiersOffsets.push_back(Stream.GetCurrentBitNo());<br>
+      CXXBaseSpecifiersOffsets.push_back(Offset);<br>
     else {<br>
       if (Index > CXXBaseSpecifiersOffsets.size())<br>
         CXXBaseSpecifiersOffsets.resize(Index + 1);<br>
-      CXXBaseSpecifiersOffsets[Index] = Stream.GetCurrentBitNo();<br>
+      CXXBaseSpecifiersOffsets[Index] = Offset;<br>
     }<br>
-<br>
-    const CXXBaseSpecifier *B = CXXBaseSpecifiersToWrite[I].Bases,<br>
-                        *BEnd = CXXBaseSpecifiersToWrite[I].BasesEnd;<br>
-    Record.push_back(BEnd - B);<br>
-    for (; B != BEnd; ++B)<br>
-      AddCXXBaseSpecifier(*B, Record);<br>
-    Stream.EmitRecord(serialization::DECL_CXX_BASE_SPECIFIERS, Record);<br>
-<br>
-    // Flush any expressions that were written as part of the base specifiers.<br>
-    FlushStmts();<br>
   }<br>
<br>
   assert(N == CXXBaseSpecifiersToWrite.size() &&<br>
@@ -5476,40 +5468,40 @@ void ASTWriter::FlushCXXBaseSpecifiers()<br>
   CXXBaseSpecifiersToWrite.clear();<br>
 }<br>
<br>
-void ASTWriter::AddCXXCtorInitializers(<br>
-                             const CXXCtorInitializer * const *CtorInitializers,<br>
-                             unsigned NumCtorInitializers,<br>
-                             RecordDataImpl &Record) {<br>
-  Record.push_back(NumCtorInitializers);<br>
+// FIXME: Move this out of the main ASTRecordWriter interface.<br>
+void ASTRecordWriter::AddCXXCtorInitializers(<br>
+    const CXXCtorInitializer *const *CtorInitializers,<br>
+    unsigned NumCtorInitializers) {<br>
+  Record->push_back(NumCtorInitializers);<br>
   for (unsigned i=0; i != NumCtorInitializers; ++i) {<br>
     const CXXCtorInitializer *Init = CtorInitializers[i];<br>
<br>
     if (Init->isBaseInitializer()) {<br>
-      Record.push_back(CTOR_INITIALIZER_BASE);<br>
-      AddTypeSourceInfo(Init->getTypeSourceInfo(), Record);<br>
-      Record.push_back(Init->isBaseVirtual());<br>
+      Record->push_back(CTOR_INITIALIZER_BASE);<br>
+      AddTypeSourceInfo(Init->getTypeSourceInfo());<br>
+      Record->push_back(Init->isBaseVirtual());<br>
     } else if (Init->isDelegatingInitializer()) {<br>
-      Record.push_back(CTOR_INITIALIZER_DELEGATING);<br>
-      AddTypeSourceInfo(Init->getTypeSourceInfo(), Record);<br>
+      Record->push_back(CTOR_INITIALIZER_DELEGATING);<br>
+      AddTypeSourceInfo(Init->getTypeSourceInfo());<br>
     } else if (Init->isMemberInitializer()){<br>
-      Record.push_back(CTOR_INITIALIZER_MEMBER);<br>
-      AddDeclRef(Init->getMember(), Record);<br>
+      Record->push_back(CTOR_INITIALIZER_MEMBER);<br>
+      AddDeclRef(Init->getMember());<br>
     } else {<br>
-      Record.push_back(CTOR_INITIALIZER_INDIRECT_MEMBER);<br>
-      AddDeclRef(Init->getIndirectMember(), Record);<br>
+      Record->push_back(CTOR_INITIALIZER_INDIRECT_MEMBER);<br>
+      AddDeclRef(Init->getIndirectMember());<br>
     }<br>
<br>
-    AddSourceLocation(Init->getMemberLocation(), Record);<br>
+    AddSourceLocation(Init->getMemberLocation());<br>
     AddStmt(Init->getInit());<br>
-    AddSourceLocation(Init->getLParenLoc(), Record);<br>
-    AddSourceLocation(Init->getRParenLoc(), Record);<br>
-    Record.push_back(Init->isWritten());<br>
+    AddSourceLocation(Init->getLParenLoc());<br>
+    AddSourceLocation(Init->getRParenLoc());<br>
+    Record->push_back(Init->isWritten());<br>
     if (Init->isWritten()) {<br>
-      Record.push_back(Init->getSourceOrder());<br>
+      Record->push_back(Init->getSourceOrder());<br>
     } else {<br>
-      Record.push_back(Init->getNumArrayIndices());<br>
+      Record->push_back(Init->getNumArrayIndices());<br>
       for (unsigned i=0, e=Init->getNumArrayIndices(); i != e; ++i)<br>
-        AddDeclRef(Init->getArrayIndex(i), Record);<br>
+        AddDeclRef(Init->getArrayIndex(i));<br>
     }<br>
   }<br>
 }<br>
@@ -5522,21 +5514,19 @@ void ASTWriter::FlushCXXCtorInitializers<br>
   for (auto &Init : CXXCtorInitializersToWrite) {<br>
     Record.clear();<br>
<br>
+    ASTRecordWriter Writer(*this, Record);<br>
+    Writer.AddCXXCtorInitializers(Init.Inits.data(), Init.Inits.size());<br>
+    uint64_t Offset = Writer.Emit(serialization::DECL_CXX_CTOR_INITIALIZERS);<br>
+<br>
     // Record the offset of this mem-initializer list.<br>
     unsigned Index = Init.ID - 1;<br>
     if (Index == CXXCtorInitializersOffsets.size())<br>
-      CXXCtorInitializersOffsets.push_back(Stream.GetCurrentBitNo());<br>
+      CXXCtorInitializersOffsets.push_back(Offset);<br>
     else {<br>
       if (Index > CXXCtorInitializersOffsets.size())<br>
         CXXCtorInitializersOffsets.resize(Index + 1);<br>
-      CXXCtorInitializersOffsets[Index] = Stream.GetCurrentBitNo();<br>
+      CXXCtorInitializersOffsets[Index] = Offset;<br>
     }<br>
-<br>
-    AddCXXCtorInitializers(Init.Inits.data(), Init.Inits.size(), Record);<br>
-    Stream.EmitRecord(serialization::DECL_CXX_CTOR_INITIALIZERS, Record);<br>
-<br>
-    // Flush any expressions that were written as part of the initializers.<br>
-    FlushStmts();<br>
   }<br>
<br>
   assert(N == CXXCtorInitializersToWrite.size() &&<br>
@@ -5544,82 +5534,81 @@ void ASTWriter::FlushCXXCtorInitializers<br>
   CXXCtorInitializersToWrite.clear();<br>
 }<br>
<br>
-void ASTWriter::AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Record) {<br>
+void ASTRecordWriter::AddCXXDefinitionData(const CXXRecordDecl *D) {<br>
   auto &Data = D->data();<br>
-  Record.push_back(Data.IsLambda);<br>
-  Record.push_back(Data.UserDeclaredConstructor);<br>
-  Record.push_back(Data.UserDeclaredSpecialMembers);<br>
-  Record.push_back(Data.Aggregate);<br>
-  Record.push_back(Data.PlainOldData);<br>
-  Record.push_back(Data.Empty);<br>
-  Record.push_back(Data.Polymorphic);<br>
-  Record.push_back(Data.Abstract);<br>
-  Record.push_back(Data.IsStandardLayout);<br>
-  Record.push_back(Data.HasNoNonEmptyBases);<br>
-  Record.push_back(Data.HasPrivateFields);<br>
-  Record.push_back(Data.HasProtectedFields);<br>
-  Record.push_back(Data.HasPublicFields);<br>
-  Record.push_back(Data.HasMutableFields);<br>
-  Record.push_back(Data.HasVariantMembers);<br>
-  Record.push_back(Data.HasOnlyCMembers);<br>
-  Record.push_back(Data.HasInClassInitializer);<br>
-  Record.push_back(Data.HasUninitializedReferenceMember);<br>
-  Record.push_back(Data.HasUninitializedFields);<br>
-  Record.push_back(Data.NeedOverloadResolutionForMoveConstructor);<br>
-  Record.push_back(Data.NeedOverloadResolutionForMoveAssignment);<br>
-  Record.push_back(Data.NeedOverloadResolutionForDestructor);<br>
-  Record.push_back(Data.DefaultedMoveConstructorIsDeleted);<br>
-  Record.push_back(Data.DefaultedMoveAssignmentIsDeleted);<br>
-  Record.push_back(Data.DefaultedDestructorIsDeleted);<br>
-  Record.push_back(Data.HasTrivialSpecialMembers);<br>
-  Record.push_back(Data.DeclaredNonTrivialSpecialMembers);<br>
-  Record.push_back(Data.HasIrrelevantDestructor);<br>
-  Record.push_back(Data.HasConstexprNonCopyMoveConstructor);<br>
-  Record.push_back(Data.HasDefaultedDefaultConstructor);<br>
-  Record.push_back(Data.DefaultedDefaultConstructorIsConstexpr);<br>
-  Record.push_back(Data.HasConstexprDefaultConstructor);<br>
-  Record.push_back(Data.HasNonLiteralTypeFieldsOrBases);<br>
-  Record.push_back(Data.ComputedVisibleConversions);<br>
-  Record.push_back(Data.UserProvidedDefaultConstructor);<br>
-  Record.push_back(Data.DeclaredSpecialMembers);<br>
-  Record.push_back(Data.ImplicitCopyConstructorHasConstParam);<br>
-  Record.push_back(Data.ImplicitCopyAssignmentHasConstParam);<br>
-  Record.push_back(Data.HasDeclaredCopyConstructorWithConstParam);<br>
-  Record.push_back(Data.HasDeclaredCopyAssignmentWithConstParam);<br>
+  Record->push_back(Data.IsLambda);<br>
+  Record->push_back(Data.UserDeclaredConstructor);<br>
+  Record->push_back(Data.UserDeclaredSpecialMembers);<br>
+  Record->push_back(Data.Aggregate);<br>
+  Record->push_back(Data.PlainOldData);<br>
+  Record->push_back(Data.Empty);<br>
+  Record->push_back(Data.Polymorphic);<br>
+  Record->push_back(Data.Abstract);<br>
+  Record->push_back(Data.IsStandardLayout);<br>
+  Record->push_back(Data.HasNoNonEmptyBases);<br>
+  Record->push_back(Data.HasPrivateFields);<br>
+  Record->push_back(Data.HasProtectedFields);<br>
+  Record->push_back(Data.HasPublicFields);<br>
+  Record->push_back(Data.HasMutableFields);<br>
+  Record->push_back(Data.HasVariantMembers);<br>
+  Record->push_back(Data.HasOnlyCMembers);<br>
+  Record->push_back(Data.HasInClassInitializer);<br>
+  Record->push_back(Data.HasUninitializedReferenceMember);<br>
+  Record->push_back(Data.HasUninitializedFields);<br>
+  Record->push_back(Data.NeedOverloadResolutionForMoveConstructor);<br>
+  Record->push_back(Data.NeedOverloadResolutionForMoveAssignment);<br>
+  Record->push_back(Data.NeedOverloadResolutionForDestructor);<br>
+  Record->push_back(Data.DefaultedMoveConstructorIsDeleted);<br>
+  Record->push_back(Data.DefaultedMoveAssignmentIsDeleted);<br>
+  Record->push_back(Data.DefaultedDestructorIsDeleted);<br>
+  Record->push_back(Data.HasTrivialSpecialMembers);<br>
+  Record->push_back(Data.DeclaredNonTrivialSpecialMembers);<br>
+  Record->push_back(Data.HasIrrelevantDestructor);<br>
+  Record->push_back(Data.HasConstexprNonCopyMoveConstructor);<br>
+  Record->push_back(Data.HasDefaultedDefaultConstructor);<br>
+  Record->push_back(Data.DefaultedDefaultConstructorIsConstexpr);<br>
+  Record->push_back(Data.HasConstexprDefaultConstructor);<br>
+  Record->push_back(Data.HasNonLiteralTypeFieldsOrBases);<br>
+  Record->push_back(Data.ComputedVisibleConversions);<br>
+  Record->push_back(Data.UserProvidedDefaultConstructor);<br>
+  Record->push_back(Data.DeclaredSpecialMembers);<br>
+  Record->push_back(Data.ImplicitCopyConstructorHasConstParam);<br>
+  Record->push_back(Data.ImplicitCopyAssignmentHasConstParam);<br>
+  Record->push_back(Data.HasDeclaredCopyConstructorWithConstParam);<br>
+  Record->push_back(Data.HasDeclaredCopyAssignmentWithConstParam);<br>
   // IsLambda bit is already saved.<br>
<br>
-  Record.push_back(Data.NumBases);<br>
+  Record->push_back(Data.NumBases);<br>
   if (Data.NumBases > 0)<br>
-    AddCXXBaseSpecifiersRef(Data.getBases(), Data.getBases() + Data.NumBases,<br>
-                            Record);<br>
+    AddCXXBaseSpecifiersRef(Data.getBases(), Data.getBases() + Data.NumBases);<br>
<br>
   // FIXME: Make VBases lazily computed when needed to avoid storing them.<br>
-  Record.push_back(Data.NumVBases);<br>
+  Record->push_back(Data.NumVBases);<br>
   if (Data.NumVBases > 0)<br>
-    AddCXXBaseSpecifiersRef(Data.getVBases(), Data.getVBases() + Data.NumVBases,<br>
-                            Record);<br>
+    AddCXXBaseSpecifiersRef(Data.getVBases(),<br>
+                            Data.getVBases() + Data.NumVBases);<br>
<br>
-  AddUnresolvedSet(Data.Conversions.get(*Context), Record);<br>
-  AddUnresolvedSet(Data.VisibleConversions.get(*Context), Record);<br>
+  AddUnresolvedSet(Data.Conversions.get(*Writer->Context));<br>
+  AddUnresolvedSet(Data.VisibleConversions.get(*Writer->Context));<br>
   // Data.Definition is the owning decl, no need to write it.<br>
-  AddDeclRef(D->getFirstFriend(), Record);<br>
+  AddDeclRef(D->getFirstFriend());<br>
<br>
   // Add lambda-specific data.<br>
   if (Data.IsLambda) {<br>
     auto &Lambda = D->getLambdaData();<br>
-    Record.push_back(Lambda.Dependent);<br>
-    Record.push_back(Lambda.IsGenericLambda);<br>
-    Record.push_back(Lambda.CaptureDefault);<br>
-    Record.push_back(Lambda.NumCaptures);<br>
-    Record.push_back(Lambda.NumExplicitCaptures);<br>
-    Record.push_back(Lambda.ManglingNumber);<br>
-    AddDeclRef(Lambda.ContextDecl, Record);<br>
-    AddTypeSourceInfo(Lambda.MethodTyInfo, Record);<br>
+    Record->push_back(Lambda.Dependent);<br>
+    Record->push_back(Lambda.IsGenericLambda);<br>
+    Record->push_back(Lambda.CaptureDefault);<br>
+    Record->push_back(Lambda.NumCaptures);<br>
+    Record->push_back(Lambda.NumExplicitCaptures);<br>
+    Record->push_back(Lambda.ManglingNumber);<br>
+    AddDeclRef(Lambda.ContextDecl);<br>
+    AddTypeSourceInfo(Lambda.MethodTyInfo);<br>
     for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {<br>
       const LambdaCapture &Capture = Lambda.Captures[I];<br>
-      AddSourceLocation(Capture.getLocation(), Record);<br>
-      Record.push_back(Capture.isImplicit());<br>
-      Record.push_back(Capture.getCaptureKind());<br>
+      AddSourceLocation(Capture.getLocation());<br>
+      Record->push_back(Capture.isImplicit());<br>
+      Record->push_back(Capture.getCaptureKind());<br>
       switch (Capture.getCaptureKind()) {<br>
       case LCK_StarThis:<br>
       case LCK_This:<br>
@@ -5629,10 +5618,9 @@ void ASTWriter::AddCXXDefinitionData(con<br>
       case LCK_ByRef:<br>
         VarDecl *Var =<br>
             Capture.capturesVariable() ? Capture.getCapturedVar() : nullptr;<br>
-        AddDeclRef(Var, Record);<br>
+        AddDeclRef(Var);<br>
         AddSourceLocation(Capture.isPackExpansion() ? Capture.getEllipsisLoc()<br>
-                                                    : SourceLocation(),<br>
-                          Record);<br>
+                                                    : SourceLocation());<br>
         break;<br>
       }<br>
     }<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Wed Apr  6 01:26:08 2016<br>
@@ -171,17 +171,6 @@ namespace clang {<br>
       Record.AddSourceLocation(typeParams->getRAngleLoc());<br>
     }<br>
<br>
-    void AddFunctionDefinition(const FunctionDecl *FD) {<br>
-      assert(FD->doesThisDeclarationHaveABody());<br>
-      if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {<br>
-        Record.push_back(CD->NumCtorInitializers);<br>
-        if (CD->NumCtorInitializers)<br>
-          Record.AddCXXCtorInitializersRef(<br>
-              llvm::makeArrayRef(CD->init_begin(), CD->init_end()));<br>
-      }<br>
-      Writer.AddStmt(FD->getBody());<br>
-    }<br>
-<br>
     /// Add to the record the first declaration from each module file that<br>
     /// provides a declaration of D. The intent is to provide a sufficient<br>
     /// set such that reloading this set will load all current redeclarations.<br>
@@ -293,7 +282,7 @@ void ASTDeclWriter::Visit(Decl *D) {<br>
   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {<br>
     Record.push_back(FD->doesThisDeclarationHaveABody());<br>
     if (FD->doesThisDeclarationHaveABody())<br>
-      AddFunctionDefinition(FD);<br>
+      Record.AddFunctionDefinition(FD);<br>
   }<br>
 }<br>
<br>
@@ -508,7 +497,7 @@ void ASTDeclWriter::VisitEnumConstantDec<br>
   VisitValueDecl(D);<br>
   Record.push_back(D->getInitExpr()? 1 : 0);<br>
   if (D->getInitExpr())<br>
-    Writer.AddStmt(D->getInitExpr());<br>
+    Record.AddStmt(D->getInitExpr());<br>
   Record.AddAPSInt(D->getInitVal());<br>
<br>
   Code = serialization::DECL_ENUM_CONSTANT;<br>
@@ -629,7 +618,7 @@ void ASTDeclWriter::VisitObjCMethodDecl(<br>
                       D->getSelfDecl() != nullptr || D->getCmdDecl() != nullptr;<br>
   Record.push_back(HasBodyStuff);<br>
   if (HasBodyStuff) {<br>
-    Writer.AddStmt(D->getBody());<br>
+    Record.AddStmt(D->getBody());<br>
     Record.AddDeclRef(D->getSelfDecl());<br>
     Record.AddDeclRef(D->getCmdDecl());<br>
   }<br>
@@ -846,8 +835,8 @@ void ASTDeclWriter::VisitObjCPropertyImp<br>
   Record.AddDeclRef(D->getPropertyDecl());<br>
   Record.AddDeclRef(D->getPropertyIvarDecl());<br>
   Record.AddSourceLocation(D->getPropertyIvarDeclLoc());<br>
-  Writer.AddStmt(D->getGetterCXXConstructor());<br>
-  Writer.AddStmt(D->getSetterCXXAssignment());<br>
+  Record.AddStmt(D->getGetterCXXConstructor());<br>
+  Record.AddStmt(D->getSetterCXXAssignment());<br>
   Code = serialization::DECL_OBJC_PROPERTY_IMPL;<br>
 }<br>
<br>
@@ -863,7 +852,7 @@ void ASTDeclWriter::VisitFieldDecl(Field<br>
         QualType(static_cast<Type *>(D->InitStorage.getPointer()), 0));<br>
   } else {<br>
     Record.push_back(D->InitStorage.getInt() + 1);<br>
-    Writer.AddStmt(static_cast<Expr *>(D->InitStorage.getPointer()));<br>
+    Record.AddStmt(static_cast<Expr *>(D->InitStorage.getPointer()));<br>
   }<br>
   if (!D->getDeclName())<br>
     Record.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D));<br>
@@ -922,7 +911,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl<br>
<br>
   if (D->getInit()) {<br>
     Record.push_back(!D->isInitKnownICE() ? 1 : (D->isInitICE() ? 3 : 2));<br>
-    Writer.AddStmt(D->getInit());<br>
+    Record.AddStmt(D->getInit());<br>
   } else {<br>
     Record.push_back(0);<br>
   }<br>
@@ -984,7 +973,7 @@ void ASTDeclWriter::VisitParmVarDecl(Par<br>
   Record.push_back(D->hasInheritedDefaultArg());<br>
   Record.push_back(D->hasUninstantiatedDefaultArg());<br>
   if (D->hasUninstantiatedDefaultArg())<br>
-    Writer.AddStmt(D->getUninstantiatedDefaultArg());<br>
+    Record.AddStmt(D->getUninstantiatedDefaultArg());<br>
   Code = serialization::DECL_PARM_VAR;<br>
<br>
   assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl<br>
@@ -1023,7 +1012,7 @@ void ASTDeclWriter::VisitParmVarDecl(Par<br>
<br>
 void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {<br>
   VisitDecl(D);<br>
-  Writer.AddStmt(D->getAsmString());<br>
+  Record.AddStmt(D->getAsmString());<br>
   Record.AddSourceLocation(D->getRParenLoc());<br>
   Code = serialization::DECL_FILE_SCOPE_ASM;<br>
 }<br>
@@ -1035,7 +1024,7 @@ void ASTDeclWriter::VisitEmptyDecl(Empty<br>
<br>
 void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) {<br>
   VisitDecl(D);<br>
-  Writer.AddStmt(D->getBody());<br>
+  Record.AddStmt(D->getBody());<br>
   Record.AddTypeSourceInfo(D->getSignatureAsWritten());<br>
   Record.push_back(D->param_size());<br>
   for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();<br>
@@ -1055,7 +1044,7 @@ void ASTDeclWriter::VisitBlockDecl(Block<br>
     if (capture.hasCopyExpr()) flags |= 4;<br>
     Record.push_back(flags);<br>
<br>
-    if (capture.hasCopyExpr()) Writer.AddStmt(capture.getCopyExpr());<br>
+    if (capture.hasCopyExpr()) Record.AddStmt(capture.getCopyExpr());<br>
   }<br>
<br>
   Code = serialization::DECL_BLOCK;<br>
@@ -1505,7 +1494,7 @@ void ASTDeclWriter::VisitNonTypeTemplate<br>
                           !D->defaultArgumentWasInherited();<br>
     Record.push_back(OwnsDefaultArg);<br>
     if (OwnsDefaultArg)<br>
-      Writer.AddStmt(D->getDefaultArgument());<br>
+      Record.AddStmt(D->getDefaultArgument());<br>
     Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM;<br>
   }<br>
 }<br>
@@ -1546,9 +1535,9 @@ void ASTDeclWriter::VisitTypeAliasTempla<br>
<br>
 void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) {<br>
   VisitDecl(D);<br>
-  Writer.AddStmt(D->getAssertExpr());<br>
+  Record.AddStmt(D->getAssertExpr());<br>
   Record.push_back(D->isFailed());<br>
-  Writer.AddStmt(D->getMessage());<br>
+  Record.AddStmt(D->getMessage());<br>
   Record.AddSourceLocation(D->getRParenLoc());<br>
   Code = serialization::DECL_STATIC_ASSERT;<br>
 }<br>
@@ -1661,15 +1650,15 @@ void ASTDeclWriter::VisitOMPThreadPrivat<br>
   Record.push_back(D->varlist_size());<br>
   VisitDecl(D);<br>
   for (auto *I : D->varlists())<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   Code = serialization::DECL_OMP_THREADPRIVATE;<br>
 }<br>
<br>
 void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) {<br>
   VisitValueDecl(D);<br>
   Record.AddSourceLocation(D->getLocStart());<br>
-  Writer.AddStmt(D->getCombiner());<br>
-  Writer.AddStmt(D->getInitializer());<br>
+  Record.AddStmt(D->getCombiner());<br>
+  Record.AddStmt(D->getInitializer());<br>
   Record.AddDeclRef(D->getPrevDeclInScope());<br>
   Code = serialization::DECL_OMP_DECLARE_REDUCTION;<br>
 }<br>
@@ -2147,9 +2136,6 @@ static bool isRequiredDecl(const Decl *D<br>
 }<br>
<br>
 void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) {<br>
-  // Switch case IDs are per Decl.<br>
-  ClearSwitchCaseIDs();<br>
-<br>
   // Determine the ID for this declaration.<br>
   serialization::DeclID ID;<br>
   assert(!D->isFromASTFile() && "should not be emitting imported decl");<br>
@@ -2208,10 +2194,16 @@ void ASTWriter::WriteDecl(ASTContext &Co<br>
     EagerlyDeserializedDecls.push_back(ID);<br>
 }<br>
<br>
-void ASTWriter::AddFunctionDefinition(const FunctionDecl *FD,<br>
-                                      RecordDataImpl &Record) {<br>
-  ClearSwitchCaseIDs();<br>
-<br>
-  ASTDeclWriter W(*this, FD->getASTContext(), Record);<br>
-  W.AddFunctionDefinition(FD);<br>
+void ASTRecordWriter::AddFunctionDefinition(const FunctionDecl *FD) {<br>
+  // Switch case IDs are per function body.<br>
+  Writer->ClearSwitchCaseIDs();<br>
+<br>
+  assert(FD->doesThisDeclarationHaveABody());<br>
+  if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {<br>
+    Record->push_back(CD->getNumCtorInitializers());<br>
+    if (CD->getNumCtorInitializers())<br>
+      AddCXXCtorInitializersRef(<br>
+          llvm::makeArrayRef(CD->init_begin(), CD->init_end()));<br>
+  }<br>
+  AddStmt(FD->getBody());<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Wed Apr  6 01:26:08 2016<br>
@@ -31,14 +31,23 @@ namespace clang {<br>
   class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {<br>
     friend class OMPClauseWriter;<br>
     ASTWriter &Writer;<br>
-    ASTWriter::RecordData &Record;<br>
+    ASTRecordWriter Record;<br>
<br>
-  public:<br>
     serialization::StmtCode Code;<br>
     unsigned AbbrevToUse;<br>
<br>
+  public:<br>
     ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)<br>
-      : Writer(Writer), Record(Record) { }<br>
+        : Writer(Writer), Record(Writer, Record),<br>
+          Code(serialization::STMT_NULL_PTR), AbbrevToUse(0) {}<br>
+<br>
+    ASTStmtWriter(const ASTStmtWriter&) = delete;<br>
+<br>
+    uint64_t Emit(Stmt *S) {<br>
+      assert(Code != serialization::STMT_NULL_PTR &&<br>
+             "unhandled sub-statement writing AST file");<br>
+      return Record.EmitStmt(Code, AbbrevToUse);<br>
+    }<br>
<br>
     void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &ArgInfo,<br>
                                   const TemplateArgumentLoc *Args);<br>
@@ -52,11 +61,11 @@ namespace clang {<br>
<br>
 void ASTStmtWriter::AddTemplateKWAndArgsInfo(<br>
     const ASTTemplateKWAndArgsInfo &ArgInfo, const TemplateArgumentLoc *Args) {<br>
-  Writer.AddSourceLocation(ArgInfo.TemplateKWLoc, Record);<br>
-  Writer.AddSourceLocation(ArgInfo.LAngleLoc, Record);<br>
-  Writer.AddSourceLocation(ArgInfo.RAngleLoc, Record);<br>
+  Record.AddSourceLocation(ArgInfo.TemplateKWLoc);<br>
+  Record.AddSourceLocation(ArgInfo.LAngleLoc);<br>
+  Record.AddSourceLocation(ArgInfo.RAngleLoc);<br>
   for (unsigned i = 0; i != ArgInfo.NumTemplateArgs; ++i)<br>
-    Writer.AddTemplateArgumentLoc(Args[i], Record);<br>
+    Record.AddTemplateArgumentLoc(Args[i]);<br>
 }<br>
<br>
 void ASTStmtWriter::VisitStmt(Stmt *S) {<br>
@@ -64,7 +73,7 @@ void ASTStmtWriter::VisitStmt(Stmt *S) {<br>
<br>
 void ASTStmtWriter::VisitNullStmt(NullStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getSemiLoc(), Record);<br>
+  Record.AddSourceLocation(S->getSemiLoc());<br>
   Record.push_back(S->HasLeadingEmptyMacro);<br>
   Code = serialization::STMT_NULL;<br>
 }<br>
@@ -73,68 +82,68 @@ void ASTStmtWriter::VisitCompoundStmt(Co<br>
   VisitStmt(S);<br>
   Record.push_back(S->size());<br>
   for (auto *CS : S->body())<br>
-    Writer.AddStmt(CS);<br>
-  Writer.AddSourceLocation(S->getLBracLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRBracLoc(), Record);<br>
+    Record.AddStmt(CS);<br>
+  Record.AddSourceLocation(S->getLBracLoc());<br>
+  Record.AddSourceLocation(S->getRBracLoc());<br>
   Code = serialization::STMT_COMPOUND;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {<br>
   VisitStmt(S);<br>
   Record.push_back(Writer.getSwitchCaseID(S));<br>
-  Writer.AddSourceLocation(S->getKeywordLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getColonLoc(), Record);<br>
+  Record.AddSourceLocation(S->getKeywordLoc());<br>
+  Record.AddSourceLocation(S->getColonLoc());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {<br>
   VisitSwitchCase(S);<br>
-  Writer.AddStmt(S->getLHS());<br>
-  Writer.AddStmt(S->getRHS());<br>
-  Writer.AddStmt(S->getSubStmt());<br>
-  Writer.AddSourceLocation(S->getEllipsisLoc(), Record);<br>
+  Record.AddStmt(S->getLHS());<br>
+  Record.AddStmt(S->getRHS());<br>
+  Record.AddStmt(S->getSubStmt());<br>
+  Record.AddSourceLocation(S->getEllipsisLoc());<br>
   Code = serialization::STMT_CASE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {<br>
   VisitSwitchCase(S);<br>
-  Writer.AddStmt(S->getSubStmt());<br>
+  Record.AddStmt(S->getSubStmt());<br>
   Code = serialization::STMT_DEFAULT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddDeclRef(S->getDecl(), Record);<br>
-  Writer.AddStmt(S->getSubStmt());<br>
-  Writer.AddSourceLocation(S->getIdentLoc(), Record);<br>
+  Record.AddDeclRef(S->getDecl());<br>
+  Record.AddStmt(S->getSubStmt());<br>
+  Record.AddSourceLocation(S->getIdentLoc());<br>
   Code = serialization::STMT_LABEL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {<br>
   VisitStmt(S);<br>
   Record.push_back(S->getAttrs().size());<br>
-  Writer.AddAttributes(S->getAttrs(), Record);<br>
-  Writer.AddStmt(S->getSubStmt());<br>
-  Writer.AddSourceLocation(S->getAttrLoc(), Record);<br>
+  Record.AddAttributes(S->getAttrs());<br>
+  Record.AddStmt(S->getSubStmt());<br>
+  Record.AddSourceLocation(S->getAttrLoc());<br>
   Code = serialization::STMT_ATTRIBUTED;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitIfStmt(IfStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddDeclRef(S->getConditionVariable(), Record);<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddStmt(S->getThen());<br>
-  Writer.AddStmt(S->getElse());<br>
-  Writer.AddSourceLocation(S->getIfLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getElseLoc(), Record);<br>
+  Record.AddDeclRef(S->getConditionVariable());<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddStmt(S->getThen());<br>
+  Record.AddStmt(S->getElse());<br>
+  Record.AddSourceLocation(S->getIfLoc());<br>
+  Record.AddSourceLocation(S->getElseLoc());<br>
   Code = serialization::STMT_IF;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddDeclRef(S->getConditionVariable(), Record);<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddStmt(S->getBody());<br>
-  Writer.AddSourceLocation(S->getSwitchLoc(), Record);<br>
+  Record.AddDeclRef(S->getConditionVariable());<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getSwitchLoc());<br>
   Record.push_back(S->isAllEnumCasesCovered());<br>
   for (SwitchCase *SC = S->getSwitchCaseList(); SC;<br>
        SC = SC->getNextSwitchCase())<br>
@@ -144,79 +153,79 @@ void ASTStmtWriter::VisitSwitchStmt(Swit<br>
<br>
 void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddDeclRef(S->getConditionVariable(), Record);<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddStmt(S->getBody());<br>
-  Writer.AddSourceLocation(S->getWhileLoc(), Record);<br>
+  Record.AddDeclRef(S->getConditionVariable());<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getWhileLoc());<br>
   Code = serialization::STMT_WHILE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitDoStmt(DoStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddStmt(S->getBody());<br>
-  Writer.AddSourceLocation(S->getDoLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getWhileLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getDoLoc());<br>
+  Record.AddSourceLocation(S->getWhileLoc());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
   Code = serialization::STMT_DO;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitForStmt(ForStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddStmt(S->getInit());<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddDeclRef(S->getConditionVariable(), Record);<br>
-  Writer.AddStmt(S->getInc());<br>
-  Writer.AddStmt(S->getBody());<br>
-  Writer.AddSourceLocation(S->getForLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
+  Record.AddStmt(S->getInit());<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddDeclRef(S->getConditionVariable());<br>
+  Record.AddStmt(S->getInc());<br>
+  Record.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getForLoc());<br>
+  Record.AddSourceLocation(S->getLParenLoc());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
   Code = serialization::STMT_FOR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddDeclRef(S->getLabel(), Record);<br>
-  Writer.AddSourceLocation(S->getGotoLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getLabelLoc(), Record);<br>
+  Record.AddDeclRef(S->getLabel());<br>
+  Record.AddSourceLocation(S->getGotoLoc());<br>
+  Record.AddSourceLocation(S->getLabelLoc());<br>
   Code = serialization::STMT_GOTO;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getGotoLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getStarLoc(), Record);<br>
-  Writer.AddStmt(S->getTarget());<br>
+  Record.AddSourceLocation(S->getGotoLoc());<br>
+  Record.AddSourceLocation(S->getStarLoc());<br>
+  Record.AddStmt(S->getTarget());<br>
   Code = serialization::STMT_INDIRECT_GOTO;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getContinueLoc(), Record);<br>
+  Record.AddSourceLocation(S->getContinueLoc());<br>
   Code = serialization::STMT_CONTINUE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getBreakLoc(), Record);<br>
+  Record.AddSourceLocation(S->getBreakLoc());<br>
   Code = serialization::STMT_BREAK;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddStmt(S->getRetValue());<br>
-  Writer.AddSourceLocation(S->getReturnLoc(), Record);<br>
-  Writer.AddDeclRef(S->getNRVOCandidate(), Record);<br>
+  Record.AddStmt(S->getRetValue());<br>
+  Record.AddSourceLocation(S->getReturnLoc());<br>
+  Record.AddDeclRef(S->getNRVOCandidate());<br>
   Code = serialization::STMT_RETURN;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getStartLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getEndLoc(), Record);<br>
+  Record.AddSourceLocation(S->getStartLoc());<br>
+  Record.AddSourceLocation(S->getEndLoc());<br>
   DeclGroupRef DG = S->getDeclGroup();<br>
   for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)<br>
-    Writer.AddDeclRef(*D, Record);<br>
+    Record.AddDeclRef(*D);<br>
   Code = serialization::STMT_DECL;<br>
 }<br>
<br>
@@ -225,64 +234,65 @@ void ASTStmtWriter::VisitAsmStmt(AsmStmt<br>
   Record.push_back(S->getNumOutputs());<br>
   Record.push_back(S->getNumInputs());<br>
   Record.push_back(S->getNumClobbers());<br>
-  Writer.AddSourceLocation(S->getAsmLoc(), Record);<br>
+  Record.AddSourceLocation(S->getAsmLoc());<br>
   Record.push_back(S->isVolatile());<br>
   Record.push_back(S->isSimple());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {<br>
   VisitAsmStmt(S);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
-  Writer.AddStmt(S->getAsmString());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
+  Record.AddStmt(S->getAsmString());<br>
<br>
   // Outputs<br>
   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {<br>
-    Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);<br>
-    Writer.AddStmt(S->getOutputConstraintLiteral(I));<br>
-    Writer.AddStmt(S->getOutputExpr(I));<br>
+    Record.AddIdentifierRef(S->getOutputIdentifier(I));<br>
+    Record.AddStmt(S->getOutputConstraintLiteral(I));<br>
+    Record.AddStmt(S->getOutputExpr(I));<br>
   }<br>
<br>
   // Inputs<br>
   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {<br>
-    Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);<br>
-    Writer.AddStmt(S->getInputConstraintLiteral(I));<br>
-    Writer.AddStmt(S->getInputExpr(I));<br>
+    Record.AddIdentifierRef(S->getInputIdentifier(I));<br>
+    Record.AddStmt(S->getInputConstraintLiteral(I));<br>
+    Record.AddStmt(S->getInputExpr(I));<br>
   }<br>
<br>
   // Clobbers<br>
   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)<br>
-    Writer.AddStmt(S->getClobberStringLiteral(I));<br>
+    Record.AddStmt(S->getClobberStringLiteral(I));<br>
<br>
   Code = serialization::STMT_GCCASM;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {<br>
   VisitAsmStmt(S);<br>
-  Writer.AddSourceLocation(S->getLBraceLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getEndLoc(), Record);<br>
+  Record.AddSourceLocation(S->getLBraceLoc());<br>
+  Record.AddSourceLocation(S->getEndLoc());<br>
   Record.push_back(S->getNumAsmToks());<br>
-  Writer.AddString(S->getAsmString(), Record);<br>
+  Record.AddString(S->getAsmString());<br>
<br>
   // Tokens<br>
   for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {<br>
-    Writer.AddToken(S->getAsmToks()[I], Record);<br>
+    // FIXME: Move this to ASTRecordWriter?<br>
+    Writer.AddToken(S->getAsmToks()[I], Record.getRecordData());<br>
   }<br>
<br>
   // Clobbers<br>
   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {<br>
-    Writer.AddString(S->getClobber(I), Record);<br>
+    Record.AddString(S->getClobber(I));<br>
   }<br>
<br>
   // Outputs<br>
   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {<br>
-    Writer.AddStmt(S->getOutputExpr(I));<br>
-    Writer.AddString(S->getOutputConstraint(I), Record);<br>
+    Record.AddStmt(S->getOutputExpr(I));<br>
+    Record.AddString(S->getOutputConstraint(I));<br>
   }<br>
<br>
   // Inputs<br>
   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {<br>
-    Writer.AddStmt(S->getInputExpr(I));<br>
-    Writer.AddString(S->getInputConstraint(I), Record);<br>
+    Record.AddStmt(S->getInputExpr(I));<br>
+    Record.AddString(S->getInputConstraint(I));<br>
   }<br>
<br>
   Code = serialization::STMT_MSASM;<br>
@@ -314,26 +324,26 @@ void ASTStmtWriter::VisitCapturedStmt(Ca<br>
   Record.push_back(std::distance(S->capture_begin(), S->capture_end()));<br>
<br>
   // CapturedDecl and captured region kind<br>
-  Writer.AddDeclRef(S->getCapturedDecl(), Record);<br>
+  Record.AddDeclRef(S->getCapturedDecl());<br>
   Record.push_back(S->getCapturedRegionKind());<br>
<br>
-  Writer.AddDeclRef(S->getCapturedRecordDecl(), Record);<br>
+  Record.AddDeclRef(S->getCapturedRecordDecl());<br>
<br>
   // Capture inits<br>
   for (auto *I : S->capture_inits())<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
<br>
   // Body<br>
-  Writer.AddStmt(S->getCapturedStmt());<br>
+  Record.AddStmt(S->getCapturedStmt());<br>
<br>
   // Captures<br>
   for (const auto &I : S->captures()) {<br>
     if (I.capturesThis() || I.capturesVariableArrayType())<br>
-      Writer.AddDeclRef(nullptr, Record);<br>
+      Record.AddDeclRef(nullptr);<br>
     else<br>
-      Writer.AddDeclRef(I.getCapturedVar(), Record);<br>
+      Record.AddDeclRef(I.getCapturedVar());<br>
     Record.push_back(I.getCaptureKind());<br>
-    Writer.AddSourceLocation(I.getLocation(), Record);<br>
+    Record.AddSourceLocation(I.getLocation());<br>
   }<br>
<br>
   Code = serialization::STMT_CAPTURED;<br>
@@ -341,7 +351,7 @@ void ASTStmtWriter::VisitCapturedStmt(Ca<br>
<br>
 void ASTStmtWriter::VisitExpr(Expr *E) {<br>
   VisitStmt(E);<br>
-  Writer.AddTypeRef(E->getType(), Record);<br>
+  Record.AddTypeRef(E->getType());<br>
   Record.push_back(E->isTypeDependent());<br>
   Record.push_back(E->isValueDependent());<br>
   Record.push_back(E->isInstantiationDependent());<br>
@@ -352,9 +362,9 @@ void ASTStmtWriter::VisitExpr(Expr *E) {<br>
<br>
 void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Record.push_back(E->getIdentType()); // FIXME: stable encoding<br>
-  Writer.AddStmt(E->getFunctionName());<br>
+  Record.AddStmt(E->getFunctionName());<br>
   Code = serialization::EXPR_PREDEFINED;<br>
 }<br>
<br>
@@ -381,25 +391,25 @@ void ASTStmtWriter::VisitDeclRefExpr(Dec<br>
   }<br>
<br>
   if (E->hasQualifier())<br>
-    Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
+    Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
<br>
   if (E->getDecl() != E->getFoundDecl())<br>
-    Writer.AddDeclRef(E->getFoundDecl(), Record);<br>
+    Record.AddDeclRef(E->getFoundDecl());<br>
<br>
   if (E->hasTemplateKWAndArgsInfo())<br>
     AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),<br>
                              E->getTrailingObjects<TemplateArgumentLoc>());<br>
<br>
-  Writer.AddDeclRef(E->getDecl(), Record);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
-  Writer.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record);<br>
+  Record.AddDeclRef(E->getDecl());<br>
+  Record.AddSourceLocation(E->getLocation());<br>
+  Record.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName());<br>
   Code = serialization::EXPR_DECL_REF;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
-  Writer.AddAPInt(E->getValue(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
+  Record.AddAPInt(E->getValue());<br>
<br>
   if (E->getValue().getBitWidth() == 32) {<br>
     AbbrevToUse = Writer.getIntegerLiteralAbbrev();<br>
@@ -412,14 +422,14 @@ void ASTStmtWriter::VisitFloatingLiteral<br>
   VisitExpr(E);<br>
   Record.push_back(E->getRawSemantics());<br>
   Record.push_back(E->isExact());<br>
-  Writer.AddAPFloat(E->getValue(), Record);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddAPFloat(E->getValue());<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Code = serialization::EXPR_FLOATING_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Code = serialization::EXPR_IMAGINARY_LITERAL;<br>
 }<br>
<br>
@@ -435,14 +445,14 @@ void ASTStmtWriter::VisitStringLiteral(S<br>
   // the AST file during deserialization.<br>
   Record.append(E->getBytes().begin(), E->getBytes().end());<br>
   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)<br>
-    Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);<br>
+    Record.AddSourceLocation(E->getStrTokenLoc(I));<br>
   Code = serialization::EXPR_STRING_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Record.push_back(E->getKind());<br>
<br>
   AbbrevToUse = Writer.getCharacterLiteralAbbrev();<br>
@@ -452,9 +462,9 @@ void ASTStmtWriter::VisitCharacterLitera<br>
<br>
 void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLParen(), Record);<br>
-  Writer.AddSourceLocation(E->getRParen(), Record);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddSourceLocation(E->getLParen());<br>
+  Record.AddSourceLocation(E->getRParen());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Code = serialization::EXPR_PAREN;<br>
 }<br>
<br>
@@ -462,17 +472,17 @@ void ASTStmtWriter::VisitParenListExpr(P<br>
   VisitExpr(E);<br>
   Record.push_back(E->NumExprs);<br>
   for (unsigned i=0; i != E->NumExprs; ++i)<br>
-    Writer.AddStmt(E->Exprs[i]);<br>
-  Writer.AddSourceLocation(E->LParenLoc, Record);<br>
-  Writer.AddSourceLocation(E->RParenLoc, Record);<br>
+    Record.AddStmt(E->Exprs[i]);<br>
+  Record.AddSourceLocation(E->LParenLoc);<br>
+  Record.AddSourceLocation(E->RParenLoc);<br>
   Code = serialization::EXPR_PAREN_LIST;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Record.push_back(E->getOpcode()); // FIXME: stable encoding<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
   Code = serialization::EXPR_UNARY_OPERATOR;<br>
 }<br>
<br>
@@ -480,34 +490,34 @@ void ASTStmtWriter::VisitOffsetOfExpr(Of<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumComponents());<br>
   Record.push_back(E->getNumExpressions());<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {<br>
     const OffsetOfNode &ON = E->getComponent(I);<br>
     Record.push_back(ON.getKind()); // FIXME: Stable encoding<br>
-    Writer.AddSourceLocation(ON.getSourceRange().getBegin(), Record);<br>
-    Writer.AddSourceLocation(ON.getSourceRange().getEnd(), Record);<br>
+    Record.AddSourceLocation(ON.getSourceRange().getBegin());<br>
+    Record.AddSourceLocation(ON.getSourceRange().getEnd());<br>
     switch (ON.getKind()) {<br>
     case OffsetOfNode::Array:<br>
       Record.push_back(ON.getArrayExprIndex());<br>
       break;<br>
<br>
     case OffsetOfNode::Field:<br>
-      Writer.AddDeclRef(ON.getField(), Record);<br>
+      Record.AddDeclRef(ON.getField());<br>
       break;<br>
<br>
     case OffsetOfNode::Identifier:<br>
-      Writer.AddIdentifierRef(ON.getFieldName(), Record);<br>
+      Record.AddIdentifierRef(ON.getFieldName());<br>
       break;<br>
<br>
     case OffsetOfNode::Base:<br>
-      Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);<br>
+      Record.AddCXXBaseSpecifier(*ON.getBase());<br>
       break;<br>
     }<br>
   }<br>
   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)<br>
-    Writer.AddStmt(E->getIndexExpr(I));<br>
+    Record.AddStmt(E->getIndexExpr(I));<br>
   Code = serialization::EXPR_OFFSETOF;<br>
 }<br>
<br>
@@ -515,42 +525,42 @@ void ASTStmtWriter::VisitUnaryExprOrType<br>
   VisitExpr(E);<br>
   Record.push_back(E->getKind());<br>
   if (E->isArgumentType())<br>
-    Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);<br>
+    Record.AddTypeSourceInfo(E->getArgumentTypeInfo());<br>
   else {<br>
     Record.push_back(0);<br>
-    Writer.AddStmt(E->getArgumentExpr());<br>
+    Record.AddStmt(E->getArgumentExpr());<br>
   }<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_SIZEOF_ALIGN_OF;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getLHS());<br>
-  Writer.AddStmt(E->getRHS());<br>
-  Writer.AddSourceLocation(E->getRBracketLoc(), Record);<br>
+  Record.AddStmt(E->getLHS());<br>
+  Record.AddStmt(E->getRHS());<br>
+  Record.AddSourceLocation(E->getRBracketLoc());<br>
   Code = serialization::EXPR_ARRAY_SUBSCRIPT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddStmt(E->getLowerBound());<br>
-  Writer.AddStmt(E->getLength());<br>
-  Writer.AddSourceLocation(E->getColonLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRBracketLoc(), Record);<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddStmt(E->getLowerBound());<br>
+  Record.AddStmt(E->getLength());<br>
+  Record.AddSourceLocation(E->getColonLoc());<br>
+  Record.AddSourceLocation(E->getRBracketLoc());<br>
   Code = serialization::EXPR_OMP_ARRAY_SECTION;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCallExpr(CallExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumArgs());<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
-  Writer.AddStmt(E->getCallee());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
+  Record.AddStmt(E->getCallee());<br>
   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();<br>
        Arg != ArgEnd; ++Arg)<br>
-    Writer.AddStmt(*Arg);<br>
+    Record.AddStmt(*Arg);<br>
   Code = serialization::EXPR_CALL;<br>
 }<br>
<br>
@@ -559,43 +569,43 @@ void ASTStmtWriter::VisitMemberExpr(Memb<br>
<br>
   Record.push_back(E->hasQualifier());<br>
   if (E->hasQualifier())<br>
-    Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
+    Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
<br>
   Record.push_back(E->HasTemplateKWAndArgsInfo);<br>
   if (E->HasTemplateKWAndArgsInfo) {<br>
-    Writer.AddSourceLocation(E->getTemplateKeywordLoc(), Record);<br>
+    Record.AddSourceLocation(E->getTemplateKeywordLoc());<br>
     unsigned NumTemplateArgs = E->getNumTemplateArgs();<br>
     Record.push_back(NumTemplateArgs);<br>
-    Writer.AddSourceLocation(E->getLAngleLoc(), Record);<br>
-    Writer.AddSourceLocation(E->getRAngleLoc(), Record);<br>
+    Record.AddSourceLocation(E->getLAngleLoc());<br>
+    Record.AddSourceLocation(E->getRAngleLoc());<br>
     for (unsigned i=0; i != NumTemplateArgs; ++i)<br>
-      Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);<br>
+      Record.AddTemplateArgumentLoc(E->getTemplateArgs()[i]);<br>
   }<br>
<br>
   Record.push_back(E->hadMultipleCandidates());<br>
<br>
   DeclAccessPair FoundDecl = E->getFoundDecl();<br>
-  Writer.AddDeclRef(FoundDecl.getDecl(), Record);<br>
+  Record.AddDeclRef(FoundDecl.getDecl());<br>
   Record.push_back(FoundDecl.getAccess());<br>
<br>
-  Writer.AddTypeRef(E->getType(), Record);<br>
+  Record.AddTypeRef(E->getType());<br>
   Record.push_back(E->getValueKind());<br>
   Record.push_back(E->getObjectKind());<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddDeclRef(E->getMemberDecl(), Record);<br>
-  Writer.AddSourceLocation(E->getMemberLoc(), Record);<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddDeclRef(E->getMemberDecl());<br>
+  Record.AddSourceLocation(E->getMemberLoc());<br>
   Record.push_back(E->isArrow());<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
-  Writer.AddDeclarationNameLoc(E->MemberDNLoc,<br>
-                               E->getMemberDecl()->getDeclName(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
+  Record.AddDeclarationNameLoc(E->MemberDNLoc,<br>
+                               E->getMemberDecl()->getDeclName());<br>
   Code = serialization::EXPR_MEMBER;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getOpLoc(), Record);<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddSourceLocation(E->getIsaMemberLoc());<br>
+  Record.AddSourceLocation(E->getOpLoc());<br>
   Record.push_back(E->isArrow());<br>
   Code = serialization::EXPR_OBJC_ISA;<br>
 }<br>
@@ -603,15 +613,15 @@ void ASTStmtWriter::VisitObjCIsaExpr(Obj<br>
 void ASTStmtWriter::<br>
 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Record.push_back(E->shouldCopy());<br>
   Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record);<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddSourceLocation(E->getBridgeKeywordLoc());<br>
   Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding<br>
   Code = serialization::EXPR_OBJC_BRIDGED_CAST;<br>
 }<br>
@@ -619,51 +629,51 @@ void ASTStmtWriter::VisitObjCBridgedCast<br>
 void ASTStmtWriter::VisitCastExpr(CastExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->path_size());<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Record.push_back(E->getCastKind()); // FIXME: stable encoding<br>
<br>
   for (CastExpr::path_iterator<br>
          PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)<br>
-    Writer.AddCXXBaseSpecifier(**PI, Record);<br>
+    Record.AddCXXBaseSpecifier(**PI);<br>
 }<br>
<br>
 void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getLHS());<br>
-  Writer.AddStmt(E->getRHS());<br>
+  Record.AddStmt(E->getLHS());<br>
+  Record.AddStmt(E->getRHS());<br>
   Record.push_back(E->getOpcode()); // FIXME: stable encoding<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
   Record.push_back(E->isFPContractable());<br>
   Code = serialization::EXPR_BINARY_OPERATOR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {<br>
   VisitBinaryOperator(E);<br>
-  Writer.AddTypeRef(E->getComputationLHSType(), Record);<br>
-  Writer.AddTypeRef(E->getComputationResultType(), Record);<br>
+  Record.AddTypeRef(E->getComputationLHSType());<br>
+  Record.AddTypeRef(E->getComputationResultType());<br>
   Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getCond());<br>
-  Writer.AddStmt(E->getLHS());<br>
-  Writer.AddStmt(E->getRHS());<br>
-  Writer.AddSourceLocation(E->getQuestionLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getColonLoc(), Record);<br>
+  Record.AddStmt(E->getCond());<br>
+  Record.AddStmt(E->getLHS());<br>
+  Record.AddStmt(E->getRHS());<br>
+  Record.AddSourceLocation(E->getQuestionLoc());<br>
+  Record.AddSourceLocation(E->getColonLoc());<br>
   Code = serialization::EXPR_CONDITIONAL_OPERATOR;<br>
 }<br>
<br>
 void<br>
 ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getOpaqueValue());<br>
-  Writer.AddStmt(E->getCommon());<br>
-  Writer.AddStmt(E->getCond());<br>
-  Writer.AddStmt(E->getTrueExpr());<br>
-  Writer.AddStmt(E->getFalseExpr());<br>
-  Writer.AddSourceLocation(E->getQuestionLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getColonLoc(), Record);<br>
+  Record.AddStmt(E->getOpaqueValue());<br>
+  Record.AddStmt(E->getCommon());<br>
+  Record.AddStmt(E->getCond());<br>
+  Record.AddStmt(E->getTrueExpr());<br>
+  Record.AddStmt(E->getFalseExpr());<br>
+  Record.AddSourceLocation(E->getQuestionLoc());<br>
+  Record.AddSourceLocation(E->getColonLoc());<br>
   Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;<br>
 }<br>
<br>
@@ -678,30 +688,30 @@ void ASTStmtWriter::VisitImplicitCastExp<br>
<br>
 void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {<br>
   VisitCastExpr(E);<br>
-  Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);<br>
+  Record.AddTypeSourceInfo(E->getTypeInfoAsWritten());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_CSTYLE_CAST;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
-  Writer.AddStmt(E->getInitializer());<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
+  Record.AddStmt(E->getInitializer());<br>
   Record.push_back(E->isFileScope());<br>
   Code = serialization::EXPR_COMPOUND_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddIdentifierRef(&E->getAccessor(), Record);<br>
-  Writer.AddSourceLocation(E->getAccessorLoc(), Record);<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddIdentifierRef(&E->getAccessor());<br>
+  Record.AddSourceLocation(E->getAccessorLoc());<br>
   Code = serialization::EXPR_EXT_VECTOR_ELEMENT;<br>
 }<br>
<br>
@@ -709,15 +719,15 @@ void ASTStmtWriter::VisitInitListExpr(In<br>
   VisitExpr(E);<br>
   // NOTE: only add the (possibly null) syntactic form.<br>
   // No need to serialize the isSemanticForm flag and the semantic form.<br>
-  Writer.AddStmt(E->getSyntacticForm());<br>
-  Writer.AddSourceLocation(E->getLBraceLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRBraceLoc(), Record);<br>
+  Record.AddStmt(E->getSyntacticForm());<br>
+  Record.AddSourceLocation(E->getLBraceLoc());<br>
+  Record.AddSourceLocation(E->getRBraceLoc());<br>
   bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();<br>
   Record.push_back(isArrayFiller);<br>
   if (isArrayFiller)<br>
-    Writer.AddStmt(E->getArrayFiller());<br>
+    Record.AddStmt(E->getArrayFiller());<br>
   else<br>
-    Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);<br>
+    Record.AddDeclRef(E->getInitializedFieldInUnion());<br>
   Record.push_back(E->hadArrayRangeDesignator());<br>
   Record.push_back(E->getNumInits());<br>
   if (isArrayFiller) {<br>
@@ -725,10 +735,10 @@ void ASTStmtWriter::VisitInitListExpr(In<br>
     // Replace them by 0 to indicate that the filler goes in that place.<br>
     Expr *filler = E->getArrayFiller();<br>
     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)<br>
-      Writer.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);<br>
+      Record.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);<br>
   } else {<br>
     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)<br>
-      Writer.AddStmt(E->getInit(I));<br>
+      Record.AddStmt(E->getInit(I));<br>
   }<br>
   Code = serialization::EXPR_INIT_LIST;<br>
 }<br>
@@ -737,8 +747,8 @@ void ASTStmtWriter::VisitDesignatedInitE<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumSubExprs());<br>
   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)<br>
-    Writer.AddStmt(E->getSubExpr(I));<br>
-  Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);<br>
+    Record.AddStmt(E->getSubExpr(I));<br>
+  Record.AddSourceLocation(E->getEqualOrColonLoc());<br>
   Record.push_back(E->usesGNUSyntax());<br>
   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),<br>
                                              DEnd = E->designators_end();<br>
@@ -746,25 +756,25 @@ void ASTStmtWriter::VisitDesignatedInitE<br>
     if (D->isFieldDesignator()) {<br>
       if (FieldDecl *Field = D->getField()) {<br>
         Record.push_back(serialization::DESIG_FIELD_DECL);<br>
-        Writer.AddDeclRef(Field, Record);<br>
+        Record.AddDeclRef(Field);<br>
       } else {<br>
         Record.push_back(serialization::DESIG_FIELD_NAME);<br>
-        Writer.AddIdentifierRef(D->getFieldName(), Record);<br>
+        Record.AddIdentifierRef(D->getFieldName());<br>
       }<br>
-      Writer.AddSourceLocation(D->getDotLoc(), Record);<br>
-      Writer.AddSourceLocation(D->getFieldLoc(), Record);<br>
+      Record.AddSourceLocation(D->getDotLoc());<br>
+      Record.AddSourceLocation(D->getFieldLoc());<br>
     } else if (D->isArrayDesignator()) {<br>
       Record.push_back(serialization::DESIG_ARRAY);<br>
       Record.push_back(D->getFirstExprIndex());<br>
-      Writer.AddSourceLocation(D->getLBracketLoc(), Record);<br>
-      Writer.AddSourceLocation(D->getRBracketLoc(), Record);<br>
+      Record.AddSourceLocation(D->getLBracketLoc());<br>
+      Record.AddSourceLocation(D->getRBracketLoc());<br>
     } else {<br>
       assert(D->isArrayRangeDesignator() && "Unknown designator");<br>
       Record.push_back(serialization::DESIG_ARRAY_RANGE);<br>
       Record.push_back(D->getFirstExprIndex());<br>
-      Writer.AddSourceLocation(D->getLBracketLoc(), Record);<br>
-      Writer.AddSourceLocation(D->getEllipsisLoc(), Record);<br>
-      Writer.AddSourceLocation(D->getRBracketLoc(), Record);<br>
+      Record.AddSourceLocation(D->getLBracketLoc());<br>
+      Record.AddSourceLocation(D->getEllipsisLoc());<br>
+      Record.AddSourceLocation(D->getRBracketLoc());<br>
     }<br>
   }<br>
   Code = serialization::EXPR_DESIGNATED_INIT;<br>
@@ -772,8 +782,8 @@ void ASTStmtWriter::VisitDesignatedInitE<br>
<br>
 void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddStmt(E->getUpdater());<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddStmt(E->getUpdater());<br>
   Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;<br>
 }<br>
<br>
@@ -789,44 +799,44 @@ void ASTStmtWriter::VisitImplicitValueIn<br>
<br>
 void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
-  Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record);<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddStmt(E->getSubExpr());<br>
+  Record.AddTypeSourceInfo(E->getWrittenTypeInfo());<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Record.push_back(E->isMicrosoftABI());<br>
   Code = serialization::EXPR_VA_ARG;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getLabelLoc(), Record);<br>
-  Writer.AddDeclRef(E->getLabel(), Record);<br>
+  Record.AddSourceLocation(E->getAmpAmpLoc());<br>
+  Record.AddSourceLocation(E->getLabelLoc());<br>
+  Record.AddDeclRef(E->getLabel());<br>
   Code = serialization::EXPR_ADDR_LABEL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubStmt());<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddStmt(E->getSubStmt());<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_STMT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getCond());<br>
-  Writer.AddStmt(E->getLHS());<br>
-  Writer.AddStmt(E->getRHS());<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddStmt(E->getCond());<br>
+  Record.AddStmt(E->getLHS());<br>
+  Record.AddStmt(E->getRHS());<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());<br>
   Code = serialization::EXPR_CHOOSE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getTokenLocation(), Record);<br>
+  Record.AddSourceLocation(E->getTokenLocation());<br>
   Code = serialization::EXPR_GNU_NULL;<br>
 }<br>
<br>
@@ -834,24 +844,24 @@ void ASTStmtWriter::VisitShuffleVectorEx<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumSubExprs());<br>
   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)<br>
-    Writer.AddStmt(E->getExpr(I));<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+    Record.AddStmt(E->getExpr(I));<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_SHUFFLE_VECTOR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
-  Writer.AddStmt(E->getSrcExpr());<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
+  Record.AddStmt(E->getSrcExpr());<br>
   Code = serialization::EXPR_CONVERT_VECTOR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getBlockDecl(), Record);<br>
+  Record.AddDeclRef(E->getBlockDecl());<br>
   Code = serialization::EXPR_BLOCK;<br>
 }<br>
<br>
@@ -859,16 +869,16 @@ void ASTStmtWriter::VisitGenericSelectio<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumAssocs());<br>
<br>
-  Writer.AddStmt(E->getControllingExpr());<br>
+  Record.AddStmt(E->getControllingExpr());<br>
   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {<br>
-    Writer.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I), Record);<br>
-    Writer.AddStmt(E->getAssocExpr(I));<br>
+    Record.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I));<br>
+    Record.AddStmt(E->getAssocExpr(I));<br>
   }<br>
   Record.push_back(E->isResultDependent() ? -1U : E->getResultIndex());<br>
<br>
-  Writer.AddSourceLocation(E->getGenericLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getDefaultLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddSourceLocation(E->getGenericLoc());<br>
+  Record.AddSourceLocation(E->getDefaultLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_GENERIC_SELECTION;<br>
 }<br>
<br>
@@ -882,10 +892,10 @@ void ASTStmtWriter::VisitPseudoObjectExp<br>
   result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);<br>
   Record.push_back(result);<br>
<br>
-  Writer.AddStmt(E->getSyntacticForm());<br>
+  Record.AddStmt(E->getSyntacticForm());<br>
   for (PseudoObjectExpr::semantics_iterator<br>
          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {<br>
-    Writer.AddStmt(*i);<br>
+    Record.AddStmt(*i);<br>
   }<br>
   Code = serialization::EXPR_PSEUDO_OBJECT;<br>
 }<br>
@@ -894,9 +904,9 @@ void ASTStmtWriter::VisitAtomicExpr(Atom<br>
   VisitExpr(E);<br>
   Record.push_back(E->getOp());<br>
   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)<br>
-    Writer.AddStmt(E->getSubExprs()[I]);<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+    Record.AddStmt(E->getSubExprs()[I]);<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_ATOMIC;<br>
 }<br>
<br>
@@ -906,16 +916,16 @@ void ASTStmtWriter::VisitAtomicExpr(Atom<br>
<br>
 void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getString());<br>
-  Writer.AddSourceLocation(E->getAtLoc(), Record);<br>
+  Record.AddStmt(E->getString());<br>
+  Record.AddSourceLocation(E->getAtLoc());<br>
   Code = serialization::EXPR_OBJC_STRING_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
-  Writer.AddDeclRef(E->getBoxingMethod(), Record);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
+  Record.AddStmt(E->getSubExpr());<br>
+  Record.AddDeclRef(E->getBoxingMethod());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
   Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;<br>
 }<br>
<br>
@@ -923,9 +933,9 @@ void ASTStmtWriter::VisitObjCArrayLitera<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumElements());<br>
   for (unsigned i = 0; i < E->getNumElements(); i++)<br>
-    Writer.AddStmt(E->getElement(i));<br>
-  Writer.AddDeclRef(E->getArrayWithObjectsMethod(), Record);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
+    Record.AddStmt(E->getElement(i));<br>
+  Record.AddDeclRef(E->getArrayWithObjectsMethod());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
   Code = serialization::EXPR_OBJC_ARRAY_LITERAL;<br>
 }<br>
<br>
@@ -935,10 +945,10 @@ void ASTStmtWriter::VisitObjCDictionaryL<br>
   Record.push_back(E->HasPackExpansions);<br>
   for (unsigned i = 0; i < E->getNumElements(); i++) {<br>
     ObjCDictionaryElement Element = E->getKeyValueElement(i);<br>
-    Writer.AddStmt(Element.Key);<br>
-    Writer.AddStmt(Element.Value);<br>
+    Record.AddStmt(Element.Key);<br>
+    Record.AddStmt(Element.Value);<br>
     if (E->HasPackExpansions) {<br>
-      Writer.AddSourceLocation(Element.EllipsisLoc, Record);<br>
+      Record.AddSourceLocation(Element.EllipsisLoc);<br>
       unsigned NumExpansions = 0;<br>
       if (Element.NumExpansions)<br>
         NumExpansions = *Element.NumExpansions + 1;<br>
@@ -946,42 +956,42 @@ void ASTStmtWriter::VisitObjCDictionaryL<br>
     }<br>
   }<br>
<br>
-  Writer.AddDeclRef(E->getDictWithObjectsMethod(), Record);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
+  Record.AddDeclRef(E->getDictWithObjectsMethod());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
   Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);<br>
-  Writer.AddSourceLocation(E->getAtLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddTypeSourceInfo(E->getEncodedTypeSourceInfo());<br>
+  Record.AddSourceLocation(E->getAtLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_OBJC_ENCODE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSelectorRef(E->getSelector(), Record);<br>
-  Writer.AddSourceLocation(E->getAtLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddSelectorRef(E->getSelector());<br>
+  Record.AddSourceLocation(E->getAtLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_OBJC_SELECTOR_EXPR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getProtocol(), Record);<br>
-  Writer.AddSourceLocation(E->getAtLoc(), Record);<br>
-  Writer.AddSourceLocation(E->ProtoLoc, Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddDeclRef(E->getProtocol());<br>
+  Record.AddSourceLocation(E->getAtLoc());<br>
+  Record.AddSourceLocation(E->ProtoLoc);<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getDecl(), Record);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
-  Writer.AddSourceLocation(E->getOpLoc(), Record);<br>
-  Writer.AddStmt(E->getBase());<br>
+  Record.AddDeclRef(E->getDecl());<br>
+  Record.AddSourceLocation(E->getLocation());<br>
+  Record.AddSourceLocation(E->getOpLoc());<br>
+  Record.AddStmt(E->getBase());<br>
   Record.push_back(E->isArrow());<br>
   Record.push_back(E->isFreeIvar());<br>
   Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;<br>
@@ -992,22 +1002,22 @@ void ASTStmtWriter::VisitObjCPropertyRef<br>
   Record.push_back(E->SetterAndMethodRefFlags.getInt());<br>
   Record.push_back(E->isImplicitProperty());<br>
   if (E->isImplicitProperty()) {<br>
-    Writer.AddDeclRef(E->getImplicitPropertyGetter(), Record);<br>
-    Writer.AddDeclRef(E->getImplicitPropertySetter(), Record);<br>
+    Record.AddDeclRef(E->getImplicitPropertyGetter());<br>
+    Record.AddDeclRef(E->getImplicitPropertySetter());<br>
   } else {<br>
-    Writer.AddDeclRef(E->getExplicitProperty(), Record);<br>
+    Record.AddDeclRef(E->getExplicitProperty());<br>
   }<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
-  Writer.AddSourceLocation(E->getReceiverLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
+  Record.AddSourceLocation(E->getReceiverLocation());<br>
   if (E->isObjectReceiver()) {<br>
     Record.push_back(0);<br>
-    Writer.AddStmt(E->getBase());<br>
+    Record.AddStmt(E->getBase());<br>
   } else if (E->isSuperReceiver()) {<br>
     Record.push_back(1);<br>
-    Writer.AddTypeRef(E->getSuperReceiverType(), Record);<br>
+    Record.AddTypeRef(E->getSuperReceiverType());<br>
   } else {<br>
     Record.push_back(2);<br>
-    Writer.AddDeclRef(E->getClassReceiver(), Record);<br>
+    Record.AddDeclRef(E->getClassReceiver());<br>
   }<br>
<br>
   Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;<br>
@@ -1015,11 +1025,11 @@ void ASTStmtWriter::VisitObjCPropertyRef<br>
<br>
 void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getRBracket(), Record);<br>
-  Writer.AddStmt(E->getBaseExpr());<br>
-  Writer.AddStmt(E->getKeyExpr());<br>
-  Writer.AddDeclRef(E->getAtIndexMethodDecl(), Record);<br>
-  Writer.AddDeclRef(E->setAtIndexMethodDecl(), Record);<br>
+  Record.AddSourceLocation(E->getRBracket());<br>
+  Record.AddStmt(E->getBaseExpr());<br>
+  Record.AddStmt(E->getKeyExpr());<br>
+  Record.AddDeclRef(E->getAtIndexMethodDecl());<br>
+  Record.AddDeclRef(E->setAtIndexMethodDecl());<br>
<br>
   Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;<br>
 }<br>
@@ -1034,101 +1044,101 @@ void ASTStmtWriter::VisitObjCMessageExpr<br>
   Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding<br>
   switch (E->getReceiverKind()) {<br>
   case ObjCMessageExpr::Instance:<br>
-    Writer.AddStmt(E->getInstanceReceiver());<br>
+    Record.AddStmt(E->getInstanceReceiver());<br>
     break;<br>
<br>
   case ObjCMessageExpr::Class:<br>
-    Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);<br>
+    Record.AddTypeSourceInfo(E->getClassReceiverTypeInfo());<br>
     break;<br>
<br>
   case ObjCMessageExpr::SuperClass:<br>
   case ObjCMessageExpr::SuperInstance:<br>
-    Writer.AddTypeRef(E->getSuperType(), Record);<br>
-    Writer.AddSourceLocation(E->getSuperLoc(), Record);<br>
+    Record.AddTypeRef(E->getSuperType());<br>
+    Record.AddSourceLocation(E->getSuperLoc());<br>
     break;<br>
   }<br>
<br>
   if (E->getMethodDecl()) {<br>
     Record.push_back(1);<br>
-    Writer.AddDeclRef(E->getMethodDecl(), Record);<br>
+    Record.AddDeclRef(E->getMethodDecl());<br>
   } else {<br>
     Record.push_back(0);<br>
-    Writer.AddSelectorRef(E->getSelector(), Record);<br>
+    Record.AddSelectorRef(E->getSelector());<br>
   }<br>
<br>
-  Writer.AddSourceLocation(E->getLeftLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRightLoc(), Record);<br>
+  Record.AddSourceLocation(E->getLeftLoc());<br>
+  Record.AddSourceLocation(E->getRightLoc());<br>
<br>
   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();<br>
        Arg != ArgEnd; ++Arg)<br>
-    Writer.AddStmt(*Arg);<br>
+    Record.AddStmt(*Arg);<br>
<br>
   SourceLocation *Locs = E->getStoredSelLocs();<br>
   for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)<br>
-    Writer.AddSourceLocation(Locs[i], Record);<br>
+    Record.AddSourceLocation(Locs[i]);<br>
<br>
   Code = serialization::EXPR_OBJC_MESSAGE_EXPR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddStmt(S->getElement());<br>
-  Writer.AddStmt(S->getCollection());<br>
-  Writer.AddStmt(S->getBody());<br>
-  Writer.AddSourceLocation(S->getForLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
+  Record.AddStmt(S->getElement());<br>
+  Record.AddStmt(S->getCollection());<br>
+  Record.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getForLoc());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
   Code = serialization::STMT_OBJC_FOR_COLLECTION;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {<br>
-  Writer.AddStmt(S->getCatchBody());<br>
-  Writer.AddDeclRef(S->getCatchParamDecl(), Record);<br>
-  Writer.AddSourceLocation(S->getAtCatchLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
+  Record.AddStmt(S->getCatchBody());<br>
+  Record.AddDeclRef(S->getCatchParamDecl());<br>
+  Record.AddSourceLocation(S->getAtCatchLoc());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
   Code = serialization::STMT_OBJC_CATCH;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {<br>
-  Writer.AddStmt(S->getFinallyBody());<br>
-  Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);<br>
+  Record.AddStmt(S->getFinallyBody());<br>
+  Record.AddSourceLocation(S->getAtFinallyLoc());<br>
   Code = serialization::STMT_OBJC_FINALLY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {<br>
-  Writer.AddStmt(S->getSubStmt());<br>
-  Writer.AddSourceLocation(S->getAtLoc(), Record);<br>
+  Record.AddStmt(S->getSubStmt());<br>
+  Record.AddSourceLocation(S->getAtLoc());<br>
   Code = serialization::STMT_OBJC_AUTORELEASE_POOL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {<br>
   Record.push_back(S->getNumCatchStmts());<br>
   Record.push_back(S->getFinallyStmt() != nullptr);<br>
-  Writer.AddStmt(S->getTryBody());<br>
+  Record.AddStmt(S->getTryBody());<br>
   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)<br>
-    Writer.AddStmt(S->getCatchStmt(I));<br>
+    Record.AddStmt(S->getCatchStmt(I));<br>
   if (S->getFinallyStmt())<br>
-    Writer.AddStmt(S->getFinallyStmt());<br>
-  Writer.AddSourceLocation(S->getAtTryLoc(), Record);<br>
+    Record.AddStmt(S->getFinallyStmt());<br>
+  Record.AddSourceLocation(S->getAtTryLoc());<br>
   Code = serialization::STMT_OBJC_AT_TRY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {<br>
-  Writer.AddStmt(S->getSynchExpr());<br>
-  Writer.AddStmt(S->getSynchBody());<br>
-  Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);<br>
+  Record.AddStmt(S->getSynchExpr());<br>
+  Record.AddStmt(S->getSynchBody());<br>
+  Record.AddSourceLocation(S->getAtSynchronizedLoc());<br>
   Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {<br>
-  Writer.AddStmt(S->getThrowExpr());<br>
-  Writer.AddSourceLocation(S->getThrowLoc(), Record);<br>
+  Record.AddStmt(S->getThrowExpr());<br>
+  Record.AddSourceLocation(S->getThrowLoc());<br>
   Code = serialization::STMT_OBJC_AT_THROW;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Code = serialization::EXPR_OBJC_BOOL_LITERAL;<br>
 }<br>
<br>
@@ -1138,52 +1148,52 @@ void ASTStmtWriter::VisitObjCBoolLiteral<br>
<br>
 void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getCatchLoc(), Record);<br>
-  Writer.AddDeclRef(S->getExceptionDecl(), Record);<br>
-  Writer.AddStmt(S->getHandlerBlock());<br>
+  Record.AddSourceLocation(S->getCatchLoc());<br>
+  Record.AddDeclRef(S->getExceptionDecl());<br>
+  Record.AddStmt(S->getHandlerBlock());<br>
   Code = serialization::STMT_CXX_CATCH;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {<br>
   VisitStmt(S);<br>
   Record.push_back(S->getNumHandlers());<br>
-  Writer.AddSourceLocation(S->getTryLoc(), Record);<br>
-  Writer.AddStmt(S->getTryBlock());<br>
+  Record.AddSourceLocation(S->getTryLoc());<br>
+  Record.AddStmt(S->getTryBlock());<br>
   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)<br>
-    Writer.AddStmt(S->getHandler(i));<br>
+    Record.AddStmt(S->getHandler(i));<br>
   Code = serialization::STMT_CXX_TRY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getForLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getCoawaitLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getColonLoc(), Record);<br>
-  Writer.AddSourceLocation(S->getRParenLoc(), Record);<br>
-  Writer.AddStmt(S->getRangeStmt());<br>
-  Writer.AddStmt(S->getBeginStmt());<br>
-  Writer.AddStmt(S->getEndStmt());<br>
-  Writer.AddStmt(S->getCond());<br>
-  Writer.AddStmt(S->getInc());<br>
-  Writer.AddStmt(S->getLoopVarStmt());<br>
-  Writer.AddStmt(S->getBody());<br>
+  Record.AddSourceLocation(S->getForLoc());<br>
+  Record.AddSourceLocation(S->getCoawaitLoc());<br>
+  Record.AddSourceLocation(S->getColonLoc());<br>
+  Record.AddSourceLocation(S->getRParenLoc());<br>
+  Record.AddStmt(S->getRangeStmt());<br>
+  Record.AddStmt(S->getBeginStmt());<br>
+  Record.AddStmt(S->getEndStmt());<br>
+  Record.AddStmt(S->getCond());<br>
+  Record.AddStmt(S->getInc());<br>
+  Record.AddStmt(S->getLoopVarStmt());<br>
+  Record.AddStmt(S->getBody());<br>
   Code = serialization::STMT_CXX_FOR_RANGE;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getKeywordLoc(), Record);<br>
+  Record.AddSourceLocation(S->getKeywordLoc());<br>
   Record.push_back(S->isIfExists());<br>
-  Writer.AddNestedNameSpecifierLoc(S->getQualifierLoc(), Record);<br>
-  Writer.AddDeclarationNameInfo(S->getNameInfo(), Record);<br>
-  Writer.AddStmt(S->getSubStmt());<br>
+  Record.AddNestedNameSpecifierLoc(S->getQualifierLoc());<br>
+  Record.AddDeclarationNameInfo(S->getNameInfo());<br>
+  Record.AddStmt(S->getSubStmt());<br>
   Code = serialization::STMT_MS_DEPENDENT_EXISTS;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {<br>
   VisitCallExpr(E);<br>
   Record.push_back(E->getOperator());<br>
-  Writer.AddSourceRange(E->Range, Record);<br>
+  Record.AddSourceRange(E->Range);<br>
   Record.push_back(E->isFPContractable());<br>
   Code = serialization::EXPR_CXX_OPERATOR_CALL;<br>
 }<br>
@@ -1197,22 +1207,22 @@ void ASTStmtWriter::VisitCXXConstructExp<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumArgs());<br>
   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)<br>
-    Writer.AddStmt(E->getArg(I));<br>
-  Writer.AddDeclRef(E->getConstructor(), Record);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+    Record.AddStmt(E->getArg(I));<br>
+  Record.AddDeclRef(E->getConstructor());<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Record.push_back(E->isElidable());<br>
   Record.push_back(E->hadMultipleCandidates());<br>
   Record.push_back(E->isListInitialization());<br>
   Record.push_back(E->isStdInitListInitialization());<br>
   Record.push_back(E->requiresZeroInitialization());<br>
   Record.push_back(E->getConstructionKind()); // FIXME: stable encoding<br>
-  Writer.AddSourceRange(E->getParenOrBraceRange(), Record);<br>
+  Record.AddSourceRange(E->getParenOrBraceRange());<br>
   Code = serialization::EXPR_CXX_CONSTRUCT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {<br>
   VisitCXXConstructExpr(E);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
   Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;<br>
 }<br>
<br>
@@ -1223,18 +1233,18 @@ void ASTStmtWriter::VisitLambdaExpr(Lamb<br>
   if (E->HasArrayIndexVars)<br>
     NumArrayIndexVars = E->getArrayIndexStarts()[E->NumCaptures];<br>
   Record.push_back(NumArrayIndexVars);<br>
-  Writer.AddSourceRange(E->IntroducerRange, Record);<br>
+  Record.AddSourceRange(E->IntroducerRange);<br>
   Record.push_back(E->CaptureDefault); // FIXME: stable encoding<br>
-  Writer.AddSourceLocation(E->CaptureDefaultLoc, Record);<br>
+  Record.AddSourceLocation(E->CaptureDefaultLoc);<br>
   Record.push_back(E->ExplicitParams);<br>
   Record.push_back(E->ExplicitResultType);<br>
-  Writer.AddSourceLocation(E->ClosingBrace, Record);<br>
+  Record.AddSourceLocation(E->ClosingBrace);<br>
<br>
   // Add capture initializers.<br>
   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),<br>
                                       CEnd = E->capture_init_end();<br>
        C != CEnd; ++C) {<br>
-    Writer.AddStmt(*C);<br>
+    Record.AddStmt(*C);<br>
   }<br>
<br>
   // Add array index variables, if any.<br>
@@ -1243,7 +1253,7 @@ void ASTStmtWriter::VisitLambdaExpr(Lamb<br>
                   E->getArrayIndexStarts() + E->NumCaptures + 1);<br>
     VarDecl **ArrayIndexVars = E->getArrayIndexVars();<br>
     for (unsigned I = 0; I != NumArrayIndexVars; ++I)<br>
-      Writer.AddDeclRef(ArrayIndexVars[I], Record);<br>
+      Record.AddDeclRef(ArrayIndexVars[I]);<br>
   }<br>
<br>
   Code = serialization::EXPR_LAMBDA;<br>
@@ -1251,15 +1261,14 @@ void ASTStmtWriter::VisitLambdaExpr(Lamb<br>
<br>
 void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  Writer.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()),<br>
-                        Record);<br>
-  Writer.AddSourceRange(E->getAngleBrackets(), Record);<br>
+  Record.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()));<br>
+  Record.AddSourceRange(E->getAngleBrackets());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {<br>
@@ -1284,82 +1293,82 @@ void ASTStmtWriter::VisitCXXConstCastExp<br>
<br>
 void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {<br>
   VisitExplicitCastExpr(E);<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {<br>
   VisitCallExpr(E);<br>
-  Writer.AddSourceLocation(E->UDSuffixLoc, Record);<br>
+  Record.AddSourceLocation(E->UDSuffixLoc);<br>
   Code = serialization::EXPR_USER_DEFINED_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Code = serialization::EXPR_CXX_BOOL_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
   if (E->isTypeOperand()) {<br>
-    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);<br>
+    Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());<br>
     Code = serialization::EXPR_CXX_TYPEID_TYPE;<br>
   } else {<br>
-    Writer.AddStmt(E->getExprOperand());<br>
+    Record.AddStmt(E->getExprOperand());<br>
     Code = serialization::EXPR_CXX_TYPEID_EXPR;<br>
   }<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Record.push_back(E->isImplicit());<br>
   Code = serialization::EXPR_CXX_THIS;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getThrowLoc(), Record);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddSourceLocation(E->getThrowLoc());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Record.push_back(E->isThrownVariableInScope());<br>
   Code = serialization::EXPR_CXX_THROW;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getParam(), Record);<br>
-  Writer.AddSourceLocation(E->getUsedLocation(), Record);<br>
+  Record.AddDeclRef(E->getParam());<br>
+  Record.AddSourceLocation(E->getUsedLocation());<br>
   Code = serialization::EXPR_CXX_DEFAULT_ARG;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getField(), Record);<br>
-  Writer.AddSourceLocation(E->getExprLoc(), Record);<br>
+  Record.AddDeclRef(E->getField());<br>
+  Record.AddSourceLocation(E->getExprLoc());<br>
   Code = serialization::EXPR_CXX_DEFAULT_INIT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddCXXTemporary(E->getTemporary(), Record);<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddCXXTemporary(E->getTemporary());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Code = serialization::EXPR_CXX_BIND_TEMPORARY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;<br>
 }<br>
<br>
@@ -1370,15 +1379,15 @@ void ASTStmtWriter::VisitCXXNewExpr(CXXN<br>
   Record.push_back(E->doesUsualArrayDeleteWantSize());<br>
   Record.push_back(E->getNumPlacementArgs());<br>
   Record.push_back(E->StoredInitializationStyle);<br>
-  Writer.AddDeclRef(E->getOperatorNew(), Record);<br>
-  Writer.AddDeclRef(E->getOperatorDelete(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo(), Record);<br>
-  Writer.AddSourceRange(E->getTypeIdParens(), Record);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
-  Writer.AddSourceRange(E->getDirectInitRange(), Record);<br>
+  Record.AddDeclRef(E->getOperatorNew());<br>
+  Record.AddDeclRef(E->getOperatorDelete());<br>
+  Record.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo());<br>
+  Record.AddSourceRange(E->getTypeIdParens());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
+  Record.AddSourceRange(E->getDirectInitRange());<br>
   for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();<br>
        I != e; ++I)<br>
-    Writer.AddStmt(*I);<br>
+    Record.AddStmt(*I);<br>
<br>
   Code = serialization::EXPR_CXX_NEW;<br>
 }<br>
@@ -1389,9 +1398,9 @@ void ASTStmtWriter::VisitCXXDeleteExpr(C<br>
   Record.push_back(E->isArrayForm());<br>
   Record.push_back(E->isArrayFormAsWritten());<br>
   Record.push_back(E->doesUsualArrayDeleteWantSize());<br>
-  Writer.AddDeclRef(E->getOperatorDelete(), Record);<br>
-  Writer.AddStmt(E->getArgument());<br>
-  Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);<br>
+  Record.AddDeclRef(E->getOperatorDelete());<br>
+  Record.AddStmt(E->getArgument());<br>
+  Record.AddSourceLocation(E->getSourceRange().getBegin());<br>
<br>
   Code = serialization::EXPR_CXX_DELETE;<br>
 }<br>
@@ -1399,20 +1408,20 @@ void ASTStmtWriter::VisitCXXDeleteExpr(C<br>
 void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {<br>
   VisitExpr(E);<br>
<br>
-  Writer.AddStmt(E->getBase());<br>
+  Record.AddStmt(E->getBase());<br>
   Record.push_back(E->isArrow());<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
-  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);<br>
-  Writer.AddSourceLocation(E->getColonColonLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getTildeLoc(), Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
+  Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
+  Record.AddTypeSourceInfo(E->getScopeTypeInfo());<br>
+  Record.AddSourceLocation(E->getColonColonLoc());<br>
+  Record.AddSourceLocation(E->getTildeLoc());<br>
<br>
   // PseudoDestructorTypeStorage.<br>
-  Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);<br>
+  Record.AddIdentifierRef(E->getDestroyedTypeIdentifier());<br>
   if (E->getDestroyedTypeIdentifier())<br>
-    Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);<br>
+    Record.AddSourceLocation(E->getDestroyedTypeLoc());<br>
   else<br>
-    Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);<br>
+    Record.AddTypeSourceInfo(E->getDestroyedTypeInfo());<br>
<br>
   Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;<br>
 }<br>
@@ -1421,9 +1430,9 @@ void ASTStmtWriter::VisitExprWithCleanup<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumObjects());<br>
   for (unsigned i = 0, e = E->getNumObjects(); i != e; ++i)<br>
-    Writer.AddDeclRef(E->getObject(i), Record);<br>
+    Record.AddDeclRef(E->getObject(i));<br>
<br>
-  Writer.AddStmt(E->getSubExpr());<br>
+  Record.AddStmt(E->getSubExpr());<br>
   Code = serialization::EXPR_EXPR_WITH_CLEANUPS;<br>
 }<br>
<br>
@@ -1444,15 +1453,15 @@ ASTStmtWriter::VisitCXXDependentScopeMem<br>
   }<br>
<br>
   if (!E->isImplicitAccess())<br>
-    Writer.AddStmt(E->getBase());<br>
+    Record.AddStmt(E->getBase());<br>
   else<br>
-    Writer.AddStmt(nullptr);<br>
-  Writer.AddTypeRef(E->getBaseType(), Record);<br>
+    Record.AddStmt(nullptr);<br>
+  Record.AddTypeRef(E->getBaseType());<br>
   Record.push_back(E->isArrow());<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
-  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
-  Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);<br>
-  Writer.AddDeclarationNameInfo(E->MemberNameInfo, Record);<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
+  Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
+  Record.AddDeclRef(E->getFirstQualifierFoundInScope());<br>
+  Record.AddDeclarationNameInfo(E->MemberNameInfo);<br>
   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;<br>
 }<br>
<br>
@@ -1472,8 +1481,8 @@ ASTStmtWriter::VisitDependentScopeDeclRe<br>
                              E->getTrailingObjects<TemplateArgumentLoc>());<br>
   }<br>
<br>
-  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
-  Writer.AddDeclarationNameInfo(E->NameInfo, Record);<br>
+  Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
+  Record.AddDeclarationNameInfo(E->NameInfo);<br>
   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;<br>
 }<br>
<br>
@@ -1483,10 +1492,10 @@ ASTStmtWriter::VisitCXXUnresolvedConstru<br>
   Record.push_back(E->arg_size());<br>
   for (CXXUnresolvedConstructExpr::arg_iterator<br>
          ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)<br>
-    Writer.AddStmt(*ArgI);<br>
-  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);<br>
-  Writer.AddSourceLocation(E->getLParenLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
+    Record.AddStmt(*ArgI);<br>
+  Record.AddTypeSourceInfo(E->getTypeSourceInfo());<br>
+  Record.AddSourceLocation(E->getLParenLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
   Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;<br>
 }<br>
<br>
@@ -1507,21 +1516,21 @@ void ASTStmtWriter::VisitOverloadExpr(Ov<br>
   Record.push_back(E->getNumDecls());<br>
   for (OverloadExpr::decls_iterator<br>
          OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {<br>
-    Writer.AddDeclRef(OvI.getDecl(), Record);<br>
+    Record.AddDeclRef(OvI.getDecl());<br>
     Record.push_back(OvI.getAccess());<br>
   }<br>
<br>
-  Writer.AddDeclarationNameInfo(E->NameInfo, Record);<br>
-  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
+  Record.AddDeclarationNameInfo(E->NameInfo);<br>
+  Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {<br>
   VisitOverloadExpr(E);<br>
   Record.push_back(E->isArrow());<br>
   Record.push_back(E->hasUnresolvedUsing());<br>
-  Writer.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);<br>
-  Writer.AddTypeRef(E->getBaseType(), Record);<br>
-  Writer.AddSourceLocation(E->getOperatorLoc(), Record);<br>
+  Record.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);<br>
+  Record.AddTypeRef(E->getBaseType());<br>
+  Record.AddSourceLocation(E->getOperatorLoc());<br>
   Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;<br>
 }<br>
<br>
@@ -1529,7 +1538,7 @@ void ASTStmtWriter::VisitUnresolvedLooku<br>
   VisitOverloadExpr(E);<br>
   Record.push_back(E->requiresADL());<br>
   Record.push_back(E->isOverloaded());<br>
-  Writer.AddDeclRef(E->getNamingClass(), Record);<br>
+  Record.AddDeclRef(E->getNamingClass());<br>
   Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;<br>
 }<br>
<br>
@@ -1538,9 +1547,9 @@ void ASTStmtWriter::VisitTypeTraitExpr(T<br>
   Record.push_back(E->TypeTraitExprBits.NumArgs);<br>
   Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding<br>
   Record.push_back(E->TypeTraitExprBits.Value);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)<br>
-    Writer.AddTypeSourceInfo(E->getArg(I), Record);<br>
+    Record.AddTypeSourceInfo(E->getArg(I));<br>
   Code = serialization::EXPR_TYPE_TRAIT;<br>
 }<br>
<br>
@@ -1548,8 +1557,8 @@ void ASTStmtWriter::VisitArrayTypeTraitE<br>
   VisitExpr(E);<br>
   Record.push_back(E->getTrait());<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
-  Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
+  Record.AddTypeSourceInfo(E->getQueriedTypeSourceInfo());<br>
   Code = serialization::EXPR_ARRAY_TYPE_TRAIT;<br>
 }<br>
<br>
@@ -1557,24 +1566,24 @@ void ASTStmtWriter::VisitExpressionTrait<br>
   VisitExpr(E);<br>
   Record.push_back(E->getTrait());<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
-  Writer.AddStmt(E->getQueriedExpression());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
+  Record.AddStmt(E->getQueriedExpression());<br>
   Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getValue());<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
-  Writer.AddStmt(E->getOperand());<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
+  Record.AddStmt(E->getOperand());<br>
   Code = serialization::EXPR_CXX_NOEXCEPT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getEllipsisLoc(), Record);<br>
+  Record.AddSourceLocation(E->getEllipsisLoc());<br>
   Record.push_back(E->NumExpansions);<br>
-  Writer.AddStmt(E->getPattern());<br>
+  Record.AddStmt(E->getPattern());<br>
   Code = serialization::EXPR_PACK_EXPANSION;<br>
 }<br>
<br>
@@ -1582,13 +1591,13 @@ void ASTStmtWriter::VisitSizeOfPackExpr(<br>
   VisitExpr(E);<br>
   Record.push_back(E->isPartiallySubstituted() ? E->getPartialArguments().size()<br>
                                                : 0);<br>
-  Writer.AddSourceLocation(E->OperatorLoc, Record);<br>
-  Writer.AddSourceLocation(E->PackLoc, Record);<br>
-  Writer.AddSourceLocation(E->RParenLoc, Record);<br>
-  Writer.AddDeclRef(E->Pack, Record);<br>
+  Record.AddSourceLocation(E->OperatorLoc);<br>
+  Record.AddSourceLocation(E->PackLoc);<br>
+  Record.AddSourceLocation(E->RParenLoc);<br>
+  Record.AddDeclRef(E->Pack);<br>
   if (E->isPartiallySubstituted()) {<br>
     for (const auto &TA : E->getPartialArguments())<br>
-      Writer.AddTemplateArgument(TA, Record);<br>
+      Record.AddTemplateArgument(TA);<br>
   } else if (!E->isValueDependent()) {<br>
     Record.push_back(E->getPackLength());<br>
   }<br>
@@ -1598,55 +1607,55 @@ void ASTStmtWriter::VisitSizeOfPackExpr(<br>
 void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(<br>
                                               SubstNonTypeTemplateParmExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getParameter(), Record);<br>
-  Writer.AddSourceLocation(E->getNameLoc(), Record);<br>
-  Writer.AddStmt(E->getReplacement());<br>
+  Record.AddDeclRef(E->getParameter());<br>
+  Record.AddSourceLocation(E->getNameLoc());<br>
+  Record.AddStmt(E->getReplacement());<br>
   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(<br>
                                           SubstNonTypeTemplateParmPackExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddDeclRef(E->getParameterPack(), Record);<br>
-  Writer.AddTemplateArgument(E->getArgumentPack(), Record);<br>
-  Writer.AddSourceLocation(E->getParameterPackLocation(), Record);<br>
+  Record.AddDeclRef(E->getParameterPack());<br>
+  Record.AddTemplateArgument(E->getArgumentPack());<br>
+  Record.AddSourceLocation(E->getParameterPackLocation());<br>
   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->getNumExpansions());<br>
-  Writer.AddDeclRef(E->getParameterPack(), Record);<br>
-  Writer.AddSourceLocation(E->getParameterPackLocation(), Record);<br>
+  Record.AddDeclRef(E->getParameterPack());<br>
+  Record.AddSourceLocation(E->getParameterPackLocation());<br>
   for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();<br>
        I != End; ++I)<br>
-    Writer.AddDeclRef(*I, Record);<br>
+    Record.AddDeclRef(*I);<br>
   Code = serialization::EXPR_FUNCTION_PARM_PACK;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getTemporary());<br>
-  Writer.AddDeclRef(E->getExtendingDecl(), Record);<br>
+  Record.AddStmt(E->getTemporary());<br>
+  Record.AddDeclRef(E->getExtendingDecl());<br>
   Record.push_back(E->getManglingNumber());<br>
   Code = serialization::EXPR_MATERIALIZE_TEMPORARY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->LParenLoc, Record);<br>
-  Writer.AddSourceLocation(E->EllipsisLoc, Record);<br>
-  Writer.AddSourceLocation(E->RParenLoc, Record);<br>
-  Writer.AddStmt(E->SubExprs[0]);<br>
-  Writer.AddStmt(E->SubExprs[1]);<br>
+  Record.AddSourceLocation(E->LParenLoc);<br>
+  Record.AddSourceLocation(E->EllipsisLoc);<br>
+  Record.AddSourceLocation(E->RParenLoc);<br>
+  Record.AddStmt(E->SubExprs[0]);<br>
+  Record.AddStmt(E->SubExprs[1]);<br>
   Record.push_back(E->Opcode);<br>
   Code = serialization::EXPR_CXX_FOLD;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getSourceExpr());<br>
-  Writer.AddSourceLocation(E->getLocation(), Record);<br>
+  Record.AddStmt(E->getSourceExpr());<br>
+  Record.AddSourceLocation(E->getLocation());<br>
   Code = serialization::EXPR_OPAQUE_VALUE;<br>
 }<br>
<br>
@@ -1662,7 +1671,7 @@ void ASTStmtWriter::VisitTypoExpr(TypoEx<br>
<br>
 void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {<br>
   VisitCallExpr(E);<br>
-  Writer.AddStmt(E->getConfig());<br>
+  Record.AddStmt(E->getConfig());<br>
   Code = serialization::EXPR_CUDA_KERNEL_CALL;<br>
 }<br>
<br>
@@ -1671,9 +1680,9 @@ void ASTStmtWriter::VisitCUDAKernelCallE<br>
 //===----------------------------------------------------------------------===//<br>
 void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getRParenLoc(), Record);<br>
-  Writer.AddStmt(E->getSrcExpr());<br>
+  Record.AddSourceLocation(E->getBuiltinLoc());<br>
+  Record.AddSourceLocation(E->getRParenLoc());<br>
+  Record.AddStmt(E->getSrcExpr());<br>
   Code = serialization::EXPR_ASTYPE;<br>
 }<br>
<br>
@@ -1683,61 +1692,61 @@ void ASTStmtWriter::VisitAsTypeExpr(AsTy<br>
 void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {<br>
   VisitExpr(E);<br>
   Record.push_back(E->isArrow());<br>
-  Writer.AddStmt(E->getBaseExpr());<br>
-  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);<br>
-  Writer.AddSourceLocation(E->getMemberLoc(), Record);<br>
-  Writer.AddDeclRef(E->getPropertyDecl(), Record);<br>
+  Record.AddStmt(E->getBaseExpr());<br>
+  Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());<br>
+  Record.AddSourceLocation(E->getMemberLoc());<br>
+  Record.AddDeclRef(E->getPropertyDecl());<br>
   Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddStmt(E->getBase());<br>
-  Writer.AddStmt(E->getIdx());<br>
-  Writer.AddSourceLocation(E->getRBracketLoc(), Record);<br>
+  Record.AddStmt(E->getBase());<br>
+  Record.AddStmt(E->getIdx());<br>
+  Record.AddSourceLocation(E->getRBracketLoc());<br>
   Code = serialization::EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {<br>
   VisitExpr(E);<br>
-  Writer.AddSourceRange(E->getSourceRange(), Record);<br>
-  Writer.AddString(E->getUuidStr(), Record);<br>
+  Record.AddSourceRange(E->getSourceRange());<br>
+  Record.AddString(E->getUuidStr());<br>
   if (E->isTypeOperand()) {<br>
-    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);<br>
+    Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());<br>
     Code = serialization::EXPR_CXX_UUIDOF_TYPE;<br>
   } else {<br>
-    Writer.AddStmt(E->getExprOperand());<br>
+    Record.AddStmt(E->getExprOperand());<br>
     Code = serialization::EXPR_CXX_UUIDOF_EXPR;<br>
   }<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getExceptLoc(), Record);<br>
-  Writer.AddStmt(S->getFilterExpr());<br>
-  Writer.AddStmt(S->getBlock());<br>
+  Record.AddSourceLocation(S->getExceptLoc());<br>
+  Record.AddStmt(S->getFilterExpr());<br>
+  Record.AddStmt(S->getBlock());<br>
   Code = serialization::STMT_SEH_EXCEPT;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getFinallyLoc(), Record);<br>
-  Writer.AddStmt(S->getBlock());<br>
+  Record.AddSourceLocation(S->getFinallyLoc());<br>
+  Record.AddStmt(S->getBlock());<br>
   Code = serialization::STMT_SEH_FINALLY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {<br>
   VisitStmt(S);<br>
   Record.push_back(S->getIsCXXTry());<br>
-  Writer.AddSourceLocation(S->getTryLoc(), Record);<br>
-  Writer.AddStmt(S->getTryBlock());<br>
-  Writer.AddStmt(S->getHandler());<br>
+  Record.AddSourceLocation(S->getTryLoc());<br>
+  Record.AddStmt(S->getTryBlock());<br>
+  Record.AddStmt(S->getHandler());<br>
   Code = serialization::STMT_SEH_TRY;<br>
 }<br>
<br>
 void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {<br>
   VisitStmt(S);<br>
-  Writer.AddSourceLocation(S->getLeaveLoc(), Record);<br>
+  Record.AddSourceLocation(S->getLeaveLoc());<br>
   Code = serialization::STMT_SEH_LEAVE;<br>
 }<br>
<br>
@@ -1747,11 +1756,9 @@ void ASTStmtWriter::VisitSEHLeaveStmt(SE<br>
<br>
 namespace clang {<br>
 class OMPClauseWriter : public OMPClauseVisitor<OMPClauseWriter> {<br>
-  ASTStmtWriter *Writer;<br>
-  ASTWriter::RecordData &Record;<br>
+  ASTRecordWriter &Record;<br>
 public:<br>
-  OMPClauseWriter(ASTStmtWriter *W, ASTWriter::RecordData &Record)<br>
-    : Writer(W), Record(Record) { }<br>
+  OMPClauseWriter(ASTRecordWriter &Record) : Record(Record) {}<br>
 #define OPENMP_CLAUSE(Name, Class)    \<br>
   void Visit##Class(Class *S);<br>
 #include "clang/Basic/OpenMPKinds.def"<br>
@@ -1764,62 +1771,62 @@ public:<br>
 void OMPClauseWriter::writeClause(OMPClause *C) {<br>
   Record.push_back(C->getClauseKind());<br>
   Visit(C);<br>
-  Writer->Writer.AddSourceLocation(C->getLocStart(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getLocEnd(), Record);<br>
+  Record.AddSourceLocation(C->getLocStart());<br>
+  Record.AddSourceLocation(C->getLocEnd());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {<br>
-  Writer->Writer.AddStmt(C->getPreInitStmt());<br>
+  Record.AddStmt(C->getPreInitStmt());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {<br>
   VisitOMPClauseWithPreInit(C);<br>
-  Writer->Writer.AddStmt(C->getPostUpdateExpr());<br>
+  Record.AddStmt(C->getPostUpdateExpr());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPIfClause(OMPIfClause *C) {<br>
   Record.push_back(C->getNameModifier());<br>
-  Writer->Writer.AddSourceLocation(C->getNameModifierLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
-  Writer->Writer.AddStmt(C->getCondition());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getNameModifierLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
+  Record.AddStmt(C->getCondition());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPFinalClause(OMPFinalClause *C) {<br>
-  Writer->Writer.AddStmt(C->getCondition());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getCondition());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {<br>
-  Writer->Writer.AddStmt(C->getNumThreads());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getNumThreads());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPSafelenClause(OMPSafelenClause *C) {<br>
-  Writer->Writer.AddStmt(C->getSafelen());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getSafelen());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPSimdlenClause(OMPSimdlenClause *C) {<br>
-  Writer->Writer.AddStmt(C->getSimdlen());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getSimdlen());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPCollapseClause(OMPCollapseClause *C) {<br>
-  Writer->Writer.AddStmt(C->getNumForLoops());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getNumForLoops());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) {<br>
   Record.push_back(C->getDefaultKind());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getDefaultKindKwLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getDefaultKindKwLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *C) {<br>
   Record.push_back(C->getProcBindKind());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getProcBindKindKwLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getProcBindKindKwLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *C) {<br>
@@ -1827,17 +1834,17 @@ void OMPClauseWriter::VisitOMPScheduleCl<br>
   Record.push_back(C->getScheduleKind());<br>
   Record.push_back(C->getFirstScheduleModifier());<br>
   Record.push_back(C->getSecondScheduleModifier());<br>
-  Writer->Writer.AddStmt(C->getChunkSize());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getFirstScheduleModifierLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getSecondScheduleModifierLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getScheduleKindLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getCommaLoc(), Record);<br>
+  Record.AddStmt(C->getChunkSize());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getFirstScheduleModifierLoc());<br>
+  Record.AddSourceLocation(C->getSecondScheduleModifierLoc());<br>
+  Record.AddSourceLocation(C->getScheduleKindLoc());<br>
+  Record.AddSourceLocation(C->getCommaLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *C) {<br>
-  Writer->Writer.AddStmt(C->getNumForLoops());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getNumForLoops());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *) {}<br>
@@ -1864,225 +1871,225 @@ void OMPClauseWriter::VisitOMPNogroupCla<br>
<br>
 void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->private_copies()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
   VisitOMPClauseWithPreInit(C);<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->private_copies()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->inits()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
   VisitOMPClauseWithPostUpdate(C);<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   for (auto *E : C->private_copies())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->source_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->destination_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->assignment_ops())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
   VisitOMPClauseWithPostUpdate(C);<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
-  Writer->Writer.AddNestedNameSpecifierLoc(C->getQualifierLoc(), Record);<br>
-  Writer->Writer.AddDeclarationNameInfo(C->getNameInfo(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
+  Record.AddNestedNameSpecifierLoc(C->getQualifierLoc());<br>
+  Record.AddDeclarationNameInfo(C->getNameInfo());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   for (auto *VE : C->privates())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   for (auto *E : C->lhs_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->rhs_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->reduction_ops())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
   VisitOMPClauseWithPostUpdate(C);<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
   Record.push_back(C->getModifier());<br>
-  Writer->Writer.AddSourceLocation(C->getModifierLoc(), Record);<br>
+  Record.AddSourceLocation(C->getModifierLoc());<br>
   for (auto *VE : C->varlists()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->privates()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->inits()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->updates()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
   for (auto *VE : C->finals()) {<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   }<br>
-  Writer->Writer.AddStmt(C->getStep());<br>
-  Writer->Writer.AddStmt(C->getCalcStep());<br>
+  Record.AddStmt(C->getStep());<br>
+  Record.AddStmt(C->getCalcStep());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
-  Writer->Writer.AddStmt(C->getAlignment());<br>
+    Record.AddStmt(VE);<br>
+  Record.AddStmt(C->getAlignment());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   for (auto *E : C->source_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->destination_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->assignment_ops())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
   for (auto *E : C->source_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->destination_exprs())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
   for (auto *E : C->assignment_ops())<br>
-    Writer->Writer.AddStmt(E);<br>
+    Record.AddStmt(E);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   Record.push_back(C->getDependencyKind());<br>
-  Writer->Writer.AddSourceLocation(C->getDependencyLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
+  Record.AddSourceLocation(C->getDependencyLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *C) {<br>
-  Writer->Writer.AddStmt(C->getDevice());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getDevice());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *C) {<br>
   Record.push_back(C->varlist_size());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
   Record.push_back(C->getMapTypeModifier());<br>
   Record.push_back(C->getMapType());<br>
-  Writer->Writer.AddSourceLocation(C->getMapLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);<br>
+  Record.AddSourceLocation(C->getMapLoc());<br>
+  Record.AddSourceLocation(C->getColonLoc());<br>
   for (auto *VE : C->varlists())<br>
-    Writer->Writer.AddStmt(VE);<br>
+    Record.AddStmt(VE);<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {<br>
-  Writer->Writer.AddStmt(C->getNumTeams());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getNumTeams());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {<br>
-  Writer->Writer.AddStmt(C->getThreadLimit());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getThreadLimit());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *C) {<br>
-  Writer->Writer.AddStmt(C->getPriority());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getPriority());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {<br>
-  Writer->Writer.AddStmt(C->getGrainsize());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getGrainsize());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *C) {<br>
-  Writer->Writer.AddStmt(C->getNumTasks());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getNumTasks());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *C) {<br>
-  Writer->Writer.AddStmt(C->getHint());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
+  Record.AddStmt(C->getHint());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {<br>
   VisitOMPClauseWithPreInit(C);<br>
   Record.push_back(C->getDistScheduleKind());<br>
-  Writer->Writer.AddStmt(C->getChunkSize());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getDistScheduleKindLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getCommaLoc(), Record);<br>
+  Record.AddStmt(C->getChunkSize());<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getDistScheduleKindLoc());<br>
+  Record.AddSourceLocation(C->getCommaLoc());<br>
 }<br>
<br>
 void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {<br>
   Record.push_back(C->getDefaultmapKind());<br>
   Record.push_back(C->getDefaultmapModifier());<br>
-  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getDefaultmapModifierLoc(), Record);<br>
-  Writer->Writer.AddSourceLocation(C->getDefaultmapKindLoc(), Record);<br>
+  Record.AddSourceLocation(C->getLParenLoc());<br>
+  Record.AddSourceLocation(C->getDefaultmapModifierLoc());<br>
+  Record.AddSourceLocation(C->getDefaultmapKindLoc());<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 // OpenMP Directives.<br>
 //===----------------------------------------------------------------------===//<br>
 void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {<br>
-  Writer.AddSourceLocation(E->getLocStart(), Record);<br>
-  Writer.AddSourceLocation(E->getLocEnd(), Record);<br>
-  OMPClauseWriter ClauseWriter(this, Record);<br>
+  Record.AddSourceLocation(E->getLocStart());<br>
+  Record.AddSourceLocation(E->getLocEnd());<br>
+  OMPClauseWriter ClauseWriter(Record);<br>
   for (unsigned i = 0; i < E->getNumClauses(); ++i) {<br>
     ClauseWriter.writeClause(E->getClause(i));<br>
   }<br>
   if (E->hasAssociatedStmt())<br>
-    Writer.AddStmt(E->getAssociatedStmt());<br>
+    Record.AddStmt(E->getAssociatedStmt());<br>
 }<br>
<br>
 void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {<br>
@@ -2090,39 +2097,39 @@ void ASTStmtWriter::VisitOMPLoopDirectiv<br>
   Record.push_back(D->getNumClauses());<br>
   Record.push_back(D->getCollapsedNumber());<br>
   VisitOMPExecutableDirective(D);<br>
-  Writer.AddStmt(D->getIterationVariable());<br>
-  Writer.AddStmt(D->getLastIteration());<br>
-  Writer.AddStmt(D->getCalcLastIteration());<br>
-  Writer.AddStmt(D->getPreCond());<br>
-  Writer.AddStmt(D->getCond());<br>
-  Writer.AddStmt(D->getInit());<br>
-  Writer.AddStmt(D->getInc());<br>
-  Writer.AddStmt(D->getPreInits());<br>
+  Record.AddStmt(D->getIterationVariable());<br>
+  Record.AddStmt(D->getLastIteration());<br>
+  Record.AddStmt(D->getCalcLastIteration());<br>
+  Record.AddStmt(D->getPreCond());<br>
+  Record.AddStmt(D->getCond());<br>
+  Record.AddStmt(D->getInit());<br>
+  Record.AddStmt(D->getInc());<br>
+  Record.AddStmt(D->getPreInits());<br>
   if (isOpenMPWorksharingDirective(D->getDirectiveKind()) ||<br>
       isOpenMPTaskLoopDirective(D->getDirectiveKind()) ||<br>
       isOpenMPDistributeDirective(D->getDirectiveKind())) {<br>
-    Writer.AddStmt(D->getIsLastIterVariable());<br>
-    Writer.AddStmt(D->getLowerBoundVariable());<br>
-    Writer.AddStmt(D->getUpperBoundVariable());<br>
-    Writer.AddStmt(D->getStrideVariable());<br>
-    Writer.AddStmt(D->getEnsureUpperBound());<br>
-    Writer.AddStmt(D->getNextLowerBound());<br>
-    Writer.AddStmt(D->getNextUpperBound());<br>
+    Record.AddStmt(D->getIsLastIterVariable());<br>
+    Record.AddStmt(D->getLowerBoundVariable());<br>
+    Record.AddStmt(D->getUpperBoundVariable());<br>
+    Record.AddStmt(D->getStrideVariable());<br>
+    Record.AddStmt(D->getEnsureUpperBound());<br>
+    Record.AddStmt(D->getNextLowerBound());<br>
+    Record.AddStmt(D->getNextUpperBound());<br>
   }<br>
   for (auto I : D->counters()) {<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   }<br>
   for (auto I : D->private_counters()) {<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   }<br>
   for (auto I : D->inits()) {<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   }<br>
   for (auto I : D->updates()) {<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   }<br>
   for (auto I : D->finals()) {<br>
-    Writer.AddStmt(I);<br>
+    Record.AddStmt(I);<br>
   }<br>
 }<br>
<br>
@@ -2182,7 +2189,7 @@ void ASTStmtWriter::VisitOMPCriticalDire<br>
   VisitStmt(D);<br>
   Record.push_back(D->getNumClauses());<br>
   VisitOMPExecutableDirective(D);<br>
-  Writer.AddDeclarationNameInfo(D->getDirectiveName(), Record);<br>
+  Record.AddDeclarationNameInfo(D->getDirectiveName());<br>
   Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;<br>
 }<br>
<br>
@@ -2219,10 +2226,10 @@ void ASTStmtWriter::VisitOMPAtomicDirect<br>
   VisitStmt(D);<br>
   Record.push_back(D->getNumClauses());<br>
   VisitOMPExecutableDirective(D);<br>
-  Writer.AddStmt(D->getX());<br>
-  Writer.AddStmt(D->getV());<br>
-  Writer.AddStmt(D->getExpr());<br>
-  Writer.AddStmt(D->getUpdateExpr());<br>
+  Record.AddStmt(D->getX());<br>
+  Record.AddStmt(D->getV());<br>
+  Record.AddStmt(D->getExpr());<br>
+  Record.AddStmt(D->getUpdateExpr());<br>
   Record.push_back(D->isXLHSInRHSPart() ? 1 : 0);<br>
   Record.push_back(D->isPostfixUpdate() ? 1 : 0);<br>
   Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;<br>
@@ -2411,61 +2418,44 @@ void ASTWriter::WriteSubStmt(Stmt *S,<br>
   ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);<br>
 #endif<br>
<br>
-  // Redirect ASTWriter::AddStmt to collect sub-stmts.<br>
-  SmallVector<Stmt *, 16> SubStmts;<br>
-  CollectedStmts = &SubStmts;<br>
-<br>
-  Writer.Code = serialization::STMT_NULL_PTR;<br>
-  Writer.AbbrevToUse = 0;<br>
   Writer.Visit(S);<br>
<br>
-#ifndef NDEBUG<br>
-  if (Writer.Code == serialization::STMT_NULL_PTR) {<br>
-    SourceManager &SrcMgr<br>
-      = DeclIDs.begin()->first->getASTContext().getSourceManager();<br>
-    S->dump(SrcMgr);<br>
-    llvm_unreachable("Unhandled sub-statement writing AST file");<br>
-  }<br>
-#endif<br>
-<br>
-  // Revert ASTWriter::AddStmt.<br>
-  CollectedStmts = &StmtsToEmit;<br>
-<br>
-  // Write the sub-stmts in reverse order, last to first. When reading them back<br>
-  // we will read them in correct order by "pop"ing them from the Stmts stack.<br>
-  // This simplifies reading and allows to store a variable number of sub-stmts<br>
-  // without knowing it in advance.<br>
-  while (!SubStmts.empty())<br>
-    WriteSubStmt(SubStmts.pop_back_val(), SubStmtEntries, ParentStmts);<br>
-<br>
-  Stream.EmitRecord(Writer.Code, Record, Writer.AbbrevToUse);<br>
-<br>
-  SubStmtEntries[S] = Stream.GetCurrentBitNo();<br>
+  SubStmtEntries[S] = Writer.Emit(S);<br>
 }<br>
<br>
 /// \brief Flush all of the statements that have been added to the<br>
 /// queue via AddStmt().<br>
-void ASTWriter::FlushStmts() {<br>
-  RecordData Record;<br>
-<br>
+void ASTRecordWriter::FlushStmts() {<br>
   // We expect to be the only consumer of the two temporary statement maps,<br>
   // assert that they are empty.<br>
-  assert(SubStmtEntries.empty() && "unexpected entries in sub-stmt map");<br>
-  assert(ParentStmts.empty() && "unexpected entries in parent stmt map");<br>
+  assert(Writer->SubStmtEntries.empty() && "unexpected entries in sub-stmt map");<br>
+  assert(Writer->ParentStmts.empty() && "unexpected entries in parent stmt map");<br>
<br>
   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {<br>
-    WriteSubStmt(StmtsToEmit[I], SubStmtEntries, ParentStmts);<br>
+    Writer->WriteSubStmt(StmtsToEmit[I], Writer->SubStmtEntries, Writer->ParentStmts);<br>
<br>
-    assert(N == StmtsToEmit.size() &&<br>
-           "Substatement written via AddStmt rather than WriteSubStmt!");<br>
+    assert(N == StmtsToEmit.size() && "record modified while being written!");<br>
<br>
     // Note that we are at the end of a full expression. Any<br>
     // expression records that follow this one are part of a different<br>
     // expression.<br>
-    Stream.EmitRecord(serialization::STMT_STOP, Record);<br>
+    Writer->Stream.EmitRecord(serialization::STMT_STOP, ArrayRef<uint32_t>());<br>
+<br>
+    Writer->SubStmtEntries.clear();<br>
+    Writer->ParentStmts.clear();<br>
+  }<br>
<br>
-    SubStmtEntries.clear();<br>
-    ParentStmts.clear();<br>
+  StmtsToEmit.clear();<br>
+}<br>
+<br>
+void ASTRecordWriter::FlushSubStmts() {<br>
+  // For a nested statement, write out the substatements in reverse order (so<br>
+  // that a simple stack machine can be used when loading), and don't emit a<br>
+  // STMT_STOP after each one.<br>
+  for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {<br>
+    Writer->WriteSubStmt(StmtsToEmit[N - I - 1],<br>
+                         Writer->SubStmtEntries, Writer->ParentStmts);<br>
+    assert(N == StmtsToEmit.size() && "record modified while being written!");<br>
   }<br>
<br>
   StmtsToEmit.clear();<br>
<br>
Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=265518&r1=265517&r2=265518&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=265518&r1=265517&r2=265518&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)<br>
+++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Wed Apr  6 01:26:08 2016<br>
@@ -87,16 +87,13 @@ static std::string ReadPCHRecord(StringR<br>
<br>
 // Assumes that the way to get the value is SA->getname()<br>
 static std::string WritePCHRecord(StringRef type, StringRef name) {<br>
-  return StringSwitch<std::string>(type)<br>
-    .EndsWith("Decl *", "AddDeclRef(" + std::string(name) +<br>
-                        ", Record);\n")<br>
-    .Case("TypeSourceInfo *",<br>
-          "AddTypeSourceInfo(" + std::string(name) + ", Record);\n")<br>
+  return "Record." + StringSwitch<std::string>(type)<br>
+    .EndsWith("Decl *", "AddDeclRef(" + std::string(name) + ");\n")<br>
+    .Case("TypeSourceInfo *", "AddTypeSourceInfo(" + std::string(name) + ");\n")<br>
     .Case("Expr *", "AddStmt(" + std::string(name) + ");\n")<br>
-    .Case("IdentifierInfo *",<br>
-          "AddIdentifierRef(" + std::string(name) + ", Record);\n")<br>
-    .Case("StringRef", "AddString(" + std::string(name) + ", Record);\n")<br>
-    .Default("Record.push_back(" + std::string(name) + ");\n");<br>
+    .Case("IdentifierInfo *", "AddIdentifierRef(" + std::string(name) + ");\n")<br>
+    .Case("StringRef", "AddString(" + std::string(name) + ");\n")<br>
+    .Default("push_back(" + std::string(name) + ");\n");<br>
 }<br>
<br>
 // Normalize attribute name by removing leading and trailing<br>
@@ -371,7 +368,7 @@ namespace {<br>
       OS << getLowerName();<br>
     }<br>
     void writePCHWrite(raw_ostream &OS) const override {<br>
-      OS << "    AddString(SA->get" << getUpperName() << "(), Record);\n";<br>
+      OS << "    Record.AddString(SA->get" << getUpperName() << "());\n";<br>
     }<br>
     void writeValue(raw_ostream &OS) const override {<br>
       OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";<br>
@@ -487,10 +484,10 @@ namespace {<br>
     void writePCHWrite(raw_ostream &OS) const override {<br>
       OS << "    Record.push_back(SA->is" << getUpperName() << "Expr());\n";<br>
       OS << "    if (SA->is" << getUpperName() << "Expr())\n";<br>
-      OS << "      AddStmt(SA->get" << getUpperName() << "Expr());\n";<br>
+      OS << "      Record.AddStmt(SA->get" << getUpperName() << "Expr());\n";<br>
       OS << "    else\n";<br>
-      OS << "      AddTypeSourceInfo(SA->get" << getUpperName()<br>
-         << "Type(), Record);\n";<br>
+      OS << "      Record.AddTypeSourceInfo(SA->get" << getUpperName()<br>
+         << "Type());\n";<br>
     }<br>
     void writeValue(raw_ostream &OS) const override {<br>
       OS << "\";\n";<br>
@@ -887,7 +884,7 @@ namespace {<br>
       OS << getLowerName();<br>
     }<br>
     void writePCHWrite(raw_ostream &OS) const override {<br>
-      OS << "    AddVersionTuple(SA->get" << getUpperName() << "(), Record);\n";<br>
+      OS << "    Record.AddVersionTuple(SA->get" << getUpperName() << "());\n";<br>
     }<br>
     void writeValue(raw_ostream &OS) const override {<br>
       OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>