15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \file
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Implements serialization for Statements and Expressions.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Serialization/ASTWriter.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "clang/AST/ASTContext.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/DeclCXX.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/DeclObjC.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/DeclTemplate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/StmtVisitor.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Lex/Token.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Bitcode/BitstreamWriter.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace clang;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Statement/expression serialization
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    friend class OMPClauseWriter;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASTWriter &Writer;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASTWriter::RecordData &Record;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  public:
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    serialization::StmtCode Code;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned AbbrevToUse;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Writer(Writer), Record(Record) { }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void VisitStmt(Stmt *S);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define STMT(Type, Base) \
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void Visit##Type(Type *);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/StmtNodes.inc"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ASTStmtWriter::
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(Args.getTemplateKeywordLoc(), Record);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(Args.LAngleLoc, Record);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(Args.RAngleLoc, Record);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ASTStmtWriter::VisitStmt(Stmt *S) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitStmt(S);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(S->getSemiLoc(), Record);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Record.push_back(S->HasLeadingEmptyMacro);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_NULL;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Record.push_back(S->size());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (auto *CS : S->body())
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Writer.AddStmt(CS);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getLBracLoc(), Record);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getRBracLoc(), Record);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_COMPOUND;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Record.push_back(Writer.getSwitchCaseID(S));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getKeywordLoc(), Record);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getColonLoc(), Record);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitSwitchCase(S);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getLHS());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getRHS());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getSubStmt());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
94bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Code = serialization::STMT_CASE;
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitSwitchCase(S);
99bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Writer.AddStmt(S->getSubStmt());
100bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Code = serialization::STMT_DEFAULT;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddDeclRef(S->getDecl(), Record);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddStmt(S->getSubStmt());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(S->getIdentLoc(), Record);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Code = serialization::STMT_LABEL;
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Record.push_back(S->getAttrs().size());
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.WriteAttributes(S->getAttrs(), Record);
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddStmt(S->getSubStmt());
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getAttrLoc(), Record);
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Code = serialization::STMT_ATTRIBUTED;
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddDeclRef(S->getConditionVariable(), Record);
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddStmt(S->getCond());
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddStmt(S->getThen());
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddStmt(S->getElse());
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getIfLoc(), Record);
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getElseLoc(), Record);
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Code = serialization::STMT_IF;
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddDeclRef(S->getConditionVariable(), Record);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getCond());
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Writer.AddStmt(S->getBody());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getSwitchLoc(), Record);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Record.push_back(S->isAllEnumCasesCovered());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (SwitchCase *SC = S->getSwitchCaseList(); SC;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       SC = SC->getNextSwitchCase())
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Record.push_back(Writer.RecordSwitchCaseID(SC));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_SWITCH;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddDeclRef(S->getConditionVariable(), Record);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getCond());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getBody());
149bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Writer.AddSourceLocation(S->getWhileLoc(), Record);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_WHILE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitStmt(S);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddStmt(S->getCond());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddStmt(S->getBody());
157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Writer.AddSourceLocation(S->getDoLoc(), Record);
158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Writer.AddSourceLocation(S->getWhileLoc(), Record);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(S->getRParenLoc(), Record);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Code = serialization::STMT_DO;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ASTStmtWriter::VisitForStmt(ForStmt *S) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitStmt(S);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddStmt(S->getInit());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddStmt(S->getCond());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddDeclRef(S->getConditionVariable(), Record);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getInc());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getBody());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getForLoc(), Record);
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getLParenLoc(), Record);
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getRParenLoc(), Record);
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Code = serialization::STMT_FOR;
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddDeclRef(S->getLabel(), Record);
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getGotoLoc(), Record);
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getLabelLoc(), Record);
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Code = serialization::STMT_GOTO;
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getGotoLoc(), Record);
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddSourceLocation(S->getStarLoc(), Record);
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Writer.AddStmt(S->getTarget());
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Code = serialization::STMT_INDIRECT_GOTO;
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisitStmt(S);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getContinueLoc(), Record);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_CONTINUE;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getBreakLoc(), Record);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code = serialization::STMT_BREAK;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddStmt(S->getRetValue());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getReturnLoc(), Record);
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Writer.AddDeclRef(S->getNRVOCandidate(), Record);
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Code = serialization::STMT_RETURN;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitStmt(S);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Writer.AddSourceLocation(S->getStartLoc(), Record);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Writer.AddSourceLocation(S->getEndLoc(), Record);
216  DeclGroupRef DG = S->getDeclGroup();
217  for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
218    Writer.AddDeclRef(*D, Record);
219  Code = serialization::STMT_DECL;
220}
221
222void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
223  VisitStmt(S);
224  Record.push_back(S->getNumOutputs());
225  Record.push_back(S->getNumInputs());
226  Record.push_back(S->getNumClobbers());
227  Writer.AddSourceLocation(S->getAsmLoc(), Record);
228  Record.push_back(S->isVolatile());
229  Record.push_back(S->isSimple());
230}
231
232void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
233  VisitAsmStmt(S);
234  Writer.AddSourceLocation(S->getRParenLoc(), Record);
235  Writer.AddStmt(S->getAsmString());
236
237  // Outputs
238  for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
239    Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
240    Writer.AddStmt(S->getOutputConstraintLiteral(I));
241    Writer.AddStmt(S->getOutputExpr(I));
242  }
243
244  // Inputs
245  for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
246    Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
247    Writer.AddStmt(S->getInputConstraintLiteral(I));
248    Writer.AddStmt(S->getInputExpr(I));
249  }
250
251  // Clobbers
252  for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
253    Writer.AddStmt(S->getClobberStringLiteral(I));
254
255  Code = serialization::STMT_GCCASM;
256}
257
258void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
259  VisitAsmStmt(S);
260  Writer.AddSourceLocation(S->getLBraceLoc(), Record);
261  Writer.AddSourceLocation(S->getEndLoc(), Record);
262  Record.push_back(S->getNumAsmToks());
263  Writer.AddString(S->getAsmString(), Record);
264
265  // Tokens
266  for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {
267    Writer.AddToken(S->getAsmToks()[I], Record);
268  }
269
270  // Clobbers
271  for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {
272    Writer.AddString(S->getClobber(I), Record);
273  }
274
275  // Outputs
276  for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
277    Writer.AddStmt(S->getOutputExpr(I));
278    Writer.AddString(S->getOutputConstraint(I), Record);
279  }
280
281  // Inputs
282  for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
283    Writer.AddStmt(S->getInputExpr(I));
284    Writer.AddString(S->getInputConstraint(I), Record);
285  }
286
287  Code = serialization::STMT_MSASM;
288}
289
290void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
291  VisitStmt(S);
292  // NumCaptures
293  Record.push_back(std::distance(S->capture_begin(), S->capture_end()));
294
295  // CapturedDecl and captured region kind
296  Writer.AddDeclRef(S->getCapturedDecl(), Record);
297  Record.push_back(S->getCapturedRegionKind());
298
299  Writer.AddDeclRef(S->getCapturedRecordDecl(), Record);
300
301  // Capture inits
302  for (auto *I : S->capture_inits())
303    Writer.AddStmt(I);
304
305  // Body
306  Writer.AddStmt(S->getCapturedStmt());
307
308  // Captures
309  for (const auto &I : S->captures()) {
310    if (I.capturesThis())
311      Writer.AddDeclRef(nullptr, Record);
312    else
313      Writer.AddDeclRef(I.getCapturedVar(), Record);
314    Record.push_back(I.getCaptureKind());
315    Writer.AddSourceLocation(I.getLocation(), Record);
316  }
317
318  Code = serialization::STMT_CAPTURED;
319}
320
321void ASTStmtWriter::VisitExpr(Expr *E) {
322  VisitStmt(E);
323  Writer.AddTypeRef(E->getType(), Record);
324  Record.push_back(E->isTypeDependent());
325  Record.push_back(E->isValueDependent());
326  Record.push_back(E->isInstantiationDependent());
327  Record.push_back(E->containsUnexpandedParameterPack());
328  Record.push_back(E->getValueKind());
329  Record.push_back(E->getObjectKind());
330}
331
332void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
333  VisitExpr(E);
334  Writer.AddSourceLocation(E->getLocation(), Record);
335  Record.push_back(E->getIdentType()); // FIXME: stable encoding
336  Code = serialization::EXPR_PREDEFINED;
337}
338
339void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
340  VisitExpr(E);
341
342  Record.push_back(E->hasQualifier());
343  Record.push_back(E->getDecl() != E->getFoundDecl());
344  Record.push_back(E->hasTemplateKWAndArgsInfo());
345  Record.push_back(E->hadMultipleCandidates());
346  Record.push_back(E->refersToEnclosingLocal());
347
348  if (E->hasTemplateKWAndArgsInfo()) {
349    unsigned NumTemplateArgs = E->getNumTemplateArgs();
350    Record.push_back(NumTemplateArgs);
351  }
352
353  DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
354
355  if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
356      (E->getDecl() == E->getFoundDecl()) &&
357      nk == DeclarationName::Identifier) {
358    AbbrevToUse = Writer.getDeclRefExprAbbrev();
359  }
360
361  if (E->hasQualifier())
362    Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
363
364  if (E->getDecl() != E->getFoundDecl())
365    Writer.AddDeclRef(E->getFoundDecl(), Record);
366
367  if (E->hasTemplateKWAndArgsInfo())
368    AddTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo());
369
370  Writer.AddDeclRef(E->getDecl(), Record);
371  Writer.AddSourceLocation(E->getLocation(), Record);
372  Writer.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record);
373  Code = serialization::EXPR_DECL_REF;
374}
375
376void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
377  VisitExpr(E);
378  Writer.AddSourceLocation(E->getLocation(), Record);
379  Writer.AddAPInt(E->getValue(), Record);
380
381  if (E->getValue().getBitWidth() == 32) {
382    AbbrevToUse = Writer.getIntegerLiteralAbbrev();
383  }
384
385  Code = serialization::EXPR_INTEGER_LITERAL;
386}
387
388void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
389  VisitExpr(E);
390  Record.push_back(E->getRawSemantics());
391  Record.push_back(E->isExact());
392  Writer.AddAPFloat(E->getValue(), Record);
393  Writer.AddSourceLocation(E->getLocation(), Record);
394  Code = serialization::EXPR_FLOATING_LITERAL;
395}
396
397void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
398  VisitExpr(E);
399  Writer.AddStmt(E->getSubExpr());
400  Code = serialization::EXPR_IMAGINARY_LITERAL;
401}
402
403void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
404  VisitExpr(E);
405  Record.push_back(E->getByteLength());
406  Record.push_back(E->getNumConcatenated());
407  Record.push_back(E->getKind());
408  Record.push_back(E->isPascal());
409  // FIXME: String data should be stored as a blob at the end of the
410  // StringLiteral. However, we can't do so now because we have no
411  // provision for coping with abbreviations when we're jumping around
412  // the AST file during deserialization.
413  Record.append(E->getBytes().begin(), E->getBytes().end());
414  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
415    Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
416  Code = serialization::EXPR_STRING_LITERAL;
417}
418
419void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
420  VisitExpr(E);
421  Record.push_back(E->getValue());
422  Writer.AddSourceLocation(E->getLocation(), Record);
423  Record.push_back(E->getKind());
424
425  AbbrevToUse = Writer.getCharacterLiteralAbbrev();
426
427  Code = serialization::EXPR_CHARACTER_LITERAL;
428}
429
430void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
431  VisitExpr(E);
432  Writer.AddSourceLocation(E->getLParen(), Record);
433  Writer.AddSourceLocation(E->getRParen(), Record);
434  Writer.AddStmt(E->getSubExpr());
435  Code = serialization::EXPR_PAREN;
436}
437
438void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
439  VisitExpr(E);
440  Record.push_back(E->NumExprs);
441  for (unsigned i=0; i != E->NumExprs; ++i)
442    Writer.AddStmt(E->Exprs[i]);
443  Writer.AddSourceLocation(E->LParenLoc, Record);
444  Writer.AddSourceLocation(E->RParenLoc, Record);
445  Code = serialization::EXPR_PAREN_LIST;
446}
447
448void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
449  VisitExpr(E);
450  Writer.AddStmt(E->getSubExpr());
451  Record.push_back(E->getOpcode()); // FIXME: stable encoding
452  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
453  Code = serialization::EXPR_UNARY_OPERATOR;
454}
455
456void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
457  VisitExpr(E);
458  Record.push_back(E->getNumComponents());
459  Record.push_back(E->getNumExpressions());
460  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
461  Writer.AddSourceLocation(E->getRParenLoc(), Record);
462  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
463  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
464    const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
465    Record.push_back(ON.getKind()); // FIXME: Stable encoding
466    Writer.AddSourceLocation(ON.getSourceRange().getBegin(), Record);
467    Writer.AddSourceLocation(ON.getSourceRange().getEnd(), Record);
468    switch (ON.getKind()) {
469    case OffsetOfExpr::OffsetOfNode::Array:
470      Record.push_back(ON.getArrayExprIndex());
471      break;
472
473    case OffsetOfExpr::OffsetOfNode::Field:
474      Writer.AddDeclRef(ON.getField(), Record);
475      break;
476
477    case OffsetOfExpr::OffsetOfNode::Identifier:
478      Writer.AddIdentifierRef(ON.getFieldName(), Record);
479      break;
480
481    case OffsetOfExpr::OffsetOfNode::Base:
482      Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);
483      break;
484    }
485  }
486  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
487    Writer.AddStmt(E->getIndexExpr(I));
488  Code = serialization::EXPR_OFFSETOF;
489}
490
491void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
492  VisitExpr(E);
493  Record.push_back(E->getKind());
494  if (E->isArgumentType())
495    Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
496  else {
497    Record.push_back(0);
498    Writer.AddStmt(E->getArgumentExpr());
499  }
500  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
501  Writer.AddSourceLocation(E->getRParenLoc(), Record);
502  Code = serialization::EXPR_SIZEOF_ALIGN_OF;
503}
504
505void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
506  VisitExpr(E);
507  Writer.AddStmt(E->getLHS());
508  Writer.AddStmt(E->getRHS());
509  Writer.AddSourceLocation(E->getRBracketLoc(), Record);
510  Code = serialization::EXPR_ARRAY_SUBSCRIPT;
511}
512
513void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
514  VisitExpr(E);
515  Record.push_back(E->getNumArgs());
516  Writer.AddSourceLocation(E->getRParenLoc(), Record);
517  Writer.AddStmt(E->getCallee());
518  for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
519       Arg != ArgEnd; ++Arg)
520    Writer.AddStmt(*Arg);
521  Code = serialization::EXPR_CALL;
522}
523
524void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
525  // Don't call VisitExpr, we'll write everything here.
526
527  Record.push_back(E->hasQualifier());
528  if (E->hasQualifier())
529    Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
530
531  Record.push_back(E->HasTemplateKWAndArgsInfo);
532  if (E->HasTemplateKWAndArgsInfo) {
533    Writer.AddSourceLocation(E->getTemplateKeywordLoc(), Record);
534    unsigned NumTemplateArgs = E->getNumTemplateArgs();
535    Record.push_back(NumTemplateArgs);
536    Writer.AddSourceLocation(E->getLAngleLoc(), Record);
537    Writer.AddSourceLocation(E->getRAngleLoc(), Record);
538    for (unsigned i=0; i != NumTemplateArgs; ++i)
539      Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
540  }
541
542  Record.push_back(E->hadMultipleCandidates());
543
544  DeclAccessPair FoundDecl = E->getFoundDecl();
545  Writer.AddDeclRef(FoundDecl.getDecl(), Record);
546  Record.push_back(FoundDecl.getAccess());
547
548  Writer.AddTypeRef(E->getType(), Record);
549  Record.push_back(E->getValueKind());
550  Record.push_back(E->getObjectKind());
551  Writer.AddStmt(E->getBase());
552  Writer.AddDeclRef(E->getMemberDecl(), Record);
553  Writer.AddSourceLocation(E->getMemberLoc(), Record);
554  Record.push_back(E->isArrow());
555  Writer.AddDeclarationNameLoc(E->MemberDNLoc,
556                               E->getMemberDecl()->getDeclName(), Record);
557  Code = serialization::EXPR_MEMBER;
558}
559
560void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
561  VisitExpr(E);
562  Writer.AddStmt(E->getBase());
563  Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
564  Writer.AddSourceLocation(E->getOpLoc(), Record);
565  Record.push_back(E->isArrow());
566  Code = serialization::EXPR_OBJC_ISA;
567}
568
569void ASTStmtWriter::
570VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
571  VisitExpr(E);
572  Writer.AddStmt(E->getSubExpr());
573  Record.push_back(E->shouldCopy());
574  Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
575}
576
577void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
578  VisitExplicitCastExpr(E);
579  Writer.AddSourceLocation(E->getLParenLoc(), Record);
580  Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record);
581  Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
582  Code = serialization::EXPR_OBJC_BRIDGED_CAST;
583}
584
585void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
586  VisitExpr(E);
587  Record.push_back(E->path_size());
588  Writer.AddStmt(E->getSubExpr());
589  Record.push_back(E->getCastKind()); // FIXME: stable encoding
590
591  for (CastExpr::path_iterator
592         PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
593    Writer.AddCXXBaseSpecifier(**PI, Record);
594}
595
596void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
597  VisitExpr(E);
598  Writer.AddStmt(E->getLHS());
599  Writer.AddStmt(E->getRHS());
600  Record.push_back(E->getOpcode()); // FIXME: stable encoding
601  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
602  Record.push_back(E->isFPContractable());
603  Code = serialization::EXPR_BINARY_OPERATOR;
604}
605
606void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
607  VisitBinaryOperator(E);
608  Writer.AddTypeRef(E->getComputationLHSType(), Record);
609  Writer.AddTypeRef(E->getComputationResultType(), Record);
610  Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
611}
612
613void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
614  VisitExpr(E);
615  Writer.AddStmt(E->getCond());
616  Writer.AddStmt(E->getLHS());
617  Writer.AddStmt(E->getRHS());
618  Writer.AddSourceLocation(E->getQuestionLoc(), Record);
619  Writer.AddSourceLocation(E->getColonLoc(), Record);
620  Code = serialization::EXPR_CONDITIONAL_OPERATOR;
621}
622
623void
624ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
625  VisitExpr(E);
626  Writer.AddStmt(E->getOpaqueValue());
627  Writer.AddStmt(E->getCommon());
628  Writer.AddStmt(E->getCond());
629  Writer.AddStmt(E->getTrueExpr());
630  Writer.AddStmt(E->getFalseExpr());
631  Writer.AddSourceLocation(E->getQuestionLoc(), Record);
632  Writer.AddSourceLocation(E->getColonLoc(), Record);
633  Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
634}
635
636void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
637  VisitCastExpr(E);
638  Code = serialization::EXPR_IMPLICIT_CAST;
639}
640
641void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
642  VisitCastExpr(E);
643  Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
644}
645
646void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
647  VisitExplicitCastExpr(E);
648  Writer.AddSourceLocation(E->getLParenLoc(), Record);
649  Writer.AddSourceLocation(E->getRParenLoc(), Record);
650  Code = serialization::EXPR_CSTYLE_CAST;
651}
652
653void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
654  VisitExpr(E);
655  Writer.AddSourceLocation(E->getLParenLoc(), Record);
656  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
657  Writer.AddStmt(E->getInitializer());
658  Record.push_back(E->isFileScope());
659  Code = serialization::EXPR_COMPOUND_LITERAL;
660}
661
662void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
663  VisitExpr(E);
664  Writer.AddStmt(E->getBase());
665  Writer.AddIdentifierRef(&E->getAccessor(), Record);
666  Writer.AddSourceLocation(E->getAccessorLoc(), Record);
667  Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
668}
669
670void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
671  VisitExpr(E);
672  // NOTE: only add the (possibly null) syntactic form.
673  // No need to serialize the isSemanticForm flag and the semantic form.
674  Writer.AddStmt(E->getSyntacticForm());
675  Writer.AddSourceLocation(E->getLBraceLoc(), Record);
676  Writer.AddSourceLocation(E->getRBraceLoc(), Record);
677  bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
678  Record.push_back(isArrayFiller);
679  if (isArrayFiller)
680    Writer.AddStmt(E->getArrayFiller());
681  else
682    Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
683  Record.push_back(E->hadArrayRangeDesignator());
684  Record.push_back(E->getNumInits());
685  if (isArrayFiller) {
686    // ArrayFiller may have filled "holes" due to designated initializer.
687    // Replace them by 0 to indicate that the filler goes in that place.
688    Expr *filler = E->getArrayFiller();
689    for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
690      Writer.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);
691  } else {
692    for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
693      Writer.AddStmt(E->getInit(I));
694  }
695  Code = serialization::EXPR_INIT_LIST;
696}
697
698void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
699  VisitExpr(E);
700  Record.push_back(E->getNumSubExprs());
701  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
702    Writer.AddStmt(E->getSubExpr(I));
703  Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
704  Record.push_back(E->usesGNUSyntax());
705  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
706                                             DEnd = E->designators_end();
707       D != DEnd; ++D) {
708    if (D->isFieldDesignator()) {
709      if (FieldDecl *Field = D->getField()) {
710        Record.push_back(serialization::DESIG_FIELD_DECL);
711        Writer.AddDeclRef(Field, Record);
712      } else {
713        Record.push_back(serialization::DESIG_FIELD_NAME);
714        Writer.AddIdentifierRef(D->getFieldName(), Record);
715      }
716      Writer.AddSourceLocation(D->getDotLoc(), Record);
717      Writer.AddSourceLocation(D->getFieldLoc(), Record);
718    } else if (D->isArrayDesignator()) {
719      Record.push_back(serialization::DESIG_ARRAY);
720      Record.push_back(D->getFirstExprIndex());
721      Writer.AddSourceLocation(D->getLBracketLoc(), Record);
722      Writer.AddSourceLocation(D->getRBracketLoc(), Record);
723    } else {
724      assert(D->isArrayRangeDesignator() && "Unknown designator");
725      Record.push_back(serialization::DESIG_ARRAY_RANGE);
726      Record.push_back(D->getFirstExprIndex());
727      Writer.AddSourceLocation(D->getLBracketLoc(), Record);
728      Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
729      Writer.AddSourceLocation(D->getRBracketLoc(), Record);
730    }
731  }
732  Code = serialization::EXPR_DESIGNATED_INIT;
733}
734
735void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
736  VisitExpr(E);
737  Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
738}
739
740void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
741  VisitExpr(E);
742  Writer.AddStmt(E->getSubExpr());
743  Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record);
744  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
745  Writer.AddSourceLocation(E->getRParenLoc(), Record);
746  Code = serialization::EXPR_VA_ARG;
747}
748
749void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
750  VisitExpr(E);
751  Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
752  Writer.AddSourceLocation(E->getLabelLoc(), Record);
753  Writer.AddDeclRef(E->getLabel(), Record);
754  Code = serialization::EXPR_ADDR_LABEL;
755}
756
757void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
758  VisitExpr(E);
759  Writer.AddStmt(E->getSubStmt());
760  Writer.AddSourceLocation(E->getLParenLoc(), Record);
761  Writer.AddSourceLocation(E->getRParenLoc(), Record);
762  Code = serialization::EXPR_STMT;
763}
764
765void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
766  VisitExpr(E);
767  Writer.AddStmt(E->getCond());
768  Writer.AddStmt(E->getLHS());
769  Writer.AddStmt(E->getRHS());
770  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
771  Writer.AddSourceLocation(E->getRParenLoc(), Record);
772  Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());
773  Code = serialization::EXPR_CHOOSE;
774}
775
776void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
777  VisitExpr(E);
778  Writer.AddSourceLocation(E->getTokenLocation(), Record);
779  Code = serialization::EXPR_GNU_NULL;
780}
781
782void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
783  VisitExpr(E);
784  Record.push_back(E->getNumSubExprs());
785  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
786    Writer.AddStmt(E->getExpr(I));
787  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
788  Writer.AddSourceLocation(E->getRParenLoc(), Record);
789  Code = serialization::EXPR_SHUFFLE_VECTOR;
790}
791
792void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
793  VisitExpr(E);
794  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
795  Writer.AddSourceLocation(E->getRParenLoc(), Record);
796  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
797  Writer.AddStmt(E->getSrcExpr());
798  Code = serialization::EXPR_CONVERT_VECTOR;
799}
800
801void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
802  VisitExpr(E);
803  Writer.AddDeclRef(E->getBlockDecl(), Record);
804  Code = serialization::EXPR_BLOCK;
805}
806
807void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
808  VisitExpr(E);
809  Record.push_back(E->getNumAssocs());
810
811  Writer.AddStmt(E->getControllingExpr());
812  for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
813    Writer.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I), Record);
814    Writer.AddStmt(E->getAssocExpr(I));
815  }
816  Record.push_back(E->isResultDependent() ? -1U : E->getResultIndex());
817
818  Writer.AddSourceLocation(E->getGenericLoc(), Record);
819  Writer.AddSourceLocation(E->getDefaultLoc(), Record);
820  Writer.AddSourceLocation(E->getRParenLoc(), Record);
821  Code = serialization::EXPR_GENERIC_SELECTION;
822}
823
824void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
825  VisitExpr(E);
826  Record.push_back(E->getNumSemanticExprs());
827
828  // Push the result index.  Currently, this needs to exactly match
829  // the encoding used internally for ResultIndex.
830  unsigned result = E->getResultExprIndex();
831  result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
832  Record.push_back(result);
833
834  Writer.AddStmt(E->getSyntacticForm());
835  for (PseudoObjectExpr::semantics_iterator
836         i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
837    Writer.AddStmt(*i);
838  }
839  Code = serialization::EXPR_PSEUDO_OBJECT;
840}
841
842void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
843  VisitExpr(E);
844  Record.push_back(E->getOp());
845  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
846    Writer.AddStmt(E->getSubExprs()[I]);
847  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
848  Writer.AddSourceLocation(E->getRParenLoc(), Record);
849  Code = serialization::EXPR_ATOMIC;
850}
851
852//===----------------------------------------------------------------------===//
853// Objective-C Expressions and Statements.
854//===----------------------------------------------------------------------===//
855
856void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
857  VisitExpr(E);
858  Writer.AddStmt(E->getString());
859  Writer.AddSourceLocation(E->getAtLoc(), Record);
860  Code = serialization::EXPR_OBJC_STRING_LITERAL;
861}
862
863void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
864  VisitExpr(E);
865  Writer.AddStmt(E->getSubExpr());
866  Writer.AddDeclRef(E->getBoxingMethod(), Record);
867  Writer.AddSourceRange(E->getSourceRange(), Record);
868  Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
869}
870
871void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
872  VisitExpr(E);
873  Record.push_back(E->getNumElements());
874  for (unsigned i = 0; i < E->getNumElements(); i++)
875    Writer.AddStmt(E->getElement(i));
876  Writer.AddDeclRef(E->getArrayWithObjectsMethod(), Record);
877  Writer.AddSourceRange(E->getSourceRange(), Record);
878  Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
879}
880
881void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
882  VisitExpr(E);
883  Record.push_back(E->getNumElements());
884  Record.push_back(E->HasPackExpansions);
885  for (unsigned i = 0; i < E->getNumElements(); i++) {
886    ObjCDictionaryElement Element = E->getKeyValueElement(i);
887    Writer.AddStmt(Element.Key);
888    Writer.AddStmt(Element.Value);
889    if (E->HasPackExpansions) {
890      Writer.AddSourceLocation(Element.EllipsisLoc, Record);
891      unsigned NumExpansions = 0;
892      if (Element.NumExpansions)
893        NumExpansions = *Element.NumExpansions + 1;
894      Record.push_back(NumExpansions);
895    }
896  }
897
898  Writer.AddDeclRef(E->getDictWithObjectsMethod(), Record);
899  Writer.AddSourceRange(E->getSourceRange(), Record);
900  Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
901}
902
903void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
904  VisitExpr(E);
905  Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
906  Writer.AddSourceLocation(E->getAtLoc(), Record);
907  Writer.AddSourceLocation(E->getRParenLoc(), Record);
908  Code = serialization::EXPR_OBJC_ENCODE;
909}
910
911void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
912  VisitExpr(E);
913  Writer.AddSelectorRef(E->getSelector(), Record);
914  Writer.AddSourceLocation(E->getAtLoc(), Record);
915  Writer.AddSourceLocation(E->getRParenLoc(), Record);
916  Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
917}
918
919void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
920  VisitExpr(E);
921  Writer.AddDeclRef(E->getProtocol(), Record);
922  Writer.AddSourceLocation(E->getAtLoc(), Record);
923  Writer.AddSourceLocation(E->ProtoLoc, Record);
924  Writer.AddSourceLocation(E->getRParenLoc(), Record);
925  Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
926}
927
928void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
929  VisitExpr(E);
930  Writer.AddDeclRef(E->getDecl(), Record);
931  Writer.AddSourceLocation(E->getLocation(), Record);
932  Writer.AddSourceLocation(E->getOpLoc(), Record);
933  Writer.AddStmt(E->getBase());
934  Record.push_back(E->isArrow());
935  Record.push_back(E->isFreeIvar());
936  Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
937}
938
939void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
940  VisitExpr(E);
941  Record.push_back(E->SetterAndMethodRefFlags.getInt());
942  Record.push_back(E->isImplicitProperty());
943  if (E->isImplicitProperty()) {
944    Writer.AddDeclRef(E->getImplicitPropertyGetter(), Record);
945    Writer.AddDeclRef(E->getImplicitPropertySetter(), Record);
946  } else {
947    Writer.AddDeclRef(E->getExplicitProperty(), Record);
948  }
949  Writer.AddSourceLocation(E->getLocation(), Record);
950  Writer.AddSourceLocation(E->getReceiverLocation(), Record);
951  if (E->isObjectReceiver()) {
952    Record.push_back(0);
953    Writer.AddStmt(E->getBase());
954  } else if (E->isSuperReceiver()) {
955    Record.push_back(1);
956    Writer.AddTypeRef(E->getSuperReceiverType(), Record);
957  } else {
958    Record.push_back(2);
959    Writer.AddDeclRef(E->getClassReceiver(), Record);
960  }
961
962  Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
963}
964
965void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
966  VisitExpr(E);
967  Writer.AddSourceLocation(E->getRBracket(), Record);
968  Writer.AddStmt(E->getBaseExpr());
969  Writer.AddStmt(E->getKeyExpr());
970  Writer.AddDeclRef(E->getAtIndexMethodDecl(), Record);
971  Writer.AddDeclRef(E->setAtIndexMethodDecl(), Record);
972
973  Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
974}
975
976void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
977  VisitExpr(E);
978  Record.push_back(E->getNumArgs());
979  Record.push_back(E->getNumStoredSelLocs());
980  Record.push_back(E->SelLocsKind);
981  Record.push_back(E->isDelegateInitCall());
982  Record.push_back(E->IsImplicit);
983  Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
984  switch (E->getReceiverKind()) {
985  case ObjCMessageExpr::Instance:
986    Writer.AddStmt(E->getInstanceReceiver());
987    break;
988
989  case ObjCMessageExpr::Class:
990    Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
991    break;
992
993  case ObjCMessageExpr::SuperClass:
994  case ObjCMessageExpr::SuperInstance:
995    Writer.AddTypeRef(E->getSuperType(), Record);
996    Writer.AddSourceLocation(E->getSuperLoc(), Record);
997    break;
998  }
999
1000  if (E->getMethodDecl()) {
1001    Record.push_back(1);
1002    Writer.AddDeclRef(E->getMethodDecl(), Record);
1003  } else {
1004    Record.push_back(0);
1005    Writer.AddSelectorRef(E->getSelector(), Record);
1006  }
1007
1008  Writer.AddSourceLocation(E->getLeftLoc(), Record);
1009  Writer.AddSourceLocation(E->getRightLoc(), Record);
1010
1011  for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
1012       Arg != ArgEnd; ++Arg)
1013    Writer.AddStmt(*Arg);
1014
1015  SourceLocation *Locs = E->getStoredSelLocs();
1016  for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
1017    Writer.AddSourceLocation(Locs[i], Record);
1018
1019  Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
1020}
1021
1022void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
1023  VisitStmt(S);
1024  Writer.AddStmt(S->getElement());
1025  Writer.AddStmt(S->getCollection());
1026  Writer.AddStmt(S->getBody());
1027  Writer.AddSourceLocation(S->getForLoc(), Record);
1028  Writer.AddSourceLocation(S->getRParenLoc(), Record);
1029  Code = serialization::STMT_OBJC_FOR_COLLECTION;
1030}
1031
1032void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
1033  Writer.AddStmt(S->getCatchBody());
1034  Writer.AddDeclRef(S->getCatchParamDecl(), Record);
1035  Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
1036  Writer.AddSourceLocation(S->getRParenLoc(), Record);
1037  Code = serialization::STMT_OBJC_CATCH;
1038}
1039
1040void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
1041  Writer.AddStmt(S->getFinallyBody());
1042  Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
1043  Code = serialization::STMT_OBJC_FINALLY;
1044}
1045
1046void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
1047  Writer.AddStmt(S->getSubStmt());
1048  Writer.AddSourceLocation(S->getAtLoc(), Record);
1049  Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
1050}
1051
1052void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1053  Record.push_back(S->getNumCatchStmts());
1054  Record.push_back(S->getFinallyStmt() != nullptr);
1055  Writer.AddStmt(S->getTryBody());
1056  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
1057    Writer.AddStmt(S->getCatchStmt(I));
1058  if (S->getFinallyStmt())
1059    Writer.AddStmt(S->getFinallyStmt());
1060  Writer.AddSourceLocation(S->getAtTryLoc(), Record);
1061  Code = serialization::STMT_OBJC_AT_TRY;
1062}
1063
1064void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1065  Writer.AddStmt(S->getSynchExpr());
1066  Writer.AddStmt(S->getSynchBody());
1067  Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
1068  Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
1069}
1070
1071void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1072  Writer.AddStmt(S->getThrowExpr());
1073  Writer.AddSourceLocation(S->getThrowLoc(), Record);
1074  Code = serialization::STMT_OBJC_AT_THROW;
1075}
1076
1077void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1078  VisitExpr(E);
1079  Record.push_back(E->getValue());
1080  Writer.AddSourceLocation(E->getLocation(), Record);
1081  Code = serialization::EXPR_OBJC_BOOL_LITERAL;
1082}
1083
1084//===----------------------------------------------------------------------===//
1085// C++ Expressions and Statements.
1086//===----------------------------------------------------------------------===//
1087
1088void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
1089  VisitStmt(S);
1090  Writer.AddSourceLocation(S->getCatchLoc(), Record);
1091  Writer.AddDeclRef(S->getExceptionDecl(), Record);
1092  Writer.AddStmt(S->getHandlerBlock());
1093  Code = serialization::STMT_CXX_CATCH;
1094}
1095
1096void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
1097  VisitStmt(S);
1098  Record.push_back(S->getNumHandlers());
1099  Writer.AddSourceLocation(S->getTryLoc(), Record);
1100  Writer.AddStmt(S->getTryBlock());
1101  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1102    Writer.AddStmt(S->getHandler(i));
1103  Code = serialization::STMT_CXX_TRY;
1104}
1105
1106void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1107  VisitStmt(S);
1108  Writer.AddSourceLocation(S->getForLoc(), Record);
1109  Writer.AddSourceLocation(S->getColonLoc(), Record);
1110  Writer.AddSourceLocation(S->getRParenLoc(), Record);
1111  Writer.AddStmt(S->getRangeStmt());
1112  Writer.AddStmt(S->getBeginEndStmt());
1113  Writer.AddStmt(S->getCond());
1114  Writer.AddStmt(S->getInc());
1115  Writer.AddStmt(S->getLoopVarStmt());
1116  Writer.AddStmt(S->getBody());
1117  Code = serialization::STMT_CXX_FOR_RANGE;
1118}
1119
1120void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1121  VisitStmt(S);
1122  Writer.AddSourceLocation(S->getKeywordLoc(), Record);
1123  Record.push_back(S->isIfExists());
1124  Writer.AddNestedNameSpecifierLoc(S->getQualifierLoc(), Record);
1125  Writer.AddDeclarationNameInfo(S->getNameInfo(), Record);
1126  Writer.AddStmt(S->getSubStmt());
1127  Code = serialization::STMT_MS_DEPENDENT_EXISTS;
1128}
1129
1130void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1131  VisitCallExpr(E);
1132  Record.push_back(E->getOperator());
1133  Writer.AddSourceRange(E->Range, Record);
1134  Record.push_back(E->isFPContractable());
1135  Code = serialization::EXPR_CXX_OPERATOR_CALL;
1136}
1137
1138void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
1139  VisitCallExpr(E);
1140  Code = serialization::EXPR_CXX_MEMBER_CALL;
1141}
1142
1143void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1144  VisitExpr(E);
1145  Record.push_back(E->getNumArgs());
1146  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1147    Writer.AddStmt(E->getArg(I));
1148  Writer.AddDeclRef(E->getConstructor(), Record);
1149  Writer.AddSourceLocation(E->getLocation(), Record);
1150  Record.push_back(E->isElidable());
1151  Record.push_back(E->hadMultipleCandidates());
1152  Record.push_back(E->isListInitialization());
1153  Record.push_back(E->requiresZeroInitialization());
1154  Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
1155  Writer.AddSourceRange(E->getParenOrBraceRange(), Record);
1156  Code = serialization::EXPR_CXX_CONSTRUCT;
1157}
1158
1159void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1160  VisitCXXConstructExpr(E);
1161  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1162  Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
1163}
1164
1165void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
1166  VisitExpr(E);
1167  Record.push_back(E->NumCaptures);
1168  unsigned NumArrayIndexVars = 0;
1169  if (E->HasArrayIndexVars)
1170    NumArrayIndexVars = E->getArrayIndexStarts()[E->NumCaptures];
1171  Record.push_back(NumArrayIndexVars);
1172  Writer.AddSourceRange(E->IntroducerRange, Record);
1173  Record.push_back(E->CaptureDefault); // FIXME: stable encoding
1174  Writer.AddSourceLocation(E->CaptureDefaultLoc, Record);
1175  Record.push_back(E->ExplicitParams);
1176  Record.push_back(E->ExplicitResultType);
1177  Writer.AddSourceLocation(E->ClosingBrace, Record);
1178
1179  // Add capture initializers.
1180  for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1181                                      CEnd = E->capture_init_end();
1182       C != CEnd; ++C) {
1183    Writer.AddStmt(*C);
1184  }
1185
1186  // Add array index variables, if any.
1187  if (NumArrayIndexVars) {
1188    Record.append(E->getArrayIndexStarts(),
1189                  E->getArrayIndexStarts() + E->NumCaptures + 1);
1190    VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1191    for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1192      Writer.AddDeclRef(ArrayIndexVars[I], Record);
1193  }
1194
1195  Code = serialization::EXPR_LAMBDA;
1196}
1197
1198void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
1199  VisitExpr(E);
1200  Writer.AddStmt(E->getSubExpr());
1201  Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;
1202}
1203
1204void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1205  VisitExplicitCastExpr(E);
1206  Writer.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()),
1207                        Record);
1208  Writer.AddSourceRange(E->getAngleBrackets(), Record);
1209}
1210
1211void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1212  VisitCXXNamedCastExpr(E);
1213  Code = serialization::EXPR_CXX_STATIC_CAST;
1214}
1215
1216void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1217  VisitCXXNamedCastExpr(E);
1218  Code = serialization::EXPR_CXX_DYNAMIC_CAST;
1219}
1220
1221void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1222  VisitCXXNamedCastExpr(E);
1223  Code = serialization::EXPR_CXX_REINTERPRET_CAST;
1224}
1225
1226void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1227  VisitCXXNamedCastExpr(E);
1228  Code = serialization::EXPR_CXX_CONST_CAST;
1229}
1230
1231void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1232  VisitExplicitCastExpr(E);
1233  Writer.AddSourceLocation(E->getLParenLoc(), Record);
1234  Writer.AddSourceLocation(E->getRParenLoc(), Record);
1235  Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
1236}
1237
1238void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1239  VisitCallExpr(E);
1240  Writer.AddSourceLocation(E->UDSuffixLoc, Record);
1241  Code = serialization::EXPR_USER_DEFINED_LITERAL;
1242}
1243
1244void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1245  VisitExpr(E);
1246  Record.push_back(E->getValue());
1247  Writer.AddSourceLocation(E->getLocation(), Record);
1248  Code = serialization::EXPR_CXX_BOOL_LITERAL;
1249}
1250
1251void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1252  VisitExpr(E);
1253  Writer.AddSourceLocation(E->getLocation(), Record);
1254  Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
1255}
1256
1257void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1258  VisitExpr(E);
1259  Writer.AddSourceRange(E->getSourceRange(), Record);
1260  if (E->isTypeOperand()) {
1261    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
1262    Code = serialization::EXPR_CXX_TYPEID_TYPE;
1263  } else {
1264    Writer.AddStmt(E->getExprOperand());
1265    Code = serialization::EXPR_CXX_TYPEID_EXPR;
1266  }
1267}
1268
1269void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
1270  VisitExpr(E);
1271  Writer.AddSourceLocation(E->getLocation(), Record);
1272  Record.push_back(E->isImplicit());
1273  Code = serialization::EXPR_CXX_THIS;
1274}
1275
1276void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
1277  VisitExpr(E);
1278  Writer.AddSourceLocation(E->getThrowLoc(), Record);
1279  Writer.AddStmt(E->getSubExpr());
1280  Record.push_back(E->isThrownVariableInScope());
1281  Code = serialization::EXPR_CXX_THROW;
1282}
1283
1284void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1285  VisitExpr(E);
1286
1287  bool HasOtherExprStored = E->Param.getInt();
1288  // Store these first, the reader reads them before creation.
1289  Record.push_back(HasOtherExprStored);
1290  if (HasOtherExprStored)
1291    Writer.AddStmt(E->getExpr());
1292  Writer.AddDeclRef(E->getParam(), Record);
1293  Writer.AddSourceLocation(E->getUsedLocation(), Record);
1294
1295  Code = serialization::EXPR_CXX_DEFAULT_ARG;
1296}
1297
1298void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
1299  VisitExpr(E);
1300  Writer.AddDeclRef(E->getField(), Record);
1301  Writer.AddSourceLocation(E->getExprLoc(), Record);
1302  Code = serialization::EXPR_CXX_DEFAULT_INIT;
1303}
1304
1305void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1306  VisitExpr(E);
1307  Writer.AddCXXTemporary(E->getTemporary(), Record);
1308  Writer.AddStmt(E->getSubExpr());
1309  Code = serialization::EXPR_CXX_BIND_TEMPORARY;
1310}
1311
1312void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1313  VisitExpr(E);
1314  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1315  Writer.AddSourceLocation(E->getRParenLoc(), Record);
1316  Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
1317}
1318
1319void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1320  VisitExpr(E);
1321  Record.push_back(E->isGlobalNew());
1322  Record.push_back(E->isArray());
1323  Record.push_back(E->doesUsualArrayDeleteWantSize());
1324  Record.push_back(E->getNumPlacementArgs());
1325  Record.push_back(E->StoredInitializationStyle);
1326  Writer.AddDeclRef(E->getOperatorNew(), Record);
1327  Writer.AddDeclRef(E->getOperatorDelete(), Record);
1328  Writer.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo(), Record);
1329  Writer.AddSourceRange(E->getTypeIdParens(), Record);
1330  Writer.AddSourceRange(E->getSourceRange(), Record);
1331  Writer.AddSourceRange(E->getDirectInitRange(), Record);
1332  for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
1333       I != e; ++I)
1334    Writer.AddStmt(*I);
1335
1336  Code = serialization::EXPR_CXX_NEW;
1337}
1338
1339void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1340  VisitExpr(E);
1341  Record.push_back(E->isGlobalDelete());
1342  Record.push_back(E->isArrayForm());
1343  Record.push_back(E->isArrayFormAsWritten());
1344  Record.push_back(E->doesUsualArrayDeleteWantSize());
1345  Writer.AddDeclRef(E->getOperatorDelete(), Record);
1346  Writer.AddStmt(E->getArgument());
1347  Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1348
1349  Code = serialization::EXPR_CXX_DELETE;
1350}
1351
1352void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1353  VisitExpr(E);
1354
1355  Writer.AddStmt(E->getBase());
1356  Record.push_back(E->isArrow());
1357  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1358  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1359  Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);
1360  Writer.AddSourceLocation(E->getColonColonLoc(), Record);
1361  Writer.AddSourceLocation(E->getTildeLoc(), Record);
1362
1363  // PseudoDestructorTypeStorage.
1364  Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);
1365  if (E->getDestroyedTypeIdentifier())
1366    Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);
1367  else
1368    Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);
1369
1370  Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
1371}
1372
1373void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
1374  VisitExpr(E);
1375  Record.push_back(E->getNumObjects());
1376  for (unsigned i = 0, e = E->getNumObjects(); i != e; ++i)
1377    Writer.AddDeclRef(E->getObject(i), Record);
1378
1379  Writer.AddStmt(E->getSubExpr());
1380  Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
1381}
1382
1383void
1384ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1385  VisitExpr(E);
1386
1387  // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1388  // emitted first.
1389
1390  Record.push_back(E->HasTemplateKWAndArgsInfo);
1391  if (E->HasTemplateKWAndArgsInfo) {
1392    const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1393    Record.push_back(Args.NumTemplateArgs);
1394    AddTemplateKWAndArgsInfo(Args);
1395  }
1396
1397  if (!E->isImplicitAccess())
1398    Writer.AddStmt(E->getBase());
1399  else
1400    Writer.AddStmt(nullptr);
1401  Writer.AddTypeRef(E->getBaseType(), Record);
1402  Record.push_back(E->isArrow());
1403  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1404  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1405  Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
1406  Writer.AddDeclarationNameInfo(E->MemberNameInfo, Record);
1407  Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1408}
1409
1410void
1411ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1412  VisitExpr(E);
1413
1414  // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1415  // emitted first.
1416
1417  Record.push_back(E->HasTemplateKWAndArgsInfo);
1418  if (E->HasTemplateKWAndArgsInfo) {
1419    const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1420    Record.push_back(Args.NumTemplateArgs);
1421    AddTemplateKWAndArgsInfo(Args);
1422  }
1423
1424  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1425  Writer.AddDeclarationNameInfo(E->NameInfo, Record);
1426  Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
1427}
1428
1429void
1430ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1431  VisitExpr(E);
1432  Record.push_back(E->arg_size());
1433  for (CXXUnresolvedConstructExpr::arg_iterator
1434         ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1435    Writer.AddStmt(*ArgI);
1436  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1437  Writer.AddSourceLocation(E->getLParenLoc(), Record);
1438  Writer.AddSourceLocation(E->getRParenLoc(), Record);
1439  Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1440}
1441
1442void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1443  VisitExpr(E);
1444
1445  // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1446  // emitted first.
1447
1448  Record.push_back(E->HasTemplateKWAndArgsInfo);
1449  if (E->HasTemplateKWAndArgsInfo) {
1450    const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1451    Record.push_back(Args.NumTemplateArgs);
1452    AddTemplateKWAndArgsInfo(Args);
1453  }
1454
1455  Record.push_back(E->getNumDecls());
1456  for (OverloadExpr::decls_iterator
1457         OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
1458    Writer.AddDeclRef(OvI.getDecl(), Record);
1459    Record.push_back(OvI.getAccess());
1460  }
1461
1462  Writer.AddDeclarationNameInfo(E->NameInfo, Record);
1463  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1464}
1465
1466void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1467  VisitOverloadExpr(E);
1468  Record.push_back(E->isArrow());
1469  Record.push_back(E->hasUnresolvedUsing());
1470  Writer.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);
1471  Writer.AddTypeRef(E->getBaseType(), Record);
1472  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1473  Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
1474}
1475
1476void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1477  VisitOverloadExpr(E);
1478  Record.push_back(E->requiresADL());
1479  Record.push_back(E->isOverloaded());
1480  Writer.AddDeclRef(E->getNamingClass(), Record);
1481  Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
1482}
1483
1484void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
1485  VisitExpr(E);
1486  Record.push_back(E->TypeTraitExprBits.NumArgs);
1487  Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
1488  Record.push_back(E->TypeTraitExprBits.Value);
1489  Writer.AddSourceRange(E->getSourceRange(), Record);
1490  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1491    Writer.AddTypeSourceInfo(E->getArg(I), Record);
1492  Code = serialization::EXPR_TYPE_TRAIT;
1493}
1494
1495void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1496  VisitExpr(E);
1497  Record.push_back(E->getTrait());
1498  Record.push_back(E->getValue());
1499  Writer.AddSourceRange(E->getSourceRange(), Record);
1500  Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);
1501  Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
1502}
1503
1504void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1505  VisitExpr(E);
1506  Record.push_back(E->getTrait());
1507  Record.push_back(E->getValue());
1508  Writer.AddSourceRange(E->getSourceRange(), Record);
1509  Writer.AddStmt(E->getQueriedExpression());
1510  Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
1511}
1512
1513void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1514  VisitExpr(E);
1515  Record.push_back(E->getValue());
1516  Writer.AddSourceRange(E->getSourceRange(), Record);
1517  Writer.AddStmt(E->getOperand());
1518  Code = serialization::EXPR_CXX_NOEXCEPT;
1519}
1520
1521void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
1522  VisitExpr(E);
1523  Writer.AddSourceLocation(E->getEllipsisLoc(), Record);
1524  Record.push_back(E->NumExpansions);
1525  Writer.AddStmt(E->getPattern());
1526  Code = serialization::EXPR_PACK_EXPANSION;
1527}
1528
1529void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1530  VisitExpr(E);
1531  Writer.AddSourceLocation(E->OperatorLoc, Record);
1532  Writer.AddSourceLocation(E->PackLoc, Record);
1533  Writer.AddSourceLocation(E->RParenLoc, Record);
1534  Record.push_back(E->Length);
1535  Writer.AddDeclRef(E->Pack, Record);
1536  Code = serialization::EXPR_SIZEOF_PACK;
1537}
1538
1539void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
1540                                              SubstNonTypeTemplateParmExpr *E) {
1541  VisitExpr(E);
1542  Writer.AddDeclRef(E->getParameter(), Record);
1543  Writer.AddSourceLocation(E->getNameLoc(), Record);
1544  Writer.AddStmt(E->getReplacement());
1545  Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
1546}
1547
1548void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
1549                                          SubstNonTypeTemplateParmPackExpr *E) {
1550  VisitExpr(E);
1551  Writer.AddDeclRef(E->getParameterPack(), Record);
1552  Writer.AddTemplateArgument(E->getArgumentPack(), Record);
1553  Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
1554  Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
1555}
1556
1557void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
1558  VisitExpr(E);
1559  Record.push_back(E->getNumExpansions());
1560  Writer.AddDeclRef(E->getParameterPack(), Record);
1561  Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
1562  for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
1563       I != End; ++I)
1564    Writer.AddDeclRef(*I, Record);
1565  Code = serialization::EXPR_FUNCTION_PARM_PACK;
1566}
1567
1568void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1569  VisitExpr(E);
1570  Writer.AddStmt(E->getTemporary());
1571  Writer.AddDeclRef(E->getExtendingDecl(), Record);
1572  Record.push_back(E->getManglingNumber());
1573  Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
1574}
1575
1576void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1577  VisitExpr(E);
1578  Writer.AddStmt(E->getSourceExpr());
1579  Writer.AddSourceLocation(E->getLocation(), Record);
1580  Code = serialization::EXPR_OPAQUE_VALUE;
1581}
1582
1583//===----------------------------------------------------------------------===//
1584// CUDA Expressions and Statements.
1585//===----------------------------------------------------------------------===//
1586
1587void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1588  VisitCallExpr(E);
1589  Writer.AddStmt(E->getConfig());
1590  Code = serialization::EXPR_CUDA_KERNEL_CALL;
1591}
1592
1593//===----------------------------------------------------------------------===//
1594// OpenCL Expressions and Statements.
1595//===----------------------------------------------------------------------===//
1596void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
1597  VisitExpr(E);
1598  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
1599  Writer.AddSourceLocation(E->getRParenLoc(), Record);
1600  Writer.AddStmt(E->getSrcExpr());
1601  Code = serialization::EXPR_ASTYPE;
1602}
1603
1604//===----------------------------------------------------------------------===//
1605// Microsoft Expressions and Statements.
1606//===----------------------------------------------------------------------===//
1607void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
1608  VisitExpr(E);
1609  Record.push_back(E->isArrow());
1610  Writer.AddStmt(E->getBaseExpr());
1611  Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1612  Writer.AddSourceLocation(E->getMemberLoc(), Record);
1613  Writer.AddDeclRef(E->getPropertyDecl(), Record);
1614  Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;
1615}
1616
1617void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1618  VisitExpr(E);
1619  Writer.AddSourceRange(E->getSourceRange(), Record);
1620  if (E->isTypeOperand()) {
1621    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
1622    Code = serialization::EXPR_CXX_UUIDOF_TYPE;
1623  } else {
1624    Writer.AddStmt(E->getExprOperand());
1625    Code = serialization::EXPR_CXX_UUIDOF_EXPR;
1626  }
1627}
1628
1629void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
1630  VisitStmt(S);
1631  Writer.AddSourceLocation(S->getExceptLoc(), Record);
1632  Writer.AddStmt(S->getFilterExpr());
1633  Writer.AddStmt(S->getBlock());
1634  Code = serialization::STMT_SEH_EXCEPT;
1635}
1636
1637void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1638  VisitStmt(S);
1639  Writer.AddSourceLocation(S->getFinallyLoc(), Record);
1640  Writer.AddStmt(S->getBlock());
1641  Code = serialization::STMT_SEH_FINALLY;
1642}
1643
1644void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
1645  VisitStmt(S);
1646  Record.push_back(S->getIsCXXTry());
1647  Writer.AddSourceLocation(S->getTryLoc(), Record);
1648  Writer.AddStmt(S->getTryBlock());
1649  Writer.AddStmt(S->getHandler());
1650  Code = serialization::STMT_SEH_TRY;
1651}
1652
1653void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
1654  VisitStmt(S);
1655  Writer.AddSourceLocation(S->getLeaveLoc(), Record);
1656  Code = serialization::STMT_SEH_LEAVE;
1657}
1658
1659//===----------------------------------------------------------------------===//
1660// OpenMP Clauses.
1661//===----------------------------------------------------------------------===//
1662
1663namespace clang {
1664class OMPClauseWriter : public OMPClauseVisitor<OMPClauseWriter> {
1665  ASTStmtWriter *Writer;
1666  ASTWriter::RecordData &Record;
1667public:
1668  OMPClauseWriter(ASTStmtWriter *W, ASTWriter::RecordData &Record)
1669    : Writer(W), Record(Record) { }
1670#define OPENMP_CLAUSE(Name, Class)    \
1671  void Visit##Class(Class *S);
1672#include "clang/Basic/OpenMPKinds.def"
1673  void writeClause(OMPClause *C);
1674};
1675}
1676
1677void OMPClauseWriter::writeClause(OMPClause *C) {
1678  Record.push_back(C->getClauseKind());
1679  Visit(C);
1680  Writer->Writer.AddSourceLocation(C->getLocStart(), Record);
1681  Writer->Writer.AddSourceLocation(C->getLocEnd(), Record);
1682}
1683
1684void OMPClauseWriter::VisitOMPIfClause(OMPIfClause *C) {
1685  Writer->Writer.AddStmt(C->getCondition());
1686  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1687}
1688
1689void OMPClauseWriter::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
1690  Writer->Writer.AddStmt(C->getNumThreads());
1691  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1692}
1693
1694void OMPClauseWriter::VisitOMPSafelenClause(OMPSafelenClause *C) {
1695  Writer->Writer.AddStmt(C->getSafelen());
1696  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1697}
1698
1699void OMPClauseWriter::VisitOMPCollapseClause(OMPCollapseClause *C) {
1700  Writer->Writer.AddStmt(C->getNumForLoops());
1701  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1702}
1703
1704void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) {
1705  Record.push_back(C->getDefaultKind());
1706  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1707  Writer->Writer.AddSourceLocation(C->getDefaultKindKwLoc(), Record);
1708}
1709
1710void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *C) {
1711  Record.push_back(C->getProcBindKind());
1712  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1713  Writer->Writer.AddSourceLocation(C->getProcBindKindKwLoc(), Record);
1714}
1715
1716void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *C) {
1717  Record.push_back(C->getScheduleKind());
1718  Writer->Writer.AddStmt(C->getChunkSize());
1719  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1720  Writer->Writer.AddSourceLocation(C->getScheduleKindLoc(), Record);
1721  Writer->Writer.AddSourceLocation(C->getCommaLoc(), Record);
1722}
1723
1724void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *) {}
1725
1726void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *) {}
1727
1728void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) {
1729  Record.push_back(C->varlist_size());
1730  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1731  for (auto *VE : C->varlists())
1732    Writer->Writer.AddStmt(VE);
1733}
1734
1735void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
1736  Record.push_back(C->varlist_size());
1737  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1738  for (auto *VE : C->varlists())
1739    Writer->Writer.AddStmt(VE);
1740}
1741
1742void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
1743  Record.push_back(C->varlist_size());
1744  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1745  for (auto *VE : C->varlists())
1746    Writer->Writer.AddStmt(VE);
1747}
1748
1749void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *C) {
1750  Record.push_back(C->varlist_size());
1751  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1752  for (auto *VE : C->varlists())
1753    Writer->Writer.AddStmt(VE);
1754}
1755
1756void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *C) {
1757  Record.push_back(C->varlist_size());
1758  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1759  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
1760  Writer->Writer.AddNestedNameSpecifierLoc(C->getQualifierLoc(), Record);
1761  Writer->Writer.AddDeclarationNameInfo(C->getNameInfo(), Record);
1762  for (auto *VE : C->varlists())
1763    Writer->Writer.AddStmt(VE);
1764}
1765
1766void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *C) {
1767  Record.push_back(C->varlist_size());
1768  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1769  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
1770  for (auto *VE : C->varlists())
1771    Writer->Writer.AddStmt(VE);
1772  Writer->Writer.AddStmt(C->getStep());
1773}
1774
1775void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *C) {
1776  Record.push_back(C->varlist_size());
1777  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1778  Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
1779  for (auto *VE : C->varlists())
1780    Writer->Writer.AddStmt(VE);
1781  Writer->Writer.AddStmt(C->getAlignment());
1782}
1783
1784void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *C) {
1785  Record.push_back(C->varlist_size());
1786  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1787  for (auto *VE : C->varlists())
1788    Writer->Writer.AddStmt(VE);
1789}
1790
1791void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
1792  Record.push_back(C->varlist_size());
1793  Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
1794  for (auto *VE : C->varlists())
1795    Writer->Writer.AddStmt(VE);
1796}
1797
1798//===----------------------------------------------------------------------===//
1799// OpenMP Directives.
1800//===----------------------------------------------------------------------===//
1801void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
1802  Writer.AddSourceLocation(E->getLocStart(), Record);
1803  Writer.AddSourceLocation(E->getLocEnd(), Record);
1804  OMPClauseWriter ClauseWriter(this, Record);
1805  for (unsigned i = 0; i < E->getNumClauses(); ++i) {
1806    ClauseWriter.writeClause(E->getClause(i));
1807  }
1808  Writer.AddStmt(E->getAssociatedStmt());
1809}
1810
1811void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
1812  VisitStmt(D);
1813  Record.push_back(D->getNumClauses());
1814  VisitOMPExecutableDirective(D);
1815  Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
1816}
1817
1818void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
1819  VisitStmt(D);
1820  Record.push_back(D->getNumClauses());
1821  Record.push_back(D->getCollapsedNumber());
1822  VisitOMPExecutableDirective(D);
1823  Code = serialization::STMT_OMP_SIMD_DIRECTIVE;
1824}
1825
1826void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
1827  VisitStmt(D);
1828  Record.push_back(D->getNumClauses());
1829  Record.push_back(D->getCollapsedNumber());
1830  VisitOMPExecutableDirective(D);
1831  Code = serialization::STMT_OMP_FOR_DIRECTIVE;
1832}
1833
1834void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
1835  VisitStmt(D);
1836  Record.push_back(D->getNumClauses());
1837  VisitOMPExecutableDirective(D);
1838  Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
1839}
1840
1841void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
1842  VisitStmt(D);
1843  VisitOMPExecutableDirective(D);
1844  Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
1845}
1846
1847void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {
1848  VisitStmt(D);
1849  Record.push_back(D->getNumClauses());
1850  VisitOMPExecutableDirective(D);
1851  Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;
1852}
1853
1854void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
1855  VisitStmt(D);
1856  Record.push_back(D->getNumClauses());
1857  Record.push_back(D->getCollapsedNumber());
1858  VisitOMPExecutableDirective(D);
1859  Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
1860}
1861
1862void ASTStmtWriter::VisitOMPParallelSectionsDirective(
1863    OMPParallelSectionsDirective *D) {
1864  VisitStmt(D);
1865  Record.push_back(D->getNumClauses());
1866  VisitOMPExecutableDirective(D);
1867  Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
1868}
1869
1870//===----------------------------------------------------------------------===//
1871// ASTWriter Implementation
1872//===----------------------------------------------------------------------===//
1873
1874unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
1875  assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
1876         "SwitchCase recorded twice");
1877  unsigned NextID = SwitchCaseIDs.size();
1878  SwitchCaseIDs[S] = NextID;
1879  return NextID;
1880}
1881
1882unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
1883  assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
1884         "SwitchCase hasn't been seen yet");
1885  return SwitchCaseIDs[S];
1886}
1887
1888void ASTWriter::ClearSwitchCaseIDs() {
1889  SwitchCaseIDs.clear();
1890}
1891
1892/// \brief Write the given substatement or subexpression to the
1893/// bitstream.
1894void ASTWriter::WriteSubStmt(Stmt *S,
1895                             llvm::DenseMap<Stmt *, uint64_t> &SubStmtEntries,
1896                             llvm::DenseSet<Stmt *> &ParentStmts) {
1897  RecordData Record;
1898  ASTStmtWriter Writer(*this, Record);
1899  ++NumStatements;
1900
1901  if (!S) {
1902    Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
1903    return;
1904  }
1905
1906  llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
1907  if (I != SubStmtEntries.end()) {
1908    Record.push_back(I->second);
1909    Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
1910    return;
1911  }
1912
1913#ifndef NDEBUG
1914  assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
1915
1916  struct ParentStmtInserterRAII {
1917    Stmt *S;
1918    llvm::DenseSet<Stmt *> &ParentStmts;
1919
1920    ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
1921      : S(S), ParentStmts(ParentStmts) {
1922      ParentStmts.insert(S);
1923    }
1924    ~ParentStmtInserterRAII() {
1925      ParentStmts.erase(S);
1926    }
1927  };
1928
1929  ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
1930#endif
1931
1932  // Redirect ASTWriter::AddStmt to collect sub-stmts.
1933  SmallVector<Stmt *, 16> SubStmts;
1934  CollectedStmts = &SubStmts;
1935
1936  Writer.Code = serialization::STMT_NULL_PTR;
1937  Writer.AbbrevToUse = 0;
1938  Writer.Visit(S);
1939
1940#ifndef NDEBUG
1941  if (Writer.Code == serialization::STMT_NULL_PTR) {
1942    SourceManager &SrcMgr
1943      = DeclIDs.begin()->first->getASTContext().getSourceManager();
1944    S->dump(SrcMgr);
1945    llvm_unreachable("Unhandled sub-statement writing AST file");
1946  }
1947#endif
1948
1949  // Revert ASTWriter::AddStmt.
1950  CollectedStmts = &StmtsToEmit;
1951
1952  // Write the sub-stmts in reverse order, last to first. When reading them back
1953  // we will read them in correct order by "pop"ing them from the Stmts stack.
1954  // This simplifies reading and allows to store a variable number of sub-stmts
1955  // without knowing it in advance.
1956  while (!SubStmts.empty())
1957    WriteSubStmt(SubStmts.pop_back_val(), SubStmtEntries, ParentStmts);
1958
1959  Stream.EmitRecord(Writer.Code, Record, Writer.AbbrevToUse);
1960
1961  SubStmtEntries[S] = Stream.GetCurrentBitNo();
1962}
1963
1964/// \brief Flush all of the statements that have been added to the
1965/// queue via AddStmt().
1966void ASTWriter::FlushStmts() {
1967  RecordData Record;
1968
1969  // We expect to be the only consumer of the two temporary statement maps,
1970  // assert that they are empty.
1971  assert(SubStmtEntries.empty() && "unexpected entries in sub-stmt map");
1972  assert(ParentStmts.empty() && "unexpected entries in parent stmt map");
1973
1974  for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1975    WriteSubStmt(StmtsToEmit[I], SubStmtEntries, ParentStmts);
1976
1977    assert(N == StmtsToEmit.size() &&
1978           "Substatement written via AddStmt rather than WriteSubStmt!");
1979
1980    // Note that we are at the end of a full expression. Any
1981    // expression records that follow this one are part of a different
1982    // expression.
1983    Stream.EmitRecord(serialization::STMT_STOP, Record);
1984
1985    SubStmtEntries.clear();
1986    ParentStmts.clear();
1987  }
1988
1989  StmtsToEmit.clear();
1990}
1991