1d6522cfcSSebastian Redl //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
2d6522cfcSSebastian Redl //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d6522cfcSSebastian Redl //
7d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
8ddd36fffSJames Dennett ///
9ddd36fffSJames Dennett /// \file
109fc8faf9SAdrian Prantl /// Implements serialization for Statements and Expressions.
11ddd36fffSJames Dennett ///
12d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
13d6522cfcSSebastian Redl 
14be99c615SAlexey Bataev #include "clang/AST/ExprOpenMP.h"
152ac702aaSJohn McCall #include "clang/Serialization/ASTRecordWriter.h"
16a0f50d73SSaar Raz #include "clang/Sema/DeclSpec.h"
174ab984e7SBenjamin Kramer #include "clang/AST/ASTContext.h"
18d6522cfcSSebastian Redl #include "clang/AST/DeclCXX.h"
19d6522cfcSSebastian Redl #include "clang/AST/DeclObjC.h"
20cdbc539aSDouglas Gregor #include "clang/AST/DeclTemplate.h"
21d6522cfcSSebastian Redl #include "clang/AST/StmtVisitor.h"
22f413f5edSJohn McCall #include "clang/Lex/Token.h"
23e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamWriter.h"
24d6522cfcSSebastian Redl using namespace clang;
25d6522cfcSSebastian Redl 
26d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
27d6522cfcSSebastian Redl // Statement/expression serialization
28d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
29d6522cfcSSebastian Redl 
30d6522cfcSSebastian Redl namespace clang {
315ec3eb11SAlexey Bataev 
32d6522cfcSSebastian Redl   class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
33d6522cfcSSebastian Redl     ASTWriter &Writer;
34290d8019SRichard Smith     ASTRecordWriter Record;
35d6522cfcSSebastian Redl 
36539c5061SSebastian Redl     serialization::StmtCode Code;
3703412ba0SDouglas Gregor     unsigned AbbrevToUse;
38d6522cfcSSebastian Redl 
39290d8019SRichard Smith   public:
ASTStmtWriter(ASTWriter & Writer,ASTWriter::RecordData & Record)40d6522cfcSSebastian Redl     ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
41290d8019SRichard Smith         : Writer(Writer), Record(Writer, Record),
42290d8019SRichard Smith           Code(serialization::STMT_NULL_PTR), AbbrevToUse(0) {}
43290d8019SRichard Smith 
44290d8019SRichard Smith     ASTStmtWriter(const ASTStmtWriter&) = delete;
45290d8019SRichard Smith 
Emit()46f50422aaSRichard Smith     uint64_t Emit() {
47290d8019SRichard Smith       assert(Code != serialization::STMT_NULL_PTR &&
48290d8019SRichard Smith              "unhandled sub-statement writing AST file");
49290d8019SRichard Smith       return Record.EmitStmt(Code, AbbrevToUse);
50290d8019SRichard Smith     }
51d6522cfcSSebastian Redl 
52e7d82283SJames Y Knight     void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &ArgInfo,
53e7d82283SJames Y Knight                                   const TemplateArgumentLoc *Args);
54d6522cfcSSebastian Redl 
55d6522cfcSSebastian Redl     void VisitStmt(Stmt *S);
56fa19404cSJohn McCall #define STMT(Type, Base) \
57fa19404cSJohn McCall     void Visit##Type(Type *);
58fa19404cSJohn McCall #include "clang/AST/StmtNodes.inc"
59d6522cfcSSebastian Redl   };
60ab9db510SAlexander Kornienko }
61d6522cfcSSebastian Redl 
AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo & ArgInfo,const TemplateArgumentLoc * Args)62e7d82283SJames Y Knight void ASTStmtWriter::AddTemplateKWAndArgsInfo(
63e7d82283SJames Y Knight     const ASTTemplateKWAndArgsInfo &ArgInfo, const TemplateArgumentLoc *Args) {
64290d8019SRichard Smith   Record.AddSourceLocation(ArgInfo.TemplateKWLoc);
65290d8019SRichard Smith   Record.AddSourceLocation(ArgInfo.LAngleLoc);
66290d8019SRichard Smith   Record.AddSourceLocation(ArgInfo.RAngleLoc);
67e7d82283SJames Y Knight   for (unsigned i = 0; i != ArgInfo.NumTemplateArgs; ++i)
68290d8019SRichard Smith     Record.AddTemplateArgumentLoc(Args[i]);
69d6522cfcSSebastian Redl }
70d6522cfcSSebastian Redl 
VisitStmt(Stmt * S)71d6522cfcSSebastian Redl void ASTStmtWriter::VisitStmt(Stmt *S) {
72d6522cfcSSebastian Redl }
73d6522cfcSSebastian Redl 
VisitNullStmt(NullStmt * S)74d6522cfcSSebastian Redl void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
75d6522cfcSSebastian Redl   VisitStmt(S);
76290d8019SRichard Smith   Record.AddSourceLocation(S->getSemiLoc());
7741d11c0eSBruno Ricci   Record.push_back(S->NullStmtBits.HasLeadingEmptyMacro);
78539c5061SSebastian Redl   Code = serialization::STMT_NULL;
79d6522cfcSSebastian Redl }
80d6522cfcSSebastian Redl 
VisitCompoundStmt(CompoundStmt * S)81d6522cfcSSebastian Redl void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
82d6522cfcSSebastian Redl   VisitStmt(S);
83d6522cfcSSebastian Redl   Record.push_back(S->size());
84*f7819ce1SSerge Pavlov   Record.push_back(S->hasStoredFPFeatures());
85c7e4e219SAaron Ballman   for (auto *CS : S->body())
86290d8019SRichard Smith     Record.AddStmt(CS);
87*f7819ce1SSerge Pavlov   if (S->hasStoredFPFeatures())
88*f7819ce1SSerge Pavlov     Record.push_back(S->getStoredFPFeatures().getAsOpaqueInt());
89290d8019SRichard Smith   Record.AddSourceLocation(S->getLBracLoc());
90290d8019SRichard Smith   Record.AddSourceLocation(S->getRBracLoc());
91539c5061SSebastian Redl   Code = serialization::STMT_COMPOUND;
92d6522cfcSSebastian Redl }
93d6522cfcSSebastian Redl 
VisitSwitchCase(SwitchCase * S)94d6522cfcSSebastian Redl void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
95d6522cfcSSebastian Redl   VisitStmt(S);
96d6522cfcSSebastian Redl   Record.push_back(Writer.getSwitchCaseID(S));
97290d8019SRichard Smith   Record.AddSourceLocation(S->getKeywordLoc());
98290d8019SRichard Smith   Record.AddSourceLocation(S->getColonLoc());
99d6522cfcSSebastian Redl }
100d6522cfcSSebastian Redl 
VisitCaseStmt(CaseStmt * S)101d6522cfcSSebastian Redl void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
102d6522cfcSSebastian Redl   VisitSwitchCase(S);
1035b305717SBruno Ricci   Record.push_back(S->caseStmtIsGNURange());
104290d8019SRichard Smith   Record.AddStmt(S->getLHS());
105290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
1065b305717SBruno Ricci   if (S->caseStmtIsGNURange()) {
1075b305717SBruno Ricci     Record.AddStmt(S->getRHS());
108290d8019SRichard Smith     Record.AddSourceLocation(S->getEllipsisLoc());
1095b305717SBruno Ricci   }
110539c5061SSebastian Redl   Code = serialization::STMT_CASE;
111d6522cfcSSebastian Redl }
112d6522cfcSSebastian Redl 
VisitDefaultStmt(DefaultStmt * S)113d6522cfcSSebastian Redl void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
114d6522cfcSSebastian Redl   VisitSwitchCase(S);
115290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
116539c5061SSebastian Redl   Code = serialization::STMT_DEFAULT;
117d6522cfcSSebastian Redl }
118d6522cfcSSebastian Redl 
VisitLabelStmt(LabelStmt * S)119d6522cfcSSebastian Redl void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
120d6522cfcSSebastian Redl   VisitStmt(S);
121797ad701STen Tzen   Record.push_back(S->isSideEntry());
122290d8019SRichard Smith   Record.AddDeclRef(S->getDecl());
123290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
124290d8019SRichard Smith   Record.AddSourceLocation(S->getIdentLoc());
125539c5061SSebastian Redl   Code = serialization::STMT_LABEL;
126d6522cfcSSebastian Redl }
127d6522cfcSSebastian Redl 
VisitAttributedStmt(AttributedStmt * S)128c202b280SRichard Smith void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
129c202b280SRichard Smith   VisitStmt(S);
13020f6fc62SAlexander Kornienko   Record.push_back(S->getAttrs().size());
131290d8019SRichard Smith   Record.AddAttributes(S->getAttrs());
132290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
133290d8019SRichard Smith   Record.AddSourceLocation(S->getAttrLoc());
134c202b280SRichard Smith   Code = serialization::STMT_ATTRIBUTED;
135c202b280SRichard Smith }
136c202b280SRichard Smith 
VisitIfStmt(IfStmt * S)137d6522cfcSSebastian Redl void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
138d6522cfcSSebastian Redl   VisitStmt(S);
139b1cc94b2SBruno Ricci 
140b1cc94b2SBruno Ricci   bool HasElse = S->getElse() != nullptr;
141b1cc94b2SBruno Ricci   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
142b1cc94b2SBruno Ricci   bool HasInit = S->getInit() != nullptr;
143b1cc94b2SBruno Ricci 
144b1cc94b2SBruno Ricci   Record.push_back(HasElse);
145b1cc94b2SBruno Ricci   Record.push_back(HasVar);
146b1cc94b2SBruno Ricci   Record.push_back(HasInit);
147424733c1SCorentin Jabot   Record.push_back(static_cast<uint64_t>(S->getStatementKind()));
148290d8019SRichard Smith   Record.AddStmt(S->getCond());
149290d8019SRichard Smith   Record.AddStmt(S->getThen());
150b1cc94b2SBruno Ricci   if (HasElse)
151290d8019SRichard Smith     Record.AddStmt(S->getElse());
152b1cc94b2SBruno Ricci   if (HasVar)
153b1cc94b2SBruno Ricci     Record.AddDeclRef(S->getConditionVariable());
154b1cc94b2SBruno Ricci   if (HasInit)
155b1cc94b2SBruno Ricci     Record.AddStmt(S->getInit());
156b1cc94b2SBruno Ricci 
157290d8019SRichard Smith   Record.AddSourceLocation(S->getIfLoc());
15894c6ceabSZequan Wu   Record.AddSourceLocation(S->getLParenLoc());
15994c6ceabSZequan Wu   Record.AddSourceLocation(S->getRParenLoc());
160b1cc94b2SBruno Ricci   if (HasElse)
161290d8019SRichard Smith     Record.AddSourceLocation(S->getElseLoc());
162b1cc94b2SBruno Ricci 
163539c5061SSebastian Redl   Code = serialization::STMT_IF;
164d6522cfcSSebastian Redl }
165d6522cfcSSebastian Redl 
VisitSwitchStmt(SwitchStmt * S)166d6522cfcSSebastian Redl void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
167d6522cfcSSebastian Redl   VisitStmt(S);
168e2806f85SBruno Ricci 
169e2806f85SBruno Ricci   bool HasInit = S->getInit() != nullptr;
170e2806f85SBruno Ricci   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
171e2806f85SBruno Ricci   Record.push_back(HasInit);
172e2806f85SBruno Ricci   Record.push_back(HasVar);
173e2806f85SBruno Ricci   Record.push_back(S->isAllEnumCasesCovered());
174e2806f85SBruno Ricci 
175290d8019SRichard Smith   Record.AddStmt(S->getCond());
176290d8019SRichard Smith   Record.AddStmt(S->getBody());
177e2806f85SBruno Ricci   if (HasInit)
178e2806f85SBruno Ricci     Record.AddStmt(S->getInit());
179e2806f85SBruno Ricci   if (HasVar)
180e2806f85SBruno Ricci     Record.AddDeclRef(S->getConditionVariable());
181e2806f85SBruno Ricci 
182290d8019SRichard Smith   Record.AddSourceLocation(S->getSwitchLoc());
18394c6ceabSZequan Wu   Record.AddSourceLocation(S->getLParenLoc());
18494c6ceabSZequan Wu   Record.AddSourceLocation(S->getRParenLoc());
185e2806f85SBruno Ricci 
186d6522cfcSSebastian Redl   for (SwitchCase *SC = S->getSwitchCaseList(); SC;
187d6522cfcSSebastian Redl        SC = SC->getNextSwitchCase())
188d6522cfcSSebastian Redl     Record.push_back(Writer.RecordSwitchCaseID(SC));
189539c5061SSebastian Redl   Code = serialization::STMT_SWITCH;
190d6522cfcSSebastian Redl }
191d6522cfcSSebastian Redl 
VisitWhileStmt(WhileStmt * S)192d6522cfcSSebastian Redl void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
193d6522cfcSSebastian Redl   VisitStmt(S);
194bacf751aSBruno Ricci 
195bacf751aSBruno Ricci   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
196bacf751aSBruno Ricci   Record.push_back(HasVar);
197bacf751aSBruno Ricci 
198290d8019SRichard Smith   Record.AddStmt(S->getCond());
199290d8019SRichard Smith   Record.AddStmt(S->getBody());
200bacf751aSBruno Ricci   if (HasVar)
201bacf751aSBruno Ricci     Record.AddDeclRef(S->getConditionVariable());
202bacf751aSBruno Ricci 
203290d8019SRichard Smith   Record.AddSourceLocation(S->getWhileLoc());
20417ea41e4SVy Nguyen   Record.AddSourceLocation(S->getLParenLoc());
20517ea41e4SVy Nguyen   Record.AddSourceLocation(S->getRParenLoc());
206539c5061SSebastian Redl   Code = serialization::STMT_WHILE;
207d6522cfcSSebastian Redl }
208d6522cfcSSebastian Redl 
VisitDoStmt(DoStmt * S)209d6522cfcSSebastian Redl void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
210d6522cfcSSebastian Redl   VisitStmt(S);
211290d8019SRichard Smith   Record.AddStmt(S->getCond());
212290d8019SRichard Smith   Record.AddStmt(S->getBody());
213290d8019SRichard Smith   Record.AddSourceLocation(S->getDoLoc());
214290d8019SRichard Smith   Record.AddSourceLocation(S->getWhileLoc());
215290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
216539c5061SSebastian Redl   Code = serialization::STMT_DO;
217d6522cfcSSebastian Redl }
218d6522cfcSSebastian Redl 
VisitForStmt(ForStmt * S)219d6522cfcSSebastian Redl void ASTStmtWriter::VisitForStmt(ForStmt *S) {
220d6522cfcSSebastian Redl   VisitStmt(S);
221290d8019SRichard Smith   Record.AddStmt(S->getInit());
222290d8019SRichard Smith   Record.AddStmt(S->getCond());
223290d8019SRichard Smith   Record.AddDeclRef(S->getConditionVariable());
224290d8019SRichard Smith   Record.AddStmt(S->getInc());
225290d8019SRichard Smith   Record.AddStmt(S->getBody());
226290d8019SRichard Smith   Record.AddSourceLocation(S->getForLoc());
227290d8019SRichard Smith   Record.AddSourceLocation(S->getLParenLoc());
228290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
229539c5061SSebastian Redl   Code = serialization::STMT_FOR;
230d6522cfcSSebastian Redl }
231d6522cfcSSebastian Redl 
VisitGotoStmt(GotoStmt * S)232d6522cfcSSebastian Redl void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
233d6522cfcSSebastian Redl   VisitStmt(S);
234290d8019SRichard Smith   Record.AddDeclRef(S->getLabel());
235290d8019SRichard Smith   Record.AddSourceLocation(S->getGotoLoc());
236290d8019SRichard Smith   Record.AddSourceLocation(S->getLabelLoc());
237539c5061SSebastian Redl   Code = serialization::STMT_GOTO;
238d6522cfcSSebastian Redl }
239d6522cfcSSebastian Redl 
VisitIndirectGotoStmt(IndirectGotoStmt * S)240d6522cfcSSebastian Redl void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
241d6522cfcSSebastian Redl   VisitStmt(S);
242290d8019SRichard Smith   Record.AddSourceLocation(S->getGotoLoc());
243290d8019SRichard Smith   Record.AddSourceLocation(S->getStarLoc());
244290d8019SRichard Smith   Record.AddStmt(S->getTarget());
245539c5061SSebastian Redl   Code = serialization::STMT_INDIRECT_GOTO;
246d6522cfcSSebastian Redl }
247d6522cfcSSebastian Redl 
VisitContinueStmt(ContinueStmt * S)248d6522cfcSSebastian Redl void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
249d6522cfcSSebastian Redl   VisitStmt(S);
250290d8019SRichard Smith   Record.AddSourceLocation(S->getContinueLoc());
251539c5061SSebastian Redl   Code = serialization::STMT_CONTINUE;
252d6522cfcSSebastian Redl }
253d6522cfcSSebastian Redl 
VisitBreakStmt(BreakStmt * S)254d6522cfcSSebastian Redl void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
255d6522cfcSSebastian Redl   VisitStmt(S);
256290d8019SRichard Smith   Record.AddSourceLocation(S->getBreakLoc());
257539c5061SSebastian Redl   Code = serialization::STMT_BREAK;
258d6522cfcSSebastian Redl }
259d6522cfcSSebastian Redl 
VisitReturnStmt(ReturnStmt * S)260d6522cfcSSebastian Redl void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
261d6522cfcSSebastian Redl   VisitStmt(S);
262023b1d19SBruno Ricci 
263023b1d19SBruno Ricci   bool HasNRVOCandidate = S->getNRVOCandidate() != nullptr;
264023b1d19SBruno Ricci   Record.push_back(HasNRVOCandidate);
265023b1d19SBruno Ricci 
266290d8019SRichard Smith   Record.AddStmt(S->getRetValue());
267023b1d19SBruno Ricci   if (HasNRVOCandidate)
268290d8019SRichard Smith     Record.AddDeclRef(S->getNRVOCandidate());
269023b1d19SBruno Ricci 
270023b1d19SBruno Ricci   Record.AddSourceLocation(S->getReturnLoc());
271539c5061SSebastian Redl   Code = serialization::STMT_RETURN;
272d6522cfcSSebastian Redl }
273d6522cfcSSebastian Redl 
VisitDeclStmt(DeclStmt * S)274d6522cfcSSebastian Redl void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
275d6522cfcSSebastian Redl   VisitStmt(S);
276a6e4358fSStephen Kelly   Record.AddSourceLocation(S->getBeginLoc());
277290d8019SRichard Smith   Record.AddSourceLocation(S->getEndLoc());
278d6522cfcSSebastian Redl   DeclGroupRef DG = S->getDeclGroup();
279d6522cfcSSebastian Redl   for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
280290d8019SRichard Smith     Record.AddDeclRef(*D);
281539c5061SSebastian Redl   Code = serialization::STMT_DECL;
282d6522cfcSSebastian Redl }
283d6522cfcSSebastian Redl 
VisitAsmStmt(AsmStmt * S)284f413f5edSJohn McCall void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
285d6522cfcSSebastian Redl   VisitStmt(S);
286d6522cfcSSebastian Redl   Record.push_back(S->getNumOutputs());
287d6522cfcSSebastian Redl   Record.push_back(S->getNumInputs());
288d6522cfcSSebastian Redl   Record.push_back(S->getNumClobbers());
289290d8019SRichard Smith   Record.AddSourceLocation(S->getAsmLoc());
290d6522cfcSSebastian Redl   Record.push_back(S->isVolatile());
291d6522cfcSSebastian Redl   Record.push_back(S->isSimple());
292f413f5edSJohn McCall }
293f413f5edSJohn McCall 
VisitGCCAsmStmt(GCCAsmStmt * S)294f413f5edSJohn McCall void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
295f413f5edSJohn McCall   VisitAsmStmt(S);
296b8fee677SJennifer Yu   Record.push_back(S->getNumLabels());
297290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
298290d8019SRichard Smith   Record.AddStmt(S->getAsmString());
299d6522cfcSSebastian Redl 
300d6522cfcSSebastian Redl   // Outputs
301d6522cfcSSebastian Redl   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
302290d8019SRichard Smith     Record.AddIdentifierRef(S->getOutputIdentifier(I));
303290d8019SRichard Smith     Record.AddStmt(S->getOutputConstraintLiteral(I));
304290d8019SRichard Smith     Record.AddStmt(S->getOutputExpr(I));
305d6522cfcSSebastian Redl   }
306d6522cfcSSebastian Redl 
307d6522cfcSSebastian Redl   // Inputs
308d6522cfcSSebastian Redl   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
309290d8019SRichard Smith     Record.AddIdentifierRef(S->getInputIdentifier(I));
310290d8019SRichard Smith     Record.AddStmt(S->getInputConstraintLiteral(I));
311290d8019SRichard Smith     Record.AddStmt(S->getInputExpr(I));
312d6522cfcSSebastian Redl   }
313d6522cfcSSebastian Redl 
314d6522cfcSSebastian Redl   // Clobbers
315d6522cfcSSebastian Redl   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
316290d8019SRichard Smith     Record.AddStmt(S->getClobberStringLiteral(I));
317d6522cfcSSebastian Redl 
318b8fee677SJennifer Yu   // Labels
319b8fee677SJennifer Yu   for (auto *E : S->labels()) Record.AddStmt(E);
320b8fee677SJennifer Yu 
321de70e0efSChad Rosier   Code = serialization::STMT_GCCASM;
322d6522cfcSSebastian Redl }
323d6522cfcSSebastian Redl 
VisitMSAsmStmt(MSAsmStmt * S)32432503020SChad Rosier void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
325f413f5edSJohn McCall   VisitAsmStmt(S);
326290d8019SRichard Smith   Record.AddSourceLocation(S->getLBraceLoc());
327290d8019SRichard Smith   Record.AddSourceLocation(S->getEndLoc());
328f413f5edSJohn McCall   Record.push_back(S->getNumAsmToks());
329290d8019SRichard Smith   Record.AddString(S->getAsmString());
330f413f5edSJohn McCall 
331f413f5edSJohn McCall   // Tokens
332f413f5edSJohn McCall   for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {
333290d8019SRichard Smith     // FIXME: Move this to ASTRecordWriter?
334290d8019SRichard Smith     Writer.AddToken(S->getAsmToks()[I], Record.getRecordData());
335f413f5edSJohn McCall   }
336f413f5edSJohn McCall 
337f413f5edSJohn McCall   // Clobbers
338f413f5edSJohn McCall   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {
339290d8019SRichard Smith     Record.AddString(S->getClobber(I));
340f413f5edSJohn McCall   }
341f413f5edSJohn McCall 
342f413f5edSJohn McCall   // Outputs
343f413f5edSJohn McCall   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
344290d8019SRichard Smith     Record.AddStmt(S->getOutputExpr(I));
345290d8019SRichard Smith     Record.AddString(S->getOutputConstraint(I));
346f413f5edSJohn McCall   }
347f413f5edSJohn McCall 
348f413f5edSJohn McCall   // Inputs
349f413f5edSJohn McCall   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
350290d8019SRichard Smith     Record.AddStmt(S->getInputExpr(I));
351290d8019SRichard Smith     Record.AddString(S->getInputConstraint(I));
352f413f5edSJohn McCall   }
353e30d4994SChad Rosier 
354e30d4994SChad Rosier   Code = serialization::STMT_MSASM;
35532503020SChad Rosier }
35632503020SChad Rosier 
VisitCoroutineBodyStmt(CoroutineBodyStmt * CoroStmt)357f5ecb5e1SGor Nishanov void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *CoroStmt) {
358f5ecb5e1SGor Nishanov   VisitStmt(CoroStmt);
359f5ecb5e1SGor Nishanov   Record.push_back(CoroStmt->getParamMoves().size());
360f5ecb5e1SGor Nishanov   for (Stmt *S : CoroStmt->children())
361f5ecb5e1SGor Nishanov     Record.AddStmt(S);
362f5ecb5e1SGor Nishanov   Code = serialization::STMT_COROUTINE_BODY;
3639f690bd8SRichard Smith }
3649f690bd8SRichard Smith 
VisitCoreturnStmt(CoreturnStmt * S)3659f690bd8SRichard Smith void ASTStmtWriter::VisitCoreturnStmt(CoreturnStmt *S) {
366f5ecb5e1SGor Nishanov   VisitStmt(S);
367f5ecb5e1SGor Nishanov   Record.AddSourceLocation(S->getKeywordLoc());
368f5ecb5e1SGor Nishanov   Record.AddStmt(S->getOperand());
369f5ecb5e1SGor Nishanov   Record.AddStmt(S->getPromiseCall());
370f5ecb5e1SGor Nishanov   Record.push_back(S->isImplicit());
371f5ecb5e1SGor Nishanov   Code = serialization::STMT_CORETURN;
3729f690bd8SRichard Smith }
3739f690bd8SRichard Smith 
VisitCoroutineSuspendExpr(CoroutineSuspendExpr * E)374f5ecb5e1SGor Nishanov void ASTStmtWriter::VisitCoroutineSuspendExpr(CoroutineSuspendExpr *E) {
375f5ecb5e1SGor Nishanov   VisitExpr(E);
376f5ecb5e1SGor Nishanov   Record.AddSourceLocation(E->getKeywordLoc());
377f5ecb5e1SGor Nishanov   for (Stmt *S : E->children())
378f5ecb5e1SGor Nishanov     Record.AddStmt(S);
379f5ecb5e1SGor Nishanov   Record.AddStmt(E->getOpaqueValue());
3809f690bd8SRichard Smith }
3819f690bd8SRichard Smith 
VisitCoawaitExpr(CoawaitExpr * E)382f5ecb5e1SGor Nishanov void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *E) {
383f5ecb5e1SGor Nishanov   VisitCoroutineSuspendExpr(E);
384f5ecb5e1SGor Nishanov   Record.push_back(E->isImplicit());
385f5ecb5e1SGor Nishanov   Code = serialization::EXPR_COAWAIT;
38620f25cb6SEric Fiselier }
38720f25cb6SEric Fiselier 
VisitCoyieldExpr(CoyieldExpr * E)388f5ecb5e1SGor Nishanov void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *E) {
389f5ecb5e1SGor Nishanov   VisitCoroutineSuspendExpr(E);
390f5ecb5e1SGor Nishanov   Code = serialization::EXPR_COYIELD;
391f5ecb5e1SGor Nishanov }
392f5ecb5e1SGor Nishanov 
VisitDependentCoawaitExpr(DependentCoawaitExpr * E)393f5ecb5e1SGor Nishanov void ASTStmtWriter::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {
394f5ecb5e1SGor Nishanov   VisitExpr(E);
395f5ecb5e1SGor Nishanov   Record.AddSourceLocation(E->getKeywordLoc());
396f5ecb5e1SGor Nishanov   for (Stmt *S : E->children())
397f5ecb5e1SGor Nishanov     Record.AddStmt(S);
398f5ecb5e1SGor Nishanov   Code = serialization::EXPR_DEPENDENT_COAWAIT;
3999f690bd8SRichard Smith }
4009f690bd8SRichard Smith 
401a0f50d73SSaar Raz static void
addConstraintSatisfaction(ASTRecordWriter & Record,const ASTConstraintSatisfaction & Satisfaction)402a0f50d73SSaar Raz addConstraintSatisfaction(ASTRecordWriter &Record,
403a0f50d73SSaar Raz                           const ASTConstraintSatisfaction &Satisfaction) {
404fdf80e86SSaar Raz   Record.push_back(Satisfaction.IsSatisfied);
405fdf80e86SSaar Raz   if (!Satisfaction.IsSatisfied) {
406fdf80e86SSaar Raz     Record.push_back(Satisfaction.NumRecords);
407fdf80e86SSaar Raz     for (const auto &DetailRecord : Satisfaction) {
408fdf80e86SSaar Raz       Record.AddStmt(const_cast<Expr *>(DetailRecord.first));
409fdf80e86SSaar Raz       auto *E = DetailRecord.second.dyn_cast<Expr *>();
410fdf80e86SSaar Raz       Record.push_back(E == nullptr);
411fdf80e86SSaar Raz       if (E)
412fdf80e86SSaar Raz         Record.AddStmt(E);
413fdf80e86SSaar Raz       else {
414fdf80e86SSaar Raz         auto *Diag = DetailRecord.second.get<std::pair<SourceLocation,
415fdf80e86SSaar Raz                                                        StringRef> *>();
416fdf80e86SSaar Raz         Record.AddSourceLocation(Diag->first);
417fdf80e86SSaar Raz         Record.AddString(Diag->second);
418fdf80e86SSaar Raz       }
419fdf80e86SSaar Raz     }
420fdf80e86SSaar Raz   }
421a0f50d73SSaar Raz }
422a0f50d73SSaar Raz 
423a0f50d73SSaar Raz static void
addSubstitutionDiagnostic(ASTRecordWriter & Record,const concepts::Requirement::SubstitutionDiagnostic * D)424a0f50d73SSaar Raz addSubstitutionDiagnostic(
425a0f50d73SSaar Raz     ASTRecordWriter &Record,
426a0f50d73SSaar Raz     const concepts::Requirement::SubstitutionDiagnostic *D) {
427a0f50d73SSaar Raz   Record.AddString(D->SubstitutedEntity);
428a0f50d73SSaar Raz   Record.AddSourceLocation(D->DiagLoc);
429a0f50d73SSaar Raz   Record.AddString(D->DiagMessage);
430a0f50d73SSaar Raz }
431a0f50d73SSaar Raz 
VisitConceptSpecializationExpr(ConceptSpecializationExpr * E)432a0f50d73SSaar Raz void ASTStmtWriter::VisitConceptSpecializationExpr(
433a0f50d73SSaar Raz         ConceptSpecializationExpr *E) {
434a0f50d73SSaar Raz   VisitExpr(E);
435a0f50d73SSaar Raz   ArrayRef<TemplateArgument> TemplateArgs = E->getTemplateArguments();
436a0f50d73SSaar Raz   Record.push_back(TemplateArgs.size());
437a0f50d73SSaar Raz   Record.AddNestedNameSpecifierLoc(E->getNestedNameSpecifierLoc());
438a0f50d73SSaar Raz   Record.AddSourceLocation(E->getTemplateKWLoc());
439a0f50d73SSaar Raz   Record.AddDeclarationNameInfo(E->getConceptNameInfo());
440a0f50d73SSaar Raz   Record.AddDeclRef(E->getNamedConcept());
441f9e63891SSaar Raz   Record.AddDeclRef(E->getFoundDecl());
442a0f50d73SSaar Raz   Record.AddASTTemplateArgumentListInfo(E->getTemplateArgsAsWritten());
443a0f50d73SSaar Raz   for (const TemplateArgument &Arg : TemplateArgs)
444a0f50d73SSaar Raz     Record.AddTemplateArgument(Arg);
445a0f50d73SSaar Raz   if (!E->isValueDependent())
446a0f50d73SSaar Raz     addConstraintSatisfaction(Record, E->getSatisfaction());
447fdf80e86SSaar Raz 
4485d98ba60SSaar Raz   Code = serialization::EXPR_CONCEPT_SPECIALIZATION;
4495d98ba60SSaar Raz }
4505d98ba60SSaar Raz 
VisitRequiresExpr(RequiresExpr * E)451a0f50d73SSaar Raz void ASTStmtWriter::VisitRequiresExpr(RequiresExpr *E) {
452a0f50d73SSaar Raz   VisitExpr(E);
453a0f50d73SSaar Raz   Record.push_back(E->getLocalParameters().size());
454a0f50d73SSaar Raz   Record.push_back(E->getRequirements().size());
455a0f50d73SSaar Raz   Record.AddSourceLocation(E->RequiresExprBits.RequiresKWLoc);
456a0f50d73SSaar Raz   Record.push_back(E->RequiresExprBits.IsSatisfied);
457a0f50d73SSaar Raz   Record.AddDeclRef(E->getBody());
458a0f50d73SSaar Raz   for (ParmVarDecl *P : E->getLocalParameters())
459a0f50d73SSaar Raz     Record.AddDeclRef(P);
460a0f50d73SSaar Raz   for (concepts::Requirement *R : E->getRequirements()) {
461a0f50d73SSaar Raz     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(R)) {
462a0f50d73SSaar Raz       Record.push_back(concepts::Requirement::RK_Type);
463a0f50d73SSaar Raz       Record.push_back(TypeReq->Status);
464a0f50d73SSaar Raz       if (TypeReq->Status == concepts::TypeRequirement::SS_SubstitutionFailure)
465a0f50d73SSaar Raz         addSubstitutionDiagnostic(Record, TypeReq->getSubstitutionDiagnostic());
466a0f50d73SSaar Raz       else
467a0f50d73SSaar Raz         Record.AddTypeSourceInfo(TypeReq->getType());
468a0f50d73SSaar Raz     } else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(R)) {
469a0f50d73SSaar Raz       Record.push_back(ExprReq->getKind());
470a0f50d73SSaar Raz       Record.push_back(ExprReq->Status);
471a0f50d73SSaar Raz       if (ExprReq->isExprSubstitutionFailure()) {
472a0f50d73SSaar Raz         addSubstitutionDiagnostic(Record,
473a0f50d73SSaar Raz          ExprReq->Value.get<concepts::Requirement::SubstitutionDiagnostic *>());
474a0f50d73SSaar Raz       } else
475a0f50d73SSaar Raz         Record.AddStmt(ExprReq->Value.get<Expr *>());
476a0f50d73SSaar Raz       if (ExprReq->getKind() == concepts::Requirement::RK_Compound) {
477a0f50d73SSaar Raz         Record.AddSourceLocation(ExprReq->NoexceptLoc);
478a0f50d73SSaar Raz         const auto &RetReq = ExprReq->getReturnTypeRequirement();
479a0f50d73SSaar Raz         if (RetReq.isSubstitutionFailure()) {
480a0f50d73SSaar Raz           Record.push_back(2);
481a0f50d73SSaar Raz           addSubstitutionDiagnostic(Record, RetReq.getSubstitutionDiagnostic());
482a0f50d73SSaar Raz         } else if (RetReq.isTypeConstraint()) {
483a0f50d73SSaar Raz           Record.push_back(1);
484a0f50d73SSaar Raz           Record.AddTemplateParameterList(
485a0f50d73SSaar Raz               RetReq.getTypeConstraintTemplateParameterList());
486a0f50d73SSaar Raz           if (ExprReq->Status >=
487a0f50d73SSaar Raz               concepts::ExprRequirement::SS_ConstraintsNotSatisfied)
488a0f50d73SSaar Raz             Record.AddStmt(
489a0f50d73SSaar Raz                 ExprReq->getReturnTypeRequirementSubstitutedConstraintExpr());
490a0f50d73SSaar Raz         } else {
491a0f50d73SSaar Raz           assert(RetReq.isEmpty());
492a0f50d73SSaar Raz           Record.push_back(0);
493a0f50d73SSaar Raz         }
494a0f50d73SSaar Raz       }
495a0f50d73SSaar Raz     } else {
496a0f50d73SSaar Raz       auto *NestedReq = cast<concepts::NestedRequirement>(R);
497a0f50d73SSaar Raz       Record.push_back(concepts::Requirement::RK_Nested);
498a0f50d73SSaar Raz       Record.push_back(NestedReq->isSubstitutionFailure());
499a0f50d73SSaar Raz       if (NestedReq->isSubstitutionFailure()){
500a0f50d73SSaar Raz         addSubstitutionDiagnostic(Record,
501a0f50d73SSaar Raz                                   NestedReq->getSubstitutionDiagnostic());
502a0f50d73SSaar Raz       } else {
503a0f50d73SSaar Raz         Record.AddStmt(NestedReq->Value.get<Expr *>());
504a0f50d73SSaar Raz         if (!NestedReq->isDependent())
505a0f50d73SSaar Raz           addConstraintSatisfaction(Record, *NestedReq->Satisfaction);
506a0f50d73SSaar Raz       }
507a0f50d73SSaar Raz     }
508a0f50d73SSaar Raz   }
509a0f50d73SSaar Raz   Record.AddSourceLocation(E->getEndLoc());
510a0f50d73SSaar Raz 
511a0f50d73SSaar Raz   Code = serialization::EXPR_REQUIRES;
512a0f50d73SSaar Raz }
513a0f50d73SSaar Raz 
5145d98ba60SSaar Raz 
VisitCapturedStmt(CapturedStmt * S)51524110cc7STareq A. Siraj void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
51624110cc7STareq A. Siraj   VisitStmt(S);
517ce914fc8SBen Langmuir   // NumCaptures
518ce914fc8SBen Langmuir   Record.push_back(std::distance(S->capture_begin(), S->capture_end()));
51924110cc7STareq A. Siraj 
52017fbf6edSWei Pan   // CapturedDecl and captured region kind
521290d8019SRichard Smith   Record.AddDeclRef(S->getCapturedDecl());
52217fbf6edSWei Pan   Record.push_back(S->getCapturedRegionKind());
52317fbf6edSWei Pan 
524290d8019SRichard Smith   Record.AddDeclRef(S->getCapturedRecordDecl());
525ce914fc8SBen Langmuir 
526ce914fc8SBen Langmuir   // Capture inits
527ba0238faSAaron Ballman   for (auto *I : S->capture_inits())
528290d8019SRichard Smith     Record.AddStmt(I);
529ce914fc8SBen Langmuir 
530ce914fc8SBen Langmuir   // Body
531290d8019SRichard Smith   Record.AddStmt(S->getCapturedStmt());
532ce914fc8SBen Langmuir 
533ce914fc8SBen Langmuir   // Captures
534c656303aSAaron Ballman   for (const auto &I : S->captures()) {
535330de030SAlexey Bataev     if (I.capturesThis() || I.capturesVariableArrayType())
536290d8019SRichard Smith       Record.AddDeclRef(nullptr);
537ce914fc8SBen Langmuir     else
538290d8019SRichard Smith       Record.AddDeclRef(I.getCapturedVar());
539c656303aSAaron Ballman     Record.push_back(I.getCaptureKind());
540290d8019SRichard Smith     Record.AddSourceLocation(I.getLocation());
541ce914fc8SBen Langmuir   }
542ce914fc8SBen Langmuir 
543ce914fc8SBen Langmuir   Code = serialization::STMT_CAPTURED;
54424110cc7STareq A. Siraj }
54524110cc7STareq A. Siraj 
VisitExpr(Expr * E)546d6522cfcSSebastian Redl void ASTStmtWriter::VisitExpr(Expr *E) {
547d6522cfcSSebastian Redl   VisitStmt(E);
548290d8019SRichard Smith   Record.AddTypeRef(E->getType());
5490cd5cd19SSam McCall   Record.push_back(E->getDependence());
5507decc9e4SJohn McCall   Record.push_back(E->getValueKind());
5517decc9e4SJohn McCall   Record.push_back(E->getObjectKind());
552d6522cfcSSebastian Redl }
553d6522cfcSSebastian Redl 
VisitConstantExpr(ConstantExpr * E)5547c44da27SBill Wendling void ASTStmtWriter::VisitConstantExpr(ConstantExpr *E) {
5557c44da27SBill Wendling   VisitExpr(E);
556e7ce0528SBruno Ricci   Record.push_back(E->ConstantExprBits.ResultKind);
557e7ce0528SBruno Ricci 
558e7ce0528SBruno Ricci   Record.push_back(E->ConstantExprBits.APValueKind);
559e7ce0528SBruno Ricci   Record.push_back(E->ConstantExprBits.IsUnsigned);
560e7ce0528SBruno Ricci   Record.push_back(E->ConstantExprBits.BitWidth);
561e7ce0528SBruno Ricci   // HasCleanup not serialized since we can just query the APValue.
562e7ce0528SBruno Ricci   Record.push_back(E->ConstantExprBits.IsImmediateInvocation);
563e7ce0528SBruno Ricci 
56483c7b610SGauthier Harnisch   switch (E->ConstantExprBits.ResultKind) {
565e7ce0528SBruno Ricci   case ConstantExpr::RSK_None:
566e7ce0528SBruno Ricci     break;
56783c7b610SGauthier Harnisch   case ConstantExpr::RSK_Int64:
56883c7b610SGauthier Harnisch     Record.push_back(E->Int64Result());
56983c7b610SGauthier Harnisch     break;
57083c7b610SGauthier Harnisch   case ConstantExpr::RSK_APValue:
57183c7b610SGauthier Harnisch     Record.AddAPValue(E->APValueResult());
572e7ce0528SBruno Ricci     break;
573e7ce0528SBruno Ricci   default:
574e7ce0528SBruno Ricci     llvm_unreachable("unexpected ResultKind!");
57583c7b610SGauthier Harnisch   }
576e7ce0528SBruno Ricci 
5777c44da27SBill Wendling   Record.AddStmt(E->getSubExpr());
5787c44da27SBill Wendling   Code = serialization::EXPR_CONSTANT;
5797c44da27SBill Wendling }
5807c44da27SBill Wendling 
VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr * E)581eba69b59SErich Keane void ASTStmtWriter::VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr *E) {
582eba69b59SErich Keane   VisitExpr(E);
583eba69b59SErich Keane 
584eba69b59SErich Keane   Record.AddSourceLocation(E->getLocation());
585eba69b59SErich Keane   Record.AddSourceLocation(E->getLParenLocation());
586eba69b59SErich Keane   Record.AddSourceLocation(E->getRParenLocation());
587eba69b59SErich Keane   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
588eba69b59SErich Keane 
589eba69b59SErich Keane   Code = serialization::EXPR_SYCL_UNIQUE_STABLE_NAME;
590eba69b59SErich Keane }
591eba69b59SErich Keane 
VisitPredefinedExpr(PredefinedExpr * E)592d6522cfcSSebastian Redl void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
593d6522cfcSSebastian Redl   VisitExpr(E);
59417ff026bSBruno Ricci 
59517ff026bSBruno Ricci   bool HasFunctionName = E->getFunctionName() != nullptr;
59617ff026bSBruno Ricci   Record.push_back(HasFunctionName);
59717ff026bSBruno Ricci   Record.push_back(E->getIdentKind()); // FIXME: stable encoding
598290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
59917ff026bSBruno Ricci   if (HasFunctionName)
600290d8019SRichard Smith     Record.AddStmt(E->getFunctionName());
601539c5061SSebastian Redl   Code = serialization::EXPR_PREDEFINED;
602d6522cfcSSebastian Redl }
603d6522cfcSSebastian Redl 
VisitDeclRefExpr(DeclRefExpr * E)604d6522cfcSSebastian Redl void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
605d6522cfcSSebastian Redl   VisitExpr(E);
606d6522cfcSSebastian Redl 
607d6522cfcSSebastian Redl   Record.push_back(E->hasQualifier());
6088d26bb08SChandler Carruth   Record.push_back(E->getDecl() != E->getFoundDecl());
6097945c981SAbramo Bagnara   Record.push_back(E->hasTemplateKWAndArgsInfo());
610635ed24eSAbramo Bagnara   Record.push_back(E->hadMultipleCandidates());
61119acc3d3SAlexey Bataev   Record.push_back(E->refersToEnclosingVariableOrCapture());
612715f7a1bSRichard Smith   Record.push_back(E->isNonOdrUse());
613d6522cfcSSebastian Redl 
6147945c981SAbramo Bagnara   if (E->hasTemplateKWAndArgsInfo()) {
61587866cedSDouglas Gregor     unsigned NumTemplateArgs = E->getNumTemplateArgs();
61687866cedSDouglas Gregor     Record.push_back(NumTemplateArgs);
61787866cedSDouglas Gregor   }
618d6522cfcSSebastian Redl 
61903412ba0SDouglas Gregor   DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
62003412ba0SDouglas Gregor 
6217945c981SAbramo Bagnara   if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
62203412ba0SDouglas Gregor       (E->getDecl() == E->getFoundDecl()) &&
623715f7a1bSRichard Smith       nk == DeclarationName::Identifier &&
624715f7a1bSRichard Smith       !E->refersToEnclosingVariableOrCapture() && !E->isNonOdrUse()) {
62503412ba0SDouglas Gregor     AbbrevToUse = Writer.getDeclRefExprAbbrev();
62603412ba0SDouglas Gregor   }
62703412ba0SDouglas Gregor 
62880756f62SAnders Carlsson   if (E->hasQualifier())
629290d8019SRichard Smith     Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
63080756f62SAnders Carlsson 
6318d26bb08SChandler Carruth   if (E->getDecl() != E->getFoundDecl())
632290d8019SRichard Smith     Record.AddDeclRef(E->getFoundDecl());
6338d26bb08SChandler Carruth 
6347945c981SAbramo Bagnara   if (E->hasTemplateKWAndArgsInfo())
635e7d82283SJames Y Knight     AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
636e7d82283SJames Y Knight                              E->getTrailingObjects<TemplateArgumentLoc>());
63780756f62SAnders Carlsson 
638290d8019SRichard Smith   Record.AddDeclRef(E->getDecl());
639290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
640290d8019SRichard Smith   Record.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName());
641539c5061SSebastian Redl   Code = serialization::EXPR_DECL_REF;
642d6522cfcSSebastian Redl }
643d6522cfcSSebastian Redl 
VisitIntegerLiteral(IntegerLiteral * E)644d6522cfcSSebastian Redl void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
645d6522cfcSSebastian Redl   VisitExpr(E);
646290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
647290d8019SRichard Smith   Record.AddAPInt(E->getValue());
64803412ba0SDouglas Gregor 
64903412ba0SDouglas Gregor   if (E->getValue().getBitWidth() == 32) {
65003412ba0SDouglas Gregor     AbbrevToUse = Writer.getIntegerLiteralAbbrev();
65103412ba0SDouglas Gregor   }
65203412ba0SDouglas Gregor 
653539c5061SSebastian Redl   Code = serialization::EXPR_INTEGER_LITERAL;
654d6522cfcSSebastian Redl }
655d6522cfcSSebastian Redl 
VisitFixedPointLiteral(FixedPointLiteral * E)656db01c3adSLeonard Chan void ASTStmtWriter::VisitFixedPointLiteral(FixedPointLiteral *E) {
657db01c3adSLeonard Chan   VisitExpr(E);
658db01c3adSLeonard Chan   Record.AddSourceLocation(E->getLocation());
659161fc1d9SVince Bridgers   Record.push_back(E->getScale());
660db01c3adSLeonard Chan   Record.AddAPInt(E->getValue());
661161fc1d9SVince Bridgers   Code = serialization::EXPR_FIXEDPOINT_LITERAL;
662db01c3adSLeonard Chan }
663db01c3adSLeonard Chan 
VisitFloatingLiteral(FloatingLiteral * E)664d6522cfcSSebastian Redl void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
665d6522cfcSSebastian Redl   VisitExpr(E);
666178723a6STim Northover   Record.push_back(E->getRawSemantics());
667d6522cfcSSebastian Redl   Record.push_back(E->isExact());
668290d8019SRichard Smith   Record.AddAPFloat(E->getValue());
669290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
670539c5061SSebastian Redl   Code = serialization::EXPR_FLOATING_LITERAL;
671d6522cfcSSebastian Redl }
672d6522cfcSSebastian Redl 
VisitImaginaryLiteral(ImaginaryLiteral * E)673d6522cfcSSebastian Redl void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
674d6522cfcSSebastian Redl   VisitExpr(E);
675290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
676539c5061SSebastian Redl   Code = serialization::EXPR_IMAGINARY_LITERAL;
677d6522cfcSSebastian Redl }
678d6522cfcSSebastian Redl 
VisitStringLiteral(StringLiteral * E)679d6522cfcSSebastian Redl void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
680d6522cfcSSebastian Redl   VisitExpr(E);
681b94ad1e1SBruno Ricci 
682b94ad1e1SBruno Ricci   // Store the various bits of data of StringLiteral.
683d6522cfcSSebastian Redl   Record.push_back(E->getNumConcatenated());
684b94ad1e1SBruno Ricci   Record.push_back(E->getLength());
685b94ad1e1SBruno Ricci   Record.push_back(E->getCharByteWidth());
686fb65e592SDouglas Gregor   Record.push_back(E->getKind());
68775245409SAnders Carlsson   Record.push_back(E->isPascal());
688b94ad1e1SBruno Ricci 
689b94ad1e1SBruno Ricci   // Store the trailing array of SourceLocation.
690d6522cfcSSebastian Redl   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
691290d8019SRichard Smith     Record.AddSourceLocation(E->getStrTokenLoc(I));
692b94ad1e1SBruno Ricci 
693b94ad1e1SBruno Ricci   // Store the trailing array of char holding the string data.
694b94ad1e1SBruno Ricci   StringRef StrData = E->getBytes();
695b94ad1e1SBruno Ricci   for (unsigned I = 0, N = E->getByteLength(); I != N; ++I)
696b94ad1e1SBruno Ricci     Record.push_back(StrData[I]);
697b94ad1e1SBruno Ricci 
698539c5061SSebastian Redl   Code = serialization::EXPR_STRING_LITERAL;
699d6522cfcSSebastian Redl }
700d6522cfcSSebastian Redl 
VisitCharacterLiteral(CharacterLiteral * E)701d6522cfcSSebastian Redl void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
702d6522cfcSSebastian Redl   VisitExpr(E);
703d6522cfcSSebastian Redl   Record.push_back(E->getValue());
704290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
705fb65e592SDouglas Gregor   Record.push_back(E->getKind());
70603412ba0SDouglas Gregor 
70703412ba0SDouglas Gregor   AbbrevToUse = Writer.getCharacterLiteralAbbrev();
70803412ba0SDouglas Gregor 
709539c5061SSebastian Redl   Code = serialization::EXPR_CHARACTER_LITERAL;
710d6522cfcSSebastian Redl }
711d6522cfcSSebastian Redl 
VisitParenExpr(ParenExpr * E)712d6522cfcSSebastian Redl void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
713d6522cfcSSebastian Redl   VisitExpr(E);
714290d8019SRichard Smith   Record.AddSourceLocation(E->getLParen());
715290d8019SRichard Smith   Record.AddSourceLocation(E->getRParen());
716290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
717539c5061SSebastian Redl   Code = serialization::EXPR_PAREN;
718d6522cfcSSebastian Redl }
719d6522cfcSSebastian Redl 
VisitParenListExpr(ParenListExpr * E)720d6522cfcSSebastian Redl void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
721d6522cfcSSebastian Redl   VisitExpr(E);
722f49e1ca0SBruno Ricci   Record.push_back(E->getNumExprs());
723f49e1ca0SBruno Ricci   for (auto *SubStmt : E->exprs())
724f49e1ca0SBruno Ricci     Record.AddStmt(SubStmt);
725f49e1ca0SBruno Ricci   Record.AddSourceLocation(E->getLParenLoc());
726f49e1ca0SBruno Ricci   Record.AddSourceLocation(E->getRParenLoc());
727539c5061SSebastian Redl   Code = serialization::EXPR_PAREN_LIST;
728d6522cfcSSebastian Redl }
729d6522cfcSSebastian Redl 
VisitUnaryOperator(UnaryOperator * E)730d6522cfcSSebastian Redl void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
731d6522cfcSSebastian Redl   VisitExpr(E);
732f5360d4bSMelanie Blower   bool HasFPFeatures = E->hasStoredFPFeatures();
733f5360d4bSMelanie Blower   // Write this first for easy access when deserializing, as they affect the
734f5360d4bSMelanie Blower   // size of the UnaryOperator.
735f5360d4bSMelanie Blower   Record.push_back(HasFPFeatures);
736290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
737d6522cfcSSebastian Redl   Record.push_back(E->getOpcode()); // FIXME: stable encoding
738290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
739a5038559SAaron Ballman   Record.push_back(E->canOverflow());
740f5360d4bSMelanie Blower   if (HasFPFeatures)
741f5360d4bSMelanie Blower     Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());
742539c5061SSebastian Redl   Code = serialization::EXPR_UNARY_OPERATOR;
743d6522cfcSSebastian Redl }
744d6522cfcSSebastian Redl 
VisitOffsetOfExpr(OffsetOfExpr * E)745d6522cfcSSebastian Redl void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
746d6522cfcSSebastian Redl   VisitExpr(E);
747d6522cfcSSebastian Redl   Record.push_back(E->getNumComponents());
748d6522cfcSSebastian Redl   Record.push_back(E->getNumExpressions());
749290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
750290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
751290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
752d6522cfcSSebastian Redl   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
7537281c357SJames Y Knight     const OffsetOfNode &ON = E->getComponent(I);
754d6522cfcSSebastian Redl     Record.push_back(ON.getKind()); // FIXME: Stable encoding
755290d8019SRichard Smith     Record.AddSourceLocation(ON.getSourceRange().getBegin());
756290d8019SRichard Smith     Record.AddSourceLocation(ON.getSourceRange().getEnd());
757d6522cfcSSebastian Redl     switch (ON.getKind()) {
7587281c357SJames Y Knight     case OffsetOfNode::Array:
759d6522cfcSSebastian Redl       Record.push_back(ON.getArrayExprIndex());
760d6522cfcSSebastian Redl       break;
761d6522cfcSSebastian Redl 
7627281c357SJames Y Knight     case OffsetOfNode::Field:
763290d8019SRichard Smith       Record.AddDeclRef(ON.getField());
764d6522cfcSSebastian Redl       break;
765d6522cfcSSebastian Redl 
7667281c357SJames Y Knight     case OffsetOfNode::Identifier:
767290d8019SRichard Smith       Record.AddIdentifierRef(ON.getFieldName());
768d6522cfcSSebastian Redl       break;
769d6522cfcSSebastian Redl 
7707281c357SJames Y Knight     case OffsetOfNode::Base:
771290d8019SRichard Smith       Record.AddCXXBaseSpecifier(*ON.getBase());
772d6522cfcSSebastian Redl       break;
773d6522cfcSSebastian Redl     }
774d6522cfcSSebastian Redl   }
775d6522cfcSSebastian Redl   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
776290d8019SRichard Smith     Record.AddStmt(E->getIndexExpr(I));
777539c5061SSebastian Redl   Code = serialization::EXPR_OFFSETOF;
778d6522cfcSSebastian Redl }
779d6522cfcSSebastian Redl 
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)780e190dee7SPeter Collingbourne void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
781d6522cfcSSebastian Redl   VisitExpr(E);
782e190dee7SPeter Collingbourne   Record.push_back(E->getKind());
783d6522cfcSSebastian Redl   if (E->isArgumentType())
784290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getArgumentTypeInfo());
785d6522cfcSSebastian Redl   else {
786d6522cfcSSebastian Redl     Record.push_back(0);
787290d8019SRichard Smith     Record.AddStmt(E->getArgumentExpr());
788d6522cfcSSebastian Redl   }
789290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
790290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
791539c5061SSebastian Redl   Code = serialization::EXPR_SIZEOF_ALIGN_OF;
792d6522cfcSSebastian Redl }
793d6522cfcSSebastian Redl 
VisitArraySubscriptExpr(ArraySubscriptExpr * E)794d6522cfcSSebastian Redl void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
795d6522cfcSSebastian Redl   VisitExpr(E);
796290d8019SRichard Smith   Record.AddStmt(E->getLHS());
797290d8019SRichard Smith   Record.AddStmt(E->getRHS());
798290d8019SRichard Smith   Record.AddSourceLocation(E->getRBracketLoc());
799539c5061SSebastian Redl   Code = serialization::EXPR_ARRAY_SUBSCRIPT;
800d6522cfcSSebastian Redl }
801d6522cfcSSebastian Redl 
VisitMatrixSubscriptExpr(MatrixSubscriptExpr * E)8028f3f88d2SFlorian Hahn void ASTStmtWriter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
8038f3f88d2SFlorian Hahn   VisitExpr(E);
8048f3f88d2SFlorian Hahn   Record.AddStmt(E->getBase());
8058f3f88d2SFlorian Hahn   Record.AddStmt(E->getRowIdx());
8068f3f88d2SFlorian Hahn   Record.AddStmt(E->getColumnIdx());
8078f3f88d2SFlorian Hahn   Record.AddSourceLocation(E->getRBracketLoc());
8088f3f88d2SFlorian Hahn   Code = serialization::EXPR_ARRAY_SUBSCRIPT;
8098f3f88d2SFlorian Hahn }
8108f3f88d2SFlorian Hahn 
VisitOMPArraySectionExpr(OMPArraySectionExpr * E)8111a3320e4SAlexey Bataev void ASTStmtWriter::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) {
8121a3320e4SAlexey Bataev   VisitExpr(E);
813290d8019SRichard Smith   Record.AddStmt(E->getBase());
814290d8019SRichard Smith   Record.AddStmt(E->getLowerBound());
815290d8019SRichard Smith   Record.AddStmt(E->getLength());
8162da9572aScchen   Record.AddStmt(E->getStride());
8172da9572aScchen   Record.AddSourceLocation(E->getColonLocFirst());
8182da9572aScchen   Record.AddSourceLocation(E->getColonLocSecond());
819290d8019SRichard Smith   Record.AddSourceLocation(E->getRBracketLoc());
8201a3320e4SAlexey Bataev   Code = serialization::EXPR_OMP_ARRAY_SECTION;
8211a3320e4SAlexey Bataev }
8221a3320e4SAlexey Bataev 
VisitOMPArrayShapingExpr(OMPArrayShapingExpr * E)8237ac9efb0SAlexey Bataev void ASTStmtWriter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
8247ac9efb0SAlexey Bataev   VisitExpr(E);
8257ac9efb0SAlexey Bataev   Record.push_back(E->getDimensions().size());
8267ac9efb0SAlexey Bataev   Record.AddStmt(E->getBase());
8277ac9efb0SAlexey Bataev   for (Expr *Dim : E->getDimensions())
8287ac9efb0SAlexey Bataev     Record.AddStmt(Dim);
8297ac9efb0SAlexey Bataev   for (SourceRange SR : E->getBracketsRanges())
8307ac9efb0SAlexey Bataev     Record.AddSourceRange(SR);
8317ac9efb0SAlexey Bataev   Record.AddSourceLocation(E->getLParenLoc());
8327ac9efb0SAlexey Bataev   Record.AddSourceLocation(E->getRParenLoc());
8337ac9efb0SAlexey Bataev   Code = serialization::EXPR_OMP_ARRAY_SHAPING;
8347ac9efb0SAlexey Bataev }
8357ac9efb0SAlexey Bataev 
VisitOMPIteratorExpr(OMPIteratorExpr * E)83613a1504fSAlexey Bataev void ASTStmtWriter::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
83713a1504fSAlexey Bataev   VisitExpr(E);
83813a1504fSAlexey Bataev   Record.push_back(E->numOfIterators());
83913a1504fSAlexey Bataev   Record.AddSourceLocation(E->getIteratorKwLoc());
84013a1504fSAlexey Bataev   Record.AddSourceLocation(E->getLParenLoc());
84113a1504fSAlexey Bataev   Record.AddSourceLocation(E->getRParenLoc());
84213a1504fSAlexey Bataev   for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {
84313a1504fSAlexey Bataev     Record.AddDeclRef(E->getIteratorDecl(I));
84413a1504fSAlexey Bataev     Record.AddSourceLocation(E->getAssignLoc(I));
84513a1504fSAlexey Bataev     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
84613a1504fSAlexey Bataev     Record.AddStmt(Range.Begin);
84713a1504fSAlexey Bataev     Record.AddStmt(Range.End);
84813a1504fSAlexey Bataev     Record.AddStmt(Range.Step);
84913a1504fSAlexey Bataev     Record.AddSourceLocation(E->getColonLoc(I));
85013a1504fSAlexey Bataev     if (Range.Step)
85113a1504fSAlexey Bataev       Record.AddSourceLocation(E->getSecondColonLoc(I));
852be99c615SAlexey Bataev     // Serialize helpers
853be99c615SAlexey Bataev     OMPIteratorHelperData &HD = E->getHelper(I);
854be99c615SAlexey Bataev     Record.AddDeclRef(HD.CounterVD);
855be99c615SAlexey Bataev     Record.AddStmt(HD.Upper);
856be99c615SAlexey Bataev     Record.AddStmt(HD.Update);
857be99c615SAlexey Bataev     Record.AddStmt(HD.CounterUpdate);
85813a1504fSAlexey Bataev   }
85913a1504fSAlexey Bataev   Code = serialization::EXPR_OMP_ITERATOR;
86013a1504fSAlexey Bataev }
86113a1504fSAlexey Bataev 
VisitCallExpr(CallExpr * E)862d6522cfcSSebastian Redl void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
863d6522cfcSSebastian Redl   VisitExpr(E);
864d6522cfcSSebastian Redl   Record.push_back(E->getNumArgs());
86570e7aa4aSSerge Pavlov   Record.push_back(E->hasStoredFPFeatures());
866290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
867290d8019SRichard Smith   Record.AddStmt(E->getCallee());
868d6522cfcSSebastian Redl   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
869d6522cfcSSebastian Redl        Arg != ArgEnd; ++Arg)
870290d8019SRichard Smith     Record.AddStmt(*Arg);
8715cdc2cdaSEric Fiselier   Record.push_back(static_cast<unsigned>(E->getADLCallKind()));
87270e7aa4aSSerge Pavlov   if (E->hasStoredFPFeatures())
87370e7aa4aSSerge Pavlov     Record.push_back(E->getFPFeatures().getAsOpaqueInt());
874539c5061SSebastian Redl   Code = serialization::EXPR_CALL;
875d6522cfcSSebastian Redl }
876d6522cfcSSebastian Redl 
VisitRecoveryExpr(RecoveryExpr * E)877733edf97SHaojian Wu void ASTStmtWriter::VisitRecoveryExpr(RecoveryExpr *E) {
878733edf97SHaojian Wu   VisitExpr(E);
879733edf97SHaojian Wu   Record.push_back(std::distance(E->children().begin(), E->children().end()));
880733edf97SHaojian Wu   Record.AddSourceLocation(E->getBeginLoc());
881733edf97SHaojian Wu   Record.AddSourceLocation(E->getEndLoc());
882733edf97SHaojian Wu   for (Stmt *Child : E->children())
883733edf97SHaojian Wu     Record.AddStmt(Child);
884733edf97SHaojian Wu   Code = serialization::EXPR_RECOVERY;
885733edf97SHaojian Wu }
886733edf97SHaojian Wu 
VisitMemberExpr(MemberExpr * E)887d6522cfcSSebastian Redl void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
888dcf17dedSRichard Smith   VisitExpr(E);
889d6522cfcSSebastian Redl 
890dcf17dedSRichard Smith   bool HasQualifier = E->hasQualifier();
891dcf17dedSRichard Smith   bool HasFoundDecl =
892dcf17dedSRichard Smith       E->hasQualifierOrFoundDecl() &&
893dcf17dedSRichard Smith       (E->getFoundDecl().getDecl() != E->getMemberDecl() ||
894dcf17dedSRichard Smith        E->getFoundDecl().getAccess() != E->getMemberDecl()->getAccess());
895dcf17dedSRichard Smith   bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo();
896d6522cfcSSebastian Redl   unsigned NumTemplateArgs = E->getNumTemplateArgs();
897dcf17dedSRichard Smith 
898dcf17dedSRichard Smith   // Write these first for easy access when deserializing, as they affect the
899dcf17dedSRichard Smith   // size of the MemberExpr.
900dcf17dedSRichard Smith   Record.push_back(HasQualifier);
901dcf17dedSRichard Smith   Record.push_back(HasFoundDecl);
902dcf17dedSRichard Smith   Record.push_back(HasTemplateInfo);
903d6522cfcSSebastian Redl   Record.push_back(NumTemplateArgs);
904d6522cfcSSebastian Redl 
905dcf17dedSRichard Smith   Record.AddStmt(E->getBase());
906dcf17dedSRichard Smith   Record.AddDeclRef(E->getMemberDecl());
907dcf17dedSRichard Smith   Record.AddDeclarationNameLoc(E->MemberDNLoc,
908dcf17dedSRichard Smith                                E->getMemberDecl()->getDeclName());
909dcf17dedSRichard Smith   Record.AddSourceLocation(E->getMemberLoc());
910dcf17dedSRichard Smith   Record.push_back(E->isArrow());
911635ed24eSAbramo Bagnara   Record.push_back(E->hadMultipleCandidates());
9121bbad593SRichard Smith   Record.push_back(E->isNonOdrUse());
913dcf17dedSRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
914635ed24eSAbramo Bagnara 
915dcf17dedSRichard Smith   if (HasFoundDecl) {
916d6522cfcSSebastian Redl     DeclAccessPair FoundDecl = E->getFoundDecl();
917290d8019SRichard Smith     Record.AddDeclRef(FoundDecl.getDecl());
918d6522cfcSSebastian Redl     Record.push_back(FoundDecl.getAccess());
919dcf17dedSRichard Smith   }
920d6522cfcSSebastian Redl 
921dcf17dedSRichard Smith   if (HasQualifier)
922dcf17dedSRichard Smith     Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
923dcf17dedSRichard Smith 
924dcf17dedSRichard Smith   if (HasTemplateInfo)
925dcf17dedSRichard Smith     AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
926dcf17dedSRichard Smith                              E->getTrailingObjects<TemplateArgumentLoc>());
927dcf17dedSRichard Smith 
928539c5061SSebastian Redl   Code = serialization::EXPR_MEMBER;
929d6522cfcSSebastian Redl }
930d6522cfcSSebastian Redl 
VisitObjCIsaExpr(ObjCIsaExpr * E)931d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
932d6522cfcSSebastian Redl   VisitExpr(E);
933290d8019SRichard Smith   Record.AddStmt(E->getBase());
934290d8019SRichard Smith   Record.AddSourceLocation(E->getIsaMemberLoc());
935290d8019SRichard Smith   Record.AddSourceLocation(E->getOpLoc());
936d6522cfcSSebastian Redl   Record.push_back(E->isArrow());
937539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_ISA;
938d6522cfcSSebastian Redl }
939d6522cfcSSebastian Redl 
94031168b07SJohn McCall void ASTStmtWriter::
VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)94131168b07SJohn McCall VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
94231168b07SJohn McCall   VisitExpr(E);
943290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
94431168b07SJohn McCall   Record.push_back(E->shouldCopy());
94531168b07SJohn McCall   Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
94631168b07SJohn McCall }
94731168b07SJohn McCall 
VisitObjCBridgedCastExpr(ObjCBridgedCastExpr * E)94831168b07SJohn McCall void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
94931168b07SJohn McCall   VisitExplicitCastExpr(E);
950290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
951290d8019SRichard Smith   Record.AddSourceLocation(E->getBridgeKeywordLoc());
95231168b07SJohn McCall   Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
95331168b07SJohn McCall   Code = serialization::EXPR_OBJC_BRIDGED_CAST;
95431168b07SJohn McCall }
95531168b07SJohn McCall 
VisitCastExpr(CastExpr * E)956d6522cfcSSebastian Redl void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
957d6522cfcSSebastian Redl   VisitExpr(E);
958d6522cfcSSebastian Redl   Record.push_back(E->path_size());
959f1cd6593SSerge Pavlov   Record.push_back(E->hasStoredFPFeatures());
960290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
961d6522cfcSSebastian Redl   Record.push_back(E->getCastKind()); // FIXME: stable encoding
962d6522cfcSSebastian Redl 
963d6522cfcSSebastian Redl   for (CastExpr::path_iterator
964d6522cfcSSebastian Redl          PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
965290d8019SRichard Smith     Record.AddCXXBaseSpecifier(**PI);
966f1cd6593SSerge Pavlov 
967f1cd6593SSerge Pavlov   if (E->hasStoredFPFeatures())
968f1cd6593SSerge Pavlov     Record.push_back(E->getFPFeatures().getAsOpaqueInt());
969d6522cfcSSebastian Redl }
970d6522cfcSSebastian Redl 
VisitBinaryOperator(BinaryOperator * E)971d6522cfcSSebastian Redl void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
972d6522cfcSSebastian Redl   VisitExpr(E);
9732ba4e3a4SMelanie Blower   bool HasFPFeatures = E->hasStoredFPFeatures();
9742ba4e3a4SMelanie Blower   // Write this first for easy access when deserializing, as they affect the
9752ba4e3a4SMelanie Blower   // size of the UnaryOperator.
9762ba4e3a4SMelanie Blower   Record.push_back(HasFPFeatures);
9772ba4e3a4SMelanie Blower   Record.push_back(E->getOpcode()); // FIXME: stable encoding
978290d8019SRichard Smith   Record.AddStmt(E->getLHS());
979290d8019SRichard Smith   Record.AddStmt(E->getRHS());
980290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
9812ba4e3a4SMelanie Blower   if (HasFPFeatures)
9822ba4e3a4SMelanie Blower     Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());
983539c5061SSebastian Redl   Code = serialization::EXPR_BINARY_OPERATOR;
984d6522cfcSSebastian Redl }
985d6522cfcSSebastian Redl 
VisitCompoundAssignOperator(CompoundAssignOperator * E)986d6522cfcSSebastian Redl void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
987d6522cfcSSebastian Redl   VisitBinaryOperator(E);
988290d8019SRichard Smith   Record.AddTypeRef(E->getComputationLHSType());
989290d8019SRichard Smith   Record.AddTypeRef(E->getComputationResultType());
990539c5061SSebastian Redl   Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
991d6522cfcSSebastian Redl }
992d6522cfcSSebastian Redl 
VisitConditionalOperator(ConditionalOperator * E)993d6522cfcSSebastian Redl void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
994d6522cfcSSebastian Redl   VisitExpr(E);
995290d8019SRichard Smith   Record.AddStmt(E->getCond());
996290d8019SRichard Smith   Record.AddStmt(E->getLHS());
997290d8019SRichard Smith   Record.AddStmt(E->getRHS());
998290d8019SRichard Smith   Record.AddSourceLocation(E->getQuestionLoc());
999290d8019SRichard Smith   Record.AddSourceLocation(E->getColonLoc());
1000539c5061SSebastian Redl   Code = serialization::EXPR_CONDITIONAL_OPERATOR;
1001d6522cfcSSebastian Redl }
1002d6522cfcSSebastian Redl 
1003c07a0c7eSJohn McCall void
VisitBinaryConditionalOperator(BinaryConditionalOperator * E)1004c07a0c7eSJohn McCall ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
1005c07a0c7eSJohn McCall   VisitExpr(E);
1006290d8019SRichard Smith   Record.AddStmt(E->getOpaqueValue());
1007290d8019SRichard Smith   Record.AddStmt(E->getCommon());
1008290d8019SRichard Smith   Record.AddStmt(E->getCond());
1009290d8019SRichard Smith   Record.AddStmt(E->getTrueExpr());
1010290d8019SRichard Smith   Record.AddStmt(E->getFalseExpr());
1011290d8019SRichard Smith   Record.AddSourceLocation(E->getQuestionLoc());
1012290d8019SRichard Smith   Record.AddSourceLocation(E->getColonLoc());
1013c07a0c7eSJohn McCall   Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
1014c07a0c7eSJohn McCall }
1015c07a0c7eSJohn McCall 
VisitImplicitCastExpr(ImplicitCastExpr * E)1016d6522cfcSSebastian Redl void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
1017d6522cfcSSebastian Redl   VisitCastExpr(E);
101812216f1dSRoman Lebedev   Record.push_back(E->isPartOfExplicitCast());
1019a27c26e7SRichard Smith 
1020f1cd6593SSerge Pavlov   if (E->path_size() == 0 && !E->hasStoredFPFeatures())
1021a27c26e7SRichard Smith     AbbrevToUse = Writer.getExprImplicitCastAbbrev();
1022a27c26e7SRichard Smith 
1023539c5061SSebastian Redl   Code = serialization::EXPR_IMPLICIT_CAST;
1024d6522cfcSSebastian Redl }
1025d6522cfcSSebastian Redl 
VisitExplicitCastExpr(ExplicitCastExpr * E)1026d6522cfcSSebastian Redl void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
1027d6522cfcSSebastian Redl   VisitCastExpr(E);
1028290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeInfoAsWritten());
1029d6522cfcSSebastian Redl }
1030d6522cfcSSebastian Redl 
VisitCStyleCastExpr(CStyleCastExpr * E)1031d6522cfcSSebastian Redl void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
1032d6522cfcSSebastian Redl   VisitExplicitCastExpr(E);
1033290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
1034290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1035539c5061SSebastian Redl   Code = serialization::EXPR_CSTYLE_CAST;
1036d6522cfcSSebastian Redl }
1037d6522cfcSSebastian Redl 
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)1038d6522cfcSSebastian Redl void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
1039d6522cfcSSebastian Redl   VisitExpr(E);
1040290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
1041290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1042290d8019SRichard Smith   Record.AddStmt(E->getInitializer());
1043d6522cfcSSebastian Redl   Record.push_back(E->isFileScope());
1044539c5061SSebastian Redl   Code = serialization::EXPR_COMPOUND_LITERAL;
1045d6522cfcSSebastian Redl }
1046d6522cfcSSebastian Redl 
VisitExtVectorElementExpr(ExtVectorElementExpr * E)1047d6522cfcSSebastian Redl void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
1048d6522cfcSSebastian Redl   VisitExpr(E);
1049290d8019SRichard Smith   Record.AddStmt(E->getBase());
1050290d8019SRichard Smith   Record.AddIdentifierRef(&E->getAccessor());
1051290d8019SRichard Smith   Record.AddSourceLocation(E->getAccessorLoc());
1052539c5061SSebastian Redl   Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
1053d6522cfcSSebastian Redl }
1054d6522cfcSSebastian Redl 
VisitInitListExpr(InitListExpr * E)1055d6522cfcSSebastian Redl void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
1056d6522cfcSSebastian Redl   VisitExpr(E);
10578d16bd4dSAbramo Bagnara   // NOTE: only add the (possibly null) syntactic form.
10588d16bd4dSAbramo Bagnara   // No need to serialize the isSemanticForm flag and the semantic form.
1059290d8019SRichard Smith   Record.AddStmt(E->getSyntacticForm());
1060290d8019SRichard Smith   Record.AddSourceLocation(E->getLBraceLoc());
1061290d8019SRichard Smith   Record.AddSourceLocation(E->getRBraceLoc());
1062b2ed28eaSArgyrios Kyrtzidis   bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
1063b2ed28eaSArgyrios Kyrtzidis   Record.push_back(isArrayFiller);
1064b2ed28eaSArgyrios Kyrtzidis   if (isArrayFiller)
1065290d8019SRichard Smith     Record.AddStmt(E->getArrayFiller());
1066b2ed28eaSArgyrios Kyrtzidis   else
1067290d8019SRichard Smith     Record.AddDeclRef(E->getInitializedFieldInUnion());
1068d6522cfcSSebastian Redl   Record.push_back(E->hadArrayRangeDesignator());
1069bbcefa7dSArgyrios Kyrtzidis   Record.push_back(E->getNumInits());
1070bbcefa7dSArgyrios Kyrtzidis   if (isArrayFiller) {
1071bbcefa7dSArgyrios Kyrtzidis     // ArrayFiller may have filled "holes" due to designated initializer.
1072bbcefa7dSArgyrios Kyrtzidis     // Replace them by 0 to indicate that the filler goes in that place.
1073bbcefa7dSArgyrios Kyrtzidis     Expr *filler = E->getArrayFiller();
1074bbcefa7dSArgyrios Kyrtzidis     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
1075290d8019SRichard Smith       Record.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);
1076bbcefa7dSArgyrios Kyrtzidis   } else {
1077bbcefa7dSArgyrios Kyrtzidis     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
1078290d8019SRichard Smith       Record.AddStmt(E->getInit(I));
1079bbcefa7dSArgyrios Kyrtzidis   }
1080539c5061SSebastian Redl   Code = serialization::EXPR_INIT_LIST;
1081d6522cfcSSebastian Redl }
1082d6522cfcSSebastian Redl 
VisitDesignatedInitExpr(DesignatedInitExpr * E)1083d6522cfcSSebastian Redl void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
1084d6522cfcSSebastian Redl   VisitExpr(E);
1085d6522cfcSSebastian Redl   Record.push_back(E->getNumSubExprs());
1086d6522cfcSSebastian Redl   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
1087290d8019SRichard Smith     Record.AddStmt(E->getSubExpr(I));
1088290d8019SRichard Smith   Record.AddSourceLocation(E->getEqualOrColonLoc());
1089d6522cfcSSebastian Redl   Record.push_back(E->usesGNUSyntax());
1090f7e3609fSDavid Majnemer   for (const DesignatedInitExpr::Designator &D : E->designators()) {
1091f7e3609fSDavid Majnemer     if (D.isFieldDesignator()) {
1092f7e3609fSDavid Majnemer       if (FieldDecl *Field = D.getField()) {
1093539c5061SSebastian Redl         Record.push_back(serialization::DESIG_FIELD_DECL);
1094290d8019SRichard Smith         Record.AddDeclRef(Field);
1095d6522cfcSSebastian Redl       } else {
1096539c5061SSebastian Redl         Record.push_back(serialization::DESIG_FIELD_NAME);
1097f7e3609fSDavid Majnemer         Record.AddIdentifierRef(D.getFieldName());
1098d6522cfcSSebastian Redl       }
1099f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getDotLoc());
1100f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getFieldLoc());
1101f7e3609fSDavid Majnemer     } else if (D.isArrayDesignator()) {
1102539c5061SSebastian Redl       Record.push_back(serialization::DESIG_ARRAY);
1103f7e3609fSDavid Majnemer       Record.push_back(D.getFirstExprIndex());
1104f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getLBracketLoc());
1105f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getRBracketLoc());
1106d6522cfcSSebastian Redl     } else {
1107f7e3609fSDavid Majnemer       assert(D.isArrayRangeDesignator() && "Unknown designator");
1108539c5061SSebastian Redl       Record.push_back(serialization::DESIG_ARRAY_RANGE);
1109f7e3609fSDavid Majnemer       Record.push_back(D.getFirstExprIndex());
1110f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getLBracketLoc());
1111f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getEllipsisLoc());
1112f7e3609fSDavid Majnemer       Record.AddSourceLocation(D.getRBracketLoc());
1113d6522cfcSSebastian Redl     }
1114d6522cfcSSebastian Redl   }
1115539c5061SSebastian Redl   Code = serialization::EXPR_DESIGNATED_INIT;
1116d6522cfcSSebastian Redl }
1117d6522cfcSSebastian Redl 
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)1118cb77930dSYunzhong Gao void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
1119cb77930dSYunzhong Gao   VisitExpr(E);
1120290d8019SRichard Smith   Record.AddStmt(E->getBase());
1121290d8019SRichard Smith   Record.AddStmt(E->getUpdater());
1122cb77930dSYunzhong Gao   Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;
1123cb77930dSYunzhong Gao }
1124cb77930dSYunzhong Gao 
VisitNoInitExpr(NoInitExpr * E)1125cb77930dSYunzhong Gao void ASTStmtWriter::VisitNoInitExpr(NoInitExpr *E) {
1126cb77930dSYunzhong Gao   VisitExpr(E);
1127cb77930dSYunzhong Gao   Code = serialization::EXPR_NO_INIT;
1128cb77930dSYunzhong Gao }
1129cb77930dSYunzhong Gao 
VisitArrayInitLoopExpr(ArrayInitLoopExpr * E)1130410306bfSRichard Smith void ASTStmtWriter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
1131410306bfSRichard Smith   VisitExpr(E);
1132410306bfSRichard Smith   Record.AddStmt(E->SubExprs[0]);
1133410306bfSRichard Smith   Record.AddStmt(E->SubExprs[1]);
1134410306bfSRichard Smith   Code = serialization::EXPR_ARRAY_INIT_LOOP;
1135410306bfSRichard Smith }
1136410306bfSRichard Smith 
VisitArrayInitIndexExpr(ArrayInitIndexExpr * E)1137410306bfSRichard Smith void ASTStmtWriter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
1138410306bfSRichard Smith   VisitExpr(E);
1139410306bfSRichard Smith   Code = serialization::EXPR_ARRAY_INIT_INDEX;
1140410306bfSRichard Smith }
1141410306bfSRichard Smith 
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)1142d6522cfcSSebastian Redl void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
1143d6522cfcSSebastian Redl   VisitExpr(E);
1144539c5061SSebastian Redl   Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
1145d6522cfcSSebastian Redl }
1146d6522cfcSSebastian Redl 
VisitVAArgExpr(VAArgExpr * E)1147d6522cfcSSebastian Redl void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
1148d6522cfcSSebastian Redl   VisitExpr(E);
1149290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
1150290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getWrittenTypeInfo());
1151290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
1152290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1153c7d5c94fSCharles Davis   Record.push_back(E->isMicrosoftABI());
1154539c5061SSebastian Redl   Code = serialization::EXPR_VA_ARG;
1155d6522cfcSSebastian Redl }
1156d6522cfcSSebastian Redl 
VisitSourceLocExpr(SourceLocExpr * E)1157708afb56SEric Fiselier void ASTStmtWriter::VisitSourceLocExpr(SourceLocExpr *E) {
1158708afb56SEric Fiselier   VisitExpr(E);
1159708afb56SEric Fiselier   Record.AddDeclRef(cast_or_null<Decl>(E->getParentContext()));
1160708afb56SEric Fiselier   Record.AddSourceLocation(E->getBeginLoc());
1161708afb56SEric Fiselier   Record.AddSourceLocation(E->getEndLoc());
1162708afb56SEric Fiselier   Record.push_back(E->getIdentKind());
1163708afb56SEric Fiselier   Code = serialization::EXPR_SOURCE_LOC;
1164708afb56SEric Fiselier }
1165708afb56SEric Fiselier 
VisitAddrLabelExpr(AddrLabelExpr * E)1166d6522cfcSSebastian Redl void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
1167d6522cfcSSebastian Redl   VisitExpr(E);
1168290d8019SRichard Smith   Record.AddSourceLocation(E->getAmpAmpLoc());
1169290d8019SRichard Smith   Record.AddSourceLocation(E->getLabelLoc());
1170290d8019SRichard Smith   Record.AddDeclRef(E->getLabel());
1171539c5061SSebastian Redl   Code = serialization::EXPR_ADDR_LABEL;
1172d6522cfcSSebastian Redl }
1173d6522cfcSSebastian Redl 
VisitStmtExpr(StmtExpr * E)1174d6522cfcSSebastian Redl void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
1175d6522cfcSSebastian Redl   VisitExpr(E);
1176290d8019SRichard Smith   Record.AddStmt(E->getSubStmt());
1177290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
1178290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
11795c845c1cSRichard Smith   Record.push_back(E->getTemplateDepth());
1180539c5061SSebastian Redl   Code = serialization::EXPR_STMT;
1181d6522cfcSSebastian Redl }
1182d6522cfcSSebastian Redl 
VisitChooseExpr(ChooseExpr * E)1183d6522cfcSSebastian Redl void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
1184d6522cfcSSebastian Redl   VisitExpr(E);
1185290d8019SRichard Smith   Record.AddStmt(E->getCond());
1186290d8019SRichard Smith   Record.AddStmt(E->getLHS());
1187290d8019SRichard Smith   Record.AddStmt(E->getRHS());
1188290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
1189290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
119075807f23SEli Friedman   Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());
1191539c5061SSebastian Redl   Code = serialization::EXPR_CHOOSE;
1192d6522cfcSSebastian Redl }
1193d6522cfcSSebastian Redl 
VisitGNUNullExpr(GNUNullExpr * E)1194d6522cfcSSebastian Redl void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
1195d6522cfcSSebastian Redl   VisitExpr(E);
1196290d8019SRichard Smith   Record.AddSourceLocation(E->getTokenLocation());
1197539c5061SSebastian Redl   Code = serialization::EXPR_GNU_NULL;
1198d6522cfcSSebastian Redl }
1199d6522cfcSSebastian Redl 
VisitShuffleVectorExpr(ShuffleVectorExpr * E)1200d6522cfcSSebastian Redl void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
1201d6522cfcSSebastian Redl   VisitExpr(E);
1202d6522cfcSSebastian Redl   Record.push_back(E->getNumSubExprs());
1203d6522cfcSSebastian Redl   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
1204290d8019SRichard Smith     Record.AddStmt(E->getExpr(I));
1205290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
1206290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1207539c5061SSebastian Redl   Code = serialization::EXPR_SHUFFLE_VECTOR;
1208d6522cfcSSebastian Redl }
1209d6522cfcSSebastian Redl 
VisitConvertVectorExpr(ConvertVectorExpr * E)1210c4d7c82cSHal Finkel void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
1211c4d7c82cSHal Finkel   VisitExpr(E);
1212290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
1213290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1214290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1215290d8019SRichard Smith   Record.AddStmt(E->getSrcExpr());
1216c4d7c82cSHal Finkel   Code = serialization::EXPR_CONVERT_VECTOR;
1217c4d7c82cSHal Finkel }
1218c4d7c82cSHal Finkel 
VisitBlockExpr(BlockExpr * E)1219d6522cfcSSebastian Redl void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
1220d6522cfcSSebastian Redl   VisitExpr(E);
1221290d8019SRichard Smith   Record.AddDeclRef(E->getBlockDecl());
1222539c5061SSebastian Redl   Code = serialization::EXPR_BLOCK;
1223d6522cfcSSebastian Redl }
1224d6522cfcSSebastian Redl 
VisitGenericSelectionExpr(GenericSelectionExpr * E)122591147596SPeter Collingbourne void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
122691147596SPeter Collingbourne   VisitExpr(E);
1227db07683dSBruno Ricci 
122891147596SPeter Collingbourne   Record.push_back(E->getNumAssocs());
122994498c70SBruno Ricci   Record.push_back(E->ResultIndex);
1230290d8019SRichard Smith   Record.AddSourceLocation(E->getGenericLoc());
1231290d8019SRichard Smith   Record.AddSourceLocation(E->getDefaultLoc());
1232290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1233db07683dSBruno Ricci 
1234db07683dSBruno Ricci   Stmt **Stmts = E->getTrailingObjects<Stmt *>();
1235db07683dSBruno Ricci   // Add 1 to account for the controlling expression which is the first
1236db07683dSBruno Ricci   // expression in the trailing array of Stmt *. This is not needed for
1237db07683dSBruno Ricci   // the trailing array of TypeSourceInfo *.
1238db07683dSBruno Ricci   for (unsigned I = 0, N = E->getNumAssocs() + 1; I < N; ++I)
1239db07683dSBruno Ricci     Record.AddStmt(Stmts[I]);
1240db07683dSBruno Ricci 
1241db07683dSBruno Ricci   TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();
1242db07683dSBruno Ricci   for (unsigned I = 0, N = E->getNumAssocs(); I < N; ++I)
1243db07683dSBruno Ricci     Record.AddTypeSourceInfo(TSIs[I]);
1244db07683dSBruno Ricci 
124591147596SPeter Collingbourne   Code = serialization::EXPR_GENERIC_SELECTION;
124691147596SPeter Collingbourne }
124791147596SPeter Collingbourne 
VisitPseudoObjectExpr(PseudoObjectExpr * E)1248fe96e0b6SJohn McCall void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
1249fe96e0b6SJohn McCall   VisitExpr(E);
1250fe96e0b6SJohn McCall   Record.push_back(E->getNumSemanticExprs());
1251fe96e0b6SJohn McCall 
1252fe96e0b6SJohn McCall   // Push the result index.  Currently, this needs to exactly match
1253fe96e0b6SJohn McCall   // the encoding used internally for ResultIndex.
1254fe96e0b6SJohn McCall   unsigned result = E->getResultExprIndex();
1255fe96e0b6SJohn McCall   result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
1256fe96e0b6SJohn McCall   Record.push_back(result);
1257fe96e0b6SJohn McCall 
1258290d8019SRichard Smith   Record.AddStmt(E->getSyntacticForm());
1259fe96e0b6SJohn McCall   for (PseudoObjectExpr::semantics_iterator
1260fe96e0b6SJohn McCall          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
1261290d8019SRichard Smith     Record.AddStmt(*i);
1262fe96e0b6SJohn McCall   }
12635938650bSArgyrios Kyrtzidis   Code = serialization::EXPR_PSEUDO_OBJECT;
1264fe96e0b6SJohn McCall }
1265fe96e0b6SJohn McCall 
VisitAtomicExpr(AtomicExpr * E)1266df14b3a8SEli Friedman void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
1267df14b3a8SEli Friedman   VisitExpr(E);
1268df14b3a8SEli Friedman   Record.push_back(E->getOp());
1269aa22a8cdSRichard Smith   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
1270290d8019SRichard Smith     Record.AddStmt(E->getSubExprs()[I]);
1271290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
1272290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
12735938650bSArgyrios Kyrtzidis   Code = serialization::EXPR_ATOMIC;
1274df14b3a8SEli Friedman }
1275df14b3a8SEli Friedman 
1276d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
1277d6522cfcSSebastian Redl // Objective-C Expressions and Statements.
1278d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
1279d6522cfcSSebastian Redl 
VisitObjCStringLiteral(ObjCStringLiteral * E)1280d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1281d6522cfcSSebastian Redl   VisitExpr(E);
1282290d8019SRichard Smith   Record.AddStmt(E->getString());
1283290d8019SRichard Smith   Record.AddSourceLocation(E->getAtLoc());
1284539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_STRING_LITERAL;
1285d6522cfcSSebastian Redl }
1286d6522cfcSSebastian Redl 
VisitObjCBoxedExpr(ObjCBoxedExpr * E)12870caa3947SPatrick Beard void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
1288e65b086eSTed Kremenek   VisitExpr(E);
1289290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
1290290d8019SRichard Smith   Record.AddDeclRef(E->getBoxingMethod());
1291290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
12920caa3947SPatrick Beard   Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
1293e65b086eSTed Kremenek }
1294e65b086eSTed Kremenek 
VisitObjCArrayLiteral(ObjCArrayLiteral * E)1295e65b086eSTed Kremenek void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
1296e65b086eSTed Kremenek   VisitExpr(E);
1297e65b086eSTed Kremenek   Record.push_back(E->getNumElements());
1298e65b086eSTed Kremenek   for (unsigned i = 0; i < E->getNumElements(); i++)
1299290d8019SRichard Smith     Record.AddStmt(E->getElement(i));
1300290d8019SRichard Smith   Record.AddDeclRef(E->getArrayWithObjectsMethod());
1301290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1302e65b086eSTed Kremenek   Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
1303e65b086eSTed Kremenek }
1304e65b086eSTed Kremenek 
VisitObjCDictionaryLiteral(ObjCDictionaryLiteral * E)1305e65b086eSTed Kremenek void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
1306e65b086eSTed Kremenek   VisitExpr(E);
1307e65b086eSTed Kremenek   Record.push_back(E->getNumElements());
1308e65b086eSTed Kremenek   Record.push_back(E->HasPackExpansions);
1309e65b086eSTed Kremenek   for (unsigned i = 0; i < E->getNumElements(); i++) {
1310e65b086eSTed Kremenek     ObjCDictionaryElement Element = E->getKeyValueElement(i);
1311290d8019SRichard Smith     Record.AddStmt(Element.Key);
1312290d8019SRichard Smith     Record.AddStmt(Element.Value);
1313e65b086eSTed Kremenek     if (E->HasPackExpansions) {
1314290d8019SRichard Smith       Record.AddSourceLocation(Element.EllipsisLoc);
1315e65b086eSTed Kremenek       unsigned NumExpansions = 0;
1316e65b086eSTed Kremenek       if (Element.NumExpansions)
1317e65b086eSTed Kremenek         NumExpansions = *Element.NumExpansions + 1;
1318e65b086eSTed Kremenek       Record.push_back(NumExpansions);
1319e65b086eSTed Kremenek     }
1320e65b086eSTed Kremenek   }
1321e65b086eSTed Kremenek 
1322290d8019SRichard Smith   Record.AddDeclRef(E->getDictWithObjectsMethod());
1323290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1324e65b086eSTed Kremenek   Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
1325e65b086eSTed Kremenek }
1326e65b086eSTed Kremenek 
VisitObjCEncodeExpr(ObjCEncodeExpr * E)1327d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1328d6522cfcSSebastian Redl   VisitExpr(E);
1329290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getEncodedTypeSourceInfo());
1330290d8019SRichard Smith   Record.AddSourceLocation(E->getAtLoc());
1331290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1332539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_ENCODE;
1333d6522cfcSSebastian Redl }
1334d6522cfcSSebastian Redl 
VisitObjCSelectorExpr(ObjCSelectorExpr * E)1335d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1336d6522cfcSSebastian Redl   VisitExpr(E);
1337290d8019SRichard Smith   Record.AddSelectorRef(E->getSelector());
1338290d8019SRichard Smith   Record.AddSourceLocation(E->getAtLoc());
1339290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1340539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
1341d6522cfcSSebastian Redl }
1342d6522cfcSSebastian Redl 
VisitObjCProtocolExpr(ObjCProtocolExpr * E)1343d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1344d6522cfcSSebastian Redl   VisitExpr(E);
1345290d8019SRichard Smith   Record.AddDeclRef(E->getProtocol());
1346290d8019SRichard Smith   Record.AddSourceLocation(E->getAtLoc());
1347290d8019SRichard Smith   Record.AddSourceLocation(E->ProtoLoc);
1348290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1349539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
1350d6522cfcSSebastian Redl }
1351d6522cfcSSebastian Redl 
VisitObjCIvarRefExpr(ObjCIvarRefExpr * E)1352d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1353d6522cfcSSebastian Redl   VisitExpr(E);
1354290d8019SRichard Smith   Record.AddDeclRef(E->getDecl());
1355290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1356290d8019SRichard Smith   Record.AddSourceLocation(E->getOpLoc());
1357290d8019SRichard Smith   Record.AddStmt(E->getBase());
1358d6522cfcSSebastian Redl   Record.push_back(E->isArrow());
1359d6522cfcSSebastian Redl   Record.push_back(E->isFreeIvar());
1360539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
1361d6522cfcSSebastian Redl }
1362d6522cfcSSebastian Redl 
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * E)1363d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1364d6522cfcSSebastian Redl   VisitExpr(E);
1365ab468b03SArgyrios Kyrtzidis   Record.push_back(E->SetterAndMethodRefFlags.getInt());
1366b7bd14faSJohn McCall   Record.push_back(E->isImplicitProperty());
1367b7bd14faSJohn McCall   if (E->isImplicitProperty()) {
1368290d8019SRichard Smith     Record.AddDeclRef(E->getImplicitPropertyGetter());
1369290d8019SRichard Smith     Record.AddDeclRef(E->getImplicitPropertySetter());
1370b7bd14faSJohn McCall   } else {
1371290d8019SRichard Smith     Record.AddDeclRef(E->getExplicitProperty());
1372b7bd14faSJohn McCall   }
1373290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1374290d8019SRichard Smith   Record.AddSourceLocation(E->getReceiverLocation());
1375b7bd14faSJohn McCall   if (E->isObjectReceiver()) {
1376b7bd14faSJohn McCall     Record.push_back(0);
1377290d8019SRichard Smith     Record.AddStmt(E->getBase());
1378b7bd14faSJohn McCall   } else if (E->isSuperReceiver()) {
1379b7bd14faSJohn McCall     Record.push_back(1);
1380290d8019SRichard Smith     Record.AddTypeRef(E->getSuperReceiverType());
1381b7bd14faSJohn McCall   } else {
1382b7bd14faSJohn McCall     Record.push_back(2);
1383290d8019SRichard Smith     Record.AddDeclRef(E->getClassReceiver());
1384d6522cfcSSebastian Redl   }
1385d6522cfcSSebastian Redl 
1386b7bd14faSJohn McCall   Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
1387d6522cfcSSebastian Redl }
1388d6522cfcSSebastian Redl 
VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)1389e65b086eSTed Kremenek void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
1390e65b086eSTed Kremenek   VisitExpr(E);
1391290d8019SRichard Smith   Record.AddSourceLocation(E->getRBracket());
1392290d8019SRichard Smith   Record.AddStmt(E->getBaseExpr());
1393290d8019SRichard Smith   Record.AddStmt(E->getKeyExpr());
1394290d8019SRichard Smith   Record.AddDeclRef(E->getAtIndexMethodDecl());
1395290d8019SRichard Smith   Record.AddDeclRef(E->setAtIndexMethodDecl());
1396e65b086eSTed Kremenek 
1397e65b086eSTed Kremenek   Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
1398e65b086eSTed Kremenek }
1399e65b086eSTed Kremenek 
VisitObjCMessageExpr(ObjCMessageExpr * E)1400d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1401d6522cfcSSebastian Redl   VisitExpr(E);
1402d6522cfcSSebastian Redl   Record.push_back(E->getNumArgs());
1403a6011e25SArgyrios Kyrtzidis   Record.push_back(E->getNumStoredSelLocs());
1404a6011e25SArgyrios Kyrtzidis   Record.push_back(E->SelLocsKind);
140531168b07SJohn McCall   Record.push_back(E->isDelegateInitCall());
1406a80f1bf2SArgyrios Kyrtzidis   Record.push_back(E->IsImplicit);
1407d6522cfcSSebastian Redl   Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
1408d6522cfcSSebastian Redl   switch (E->getReceiverKind()) {
1409d6522cfcSSebastian Redl   case ObjCMessageExpr::Instance:
1410290d8019SRichard Smith     Record.AddStmt(E->getInstanceReceiver());
1411d6522cfcSSebastian Redl     break;
1412d6522cfcSSebastian Redl 
1413d6522cfcSSebastian Redl   case ObjCMessageExpr::Class:
1414290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getClassReceiverTypeInfo());
1415d6522cfcSSebastian Redl     break;
1416d6522cfcSSebastian Redl 
1417d6522cfcSSebastian Redl   case ObjCMessageExpr::SuperClass:
1418d6522cfcSSebastian Redl   case ObjCMessageExpr::SuperInstance:
1419290d8019SRichard Smith     Record.AddTypeRef(E->getSuperType());
1420290d8019SRichard Smith     Record.AddSourceLocation(E->getSuperLoc());
1421d6522cfcSSebastian Redl     break;
1422d6522cfcSSebastian Redl   }
1423d6522cfcSSebastian Redl 
1424d6522cfcSSebastian Redl   if (E->getMethodDecl()) {
1425d6522cfcSSebastian Redl     Record.push_back(1);
1426290d8019SRichard Smith     Record.AddDeclRef(E->getMethodDecl());
1427d6522cfcSSebastian Redl   } else {
1428d6522cfcSSebastian Redl     Record.push_back(0);
1429290d8019SRichard Smith     Record.AddSelectorRef(E->getSelector());
1430d6522cfcSSebastian Redl   }
1431d6522cfcSSebastian Redl 
1432290d8019SRichard Smith   Record.AddSourceLocation(E->getLeftLoc());
1433290d8019SRichard Smith   Record.AddSourceLocation(E->getRightLoc());
1434d6522cfcSSebastian Redl 
1435d6522cfcSSebastian Redl   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
1436d6522cfcSSebastian Redl        Arg != ArgEnd; ++Arg)
1437290d8019SRichard Smith     Record.AddStmt(*Arg);
1438a6011e25SArgyrios Kyrtzidis 
1439a6011e25SArgyrios Kyrtzidis   SourceLocation *Locs = E->getStoredSelLocs();
1440a6011e25SArgyrios Kyrtzidis   for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
1441290d8019SRichard Smith     Record.AddSourceLocation(Locs[i]);
1442a6011e25SArgyrios Kyrtzidis 
1443539c5061SSebastian Redl   Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
1444d6522cfcSSebastian Redl }
1445d6522cfcSSebastian Redl 
VisitObjCForCollectionStmt(ObjCForCollectionStmt * S)1446d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
1447d6522cfcSSebastian Redl   VisitStmt(S);
1448290d8019SRichard Smith   Record.AddStmt(S->getElement());
1449290d8019SRichard Smith   Record.AddStmt(S->getCollection());
1450290d8019SRichard Smith   Record.AddStmt(S->getBody());
1451290d8019SRichard Smith   Record.AddSourceLocation(S->getForLoc());
1452290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
1453539c5061SSebastian Redl   Code = serialization::STMT_OBJC_FOR_COLLECTION;
1454d6522cfcSSebastian Redl }
1455d6522cfcSSebastian Redl 
VisitObjCAtCatchStmt(ObjCAtCatchStmt * S)1456d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
1457773c391dSRoman Lebedev   VisitStmt(S);
1458290d8019SRichard Smith   Record.AddStmt(S->getCatchBody());
1459290d8019SRichard Smith   Record.AddDeclRef(S->getCatchParamDecl());
1460290d8019SRichard Smith   Record.AddSourceLocation(S->getAtCatchLoc());
1461290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
1462539c5061SSebastian Redl   Code = serialization::STMT_OBJC_CATCH;
1463d6522cfcSSebastian Redl }
1464d6522cfcSSebastian Redl 
VisitObjCAtFinallyStmt(ObjCAtFinallyStmt * S)1465d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
1466773c391dSRoman Lebedev   VisitStmt(S);
1467290d8019SRichard Smith   Record.AddStmt(S->getFinallyBody());
1468290d8019SRichard Smith   Record.AddSourceLocation(S->getAtFinallyLoc());
1469539c5061SSebastian Redl   Code = serialization::STMT_OBJC_FINALLY;
1470d6522cfcSSebastian Redl }
1471d6522cfcSSebastian Redl 
VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)147231168b07SJohn McCall void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
1473773c391dSRoman Lebedev   VisitStmt(S); // FIXME: no test coverage.
1474290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
1475290d8019SRichard Smith   Record.AddSourceLocation(S->getAtLoc());
147631168b07SJohn McCall   Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
147731168b07SJohn McCall }
147831168b07SJohn McCall 
VisitObjCAtTryStmt(ObjCAtTryStmt * S)1479d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1480773c391dSRoman Lebedev   VisitStmt(S);
1481d6522cfcSSebastian Redl   Record.push_back(S->getNumCatchStmts());
1482a13603a2SCraig Topper   Record.push_back(S->getFinallyStmt() != nullptr);
1483290d8019SRichard Smith   Record.AddStmt(S->getTryBody());
1484c7aaa2efSNico Weber   for (ObjCAtCatchStmt *C : S->catch_stmts())
1485c7aaa2efSNico Weber     Record.AddStmt(C);
1486d6522cfcSSebastian Redl   if (S->getFinallyStmt())
1487290d8019SRichard Smith     Record.AddStmt(S->getFinallyStmt());
1488290d8019SRichard Smith   Record.AddSourceLocation(S->getAtTryLoc());
1489539c5061SSebastian Redl   Code = serialization::STMT_OBJC_AT_TRY;
1490d6522cfcSSebastian Redl }
1491d6522cfcSSebastian Redl 
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)1492d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1493773c391dSRoman Lebedev   VisitStmt(S); // FIXME: no test coverage.
1494290d8019SRichard Smith   Record.AddStmt(S->getSynchExpr());
1495290d8019SRichard Smith   Record.AddStmt(S->getSynchBody());
1496290d8019SRichard Smith   Record.AddSourceLocation(S->getAtSynchronizedLoc());
1497539c5061SSebastian Redl   Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
1498d6522cfcSSebastian Redl }
1499d6522cfcSSebastian Redl 
VisitObjCAtThrowStmt(ObjCAtThrowStmt * S)1500d6522cfcSSebastian Redl void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1501773c391dSRoman Lebedev   VisitStmt(S); // FIXME: no test coverage.
1502290d8019SRichard Smith   Record.AddStmt(S->getThrowExpr());
1503290d8019SRichard Smith   Record.AddSourceLocation(S->getThrowLoc());
1504539c5061SSebastian Redl   Code = serialization::STMT_OBJC_AT_THROW;
1505d6522cfcSSebastian Redl }
1506d6522cfcSSebastian Redl 
VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)1507e65b086eSTed Kremenek void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1508e65b086eSTed Kremenek   VisitExpr(E);
1509e65b086eSTed Kremenek   Record.push_back(E->getValue());
1510290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1511e65b086eSTed Kremenek   Code = serialization::EXPR_OBJC_BOOL_LITERAL;
1512e65b086eSTed Kremenek }
1513e65b086eSTed Kremenek 
VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr * E)151429099dedSErik Pilkington void ASTStmtWriter::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {
151529099dedSErik Pilkington   VisitExpr(E);
151629099dedSErik Pilkington   Record.AddSourceRange(E->getSourceRange());
151729099dedSErik Pilkington   Record.AddVersionTuple(E->getVersion());
151829099dedSErik Pilkington   Code = serialization::EXPR_OBJC_AVAILABILITY_CHECK;
151929099dedSErik Pilkington }
152029099dedSErik Pilkington 
1521d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
1522d6522cfcSSebastian Redl // C++ Expressions and Statements.
1523d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
1524d6522cfcSSebastian Redl 
VisitCXXCatchStmt(CXXCatchStmt * S)1525d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
1526d6522cfcSSebastian Redl   VisitStmt(S);
1527290d8019SRichard Smith   Record.AddSourceLocation(S->getCatchLoc());
1528290d8019SRichard Smith   Record.AddDeclRef(S->getExceptionDecl());
1529290d8019SRichard Smith   Record.AddStmt(S->getHandlerBlock());
1530539c5061SSebastian Redl   Code = serialization::STMT_CXX_CATCH;
1531d6522cfcSSebastian Redl }
1532d6522cfcSSebastian Redl 
VisitCXXTryStmt(CXXTryStmt * S)1533d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
1534d6522cfcSSebastian Redl   VisitStmt(S);
1535d6522cfcSSebastian Redl   Record.push_back(S->getNumHandlers());
1536290d8019SRichard Smith   Record.AddSourceLocation(S->getTryLoc());
1537290d8019SRichard Smith   Record.AddStmt(S->getTryBlock());
1538d6522cfcSSebastian Redl   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1539290d8019SRichard Smith     Record.AddStmt(S->getHandler(i));
1540539c5061SSebastian Redl   Code = serialization::STMT_CXX_TRY;
1541d6522cfcSSebastian Redl }
1542d6522cfcSSebastian Redl 
VisitCXXForRangeStmt(CXXForRangeStmt * S)154302e85f3bSRichard Smith void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
154402e85f3bSRichard Smith   VisitStmt(S);
1545290d8019SRichard Smith   Record.AddSourceLocation(S->getForLoc());
1546290d8019SRichard Smith   Record.AddSourceLocation(S->getCoawaitLoc());
1547290d8019SRichard Smith   Record.AddSourceLocation(S->getColonLoc());
1548290d8019SRichard Smith   Record.AddSourceLocation(S->getRParenLoc());
15498baa5001SRichard Smith   Record.AddStmt(S->getInit());
1550290d8019SRichard Smith   Record.AddStmt(S->getRangeStmt());
1551290d8019SRichard Smith   Record.AddStmt(S->getBeginStmt());
1552290d8019SRichard Smith   Record.AddStmt(S->getEndStmt());
1553290d8019SRichard Smith   Record.AddStmt(S->getCond());
1554290d8019SRichard Smith   Record.AddStmt(S->getInc());
1555290d8019SRichard Smith   Record.AddStmt(S->getLoopVarStmt());
1556290d8019SRichard Smith   Record.AddStmt(S->getBody());
155702e85f3bSRichard Smith   Code = serialization::STMT_CXX_FOR_RANGE;
155802e85f3bSRichard Smith }
155902e85f3bSRichard Smith 
VisitMSDependentExistsStmt(MSDependentExistsStmt * S)1560deb4a2beSDouglas Gregor void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1561deb4a2beSDouglas Gregor   VisitStmt(S);
1562290d8019SRichard Smith   Record.AddSourceLocation(S->getKeywordLoc());
1563deb4a2beSDouglas Gregor   Record.push_back(S->isIfExists());
1564290d8019SRichard Smith   Record.AddNestedNameSpecifierLoc(S->getQualifierLoc());
1565290d8019SRichard Smith   Record.AddDeclarationNameInfo(S->getNameInfo());
1566290d8019SRichard Smith   Record.AddStmt(S->getSubStmt());
1567deb4a2beSDouglas Gregor   Code = serialization::STMT_MS_DEPENDENT_EXISTS;
1568deb4a2beSDouglas Gregor }
1569deb4a2beSDouglas Gregor 
VisitCXXOperatorCallExpr(CXXOperatorCallExpr * E)1570d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1571d6522cfcSSebastian Redl   VisitCallExpr(E);
1572d6522cfcSSebastian Redl   Record.push_back(E->getOperator());
1573defd43a5SMelanie Blower   Record.AddSourceRange(E->Range);
1574539c5061SSebastian Redl   Code = serialization::EXPR_CXX_OPERATOR_CALL;
1575d6522cfcSSebastian Redl }
1576d6522cfcSSebastian Redl 
VisitCXXMemberCallExpr(CXXMemberCallExpr * E)1577d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
1578d6522cfcSSebastian Redl   VisitCallExpr(E);
1579539c5061SSebastian Redl   Code = serialization::EXPR_CXX_MEMBER_CALL;
1580d6522cfcSSebastian Redl }
1581d6522cfcSSebastian Redl 
VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator * E)1582778dc0f1SRichard Smith void ASTStmtWriter::VisitCXXRewrittenBinaryOperator(
1583778dc0f1SRichard Smith     CXXRewrittenBinaryOperator *E) {
1584778dc0f1SRichard Smith   VisitExpr(E);
1585778dc0f1SRichard Smith   Record.push_back(E->isReversed());
1586778dc0f1SRichard Smith   Record.AddStmt(E->getSemanticForm());
1587778dc0f1SRichard Smith   Code = serialization::EXPR_CXX_REWRITTEN_BINARY_OPERATOR;
1588778dc0f1SRichard Smith }
1589778dc0f1SRichard Smith 
VisitCXXConstructExpr(CXXConstructExpr * E)1590d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1591d6522cfcSSebastian Redl   VisitExpr(E);
1592ddb8f6b8SBruno Ricci 
1593d6522cfcSSebastian Redl   Record.push_back(E->getNumArgs());
1594d6522cfcSSebastian Redl   Record.push_back(E->isElidable());
1595635ed24eSAbramo Bagnara   Record.push_back(E->hadMultipleCandidates());
1596d59b8323SRichard Smith   Record.push_back(E->isListInitialization());
1597f8adcdc4SRichard Smith   Record.push_back(E->isStdInitListInitialization());
1598d6522cfcSSebastian Redl   Record.push_back(E->requiresZeroInitialization());
1599d6522cfcSSebastian Redl   Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
1600ddb8f6b8SBruno Ricci   Record.AddSourceLocation(E->getLocation());
1601ddb8f6b8SBruno Ricci   Record.AddDeclRef(E->getConstructor());
1602290d8019SRichard Smith   Record.AddSourceRange(E->getParenOrBraceRange());
1603ddb8f6b8SBruno Ricci 
1604ddb8f6b8SBruno Ricci   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1605ddb8f6b8SBruno Ricci     Record.AddStmt(E->getArg(I));
1606ddb8f6b8SBruno Ricci 
1607539c5061SSebastian Redl   Code = serialization::EXPR_CXX_CONSTRUCT;
1608d6522cfcSSebastian Redl }
1609d6522cfcSSebastian Redl 
VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)16105179eb78SRichard Smith void ASTStmtWriter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
16115179eb78SRichard Smith   VisitExpr(E);
16125179eb78SRichard Smith   Record.AddDeclRef(E->getConstructor());
16135179eb78SRichard Smith   Record.AddSourceLocation(E->getLocation());
16145179eb78SRichard Smith   Record.push_back(E->constructsVBase());
16155179eb78SRichard Smith   Record.push_back(E->inheritedFromVBase());
16165179eb78SRichard Smith   Code = serialization::EXPR_CXX_INHERITED_CTOR_INIT;
16175179eb78SRichard Smith }
16185179eb78SRichard Smith 
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)1619d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1620d6522cfcSSebastian Redl   VisitCXXConstructExpr(E);
1621290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1622539c5061SSebastian Redl   Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
1623d6522cfcSSebastian Redl }
1624d6522cfcSSebastian Redl 
VisitLambdaExpr(LambdaExpr * E)1625e31e606fSDouglas Gregor void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
1626e31e606fSDouglas Gregor   VisitExpr(E);
1627c669a1edSBruno Ricci   Record.push_back(E->LambdaExprBits.NumCaptures);
1628290d8019SRichard Smith   Record.AddSourceRange(E->IntroducerRange);
1629c669a1edSBruno Ricci   Record.push_back(E->LambdaExprBits.CaptureDefault); // FIXME: stable encoding
1630290d8019SRichard Smith   Record.AddSourceLocation(E->CaptureDefaultLoc);
1631c669a1edSBruno Ricci   Record.push_back(E->LambdaExprBits.ExplicitParams);
1632c669a1edSBruno Ricci   Record.push_back(E->LambdaExprBits.ExplicitResultType);
1633290d8019SRichard Smith   Record.AddSourceLocation(E->ClosingBrace);
163499ae806aSDouglas Gregor 
163599ae806aSDouglas Gregor   // Add capture initializers.
163699ae806aSDouglas Gregor   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
163799ae806aSDouglas Gregor                                       CEnd = E->capture_init_end();
163899ae806aSDouglas Gregor        C != CEnd; ++C) {
1639290d8019SRichard Smith     Record.AddStmt(*C);
164099ae806aSDouglas Gregor   }
164199ae806aSDouglas Gregor 
1642e4d178a7SBruno Ricci   // Don't serialize the body. It belongs to the call operator declaration.
1643e4d178a7SBruno Ricci   // LambdaExpr only stores a copy of the Stmt *.
164405843dc6SBruno Ricci 
164599ae806aSDouglas Gregor   Code = serialization::EXPR_LAMBDA;
1646e31e606fSDouglas Gregor }
1647e31e606fSDouglas Gregor 
VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)1648cc1b96d3SRichard Smith void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
1649cc1b96d3SRichard Smith   VisitExpr(E);
1650290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
1651cc1b96d3SRichard Smith   Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;
1652cc1b96d3SRichard Smith }
1653cc1b96d3SRichard Smith 
VisitCXXNamedCastExpr(CXXNamedCastExpr * E)1654d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1655d6522cfcSSebastian Redl   VisitExplicitCastExpr(E);
1656290d8019SRichard Smith   Record.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()));
1657290d8019SRichard Smith   Record.AddSourceRange(E->getAngleBrackets());
1658d6522cfcSSebastian Redl }
1659d6522cfcSSebastian Redl 
VisitCXXStaticCastExpr(CXXStaticCastExpr * E)1660d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1661d6522cfcSSebastian Redl   VisitCXXNamedCastExpr(E);
1662539c5061SSebastian Redl   Code = serialization::EXPR_CXX_STATIC_CAST;
1663d6522cfcSSebastian Redl }
1664d6522cfcSSebastian Redl 
VisitCXXDynamicCastExpr(CXXDynamicCastExpr * E)1665d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1666d6522cfcSSebastian Redl   VisitCXXNamedCastExpr(E);
1667539c5061SSebastian Redl   Code = serialization::EXPR_CXX_DYNAMIC_CAST;
1668d6522cfcSSebastian Redl }
1669d6522cfcSSebastian Redl 
VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)1670d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1671d6522cfcSSebastian Redl   VisitCXXNamedCastExpr(E);
1672539c5061SSebastian Redl   Code = serialization::EXPR_CXX_REINTERPRET_CAST;
1673d6522cfcSSebastian Redl }
1674d6522cfcSSebastian Redl 
VisitCXXConstCastExpr(CXXConstCastExpr * E)1675d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1676d6522cfcSSebastian Redl   VisitCXXNamedCastExpr(E);
1677539c5061SSebastian Redl   Code = serialization::EXPR_CXX_CONST_CAST;
1678d6522cfcSSebastian Redl }
1679d6522cfcSSebastian Redl 
VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr * E)1680a6a237f2SAnastasia Stulova void ASTStmtWriter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
1681a6a237f2SAnastasia Stulova   VisitCXXNamedCastExpr(E);
1682a6a237f2SAnastasia Stulova   Code = serialization::EXPR_CXX_ADDRSPACE_CAST;
1683a6a237f2SAnastasia Stulova }
1684a6a237f2SAnastasia Stulova 
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)1685d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1686d6522cfcSSebastian Redl   VisitExplicitCastExpr(E);
1687290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
1688290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1689539c5061SSebastian Redl   Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
1690d6522cfcSSebastian Redl }
1691d6522cfcSSebastian Redl 
VisitBuiltinBitCastExpr(BuiltinBitCastExpr * E)1692eee944e7SErik Pilkington void ASTStmtWriter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {
1693eee944e7SErik Pilkington   VisitExplicitCastExpr(E);
1694eee944e7SErik Pilkington   Record.AddSourceLocation(E->getBeginLoc());
1695eee944e7SErik Pilkington   Record.AddSourceLocation(E->getEndLoc());
169695d7ccb7Shyd-dev   Code = serialization::EXPR_BUILTIN_BIT_CAST;
1697eee944e7SErik Pilkington }
1698eee944e7SErik Pilkington 
VisitUserDefinedLiteral(UserDefinedLiteral * E)1699c67fdd4eSRichard Smith void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1700c67fdd4eSRichard Smith   VisitCallExpr(E);
1701290d8019SRichard Smith   Record.AddSourceLocation(E->UDSuffixLoc);
1702c67fdd4eSRichard Smith   Code = serialization::EXPR_USER_DEFINED_LITERAL;
1703c67fdd4eSRichard Smith }
1704c67fdd4eSRichard Smith 
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)1705d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1706d6522cfcSSebastian Redl   VisitExpr(E);
1707d6522cfcSSebastian Redl   Record.push_back(E->getValue());
1708290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1709539c5061SSebastian Redl   Code = serialization::EXPR_CXX_BOOL_LITERAL;
1710d6522cfcSSebastian Redl }
1711d6522cfcSSebastian Redl 
VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)1712d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1713d6522cfcSSebastian Redl   VisitExpr(E);
1714290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1715539c5061SSebastian Redl   Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
1716d6522cfcSSebastian Redl }
1717d6522cfcSSebastian Redl 
VisitCXXTypeidExpr(CXXTypeidExpr * E)1718d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1719d6522cfcSSebastian Redl   VisitExpr(E);
1720290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1721d6522cfcSSebastian Redl   if (E->isTypeOperand()) {
1722290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
1723539c5061SSebastian Redl     Code = serialization::EXPR_CXX_TYPEID_TYPE;
1724d6522cfcSSebastian Redl   } else {
1725290d8019SRichard Smith     Record.AddStmt(E->getExprOperand());
1726539c5061SSebastian Redl     Code = serialization::EXPR_CXX_TYPEID_EXPR;
1727d6522cfcSSebastian Redl   }
1728d6522cfcSSebastian Redl }
1729d6522cfcSSebastian Redl 
VisitCXXThisExpr(CXXThisExpr * E)1730d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
1731d6522cfcSSebastian Redl   VisitExpr(E);
1732290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
1733d6522cfcSSebastian Redl   Record.push_back(E->isImplicit());
1734539c5061SSebastian Redl   Code = serialization::EXPR_CXX_THIS;
1735d6522cfcSSebastian Redl }
1736d6522cfcSSebastian Redl 
VisitCXXThrowExpr(CXXThrowExpr * E)1737d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
1738d6522cfcSSebastian Redl   VisitExpr(E);
1739290d8019SRichard Smith   Record.AddSourceLocation(E->getThrowLoc());
1740290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
174153e191edSDouglas Gregor   Record.push_back(E->isThrownVariableInScope());
1742539c5061SSebastian Redl   Code = serialization::EXPR_CXX_THROW;
1743d6522cfcSSebastian Redl }
1744d6522cfcSSebastian Redl 
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * E)1745d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1746d6522cfcSSebastian Redl   VisitExpr(E);
1747290d8019SRichard Smith   Record.AddDeclRef(E->getParam());
1748708afb56SEric Fiselier   Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));
1749290d8019SRichard Smith   Record.AddSourceLocation(E->getUsedLocation());
1750539c5061SSebastian Redl   Code = serialization::EXPR_CXX_DEFAULT_ARG;
1751d6522cfcSSebastian Redl }
1752d6522cfcSSebastian Redl 
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * E)1753852c9db7SRichard Smith void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
1754852c9db7SRichard Smith   VisitExpr(E);
1755290d8019SRichard Smith   Record.AddDeclRef(E->getField());
1756708afb56SEric Fiselier   Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));
1757290d8019SRichard Smith   Record.AddSourceLocation(E->getExprLoc());
1758852c9db7SRichard Smith   Code = serialization::EXPR_CXX_DEFAULT_INIT;
1759852c9db7SRichard Smith }
1760852c9db7SRichard Smith 
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)1761d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1762d6522cfcSSebastian Redl   VisitExpr(E);
1763290d8019SRichard Smith   Record.AddCXXTemporary(E->getTemporary());
1764290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
1765539c5061SSebastian Redl   Code = serialization::EXPR_CXX_BIND_TEMPORARY;
1766d6522cfcSSebastian Redl }
1767d6522cfcSSebastian Redl 
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)1768d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1769d6522cfcSSebastian Redl   VisitExpr(E);
1770290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1771290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1772539c5061SSebastian Redl   Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
1773d6522cfcSSebastian Redl }
1774d6522cfcSSebastian Redl 
VisitCXXNewExpr(CXXNewExpr * E)1775d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1776d6522cfcSSebastian Redl   VisitExpr(E);
17779b6dfac5SBruno Ricci 
1778c3a3c600SSebastian Redl   Record.push_back(E->isArray());
17799b6dfac5SBruno Ricci   Record.push_back(E->hasInitializer());
17809b6dfac5SBruno Ricci   Record.push_back(E->getNumPlacementArgs());
17819b6dfac5SBruno Ricci   Record.push_back(E->isParenTypeId());
17829b6dfac5SBruno Ricci 
17839b6dfac5SBruno Ricci   Record.push_back(E->isGlobalNew());
1784b2f0f057SRichard Smith   Record.push_back(E->passAlignment());
17856047f07eSSebastian Redl   Record.push_back(E->doesUsualArrayDeleteWantSize());
17869b6dfac5SBruno Ricci   Record.push_back(E->CXXNewExprBits.StoredInitializationStyle);
17879b6dfac5SBruno Ricci 
1788290d8019SRichard Smith   Record.AddDeclRef(E->getOperatorNew());
1789290d8019SRichard Smith   Record.AddDeclRef(E->getOperatorDelete());
1790290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo());
17919b6dfac5SBruno Ricci   if (E->isParenTypeId())
1792290d8019SRichard Smith     Record.AddSourceRange(E->getTypeIdParens());
1793290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1794290d8019SRichard Smith   Record.AddSourceRange(E->getDirectInitRange());
17959b6dfac5SBruno Ricci 
17969b6dfac5SBruno Ricci   for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), N = E->raw_arg_end();
17979b6dfac5SBruno Ricci        I != N; ++I)
1798290d8019SRichard Smith     Record.AddStmt(*I);
1799d6522cfcSSebastian Redl 
1800539c5061SSebastian Redl   Code = serialization::EXPR_CXX_NEW;
1801d6522cfcSSebastian Redl }
1802d6522cfcSSebastian Redl 
VisitCXXDeleteExpr(CXXDeleteExpr * E)1803d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1804d6522cfcSSebastian Redl   VisitExpr(E);
1805d6522cfcSSebastian Redl   Record.push_back(E->isGlobalDelete());
1806d6522cfcSSebastian Redl   Record.push_back(E->isArrayForm());
180714ec9f67SArgyrios Kyrtzidis   Record.push_back(E->isArrayFormAsWritten());
1808284c48ffSJohn McCall   Record.push_back(E->doesUsualArrayDeleteWantSize());
1809290d8019SRichard Smith   Record.AddDeclRef(E->getOperatorDelete());
1810290d8019SRichard Smith   Record.AddStmt(E->getArgument());
181191728fcdSBruno Ricci   Record.AddSourceLocation(E->getBeginLoc());
1812d6522cfcSSebastian Redl 
1813539c5061SSebastian Redl   Code = serialization::EXPR_CXX_DELETE;
1814d6522cfcSSebastian Redl }
1815d6522cfcSSebastian Redl 
VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)1816d6522cfcSSebastian Redl void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1817d6522cfcSSebastian Redl   VisitExpr(E);
1818d6522cfcSSebastian Redl 
1819290d8019SRichard Smith   Record.AddStmt(E->getBase());
1820d6522cfcSSebastian Redl   Record.push_back(E->isArrow());
1821290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
1822290d8019SRichard Smith   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1823290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getScopeTypeInfo());
1824290d8019SRichard Smith   Record.AddSourceLocation(E->getColonColonLoc());
1825290d8019SRichard Smith   Record.AddSourceLocation(E->getTildeLoc());
1826d6522cfcSSebastian Redl 
1827d6522cfcSSebastian Redl   // PseudoDestructorTypeStorage.
1828290d8019SRichard Smith   Record.AddIdentifierRef(E->getDestroyedTypeIdentifier());
1829d6522cfcSSebastian Redl   if (E->getDestroyedTypeIdentifier())
1830290d8019SRichard Smith     Record.AddSourceLocation(E->getDestroyedTypeLoc());
1831d6522cfcSSebastian Redl   else
1832290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getDestroyedTypeInfo());
1833d6522cfcSSebastian Redl 
1834539c5061SSebastian Redl   Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
1835d6522cfcSSebastian Redl }
1836d6522cfcSSebastian Redl 
VisitExprWithCleanups(ExprWithCleanups * E)18375d413781SJohn McCall void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
1838d6522cfcSSebastian Redl   VisitExpr(E);
183928fc7091SJohn McCall   Record.push_back(E->getNumObjects());
184040568fecSAkira Hatanaka   for (auto &Obj : E->getObjects()) {
184140568fecSAkira Hatanaka     if (auto *BD = Obj.dyn_cast<BlockDecl *>()) {
184240568fecSAkira Hatanaka       Record.push_back(serialization::COK_Block);
184340568fecSAkira Hatanaka       Record.AddDeclRef(BD);
184440568fecSAkira Hatanaka     } else if (auto *CLE = Obj.dyn_cast<CompoundLiteralExpr *>()) {
184540568fecSAkira Hatanaka       Record.push_back(serialization::COK_CompoundLiteral);
184640568fecSAkira Hatanaka       Record.AddStmt(CLE);
184740568fecSAkira Hatanaka     }
184840568fecSAkira Hatanaka   }
1849d6522cfcSSebastian Redl 
18504a05bb8dSTim Shen   Record.push_back(E->cleanupsHaveSideEffects());
1851290d8019SRichard Smith   Record.AddStmt(E->getSubExpr());
18525d413781SJohn McCall   Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
1853d6522cfcSSebastian Redl }
1854d6522cfcSSebastian Redl 
VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)18552e6dc538SBruno Ricci void ASTStmtWriter::VisitCXXDependentScopeMemberExpr(
18562e6dc538SBruno Ricci     CXXDependentScopeMemberExpr *E) {
1857d6522cfcSSebastian Redl   VisitExpr(E);
1858d6522cfcSSebastian Redl 
18592e6dc538SBruno Ricci   // Don't emit anything here (or if you do you will have to update
18602e6dc538SBruno Ricci   // the corresponding deserialization function).
1861d6522cfcSSebastian Redl 
18622e6dc538SBruno Ricci   Record.push_back(E->hasTemplateKWAndArgsInfo());
18632e6dc538SBruno Ricci   Record.push_back(E->getNumTemplateArgs());
18642e6dc538SBruno Ricci   Record.push_back(E->hasFirstQualifierFoundInScope());
18652e6dc538SBruno Ricci 
18662e6dc538SBruno Ricci   if (E->hasTemplateKWAndArgsInfo()) {
1867e7d82283SJames Y Knight     const ASTTemplateKWAndArgsInfo &ArgInfo =
1868e7d82283SJames Y Knight         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
1869e7d82283SJames Y Knight     AddTemplateKWAndArgsInfo(ArgInfo,
1870e7d82283SJames Y Knight                              E->getTrailingObjects<TemplateArgumentLoc>());
1871d6522cfcSSebastian Redl   }
1872d6522cfcSSebastian Redl 
18732e6dc538SBruno Ricci   Record.push_back(E->isArrow());
18742e6dc538SBruno Ricci   Record.AddSourceLocation(E->getOperatorLoc());
18752e6dc538SBruno Ricci   Record.AddTypeRef(E->getBaseType());
18762e6dc538SBruno Ricci   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1877d6522cfcSSebastian Redl   if (!E->isImplicitAccess())
1878290d8019SRichard Smith     Record.AddStmt(E->getBase());
1879d6522cfcSSebastian Redl   else
1880290d8019SRichard Smith     Record.AddStmt(nullptr);
18812e6dc538SBruno Ricci 
18822e6dc538SBruno Ricci   if (E->hasFirstQualifierFoundInScope())
1883290d8019SRichard Smith     Record.AddDeclRef(E->getFirstQualifierFoundInScope());
18842e6dc538SBruno Ricci 
1885290d8019SRichard Smith   Record.AddDeclarationNameInfo(E->MemberNameInfo);
1886539c5061SSebastian Redl   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1887d6522cfcSSebastian Redl }
1888d6522cfcSSebastian Redl 
1889d6522cfcSSebastian Redl void
VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)1890d6522cfcSSebastian Redl ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1891d6522cfcSSebastian Redl   VisitExpr(E);
1892d6522cfcSSebastian Redl 
18937945c981SAbramo Bagnara   // Don't emit anything here, HasTemplateKWAndArgsInfo must be
189487866cedSDouglas Gregor   // emitted first.
18957945c981SAbramo Bagnara 
189649ee964eSBruno Ricci   Record.push_back(E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo);
189749ee964eSBruno Ricci   if (E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo) {
1898e7d82283SJames Y Knight     const ASTTemplateKWAndArgsInfo &ArgInfo =
1899e7d82283SJames Y Knight         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
1900e7d82283SJames Y Knight     Record.push_back(ArgInfo.NumTemplateArgs);
1901e7d82283SJames Y Knight     AddTemplateKWAndArgsInfo(ArgInfo,
1902e7d82283SJames Y Knight                              E->getTrailingObjects<TemplateArgumentLoc>());
1903d6522cfcSSebastian Redl   }
1904d6522cfcSSebastian Redl 
1905290d8019SRichard Smith   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1906290d8019SRichard Smith   Record.AddDeclarationNameInfo(E->NameInfo);
1907539c5061SSebastian Redl   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
1908d6522cfcSSebastian Redl }
1909d6522cfcSSebastian Redl 
1910d6522cfcSSebastian Redl void
VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)1911d6522cfcSSebastian Redl ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1912d6522cfcSSebastian Redl   VisitExpr(E);
1913537cc6ddSStephen Kelly   Record.push_back(E->getNumArgs());
1914d6522cfcSSebastian Redl   for (CXXUnresolvedConstructExpr::arg_iterator
1915d6522cfcSSebastian Redl          ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1916290d8019SRichard Smith     Record.AddStmt(*ArgI);
1917290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1918290d8019SRichard Smith   Record.AddSourceLocation(E->getLParenLoc());
1919290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
1920539c5061SSebastian Redl   Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1921d6522cfcSSebastian Redl }
1922d6522cfcSSebastian Redl 
VisitOverloadExpr(OverloadExpr * E)1923d6522cfcSSebastian Redl void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1924d6522cfcSSebastian Redl   VisitExpr(E);
1925d6522cfcSSebastian Redl 
1926d7628d99SBruno Ricci   Record.push_back(E->getNumDecls());
1927d7628d99SBruno Ricci   Record.push_back(E->hasTemplateKWAndArgsInfo());
1928d7628d99SBruno Ricci   if (E->hasTemplateKWAndArgsInfo()) {
1929e7d82283SJames Y Knight     const ASTTemplateKWAndArgsInfo &ArgInfo =
1930e7d82283SJames Y Knight         *E->getTrailingASTTemplateKWAndArgsInfo();
1931e7d82283SJames Y Knight     Record.push_back(ArgInfo.NumTemplateArgs);
1932e7d82283SJames Y Knight     AddTemplateKWAndArgsInfo(ArgInfo, E->getTrailingTemplateArgumentLoc());
1933d6522cfcSSebastian Redl   }
1934d6522cfcSSebastian Redl 
1935d7628d99SBruno Ricci   for (OverloadExpr::decls_iterator OvI = E->decls_begin(),
1936d7628d99SBruno Ricci                                     OvE = E->decls_end();
1937d7628d99SBruno Ricci        OvI != OvE; ++OvI) {
1938290d8019SRichard Smith     Record.AddDeclRef(OvI.getDecl());
1939d6522cfcSSebastian Redl     Record.push_back(OvI.getAccess());
1940d6522cfcSSebastian Redl   }
1941d6522cfcSSebastian Redl 
1942d7628d99SBruno Ricci   Record.AddDeclarationNameInfo(E->getNameInfo());
1943290d8019SRichard Smith   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1944d6522cfcSSebastian Redl }
1945d6522cfcSSebastian Redl 
VisitUnresolvedMemberExpr(UnresolvedMemberExpr * E)1946d6522cfcSSebastian Redl void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1947d6522cfcSSebastian Redl   VisitOverloadExpr(E);
1948d6522cfcSSebastian Redl   Record.push_back(E->isArrow());
1949d6522cfcSSebastian Redl   Record.push_back(E->hasUnresolvedUsing());
1950290d8019SRichard Smith   Record.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);
1951290d8019SRichard Smith   Record.AddTypeRef(E->getBaseType());
1952290d8019SRichard Smith   Record.AddSourceLocation(E->getOperatorLoc());
1953539c5061SSebastian Redl   Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
1954d6522cfcSSebastian Redl }
1955d6522cfcSSebastian Redl 
VisitUnresolvedLookupExpr(UnresolvedLookupExpr * E)1956d6522cfcSSebastian Redl void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1957d6522cfcSSebastian Redl   VisitOverloadExpr(E);
1958d6522cfcSSebastian Redl   Record.push_back(E->requiresADL());
1959d6522cfcSSebastian Redl   Record.push_back(E->isOverloaded());
1960290d8019SRichard Smith   Record.AddDeclRef(E->getNamingClass());
1961539c5061SSebastian Redl   Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
1962d6522cfcSSebastian Redl }
1963d6522cfcSSebastian Redl 
VisitTypeTraitExpr(TypeTraitExpr * E)196429c42f2aSDouglas Gregor void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
196529c42f2aSDouglas Gregor   VisitExpr(E);
196629c42f2aSDouglas Gregor   Record.push_back(E->TypeTraitExprBits.NumArgs);
196729c42f2aSDouglas Gregor   Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
196829c42f2aSDouglas Gregor   Record.push_back(E->TypeTraitExprBits.Value);
1969290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
197029c42f2aSDouglas Gregor   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1971290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getArg(I));
197229c42f2aSDouglas Gregor   Code = serialization::EXPR_TYPE_TRAIT;
197329c42f2aSDouglas Gregor }
197429c42f2aSDouglas Gregor 
VisitArrayTypeTraitExpr(ArrayTypeTraitExpr * E)19756242b6a6SJohn Wiegley void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
19766242b6a6SJohn Wiegley   VisitExpr(E);
19776242b6a6SJohn Wiegley   Record.push_back(E->getTrait());
19786242b6a6SJohn Wiegley   Record.push_back(E->getValue());
1979290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1980290d8019SRichard Smith   Record.AddTypeSourceInfo(E->getQueriedTypeSourceInfo());
1981a693b37eSAleksei Sidorin   Record.AddStmt(E->getDimensionExpression());
19826242b6a6SJohn Wiegley   Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
19836242b6a6SJohn Wiegley }
19846242b6a6SJohn Wiegley 
VisitExpressionTraitExpr(ExpressionTraitExpr * E)1985f9f6584eSJohn Wiegley void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1986f9f6584eSJohn Wiegley   VisitExpr(E);
1987f9f6584eSJohn Wiegley   Record.push_back(E->getTrait());
1988f9f6584eSJohn Wiegley   Record.push_back(E->getValue());
1989290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1990290d8019SRichard Smith   Record.AddStmt(E->getQueriedExpression());
1991f9f6584eSJohn Wiegley   Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
1992f9f6584eSJohn Wiegley }
1993f9f6584eSJohn Wiegley 
VisitCXXNoexceptExpr(CXXNoexceptExpr * E)19949ac55dd8SSebastian Redl void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
19959ac55dd8SSebastian Redl   VisitExpr(E);
19969ac55dd8SSebastian Redl   Record.push_back(E->getValue());
1997290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
1998290d8019SRichard Smith   Record.AddStmt(E->getOperand());
19999ac55dd8SSebastian Redl   Code = serialization::EXPR_CXX_NOEXCEPT;
20009ac55dd8SSebastian Redl }
20019ac55dd8SSebastian Redl 
VisitPackExpansionExpr(PackExpansionExpr * E)2002e8e9dd62SDouglas Gregor void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2003e8e9dd62SDouglas Gregor   VisitExpr(E);
2004290d8019SRichard Smith   Record.AddSourceLocation(E->getEllipsisLoc());
2005b884000bSDouglas Gregor   Record.push_back(E->NumExpansions);
2006290d8019SRichard Smith   Record.AddStmt(E->getPattern());
2007e8e9dd62SDouglas Gregor   Code = serialization::EXPR_PACK_EXPANSION;
2008e8e9dd62SDouglas Gregor }
2009e8e9dd62SDouglas Gregor 
VisitSizeOfPackExpr(SizeOfPackExpr * E)2010820ba7baSDouglas Gregor void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2011820ba7baSDouglas Gregor   VisitExpr(E);
2012d784e689SRichard Smith   Record.push_back(E->isPartiallySubstituted() ? E->getPartialArguments().size()
2013d784e689SRichard Smith                                                : 0);
2014290d8019SRichard Smith   Record.AddSourceLocation(E->OperatorLoc);
2015290d8019SRichard Smith   Record.AddSourceLocation(E->PackLoc);
2016290d8019SRichard Smith   Record.AddSourceLocation(E->RParenLoc);
2017290d8019SRichard Smith   Record.AddDeclRef(E->Pack);
2018d784e689SRichard Smith   if (E->isPartiallySubstituted()) {
2019d784e689SRichard Smith     for (const auto &TA : E->getPartialArguments())
2020290d8019SRichard Smith       Record.AddTemplateArgument(TA);
2021d784e689SRichard Smith   } else if (!E->isValueDependent()) {
2022d784e689SRichard Smith     Record.push_back(E->getPackLength());
2023d784e689SRichard Smith   }
2024820ba7baSDouglas Gregor   Code = serialization::EXPR_SIZEOF_PACK;
2025820ba7baSDouglas Gregor }
2026820ba7baSDouglas Gregor 
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)2027fa19404cSJohn McCall void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
2028fa19404cSJohn McCall                                               SubstNonTypeTemplateParmExpr *E) {
2029fa19404cSJohn McCall   VisitExpr(E);
2030290d8019SRichard Smith   Record.AddDeclRef(E->getParameter());
2031caf30e7fSRichard Smith   Record.push_back(E->isReferenceParameter());
2032290d8019SRichard Smith   Record.AddSourceLocation(E->getNameLoc());
2033290d8019SRichard Smith   Record.AddStmt(E->getReplacement());
2034fa19404cSJohn McCall   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
2035fa19404cSJohn McCall }
2036fa19404cSJohn McCall 
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)2037cdbc539aSDouglas Gregor void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
2038cdbc539aSDouglas Gregor                                           SubstNonTypeTemplateParmPackExpr *E) {
2039cdbc539aSDouglas Gregor   VisitExpr(E);
2040290d8019SRichard Smith   Record.AddDeclRef(E->getParameterPack());
2041290d8019SRichard Smith   Record.AddTemplateArgument(E->getArgumentPack());
2042290d8019SRichard Smith   Record.AddSourceLocation(E->getParameterPackLocation());
2043cdbc539aSDouglas Gregor   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
2044cdbc539aSDouglas Gregor }
2045cdbc539aSDouglas Gregor 
VisitFunctionParmPackExpr(FunctionParmPackExpr * E)2046b15fe3a5SRichard Smith void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2047b15fe3a5SRichard Smith   VisitExpr(E);
2048b15fe3a5SRichard Smith   Record.push_back(E->getNumExpansions());
2049290d8019SRichard Smith   Record.AddDeclRef(E->getParameterPack());
2050290d8019SRichard Smith   Record.AddSourceLocation(E->getParameterPackLocation());
2051b15fe3a5SRichard Smith   for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
2052b15fe3a5SRichard Smith        I != End; ++I)
2053290d8019SRichard Smith     Record.AddDeclRef(*I);
2054b15fe3a5SRichard Smith   Code = serialization::EXPR_FUNCTION_PARM_PACK;
2055b15fe3a5SRichard Smith }
2056b15fe3a5SRichard Smith 
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)2057fe31481fSDouglas Gregor void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
2058fe31481fSDouglas Gregor   VisitExpr(E);
2059b0561b33STyker   Record.push_back(static_cast<bool>(E->getLifetimeExtendedTemporaryDecl()));
2060b0561b33STyker   if (E->getLifetimeExtendedTemporaryDecl())
2061b0561b33STyker     Record.AddDeclRef(E->getLifetimeExtendedTemporaryDecl());
2062b0561b33STyker   else
2063b0561b33STyker     Record.AddStmt(E->getSubExpr());
2064fe31481fSDouglas Gregor   Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
2065fe31481fSDouglas Gregor }
2066fe31481fSDouglas Gregor 
VisitCXXFoldExpr(CXXFoldExpr * E)20670f0af19bSRichard Smith void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {
20680f0af19bSRichard Smith   VisitExpr(E);
2069290d8019SRichard Smith   Record.AddSourceLocation(E->LParenLoc);
2070290d8019SRichard Smith   Record.AddSourceLocation(E->EllipsisLoc);
2071290d8019SRichard Smith   Record.AddSourceLocation(E->RParenLoc);
2072c7214f65SRichard Smith   Record.push_back(E->NumExpansions);
2073290d8019SRichard Smith   Record.AddStmt(E->SubExprs[0]);
2074290d8019SRichard Smith   Record.AddStmt(E->SubExprs[1]);
2075ed5a18fcSRichard Smith   Record.AddStmt(E->SubExprs[2]);
20760f0af19bSRichard Smith   Record.push_back(E->Opcode);
20770f0af19bSRichard Smith   Code = serialization::EXPR_CXX_FOLD;
20780f0af19bSRichard Smith }
20790f0af19bSRichard Smith 
VisitOpaqueValueExpr(OpaqueValueExpr * E)20808d69a216SJohn McCall void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
20818d69a216SJohn McCall   VisitExpr(E);
2082290d8019SRichard Smith   Record.AddStmt(E->getSourceExpr());
2083290d8019SRichard Smith   Record.AddSourceLocation(E->getLocation());
2084797afe3aSAkira Hatanaka   Record.push_back(E->isUnique());
20858d69a216SJohn McCall   Code = serialization::EXPR_OPAQUE_VALUE;
20868d69a216SJohn McCall }
20878d69a216SJohn McCall 
VisitTypoExpr(TypoExpr * E)2088e1f49d54SKaelyn Takata void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {
2089e1f49d54SKaelyn Takata   VisitExpr(E);
2090e1f49d54SKaelyn Takata   // TODO: Figure out sane writer behavior for a TypoExpr, if necessary
209104839a59SDavide Italiano   llvm_unreachable("Cannot write TypoExpr nodes");
2092e1f49d54SKaelyn Takata }
2093e1f49d54SKaelyn Takata 
2094d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
209541f85462SPeter Collingbourne // CUDA Expressions and Statements.
209641f85462SPeter Collingbourne //===----------------------------------------------------------------------===//
209741f85462SPeter Collingbourne 
VisitCUDAKernelCallExpr(CUDAKernelCallExpr * E)209841f85462SPeter Collingbourne void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
209941f85462SPeter Collingbourne   VisitCallExpr(E);
2100290d8019SRichard Smith   Record.AddStmt(E->getConfig());
210141f85462SPeter Collingbourne   Code = serialization::EXPR_CUDA_KERNEL_CALL;
210241f85462SPeter Collingbourne }
210341f85462SPeter Collingbourne 
210441f85462SPeter Collingbourne //===----------------------------------------------------------------------===//
210555808c10STanya Lattner // OpenCL Expressions and Statements.
210655808c10STanya Lattner //===----------------------------------------------------------------------===//
VisitAsTypeExpr(AsTypeExpr * E)210755808c10STanya Lattner void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
210855808c10STanya Lattner   VisitExpr(E);
2109290d8019SRichard Smith   Record.AddSourceLocation(E->getBuiltinLoc());
2110290d8019SRichard Smith   Record.AddSourceLocation(E->getRParenLoc());
2111290d8019SRichard Smith   Record.AddStmt(E->getSrcExpr());
211255808c10STanya Lattner   Code = serialization::EXPR_ASTYPE;
211355808c10STanya Lattner }
211455808c10STanya Lattner 
211555808c10STanya Lattner //===----------------------------------------------------------------------===//
2116fa19404cSJohn McCall // Microsoft Expressions and Statements.
2117fa19404cSJohn McCall //===----------------------------------------------------------------------===//
VisitMSPropertyRefExpr(MSPropertyRefExpr * E)21185e77d76cSJohn McCall void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
21195e77d76cSJohn McCall   VisitExpr(E);
21205e77d76cSJohn McCall   Record.push_back(E->isArrow());
2121290d8019SRichard Smith   Record.AddStmt(E->getBaseExpr());
2122290d8019SRichard Smith   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
2123290d8019SRichard Smith   Record.AddSourceLocation(E->getMemberLoc());
2124290d8019SRichard Smith   Record.AddDeclRef(E->getPropertyDecl());
21255e77d76cSJohn McCall   Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;
21265e77d76cSJohn McCall }
21275e77d76cSJohn McCall 
VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)2128f763027fSAlexey Bataev void ASTStmtWriter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {
2129f763027fSAlexey Bataev   VisitExpr(E);
2130290d8019SRichard Smith   Record.AddStmt(E->getBase());
2131290d8019SRichard Smith   Record.AddStmt(E->getIdx());
2132290d8019SRichard Smith   Record.AddSourceLocation(E->getRBracketLoc());
2133f763027fSAlexey Bataev   Code = serialization::EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR;
2134f763027fSAlexey Bataev }
2135f763027fSAlexey Bataev 
VisitCXXUuidofExpr(CXXUuidofExpr * E)2136fa19404cSJohn McCall void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
2137fa19404cSJohn McCall   VisitExpr(E);
2138290d8019SRichard Smith   Record.AddSourceRange(E->getSourceRange());
2139bab6df86SRichard Smith   Record.AddDeclRef(E->getGuidDecl());
2140fa19404cSJohn McCall   if (E->isTypeOperand()) {
2141290d8019SRichard Smith     Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
2142fa19404cSJohn McCall     Code = serialization::EXPR_CXX_UUIDOF_TYPE;
2143fa19404cSJohn McCall   } else {
2144290d8019SRichard Smith     Record.AddStmt(E->getExprOperand());
2145fa19404cSJohn McCall     Code = serialization::EXPR_CXX_UUIDOF_EXPR;
2146fa19404cSJohn McCall   }
2147fa19404cSJohn McCall }
2148fa19404cSJohn McCall 
VisitSEHExceptStmt(SEHExceptStmt * S)2149fa19404cSJohn McCall void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
2150fa19404cSJohn McCall   VisitStmt(S);
2151290d8019SRichard Smith   Record.AddSourceLocation(S->getExceptLoc());
2152290d8019SRichard Smith   Record.AddStmt(S->getFilterExpr());
2153290d8019SRichard Smith   Record.AddStmt(S->getBlock());
2154fa19404cSJohn McCall   Code = serialization::STMT_SEH_EXCEPT;
2155fa19404cSJohn McCall }
2156fa19404cSJohn McCall 
VisitSEHFinallyStmt(SEHFinallyStmt * S)2157fa19404cSJohn McCall void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
2158fa19404cSJohn McCall   VisitStmt(S);
2159290d8019SRichard Smith   Record.AddSourceLocation(S->getFinallyLoc());
2160290d8019SRichard Smith   Record.AddStmt(S->getBlock());
2161fa19404cSJohn McCall   Code = serialization::STMT_SEH_FINALLY;
2162fa19404cSJohn McCall }
2163fa19404cSJohn McCall 
VisitSEHTryStmt(SEHTryStmt * S)2164fa19404cSJohn McCall void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
2165fa19404cSJohn McCall   VisitStmt(S);
2166fa19404cSJohn McCall   Record.push_back(S->getIsCXXTry());
2167290d8019SRichard Smith   Record.AddSourceLocation(S->getTryLoc());
2168290d8019SRichard Smith   Record.AddStmt(S->getTryBlock());
2169290d8019SRichard Smith   Record.AddStmt(S->getHandler());
2170fa19404cSJohn McCall   Code = serialization::STMT_SEH_TRY;
2171fa19404cSJohn McCall }
2172fa19404cSJohn McCall 
VisitSEHLeaveStmt(SEHLeaveStmt * S)21739b982078SNico Weber void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
21749b982078SNico Weber   VisitStmt(S);
2175290d8019SRichard Smith   Record.AddSourceLocation(S->getLeaveLoc());
21769b982078SNico Weber   Code = serialization::STMT_SEH_LEAVE;
21779b982078SNico Weber }
21789b982078SNico Weber 
2179fa19404cSJohn McCall //===----------------------------------------------------------------------===//
21805ec3eb11SAlexey Bataev // OpenMP Directives.
21815ec3eb11SAlexey Bataev //===----------------------------------------------------------------------===//
21820af7835eSAlexey Bataev 
VisitOMPCanonicalLoop(OMPCanonicalLoop * S)2183b1191206SMichael Kruse void ASTStmtWriter::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {
2184b1191206SMichael Kruse   VisitStmt(S);
2185b1191206SMichael Kruse   for (Stmt *SubStmt : S->SubStmts)
2186b1191206SMichael Kruse     Record.AddStmt(SubStmt);
2187b1191206SMichael Kruse   Code = serialization::STMT_OMP_CANONICAL_LOOP;
2188b1191206SMichael Kruse }
2189b1191206SMichael Kruse 
VisitOMPExecutableDirective(OMPExecutableDirective * E)21905ec3eb11SAlexey Bataev void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
21910af7835eSAlexey Bataev   Record.writeOMPChildren(E->Data);
2192f2ceec48SStephen Kelly   Record.AddSourceLocation(E->getBeginLoc());
21931c301dcbSStephen Kelly   Record.AddSourceLocation(E->getEndLoc());
21945ec3eb11SAlexey Bataev }
21955ec3eb11SAlexey Bataev 
VisitOMPLoopBasedDirective(OMPLoopBasedDirective * D)21966c050052SMichael Kruse void ASTStmtWriter::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {
21973aaab669SAlexander Musman   VisitStmt(D);
21986c050052SMichael Kruse   Record.writeUInt32(D->getLoopsNumber());
21993aaab669SAlexander Musman   VisitOMPExecutableDirective(D);
22003aaab669SAlexander Musman }
22013aaab669SAlexander Musman 
VisitOMPLoopDirective(OMPLoopDirective * D)22026c050052SMichael Kruse void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {
22036c050052SMichael Kruse   VisitOMPLoopBasedDirective(D);
22046c050052SMichael Kruse }
22056c050052SMichael Kruse 
VisitOMPMetaDirective(OMPMetaDirective * D)2206000875c1Salokmishra.besu void ASTStmtWriter::VisitOMPMetaDirective(OMPMetaDirective *D) {
2207000875c1Salokmishra.besu   VisitStmt(D);
2208000875c1Salokmishra.besu   Record.push_back(D->getNumClauses());
2209000875c1Salokmishra.besu   VisitOMPExecutableDirective(D);
2210000875c1Salokmishra.besu   Code = serialization::STMT_OMP_META_DIRECTIVE;
2211000875c1Salokmishra.besu }
2212000875c1Salokmishra.besu 
VisitOMPParallelDirective(OMPParallelDirective * D)22135ec3eb11SAlexey Bataev void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
22141b59ab56SAlexey Bataev   VisitStmt(D);
22155ec3eb11SAlexey Bataev   VisitOMPExecutableDirective(D);
22160af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
22175ec3eb11SAlexey Bataev   Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
22185ec3eb11SAlexey Bataev }
22195ec3eb11SAlexey Bataev 
VisitOMPSimdDirective(OMPSimdDirective * D)22201b59ab56SAlexey Bataev void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
22213aaab669SAlexander Musman   VisitOMPLoopDirective(D);
22221b59ab56SAlexey Bataev   Code = serialization::STMT_OMP_SIMD_DIRECTIVE;
22231b59ab56SAlexey Bataev }
22241b59ab56SAlexey Bataev 
VisitOMPLoopTransformationDirective(OMPLoopTransformationDirective * D)2225f37e8b0bSMichael Kruse void ASTStmtWriter::VisitOMPLoopTransformationDirective(
2226f37e8b0bSMichael Kruse     OMPLoopTransformationDirective *D) {
22276c050052SMichael Kruse   VisitOMPLoopBasedDirective(D);
22282130117fSMichael Kruse   Record.writeUInt32(D->getNumGeneratedLoops());
2229f37e8b0bSMichael Kruse }
2230f37e8b0bSMichael Kruse 
VisitOMPTileDirective(OMPTileDirective * D)2231f37e8b0bSMichael Kruse void ASTStmtWriter::VisitOMPTileDirective(OMPTileDirective *D) {
2232f37e8b0bSMichael Kruse   VisitOMPLoopTransformationDirective(D);
22336c050052SMichael Kruse   Code = serialization::STMT_OMP_TILE_DIRECTIVE;
22346c050052SMichael Kruse }
22356c050052SMichael Kruse 
VisitOMPUnrollDirective(OMPUnrollDirective * D)2236a2223612SMichael Kruse void ASTStmtWriter::VisitOMPUnrollDirective(OMPUnrollDirective *D) {
2237f37e8b0bSMichael Kruse   VisitOMPLoopTransformationDirective(D);
2238a2223612SMichael Kruse   Code = serialization::STMT_OMP_UNROLL_DIRECTIVE;
2239a2223612SMichael Kruse }
2240a2223612SMichael Kruse 
VisitOMPForDirective(OMPForDirective * D)2241f29276edSAlexey Bataev void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
22423aaab669SAlexander Musman   VisitOMPLoopDirective(D);
22430af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
2244f29276edSAlexey Bataev   Code = serialization::STMT_OMP_FOR_DIRECTIVE;
2245f29276edSAlexey Bataev }
2246f29276edSAlexey Bataev 
VisitOMPForSimdDirective(OMPForSimdDirective * D)2247f82886e5SAlexander Musman void ASTStmtWriter::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
2248f82886e5SAlexander Musman   VisitOMPLoopDirective(D);
2249f82886e5SAlexander Musman   Code = serialization::STMT_OMP_FOR_SIMD_DIRECTIVE;
2250f82886e5SAlexander Musman }
2251f82886e5SAlexander Musman 
VisitOMPSectionsDirective(OMPSectionsDirective * D)2252d3f8dd2dSAlexey Bataev void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
2253d3f8dd2dSAlexey Bataev   VisitStmt(D);
2254d3f8dd2dSAlexey Bataev   VisitOMPExecutableDirective(D);
22550af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
2256d3f8dd2dSAlexey Bataev   Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
2257d3f8dd2dSAlexey Bataev }
2258d3f8dd2dSAlexey Bataev 
VisitOMPSectionDirective(OMPSectionDirective * D)22591e0498a9SAlexey Bataev void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
22601e0498a9SAlexey Bataev   VisitStmt(D);
22611e0498a9SAlexey Bataev   VisitOMPExecutableDirective(D);
22620af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
22631e0498a9SAlexey Bataev   Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
22641e0498a9SAlexey Bataev }
22651e0498a9SAlexey Bataev 
VisitOMPSingleDirective(OMPSingleDirective * D)2266d1e40fbfSAlexey Bataev void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {
2267d1e40fbfSAlexey Bataev   VisitStmt(D);
2268d1e40fbfSAlexey Bataev   VisitOMPExecutableDirective(D);
2269d1e40fbfSAlexey Bataev   Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;
2270d1e40fbfSAlexey Bataev }
2271d1e40fbfSAlexey Bataev 
VisitOMPMasterDirective(OMPMasterDirective * D)227280c2289aSAlexander Musman void ASTStmtWriter::VisitOMPMasterDirective(OMPMasterDirective *D) {
227380c2289aSAlexander Musman   VisitStmt(D);
227480c2289aSAlexander Musman   VisitOMPExecutableDirective(D);
227580c2289aSAlexander Musman   Code = serialization::STMT_OMP_MASTER_DIRECTIVE;
227680c2289aSAlexander Musman }
227780c2289aSAlexander Musman 
VisitOMPCriticalDirective(OMPCriticalDirective * D)2278d9ed09f7SAlexander Musman void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
2279d9ed09f7SAlexander Musman   VisitStmt(D);
2280d9ed09f7SAlexander Musman   VisitOMPExecutableDirective(D);
2281290d8019SRichard Smith   Record.AddDeclarationNameInfo(D->getDirectiveName());
2282d9ed09f7SAlexander Musman   Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;
2283d9ed09f7SAlexander Musman }
2284d9ed09f7SAlexander Musman 
VisitOMPParallelForDirective(OMPParallelForDirective * D)22854acb859fSAlexey Bataev void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
22863aaab669SAlexander Musman   VisitOMPLoopDirective(D);
22870af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
22884acb859fSAlexey Bataev   Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
22894acb859fSAlexey Bataev }
22904acb859fSAlexey Bataev 
VisitOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)2291e4e893bbSAlexander Musman void ASTStmtWriter::VisitOMPParallelForSimdDirective(
2292e4e893bbSAlexander Musman     OMPParallelForSimdDirective *D) {
2293e4e893bbSAlexander Musman   VisitOMPLoopDirective(D);
2294e4e893bbSAlexander Musman   Code = serialization::STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE;
2295e4e893bbSAlexander Musman }
2296e4e893bbSAlexander Musman 
VisitOMPParallelMasterDirective(OMPParallelMasterDirective * D)229747d6094dScchen void ASTStmtWriter::VisitOMPParallelMasterDirective(
229847d6094dScchen     OMPParallelMasterDirective *D) {
229947d6094dScchen   VisitStmt(D);
230047d6094dScchen   VisitOMPExecutableDirective(D);
230147d6094dScchen   Code = serialization::STMT_OMP_PARALLEL_MASTER_DIRECTIVE;
230247d6094dScchen }
230347d6094dScchen 
VisitOMPParallelMaskedDirective(OMPParallelMaskedDirective * D)2304bb83f8e7SJennifer Yu void ASTStmtWriter::VisitOMPParallelMaskedDirective(
2305bb83f8e7SJennifer Yu     OMPParallelMaskedDirective *D) {
2306bb83f8e7SJennifer Yu   VisitStmt(D);
2307bb83f8e7SJennifer Yu   VisitOMPExecutableDirective(D);
2308bb83f8e7SJennifer Yu   Code = serialization::STMT_OMP_PARALLEL_MASKED_DIRECTIVE;
2309bb83f8e7SJennifer Yu }
2310bb83f8e7SJennifer Yu 
VisitOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)231184d0b3efSAlexey Bataev void ASTStmtWriter::VisitOMPParallelSectionsDirective(
231284d0b3efSAlexey Bataev     OMPParallelSectionsDirective *D) {
231384d0b3efSAlexey Bataev   VisitStmt(D);
231484d0b3efSAlexey Bataev   VisitOMPExecutableDirective(D);
23150af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
231684d0b3efSAlexey Bataev   Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
231784d0b3efSAlexey Bataev }
231884d0b3efSAlexey Bataev 
VisitOMPTaskDirective(OMPTaskDirective * D)23199c2e8ee7SAlexey Bataev void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {
23209c2e8ee7SAlexey Bataev   VisitStmt(D);
23219c2e8ee7SAlexey Bataev   VisitOMPExecutableDirective(D);
23220af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
23239c2e8ee7SAlexey Bataev   Code = serialization::STMT_OMP_TASK_DIRECTIVE;
23249c2e8ee7SAlexey Bataev }
23259c2e8ee7SAlexey Bataev 
VisitOMPAtomicDirective(OMPAtomicDirective * D)23260162e459SAlexey Bataev void ASTStmtWriter::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
23270162e459SAlexey Bataev   VisitStmt(D);
23280162e459SAlexey Bataev   VisitOMPExecutableDirective(D);
23290af7835eSAlexey Bataev   Record.writeBool(D->isXLHSInRHSPart());
23300af7835eSAlexey Bataev   Record.writeBool(D->isPostfixUpdate());
2331c4a90db7SShilei Tian   Record.writeBool(D->isFailOnly());
23320162e459SAlexey Bataev   Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;
23330162e459SAlexey Bataev }
23340162e459SAlexey Bataev 
VisitOMPTargetDirective(OMPTargetDirective * D)23350bd520b7SAlexey Bataev void ASTStmtWriter::VisitOMPTargetDirective(OMPTargetDirective *D) {
23360bd520b7SAlexey Bataev   VisitStmt(D);
23370bd520b7SAlexey Bataev   VisitOMPExecutableDirective(D);
23380bd520b7SAlexey Bataev   Code = serialization::STMT_OMP_TARGET_DIRECTIVE;
23390bd520b7SAlexey Bataev }
23400bd520b7SAlexey Bataev 
VisitOMPTargetDataDirective(OMPTargetDataDirective * D)234165f367fcSMichael Wong void ASTStmtWriter::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
234265f367fcSMichael Wong   VisitStmt(D);
234365f367fcSMichael Wong   VisitOMPExecutableDirective(D);
234465f367fcSMichael Wong   Code = serialization::STMT_OMP_TARGET_DATA_DIRECTIVE;
234565f367fcSMichael Wong }
234665f367fcSMichael Wong 
VisitOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)2347df67fc46SSamuel Antao void ASTStmtWriter::VisitOMPTargetEnterDataDirective(
2348df67fc46SSamuel Antao     OMPTargetEnterDataDirective *D) {
2349df67fc46SSamuel Antao   VisitStmt(D);
2350df67fc46SSamuel Antao   VisitOMPExecutableDirective(D);
2351df67fc46SSamuel Antao   Code = serialization::STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE;
2352df67fc46SSamuel Antao }
2353df67fc46SSamuel Antao 
VisitOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)235472590760SSamuel Antao void ASTStmtWriter::VisitOMPTargetExitDataDirective(
235572590760SSamuel Antao     OMPTargetExitDataDirective *D) {
235672590760SSamuel Antao   VisitStmt(D);
235772590760SSamuel Antao   VisitOMPExecutableDirective(D);
235872590760SSamuel Antao   Code = serialization::STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE;
235972590760SSamuel Antao }
236072590760SSamuel Antao 
VisitOMPTargetParallelDirective(OMPTargetParallelDirective * D)2361e955b3d3SArpith Chacko Jacob void ASTStmtWriter::VisitOMPTargetParallelDirective(
2362e955b3d3SArpith Chacko Jacob     OMPTargetParallelDirective *D) {
2363e955b3d3SArpith Chacko Jacob   VisitStmt(D);
2364e955b3d3SArpith Chacko Jacob   VisitOMPExecutableDirective(D);
2365b737b814SAlexey Bataev   Record.writeBool(D->hasCancel());
2366e955b3d3SArpith Chacko Jacob   Code = serialization::STMT_OMP_TARGET_PARALLEL_DIRECTIVE;
2367e955b3d3SArpith Chacko Jacob }
2368e955b3d3SArpith Chacko Jacob 
VisitOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)236905bebb57SArpith Chacko Jacob void ASTStmtWriter::VisitOMPTargetParallelForDirective(
237005bebb57SArpith Chacko Jacob     OMPTargetParallelForDirective *D) {
237105bebb57SArpith Chacko Jacob   VisitOMPLoopDirective(D);
23720af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
237305bebb57SArpith Chacko Jacob   Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE;
237405bebb57SArpith Chacko Jacob }
237505bebb57SArpith Chacko Jacob 
VisitOMPTaskyieldDirective(OMPTaskyieldDirective * D)237668446b72SAlexey Bataev void ASTStmtWriter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
237768446b72SAlexey Bataev   VisitStmt(D);
237868446b72SAlexey Bataev   VisitOMPExecutableDirective(D);
237968446b72SAlexey Bataev   Code = serialization::STMT_OMP_TASKYIELD_DIRECTIVE;
238068446b72SAlexey Bataev }
238168446b72SAlexey Bataev 
VisitOMPBarrierDirective(OMPBarrierDirective * D)23824d1dfeabSAlexey Bataev void ASTStmtWriter::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
23834d1dfeabSAlexey Bataev   VisitStmt(D);
23844d1dfeabSAlexey Bataev   VisitOMPExecutableDirective(D);
23854d1dfeabSAlexey Bataev   Code = serialization::STMT_OMP_BARRIER_DIRECTIVE;
23864d1dfeabSAlexey Bataev }
23874d1dfeabSAlexey Bataev 
VisitOMPTaskwaitDirective(OMPTaskwaitDirective * D)23882df347adSAlexey Bataev void ASTStmtWriter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
23892df347adSAlexey Bataev   VisitStmt(D);
239080256605SAlexey Bataev   Record.push_back(D->getNumClauses());
23912df347adSAlexey Bataev   VisitOMPExecutableDirective(D);
23922df347adSAlexey Bataev   Code = serialization::STMT_OMP_TASKWAIT_DIRECTIVE;
23932df347adSAlexey Bataev }
23942df347adSAlexey Bataev 
VisitOMPTaskgroupDirective(OMPTaskgroupDirective * D)2395c30dd2daSAlexey Bataev void ASTStmtWriter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
2396c30dd2daSAlexey Bataev   VisitStmt(D);
2397c30dd2daSAlexey Bataev   VisitOMPExecutableDirective(D);
2398c30dd2daSAlexey Bataev   Code = serialization::STMT_OMP_TASKGROUP_DIRECTIVE;
2399c30dd2daSAlexey Bataev }
2400c30dd2daSAlexey Bataev 
VisitOMPFlushDirective(OMPFlushDirective * D)24016125da92SAlexey Bataev void ASTStmtWriter::VisitOMPFlushDirective(OMPFlushDirective *D) {
24026125da92SAlexey Bataev   VisitStmt(D);
24036125da92SAlexey Bataev   VisitOMPExecutableDirective(D);
24046125da92SAlexey Bataev   Code = serialization::STMT_OMP_FLUSH_DIRECTIVE;
24056125da92SAlexey Bataev }
24066125da92SAlexey Bataev 
VisitOMPDepobjDirective(OMPDepobjDirective * D)2407c112e941SAlexey Bataev void ASTStmtWriter::VisitOMPDepobjDirective(OMPDepobjDirective *D) {
2408c112e941SAlexey Bataev   VisitStmt(D);
2409c112e941SAlexey Bataev   VisitOMPExecutableDirective(D);
2410c112e941SAlexey Bataev   Code = serialization::STMT_OMP_DEPOBJ_DIRECTIVE;
2411c112e941SAlexey Bataev }
2412c112e941SAlexey Bataev 
VisitOMPScanDirective(OMPScanDirective * D)2413fcba7c35SAlexey Bataev void ASTStmtWriter::VisitOMPScanDirective(OMPScanDirective *D) {
2414fcba7c35SAlexey Bataev   VisitStmt(D);
2415fcba7c35SAlexey Bataev   VisitOMPExecutableDirective(D);
2416fcba7c35SAlexey Bataev   Code = serialization::STMT_OMP_SCAN_DIRECTIVE;
2417fcba7c35SAlexey Bataev }
2418fcba7c35SAlexey Bataev 
VisitOMPOrderedDirective(OMPOrderedDirective * D)24199fb6e647SAlexey Bataev void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
24209fb6e647SAlexey Bataev   VisitStmt(D);
24219fb6e647SAlexey Bataev   VisitOMPExecutableDirective(D);
24229fb6e647SAlexey Bataev   Code = serialization::STMT_OMP_ORDERED_DIRECTIVE;
24239fb6e647SAlexey Bataev }
24249fb6e647SAlexey Bataev 
VisitOMPTeamsDirective(OMPTeamsDirective * D)242513314bf5SAlexey Bataev void ASTStmtWriter::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
242613314bf5SAlexey Bataev   VisitStmt(D);
242713314bf5SAlexey Bataev   VisitOMPExecutableDirective(D);
242813314bf5SAlexey Bataev   Code = serialization::STMT_OMP_TEAMS_DIRECTIVE;
242913314bf5SAlexey Bataev }
243013314bf5SAlexey Bataev 
VisitOMPCancellationPointDirective(OMPCancellationPointDirective * D)24316d4ed058SAlexey Bataev void ASTStmtWriter::VisitOMPCancellationPointDirective(
24326d4ed058SAlexey Bataev     OMPCancellationPointDirective *D) {
24336d4ed058SAlexey Bataev   VisitStmt(D);
24346d4ed058SAlexey Bataev   VisitOMPExecutableDirective(D);
24350af7835eSAlexey Bataev   Record.writeEnum(D->getCancelRegion());
24366d4ed058SAlexey Bataev   Code = serialization::STMT_OMP_CANCELLATION_POINT_DIRECTIVE;
24376d4ed058SAlexey Bataev }
24386d4ed058SAlexey Bataev 
VisitOMPCancelDirective(OMPCancelDirective * D)243980909878SAlexey Bataev void ASTStmtWriter::VisitOMPCancelDirective(OMPCancelDirective *D) {
244080909878SAlexey Bataev   VisitStmt(D);
244180909878SAlexey Bataev   VisitOMPExecutableDirective(D);
24420af7835eSAlexey Bataev   Record.writeEnum(D->getCancelRegion());
244380909878SAlexey Bataev   Code = serialization::STMT_OMP_CANCEL_DIRECTIVE;
244480909878SAlexey Bataev }
244580909878SAlexey Bataev 
VisitOMPTaskLoopDirective(OMPTaskLoopDirective * D)244649f6e78dSAlexey Bataev void ASTStmtWriter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
244749f6e78dSAlexey Bataev   VisitOMPLoopDirective(D);
24480af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
244949f6e78dSAlexey Bataev   Code = serialization::STMT_OMP_TASKLOOP_DIRECTIVE;
245049f6e78dSAlexey Bataev }
245149f6e78dSAlexey Bataev 
VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)24520a6ed84aSAlexey Bataev void ASTStmtWriter::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
24530a6ed84aSAlexey Bataev   VisitOMPLoopDirective(D);
24540a6ed84aSAlexey Bataev   Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;
24550a6ed84aSAlexey Bataev }
24560a6ed84aSAlexey Bataev 
VisitOMPMasterTaskLoopDirective(OMPMasterTaskLoopDirective * D)245760e51c48SAlexey Bataev void ASTStmtWriter::VisitOMPMasterTaskLoopDirective(
245860e51c48SAlexey Bataev     OMPMasterTaskLoopDirective *D) {
245960e51c48SAlexey Bataev   VisitOMPLoopDirective(D);
24600af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
246160e51c48SAlexey Bataev   Code = serialization::STMT_OMP_MASTER_TASKLOOP_DIRECTIVE;
246260e51c48SAlexey Bataev }
246360e51c48SAlexey Bataev 
VisitOMPMaskedTaskLoopDirective(OMPMaskedTaskLoopDirective * D)246442bb88e2SFazlay Rabbi void ASTStmtWriter::VisitOMPMaskedTaskLoopDirective(
246542bb88e2SFazlay Rabbi     OMPMaskedTaskLoopDirective *D) {
246642bb88e2SFazlay Rabbi   VisitOMPLoopDirective(D);
246742bb88e2SFazlay Rabbi   Record.writeBool(D->hasCancel());
246842bb88e2SFazlay Rabbi   Code = serialization::STMT_OMP_MASKED_TASKLOOP_DIRECTIVE;
246942bb88e2SFazlay Rabbi }
247042bb88e2SFazlay Rabbi 
VisitOMPMasterTaskLoopSimdDirective(OMPMasterTaskLoopSimdDirective * D)2471b8552abfSAlexey Bataev void ASTStmtWriter::VisitOMPMasterTaskLoopSimdDirective(
2472b8552abfSAlexey Bataev     OMPMasterTaskLoopSimdDirective *D) {
2473b8552abfSAlexey Bataev   VisitOMPLoopDirective(D);
2474b8552abfSAlexey Bataev   Code = serialization::STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE;
2475b8552abfSAlexey Bataev }
2476b8552abfSAlexey Bataev 
VisitOMPMaskedTaskLoopSimdDirective(OMPMaskedTaskLoopSimdDirective * D)247773e5d7bdSFazlay Rabbi void ASTStmtWriter::VisitOMPMaskedTaskLoopSimdDirective(
247873e5d7bdSFazlay Rabbi     OMPMaskedTaskLoopSimdDirective *D) {
247973e5d7bdSFazlay Rabbi   VisitOMPLoopDirective(D);
248073e5d7bdSFazlay Rabbi   Code = serialization::STMT_OMP_MASKED_TASKLOOP_SIMD_DIRECTIVE;
248173e5d7bdSFazlay Rabbi }
248273e5d7bdSFazlay Rabbi 
VisitOMPParallelMasterTaskLoopDirective(OMPParallelMasterTaskLoopDirective * D)24835bbceadfSAlexey Bataev void ASTStmtWriter::VisitOMPParallelMasterTaskLoopDirective(
24845bbceadfSAlexey Bataev     OMPParallelMasterTaskLoopDirective *D) {
24855bbceadfSAlexey Bataev   VisitOMPLoopDirective(D);
24860af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
24875bbceadfSAlexey Bataev   Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE;
24885bbceadfSAlexey Bataev }
24895bbceadfSAlexey Bataev 
VisitOMPParallelMaskedTaskLoopDirective(OMPParallelMaskedTaskLoopDirective * D)2490d64ba896SFazlay Rabbi void ASTStmtWriter::VisitOMPParallelMaskedTaskLoopDirective(
2491d64ba896SFazlay Rabbi     OMPParallelMaskedTaskLoopDirective *D) {
2492d64ba896SFazlay Rabbi   VisitOMPLoopDirective(D);
2493d64ba896SFazlay Rabbi   Record.writeBool(D->hasCancel());
2494d64ba896SFazlay Rabbi   Code = serialization::STMT_OMP_PARALLEL_MASKED_TASKLOOP_DIRECTIVE;
2495d64ba896SFazlay Rabbi }
2496d64ba896SFazlay Rabbi 
VisitOMPParallelMasterTaskLoopSimdDirective(OMPParallelMasterTaskLoopSimdDirective * D)249714a388f4SAlexey Bataev void ASTStmtWriter::VisitOMPParallelMasterTaskLoopSimdDirective(
249814a388f4SAlexey Bataev     OMPParallelMasterTaskLoopSimdDirective *D) {
249914a388f4SAlexey Bataev   VisitOMPLoopDirective(D);
250014a388f4SAlexey Bataev   Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE;
250114a388f4SAlexey Bataev }
250214a388f4SAlexey Bataev 
VisitOMPParallelMaskedTaskLoopSimdDirective(OMPParallelMaskedTaskLoopSimdDirective * D)250338bcd483SFazlay Rabbi void ASTStmtWriter::VisitOMPParallelMaskedTaskLoopSimdDirective(
250438bcd483SFazlay Rabbi     OMPParallelMaskedTaskLoopSimdDirective *D) {
250538bcd483SFazlay Rabbi   VisitOMPLoopDirective(D);
250638bcd483SFazlay Rabbi   Code = serialization::STMT_OMP_PARALLEL_MASKED_TASKLOOP_SIMD_DIRECTIVE;
250738bcd483SFazlay Rabbi }
250838bcd483SFazlay Rabbi 
VisitOMPDistributeDirective(OMPDistributeDirective * D)25096200a3d0SCarlo Bertolli void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
25106200a3d0SCarlo Bertolli   VisitOMPLoopDirective(D);
25116200a3d0SCarlo Bertolli   Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;
25126200a3d0SCarlo Bertolli }
25136200a3d0SCarlo Bertolli 
VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)2514686c70c3SSamuel Antao void ASTStmtWriter::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2515686c70c3SSamuel Antao   VisitStmt(D);
2516686c70c3SSamuel Antao   VisitOMPExecutableDirective(D);
2517686c70c3SSamuel Antao   Code = serialization::STMT_OMP_TARGET_UPDATE_DIRECTIVE;
2518686c70c3SSamuel Antao }
2519686c70c3SSamuel Antao 
VisitOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)25209925f156SCarlo Bertolli void ASTStmtWriter::VisitOMPDistributeParallelForDirective(
25219925f156SCarlo Bertolli     OMPDistributeParallelForDirective *D) {
25229925f156SCarlo Bertolli   VisitOMPLoopDirective(D);
25230af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
25249925f156SCarlo Bertolli   Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
25259925f156SCarlo Bertolli }
25269925f156SCarlo Bertolli 
VisitOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)25274a39add0SKelvin Li void ASTStmtWriter::VisitOMPDistributeParallelForSimdDirective(
25284a39add0SKelvin Li     OMPDistributeParallelForSimdDirective *D) {
25294a39add0SKelvin Li   VisitOMPLoopDirective(D);
25304a39add0SKelvin Li   Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
25314a39add0SKelvin Li }
25324a39add0SKelvin Li 
VisitOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)2533787f3fccSKelvin Li void ASTStmtWriter::VisitOMPDistributeSimdDirective(
2534787f3fccSKelvin Li     OMPDistributeSimdDirective *D) {
2535787f3fccSKelvin Li   VisitOMPLoopDirective(D);
2536787f3fccSKelvin Li   Code = serialization::STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE;
2537787f3fccSKelvin Li }
2538787f3fccSKelvin Li 
VisitOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)2539a579b919SKelvin Li void ASTStmtWriter::VisitOMPTargetParallelForSimdDirective(
2540a579b919SKelvin Li     OMPTargetParallelForSimdDirective *D) {
2541a579b919SKelvin Li   VisitOMPLoopDirective(D);
2542a579b919SKelvin Li   Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE;
2543a579b919SKelvin Li }
2544a579b919SKelvin Li 
VisitOMPTargetSimdDirective(OMPTargetSimdDirective * D)2545986330c1SKelvin Li void ASTStmtWriter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {
2546986330c1SKelvin Li   VisitOMPLoopDirective(D);
2547986330c1SKelvin Li   Code = serialization::STMT_OMP_TARGET_SIMD_DIRECTIVE;
2548986330c1SKelvin Li }
2549986330c1SKelvin Li 
VisitOMPTeamsDistributeDirective(OMPTeamsDistributeDirective * D)255002532876SKelvin Li void ASTStmtWriter::VisitOMPTeamsDistributeDirective(
255102532876SKelvin Li     OMPTeamsDistributeDirective *D) {
255202532876SKelvin Li   VisitOMPLoopDirective(D);
255302532876SKelvin Li   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE;
255402532876SKelvin Li }
255502532876SKelvin Li 
VisitOMPTeamsDistributeSimdDirective(OMPTeamsDistributeSimdDirective * D)25564e325f77SKelvin Li void ASTStmtWriter::VisitOMPTeamsDistributeSimdDirective(
25574e325f77SKelvin Li     OMPTeamsDistributeSimdDirective *D) {
25584e325f77SKelvin Li   VisitOMPLoopDirective(D);
25594e325f77SKelvin Li   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;
25604e325f77SKelvin Li }
25614e325f77SKelvin Li 
VisitOMPTeamsDistributeParallelForSimdDirective(OMPTeamsDistributeParallelForSimdDirective * D)2562579e41ceSKelvin Li void ASTStmtWriter::VisitOMPTeamsDistributeParallelForSimdDirective(
2563579e41ceSKelvin Li     OMPTeamsDistributeParallelForSimdDirective *D) {
2564579e41ceSKelvin Li   VisitOMPLoopDirective(D);
2565579e41ceSKelvin Li   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
2566579e41ceSKelvin Li }
2567579e41ceSKelvin Li 
VisitOMPTeamsDistributeParallelForDirective(OMPTeamsDistributeParallelForDirective * D)25687ade93f5SKelvin Li void ASTStmtWriter::VisitOMPTeamsDistributeParallelForDirective(
25697ade93f5SKelvin Li     OMPTeamsDistributeParallelForDirective *D) {
25707ade93f5SKelvin Li   VisitOMPLoopDirective(D);
25710af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
25727ade93f5SKelvin Li   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
25737ade93f5SKelvin Li }
25747ade93f5SKelvin Li 
VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective * D)2575bf594a56SKelvin Li void ASTStmtWriter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {
2576bf594a56SKelvin Li   VisitStmt(D);
2577bf594a56SKelvin Li   VisitOMPExecutableDirective(D);
2578bf594a56SKelvin Li   Code = serialization::STMT_OMP_TARGET_TEAMS_DIRECTIVE;
2579bf594a56SKelvin Li }
2580bf594a56SKelvin Li 
VisitOMPTargetTeamsDistributeDirective(OMPTargetTeamsDistributeDirective * D)258183c451e9SKelvin Li void ASTStmtWriter::VisitOMPTargetTeamsDistributeDirective(
258283c451e9SKelvin Li     OMPTargetTeamsDistributeDirective *D) {
258383c451e9SKelvin Li   VisitOMPLoopDirective(D);
258483c451e9SKelvin Li   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE;
258583c451e9SKelvin Li }
258683c451e9SKelvin Li 
VisitOMPTargetTeamsDistributeParallelForDirective(OMPTargetTeamsDistributeParallelForDirective * D)258780e8f562SKelvin Li void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForDirective(
258880e8f562SKelvin Li     OMPTargetTeamsDistributeParallelForDirective *D) {
258980e8f562SKelvin Li   VisitOMPLoopDirective(D);
25900af7835eSAlexey Bataev   Record.writeBool(D->hasCancel());
259180e8f562SKelvin Li   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
259280e8f562SKelvin Li }
259380e8f562SKelvin Li 
VisitOMPTargetTeamsDistributeParallelForSimdDirective(OMPTargetTeamsDistributeParallelForSimdDirective * D)25941851df56SKelvin Li void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
25951851df56SKelvin Li     OMPTargetTeamsDistributeParallelForSimdDirective *D) {
25961851df56SKelvin Li   VisitOMPLoopDirective(D);
25971851df56SKelvin Li   Code = serialization::
25981851df56SKelvin Li       STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
25991851df56SKelvin Li }
26001851df56SKelvin Li 
VisitOMPTargetTeamsDistributeSimdDirective(OMPTargetTeamsDistributeSimdDirective * D)2601da681187SKelvin Li void ASTStmtWriter::VisitOMPTargetTeamsDistributeSimdDirective(
2602da681187SKelvin Li     OMPTargetTeamsDistributeSimdDirective *D) {
2603da681187SKelvin Li   VisitOMPLoopDirective(D);
2604da681187SKelvin Li   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;
2605da681187SKelvin Li }
2606da681187SKelvin Li 
VisitOMPInteropDirective(OMPInteropDirective * D)2607410f09afSMike Rice void ASTStmtWriter::VisitOMPInteropDirective(OMPInteropDirective *D) {
2608410f09afSMike Rice   VisitStmt(D);
2609410f09afSMike Rice   VisitOMPExecutableDirective(D);
2610410f09afSMike Rice   Code = serialization::STMT_OMP_INTEROP_DIRECTIVE;
2611410f09afSMike Rice }
2612410f09afSMike Rice 
VisitOMPDispatchDirective(OMPDispatchDirective * D)2613b7899ba0SMike Rice void ASTStmtWriter::VisitOMPDispatchDirective(OMPDispatchDirective *D) {
2614b7899ba0SMike Rice   VisitStmt(D);
2615b7899ba0SMike Rice   VisitOMPExecutableDirective(D);
2616b7899ba0SMike Rice   Record.AddSourceLocation(D->getTargetCallLoc());
2617b7899ba0SMike Rice   Code = serialization::STMT_OMP_DISPATCH_DIRECTIVE;
2618b7899ba0SMike Rice }
2619b7899ba0SMike Rice 
VisitOMPMaskedDirective(OMPMaskedDirective * D)26201a43fd27Scchen void ASTStmtWriter::VisitOMPMaskedDirective(OMPMaskedDirective *D) {
26211a43fd27Scchen   VisitStmt(D);
26221a43fd27Scchen   VisitOMPExecutableDirective(D);
26231a43fd27Scchen   Code = serialization::STMT_OMP_MASKED_DIRECTIVE;
26241a43fd27Scchen }
26251a43fd27Scchen 
VisitOMPGenericLoopDirective(OMPGenericLoopDirective * D)26266f9c2516SMike Rice void ASTStmtWriter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {
26276f9c2516SMike Rice   VisitOMPLoopDirective(D);
26286f9c2516SMike Rice   Code = serialization::STMT_OMP_GENERIC_LOOP_DIRECTIVE;
26296f9c2516SMike Rice }
26306f9c2516SMike Rice 
VisitOMPTeamsGenericLoopDirective(OMPTeamsGenericLoopDirective * D)263179f661edSMike Rice void ASTStmtWriter::VisitOMPTeamsGenericLoopDirective(
263279f661edSMike Rice     OMPTeamsGenericLoopDirective *D) {
263379f661edSMike Rice   VisitOMPLoopDirective(D);
263479f661edSMike Rice   Code = serialization::STMT_OMP_TEAMS_GENERIC_LOOP_DIRECTIVE;
263579f661edSMike Rice }
263679f661edSMike Rice 
VisitOMPTargetTeamsGenericLoopDirective(OMPTargetTeamsGenericLoopDirective * D)26376bd8dc91SMike Rice void ASTStmtWriter::VisitOMPTargetTeamsGenericLoopDirective(
26386bd8dc91SMike Rice     OMPTargetTeamsGenericLoopDirective *D) {
26396bd8dc91SMike Rice   VisitOMPLoopDirective(D);
26406bd8dc91SMike Rice   Code = serialization::STMT_OMP_TARGET_TEAMS_GENERIC_LOOP_DIRECTIVE;
26416bd8dc91SMike Rice }
26426bd8dc91SMike Rice 
VisitOMPParallelGenericLoopDirective(OMPParallelGenericLoopDirective * D)26432cedaee6SMike Rice void ASTStmtWriter::VisitOMPParallelGenericLoopDirective(
26442cedaee6SMike Rice     OMPParallelGenericLoopDirective *D) {
26452cedaee6SMike Rice   VisitOMPLoopDirective(D);
26462cedaee6SMike Rice   Code = serialization::STMT_OMP_PARALLEL_GENERIC_LOOP_DIRECTIVE;
26472cedaee6SMike Rice }
26482cedaee6SMike Rice 
VisitOMPTargetParallelGenericLoopDirective(OMPTargetParallelGenericLoopDirective * D)2649f82ec553SMike Rice void ASTStmtWriter::VisitOMPTargetParallelGenericLoopDirective(
2650f82ec553SMike Rice     OMPTargetParallelGenericLoopDirective *D) {
2651f82ec553SMike Rice   VisitOMPLoopDirective(D);
2652f82ec553SMike Rice   Code = serialization::STMT_OMP_TARGET_PARALLEL_GENERIC_LOOP_DIRECTIVE;
2653f82ec553SMike Rice }
2654f82ec553SMike Rice 
26555ec3eb11SAlexey Bataev //===----------------------------------------------------------------------===//
2656d6522cfcSSebastian Redl // ASTWriter Implementation
2657d6522cfcSSebastian Redl //===----------------------------------------------------------------------===//
2658d6522cfcSSebastian Redl 
RecordSwitchCaseID(SwitchCase * S)2659d6522cfcSSebastian Redl unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
2660d6522cfcSSebastian Redl   assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
2661d6522cfcSSebastian Redl          "SwitchCase recorded twice");
2662d6522cfcSSebastian Redl   unsigned NextID = SwitchCaseIDs.size();
2663d6522cfcSSebastian Redl   SwitchCaseIDs[S] = NextID;
2664d6522cfcSSebastian Redl   return NextID;
2665d6522cfcSSebastian Redl }
2666d6522cfcSSebastian Redl 
getSwitchCaseID(SwitchCase * S)2667d6522cfcSSebastian Redl unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
2668d6522cfcSSebastian Redl   assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
2669d6522cfcSSebastian Redl          "SwitchCase hasn't been seen yet");
2670d6522cfcSSebastian Redl   return SwitchCaseIDs[S];
2671d6522cfcSSebastian Redl }
2672d6522cfcSSebastian Redl 
ClearSwitchCaseIDs()2673d9f526fcSArgyrios Kyrtzidis void ASTWriter::ClearSwitchCaseIDs() {
2674d9f526fcSArgyrios Kyrtzidis   SwitchCaseIDs.clear();
2675d9f526fcSArgyrios Kyrtzidis }
2676d9f526fcSArgyrios Kyrtzidis 
26779fc8faf9SAdrian Prantl /// Write the given substatement or subexpression to the
2678d6522cfcSSebastian Redl /// bitstream.
WriteSubStmt(Stmt * S)2679f50422aaSRichard Smith void ASTWriter::WriteSubStmt(Stmt *S) {
2680d6522cfcSSebastian Redl   RecordData Record;
2681d6522cfcSSebastian Redl   ASTStmtWriter Writer(*this, Record);
2682d6522cfcSSebastian Redl   ++NumStatements;
2683d6522cfcSSebastian Redl 
2684d6522cfcSSebastian Redl   if (!S) {
2685539c5061SSebastian Redl     Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
2686d6522cfcSSebastian Redl     return;
2687d6522cfcSSebastian Redl   }
2688d6522cfcSSebastian Redl 
26896a59897dSArgyrios Kyrtzidis   llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
26906a59897dSArgyrios Kyrtzidis   if (I != SubStmtEntries.end()) {
26916a59897dSArgyrios Kyrtzidis     Record.push_back(I->second);
26926a59897dSArgyrios Kyrtzidis     Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
26936a59897dSArgyrios Kyrtzidis     return;
26946a59897dSArgyrios Kyrtzidis   }
26956a59897dSArgyrios Kyrtzidis 
26966a59897dSArgyrios Kyrtzidis #ifndef NDEBUG
26976a59897dSArgyrios Kyrtzidis   assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
26986a59897dSArgyrios Kyrtzidis 
26996a59897dSArgyrios Kyrtzidis   struct ParentStmtInserterRAII {
27006a59897dSArgyrios Kyrtzidis     Stmt *S;
27016a59897dSArgyrios Kyrtzidis     llvm::DenseSet<Stmt *> &ParentStmts;
27026a59897dSArgyrios Kyrtzidis 
27036a59897dSArgyrios Kyrtzidis     ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
27046a59897dSArgyrios Kyrtzidis       : S(S), ParentStmts(ParentStmts) {
27056a59897dSArgyrios Kyrtzidis       ParentStmts.insert(S);
27066a59897dSArgyrios Kyrtzidis     }
27076a59897dSArgyrios Kyrtzidis     ~ParentStmtInserterRAII() {
27086a59897dSArgyrios Kyrtzidis       ParentStmts.erase(S);
27096a59897dSArgyrios Kyrtzidis     }
27106a59897dSArgyrios Kyrtzidis   };
27116a59897dSArgyrios Kyrtzidis 
27126a59897dSArgyrios Kyrtzidis   ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
27136a59897dSArgyrios Kyrtzidis #endif
27146a59897dSArgyrios Kyrtzidis 
2715d6522cfcSSebastian Redl   Writer.Visit(S);
2716d6522cfcSSebastian Redl 
2717b41ddae3SRichard Smith   uint64_t Offset = Writer.Emit();
2718b41ddae3SRichard Smith   SubStmtEntries[S] = Offset;
2719d6522cfcSSebastian Redl }
2720d6522cfcSSebastian Redl 
27219fc8faf9SAdrian Prantl /// Flush all of the statements that have been added to the
2722d6522cfcSSebastian Redl /// queue via AddStmt().
FlushStmts()2723290d8019SRichard Smith void ASTRecordWriter::FlushStmts() {
2724a5acaa3cSDaniel Dunbar   // We expect to be the only consumer of the two temporary statement maps,
2725a5acaa3cSDaniel Dunbar   // assert that they are empty.
2726290d8019SRichard Smith   assert(Writer->SubStmtEntries.empty() && "unexpected entries in sub-stmt map");
2727290d8019SRichard Smith   assert(Writer->ParentStmts.empty() && "unexpected entries in parent stmt map");
27286a59897dSArgyrios Kyrtzidis 
2729d6522cfcSSebastian Redl   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
2730f50422aaSRichard Smith     Writer->WriteSubStmt(StmtsToEmit[I]);
2731d6522cfcSSebastian Redl 
2732290d8019SRichard Smith     assert(N == StmtsToEmit.size() && "record modified while being written!");
2733d6522cfcSSebastian Redl 
2734d6522cfcSSebastian Redl     // Note that we are at the end of a full expression. Any
2735d6522cfcSSebastian Redl     // expression records that follow this one are part of a different
2736d6522cfcSSebastian Redl     // expression.
2737290d8019SRichard Smith     Writer->Stream.EmitRecord(serialization::STMT_STOP, ArrayRef<uint32_t>());
27386a59897dSArgyrios Kyrtzidis 
2739290d8019SRichard Smith     Writer->SubStmtEntries.clear();
2740290d8019SRichard Smith     Writer->ParentStmts.clear();
2741290d8019SRichard Smith   }
2742290d8019SRichard Smith 
2743290d8019SRichard Smith   StmtsToEmit.clear();
2744290d8019SRichard Smith }
2745290d8019SRichard Smith 
FlushSubStmts()2746290d8019SRichard Smith void ASTRecordWriter::FlushSubStmts() {
2747290d8019SRichard Smith   // For a nested statement, write out the substatements in reverse order (so
2748290d8019SRichard Smith   // that a simple stack machine can be used when loading), and don't emit a
2749290d8019SRichard Smith   // STMT_STOP after each one.
2750290d8019SRichard Smith   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
2751f50422aaSRichard Smith     Writer->WriteSubStmt(StmtsToEmit[N - I - 1]);
2752290d8019SRichard Smith     assert(N == StmtsToEmit.size() && "record modified while being written!");
2753d6522cfcSSebastian Redl   }
2754d6522cfcSSebastian Redl 
2755d6522cfcSSebastian Redl   StmtsToEmit.clear();
2756d6522cfcSSebastian Redl }
2757