1*67e74705SXin Li //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li ///
10*67e74705SXin Li /// \file
11*67e74705SXin Li /// \brief Implements serialization for Statements and Expressions.
12*67e74705SXin Li ///
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li
15*67e74705SXin Li #include "clang/Serialization/ASTWriter.h"
16*67e74705SXin Li #include "clang/AST/ASTContext.h"
17*67e74705SXin Li #include "clang/AST/DeclCXX.h"
18*67e74705SXin Li #include "clang/AST/DeclObjC.h"
19*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
20*67e74705SXin Li #include "clang/AST/StmtVisitor.h"
21*67e74705SXin Li #include "clang/Lex/Token.h"
22*67e74705SXin Li #include "llvm/Bitcode/BitstreamWriter.h"
23*67e74705SXin Li using namespace clang;
24*67e74705SXin Li
25*67e74705SXin Li //===----------------------------------------------------------------------===//
26*67e74705SXin Li // Statement/expression serialization
27*67e74705SXin Li //===----------------------------------------------------------------------===//
28*67e74705SXin Li
29*67e74705SXin Li namespace clang {
30*67e74705SXin Li
31*67e74705SXin Li class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
32*67e74705SXin Li ASTWriter &Writer;
33*67e74705SXin Li ASTRecordWriter Record;
34*67e74705SXin Li
35*67e74705SXin Li serialization::StmtCode Code;
36*67e74705SXin Li unsigned AbbrevToUse;
37*67e74705SXin Li
38*67e74705SXin Li public:
ASTStmtWriter(ASTWriter & Writer,ASTWriter::RecordData & Record)39*67e74705SXin Li ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
40*67e74705SXin Li : Writer(Writer), Record(Writer, Record),
41*67e74705SXin Li Code(serialization::STMT_NULL_PTR), AbbrevToUse(0) {}
42*67e74705SXin Li
43*67e74705SXin Li ASTStmtWriter(const ASTStmtWriter&) = delete;
44*67e74705SXin Li
Emit()45*67e74705SXin Li uint64_t Emit() {
46*67e74705SXin Li assert(Code != serialization::STMT_NULL_PTR &&
47*67e74705SXin Li "unhandled sub-statement writing AST file");
48*67e74705SXin Li return Record.EmitStmt(Code, AbbrevToUse);
49*67e74705SXin Li }
50*67e74705SXin Li
51*67e74705SXin Li void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &ArgInfo,
52*67e74705SXin Li const TemplateArgumentLoc *Args);
53*67e74705SXin Li
54*67e74705SXin Li void VisitStmt(Stmt *S);
55*67e74705SXin Li #define STMT(Type, Base) \
56*67e74705SXin Li void Visit##Type(Type *);
57*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
58*67e74705SXin Li };
59*67e74705SXin Li }
60*67e74705SXin Li
AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo & ArgInfo,const TemplateArgumentLoc * Args)61*67e74705SXin Li void ASTStmtWriter::AddTemplateKWAndArgsInfo(
62*67e74705SXin Li const ASTTemplateKWAndArgsInfo &ArgInfo, const TemplateArgumentLoc *Args) {
63*67e74705SXin Li Record.AddSourceLocation(ArgInfo.TemplateKWLoc);
64*67e74705SXin Li Record.AddSourceLocation(ArgInfo.LAngleLoc);
65*67e74705SXin Li Record.AddSourceLocation(ArgInfo.RAngleLoc);
66*67e74705SXin Li for (unsigned i = 0; i != ArgInfo.NumTemplateArgs; ++i)
67*67e74705SXin Li Record.AddTemplateArgumentLoc(Args[i]);
68*67e74705SXin Li }
69*67e74705SXin Li
VisitStmt(Stmt * S)70*67e74705SXin Li void ASTStmtWriter::VisitStmt(Stmt *S) {
71*67e74705SXin Li }
72*67e74705SXin Li
VisitNullStmt(NullStmt * S)73*67e74705SXin Li void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
74*67e74705SXin Li VisitStmt(S);
75*67e74705SXin Li Record.AddSourceLocation(S->getSemiLoc());
76*67e74705SXin Li Record.push_back(S->HasLeadingEmptyMacro);
77*67e74705SXin Li Code = serialization::STMT_NULL;
78*67e74705SXin Li }
79*67e74705SXin Li
VisitCompoundStmt(CompoundStmt * S)80*67e74705SXin Li void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
81*67e74705SXin Li VisitStmt(S);
82*67e74705SXin Li Record.push_back(S->size());
83*67e74705SXin Li for (auto *CS : S->body())
84*67e74705SXin Li Record.AddStmt(CS);
85*67e74705SXin Li Record.AddSourceLocation(S->getLBracLoc());
86*67e74705SXin Li Record.AddSourceLocation(S->getRBracLoc());
87*67e74705SXin Li Code = serialization::STMT_COMPOUND;
88*67e74705SXin Li }
89*67e74705SXin Li
VisitSwitchCase(SwitchCase * S)90*67e74705SXin Li void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
91*67e74705SXin Li VisitStmt(S);
92*67e74705SXin Li Record.push_back(Writer.getSwitchCaseID(S));
93*67e74705SXin Li Record.AddSourceLocation(S->getKeywordLoc());
94*67e74705SXin Li Record.AddSourceLocation(S->getColonLoc());
95*67e74705SXin Li }
96*67e74705SXin Li
VisitCaseStmt(CaseStmt * S)97*67e74705SXin Li void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
98*67e74705SXin Li VisitSwitchCase(S);
99*67e74705SXin Li Record.AddStmt(S->getLHS());
100*67e74705SXin Li Record.AddStmt(S->getRHS());
101*67e74705SXin Li Record.AddStmt(S->getSubStmt());
102*67e74705SXin Li Record.AddSourceLocation(S->getEllipsisLoc());
103*67e74705SXin Li Code = serialization::STMT_CASE;
104*67e74705SXin Li }
105*67e74705SXin Li
VisitDefaultStmt(DefaultStmt * S)106*67e74705SXin Li void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
107*67e74705SXin Li VisitSwitchCase(S);
108*67e74705SXin Li Record.AddStmt(S->getSubStmt());
109*67e74705SXin Li Code = serialization::STMT_DEFAULT;
110*67e74705SXin Li }
111*67e74705SXin Li
VisitLabelStmt(LabelStmt * S)112*67e74705SXin Li void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
113*67e74705SXin Li VisitStmt(S);
114*67e74705SXin Li Record.AddDeclRef(S->getDecl());
115*67e74705SXin Li Record.AddStmt(S->getSubStmt());
116*67e74705SXin Li Record.AddSourceLocation(S->getIdentLoc());
117*67e74705SXin Li Code = serialization::STMT_LABEL;
118*67e74705SXin Li }
119*67e74705SXin Li
VisitAttributedStmt(AttributedStmt * S)120*67e74705SXin Li void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
121*67e74705SXin Li VisitStmt(S);
122*67e74705SXin Li Record.push_back(S->getAttrs().size());
123*67e74705SXin Li Record.AddAttributes(S->getAttrs());
124*67e74705SXin Li Record.AddStmt(S->getSubStmt());
125*67e74705SXin Li Record.AddSourceLocation(S->getAttrLoc());
126*67e74705SXin Li Code = serialization::STMT_ATTRIBUTED;
127*67e74705SXin Li }
128*67e74705SXin Li
VisitIfStmt(IfStmt * S)129*67e74705SXin Li void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
130*67e74705SXin Li VisitStmt(S);
131*67e74705SXin Li Record.push_back(S->isConstexpr());
132*67e74705SXin Li Record.AddStmt(S->getInit());
133*67e74705SXin Li Record.AddDeclRef(S->getConditionVariable());
134*67e74705SXin Li Record.AddStmt(S->getCond());
135*67e74705SXin Li Record.AddStmt(S->getThen());
136*67e74705SXin Li Record.AddStmt(S->getElse());
137*67e74705SXin Li Record.AddSourceLocation(S->getIfLoc());
138*67e74705SXin Li Record.AddSourceLocation(S->getElseLoc());
139*67e74705SXin Li Code = serialization::STMT_IF;
140*67e74705SXin Li }
141*67e74705SXin Li
VisitSwitchStmt(SwitchStmt * S)142*67e74705SXin Li void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
143*67e74705SXin Li VisitStmt(S);
144*67e74705SXin Li Record.AddStmt(S->getInit());
145*67e74705SXin Li Record.AddDeclRef(S->getConditionVariable());
146*67e74705SXin Li Record.AddStmt(S->getCond());
147*67e74705SXin Li Record.AddStmt(S->getBody());
148*67e74705SXin Li Record.AddSourceLocation(S->getSwitchLoc());
149*67e74705SXin Li Record.push_back(S->isAllEnumCasesCovered());
150*67e74705SXin Li for (SwitchCase *SC = S->getSwitchCaseList(); SC;
151*67e74705SXin Li SC = SC->getNextSwitchCase())
152*67e74705SXin Li Record.push_back(Writer.RecordSwitchCaseID(SC));
153*67e74705SXin Li Code = serialization::STMT_SWITCH;
154*67e74705SXin Li }
155*67e74705SXin Li
VisitWhileStmt(WhileStmt * S)156*67e74705SXin Li void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
157*67e74705SXin Li VisitStmt(S);
158*67e74705SXin Li Record.AddDeclRef(S->getConditionVariable());
159*67e74705SXin Li Record.AddStmt(S->getCond());
160*67e74705SXin Li Record.AddStmt(S->getBody());
161*67e74705SXin Li Record.AddSourceLocation(S->getWhileLoc());
162*67e74705SXin Li Code = serialization::STMT_WHILE;
163*67e74705SXin Li }
164*67e74705SXin Li
VisitDoStmt(DoStmt * S)165*67e74705SXin Li void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
166*67e74705SXin Li VisitStmt(S);
167*67e74705SXin Li Record.AddStmt(S->getCond());
168*67e74705SXin Li Record.AddStmt(S->getBody());
169*67e74705SXin Li Record.AddSourceLocation(S->getDoLoc());
170*67e74705SXin Li Record.AddSourceLocation(S->getWhileLoc());
171*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
172*67e74705SXin Li Code = serialization::STMT_DO;
173*67e74705SXin Li }
174*67e74705SXin Li
VisitForStmt(ForStmt * S)175*67e74705SXin Li void ASTStmtWriter::VisitForStmt(ForStmt *S) {
176*67e74705SXin Li VisitStmt(S);
177*67e74705SXin Li Record.AddStmt(S->getInit());
178*67e74705SXin Li Record.AddStmt(S->getCond());
179*67e74705SXin Li Record.AddDeclRef(S->getConditionVariable());
180*67e74705SXin Li Record.AddStmt(S->getInc());
181*67e74705SXin Li Record.AddStmt(S->getBody());
182*67e74705SXin Li Record.AddSourceLocation(S->getForLoc());
183*67e74705SXin Li Record.AddSourceLocation(S->getLParenLoc());
184*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
185*67e74705SXin Li Code = serialization::STMT_FOR;
186*67e74705SXin Li }
187*67e74705SXin Li
VisitGotoStmt(GotoStmt * S)188*67e74705SXin Li void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
189*67e74705SXin Li VisitStmt(S);
190*67e74705SXin Li Record.AddDeclRef(S->getLabel());
191*67e74705SXin Li Record.AddSourceLocation(S->getGotoLoc());
192*67e74705SXin Li Record.AddSourceLocation(S->getLabelLoc());
193*67e74705SXin Li Code = serialization::STMT_GOTO;
194*67e74705SXin Li }
195*67e74705SXin Li
VisitIndirectGotoStmt(IndirectGotoStmt * S)196*67e74705SXin Li void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
197*67e74705SXin Li VisitStmt(S);
198*67e74705SXin Li Record.AddSourceLocation(S->getGotoLoc());
199*67e74705SXin Li Record.AddSourceLocation(S->getStarLoc());
200*67e74705SXin Li Record.AddStmt(S->getTarget());
201*67e74705SXin Li Code = serialization::STMT_INDIRECT_GOTO;
202*67e74705SXin Li }
203*67e74705SXin Li
VisitContinueStmt(ContinueStmt * S)204*67e74705SXin Li void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
205*67e74705SXin Li VisitStmt(S);
206*67e74705SXin Li Record.AddSourceLocation(S->getContinueLoc());
207*67e74705SXin Li Code = serialization::STMT_CONTINUE;
208*67e74705SXin Li }
209*67e74705SXin Li
VisitBreakStmt(BreakStmt * S)210*67e74705SXin Li void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
211*67e74705SXin Li VisitStmt(S);
212*67e74705SXin Li Record.AddSourceLocation(S->getBreakLoc());
213*67e74705SXin Li Code = serialization::STMT_BREAK;
214*67e74705SXin Li }
215*67e74705SXin Li
VisitReturnStmt(ReturnStmt * S)216*67e74705SXin Li void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
217*67e74705SXin Li VisitStmt(S);
218*67e74705SXin Li Record.AddStmt(S->getRetValue());
219*67e74705SXin Li Record.AddSourceLocation(S->getReturnLoc());
220*67e74705SXin Li Record.AddDeclRef(S->getNRVOCandidate());
221*67e74705SXin Li Code = serialization::STMT_RETURN;
222*67e74705SXin Li }
223*67e74705SXin Li
VisitDeclStmt(DeclStmt * S)224*67e74705SXin Li void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
225*67e74705SXin Li VisitStmt(S);
226*67e74705SXin Li Record.AddSourceLocation(S->getStartLoc());
227*67e74705SXin Li Record.AddSourceLocation(S->getEndLoc());
228*67e74705SXin Li DeclGroupRef DG = S->getDeclGroup();
229*67e74705SXin Li for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
230*67e74705SXin Li Record.AddDeclRef(*D);
231*67e74705SXin Li Code = serialization::STMT_DECL;
232*67e74705SXin Li }
233*67e74705SXin Li
VisitAsmStmt(AsmStmt * S)234*67e74705SXin Li void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
235*67e74705SXin Li VisitStmt(S);
236*67e74705SXin Li Record.push_back(S->getNumOutputs());
237*67e74705SXin Li Record.push_back(S->getNumInputs());
238*67e74705SXin Li Record.push_back(S->getNumClobbers());
239*67e74705SXin Li Record.AddSourceLocation(S->getAsmLoc());
240*67e74705SXin Li Record.push_back(S->isVolatile());
241*67e74705SXin Li Record.push_back(S->isSimple());
242*67e74705SXin Li }
243*67e74705SXin Li
VisitGCCAsmStmt(GCCAsmStmt * S)244*67e74705SXin Li void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
245*67e74705SXin Li VisitAsmStmt(S);
246*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
247*67e74705SXin Li Record.AddStmt(S->getAsmString());
248*67e74705SXin Li
249*67e74705SXin Li // Outputs
250*67e74705SXin Li for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
251*67e74705SXin Li Record.AddIdentifierRef(S->getOutputIdentifier(I));
252*67e74705SXin Li Record.AddStmt(S->getOutputConstraintLiteral(I));
253*67e74705SXin Li Record.AddStmt(S->getOutputExpr(I));
254*67e74705SXin Li }
255*67e74705SXin Li
256*67e74705SXin Li // Inputs
257*67e74705SXin Li for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
258*67e74705SXin Li Record.AddIdentifierRef(S->getInputIdentifier(I));
259*67e74705SXin Li Record.AddStmt(S->getInputConstraintLiteral(I));
260*67e74705SXin Li Record.AddStmt(S->getInputExpr(I));
261*67e74705SXin Li }
262*67e74705SXin Li
263*67e74705SXin Li // Clobbers
264*67e74705SXin Li for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
265*67e74705SXin Li Record.AddStmt(S->getClobberStringLiteral(I));
266*67e74705SXin Li
267*67e74705SXin Li Code = serialization::STMT_GCCASM;
268*67e74705SXin Li }
269*67e74705SXin Li
VisitMSAsmStmt(MSAsmStmt * S)270*67e74705SXin Li void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
271*67e74705SXin Li VisitAsmStmt(S);
272*67e74705SXin Li Record.AddSourceLocation(S->getLBraceLoc());
273*67e74705SXin Li Record.AddSourceLocation(S->getEndLoc());
274*67e74705SXin Li Record.push_back(S->getNumAsmToks());
275*67e74705SXin Li Record.AddString(S->getAsmString());
276*67e74705SXin Li
277*67e74705SXin Li // Tokens
278*67e74705SXin Li for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {
279*67e74705SXin Li // FIXME: Move this to ASTRecordWriter?
280*67e74705SXin Li Writer.AddToken(S->getAsmToks()[I], Record.getRecordData());
281*67e74705SXin Li }
282*67e74705SXin Li
283*67e74705SXin Li // Clobbers
284*67e74705SXin Li for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {
285*67e74705SXin Li Record.AddString(S->getClobber(I));
286*67e74705SXin Li }
287*67e74705SXin Li
288*67e74705SXin Li // Outputs
289*67e74705SXin Li for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
290*67e74705SXin Li Record.AddStmt(S->getOutputExpr(I));
291*67e74705SXin Li Record.AddString(S->getOutputConstraint(I));
292*67e74705SXin Li }
293*67e74705SXin Li
294*67e74705SXin Li // Inputs
295*67e74705SXin Li for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
296*67e74705SXin Li Record.AddStmt(S->getInputExpr(I));
297*67e74705SXin Li Record.AddString(S->getInputConstraint(I));
298*67e74705SXin Li }
299*67e74705SXin Li
300*67e74705SXin Li Code = serialization::STMT_MSASM;
301*67e74705SXin Li }
302*67e74705SXin Li
VisitCoroutineBodyStmt(CoroutineBodyStmt * S)303*67e74705SXin Li void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
304*67e74705SXin Li // FIXME: Implement coroutine serialization.
305*67e74705SXin Li llvm_unreachable("unimplemented");
306*67e74705SXin Li }
307*67e74705SXin Li
VisitCoreturnStmt(CoreturnStmt * S)308*67e74705SXin Li void ASTStmtWriter::VisitCoreturnStmt(CoreturnStmt *S) {
309*67e74705SXin Li // FIXME: Implement coroutine serialization.
310*67e74705SXin Li llvm_unreachable("unimplemented");
311*67e74705SXin Li }
312*67e74705SXin Li
VisitCoawaitExpr(CoawaitExpr * S)313*67e74705SXin Li void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *S) {
314*67e74705SXin Li // FIXME: Implement coroutine serialization.
315*67e74705SXin Li llvm_unreachable("unimplemented");
316*67e74705SXin Li }
317*67e74705SXin Li
VisitCoyieldExpr(CoyieldExpr * S)318*67e74705SXin Li void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *S) {
319*67e74705SXin Li // FIXME: Implement coroutine serialization.
320*67e74705SXin Li llvm_unreachable("unimplemented");
321*67e74705SXin Li }
322*67e74705SXin Li
VisitCapturedStmt(CapturedStmt * S)323*67e74705SXin Li void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
324*67e74705SXin Li VisitStmt(S);
325*67e74705SXin Li // NumCaptures
326*67e74705SXin Li Record.push_back(std::distance(S->capture_begin(), S->capture_end()));
327*67e74705SXin Li
328*67e74705SXin Li // CapturedDecl and captured region kind
329*67e74705SXin Li Record.AddDeclRef(S->getCapturedDecl());
330*67e74705SXin Li Record.push_back(S->getCapturedRegionKind());
331*67e74705SXin Li
332*67e74705SXin Li Record.AddDeclRef(S->getCapturedRecordDecl());
333*67e74705SXin Li
334*67e74705SXin Li // Capture inits
335*67e74705SXin Li for (auto *I : S->capture_inits())
336*67e74705SXin Li Record.AddStmt(I);
337*67e74705SXin Li
338*67e74705SXin Li // Body
339*67e74705SXin Li Record.AddStmt(S->getCapturedStmt());
340*67e74705SXin Li
341*67e74705SXin Li // Captures
342*67e74705SXin Li for (const auto &I : S->captures()) {
343*67e74705SXin Li if (I.capturesThis() || I.capturesVariableArrayType())
344*67e74705SXin Li Record.AddDeclRef(nullptr);
345*67e74705SXin Li else
346*67e74705SXin Li Record.AddDeclRef(I.getCapturedVar());
347*67e74705SXin Li Record.push_back(I.getCaptureKind());
348*67e74705SXin Li Record.AddSourceLocation(I.getLocation());
349*67e74705SXin Li }
350*67e74705SXin Li
351*67e74705SXin Li Code = serialization::STMT_CAPTURED;
352*67e74705SXin Li }
353*67e74705SXin Li
VisitExpr(Expr * E)354*67e74705SXin Li void ASTStmtWriter::VisitExpr(Expr *E) {
355*67e74705SXin Li VisitStmt(E);
356*67e74705SXin Li Record.AddTypeRef(E->getType());
357*67e74705SXin Li Record.push_back(E->isTypeDependent());
358*67e74705SXin Li Record.push_back(E->isValueDependent());
359*67e74705SXin Li Record.push_back(E->isInstantiationDependent());
360*67e74705SXin Li Record.push_back(E->containsUnexpandedParameterPack());
361*67e74705SXin Li Record.push_back(E->getValueKind());
362*67e74705SXin Li Record.push_back(E->getObjectKind());
363*67e74705SXin Li }
364*67e74705SXin Li
VisitPredefinedExpr(PredefinedExpr * E)365*67e74705SXin Li void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
366*67e74705SXin Li VisitExpr(E);
367*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
368*67e74705SXin Li Record.push_back(E->getIdentType()); // FIXME: stable encoding
369*67e74705SXin Li Record.AddStmt(E->getFunctionName());
370*67e74705SXin Li Code = serialization::EXPR_PREDEFINED;
371*67e74705SXin Li }
372*67e74705SXin Li
VisitDeclRefExpr(DeclRefExpr * E)373*67e74705SXin Li void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
374*67e74705SXin Li VisitExpr(E);
375*67e74705SXin Li
376*67e74705SXin Li Record.push_back(E->hasQualifier());
377*67e74705SXin Li Record.push_back(E->getDecl() != E->getFoundDecl());
378*67e74705SXin Li Record.push_back(E->hasTemplateKWAndArgsInfo());
379*67e74705SXin Li Record.push_back(E->hadMultipleCandidates());
380*67e74705SXin Li Record.push_back(E->refersToEnclosingVariableOrCapture());
381*67e74705SXin Li
382*67e74705SXin Li if (E->hasTemplateKWAndArgsInfo()) {
383*67e74705SXin Li unsigned NumTemplateArgs = E->getNumTemplateArgs();
384*67e74705SXin Li Record.push_back(NumTemplateArgs);
385*67e74705SXin Li }
386*67e74705SXin Li
387*67e74705SXin Li DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
388*67e74705SXin Li
389*67e74705SXin Li if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
390*67e74705SXin Li (E->getDecl() == E->getFoundDecl()) &&
391*67e74705SXin Li nk == DeclarationName::Identifier) {
392*67e74705SXin Li AbbrevToUse = Writer.getDeclRefExprAbbrev();
393*67e74705SXin Li }
394*67e74705SXin Li
395*67e74705SXin Li if (E->hasQualifier())
396*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
397*67e74705SXin Li
398*67e74705SXin Li if (E->getDecl() != E->getFoundDecl())
399*67e74705SXin Li Record.AddDeclRef(E->getFoundDecl());
400*67e74705SXin Li
401*67e74705SXin Li if (E->hasTemplateKWAndArgsInfo())
402*67e74705SXin Li AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
403*67e74705SXin Li E->getTrailingObjects<TemplateArgumentLoc>());
404*67e74705SXin Li
405*67e74705SXin Li Record.AddDeclRef(E->getDecl());
406*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
407*67e74705SXin Li Record.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName());
408*67e74705SXin Li Code = serialization::EXPR_DECL_REF;
409*67e74705SXin Li }
410*67e74705SXin Li
VisitIntegerLiteral(IntegerLiteral * E)411*67e74705SXin Li void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
412*67e74705SXin Li VisitExpr(E);
413*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
414*67e74705SXin Li Record.AddAPInt(E->getValue());
415*67e74705SXin Li
416*67e74705SXin Li if (E->getValue().getBitWidth() == 32) {
417*67e74705SXin Li AbbrevToUse = Writer.getIntegerLiteralAbbrev();
418*67e74705SXin Li }
419*67e74705SXin Li
420*67e74705SXin Li Code = serialization::EXPR_INTEGER_LITERAL;
421*67e74705SXin Li }
422*67e74705SXin Li
VisitFloatingLiteral(FloatingLiteral * E)423*67e74705SXin Li void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
424*67e74705SXin Li VisitExpr(E);
425*67e74705SXin Li Record.push_back(E->getRawSemantics());
426*67e74705SXin Li Record.push_back(E->isExact());
427*67e74705SXin Li Record.AddAPFloat(E->getValue());
428*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
429*67e74705SXin Li Code = serialization::EXPR_FLOATING_LITERAL;
430*67e74705SXin Li }
431*67e74705SXin Li
VisitImaginaryLiteral(ImaginaryLiteral * E)432*67e74705SXin Li void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
433*67e74705SXin Li VisitExpr(E);
434*67e74705SXin Li Record.AddStmt(E->getSubExpr());
435*67e74705SXin Li Code = serialization::EXPR_IMAGINARY_LITERAL;
436*67e74705SXin Li }
437*67e74705SXin Li
VisitStringLiteral(StringLiteral * E)438*67e74705SXin Li void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
439*67e74705SXin Li VisitExpr(E);
440*67e74705SXin Li Record.push_back(E->getByteLength());
441*67e74705SXin Li Record.push_back(E->getNumConcatenated());
442*67e74705SXin Li Record.push_back(E->getKind());
443*67e74705SXin Li Record.push_back(E->isPascal());
444*67e74705SXin Li // FIXME: String data should be stored as a blob at the end of the
445*67e74705SXin Li // StringLiteral. However, we can't do so now because we have no
446*67e74705SXin Li // provision for coping with abbreviations when we're jumping around
447*67e74705SXin Li // the AST file during deserialization.
448*67e74705SXin Li Record.append(E->getBytes().begin(), E->getBytes().end());
449*67e74705SXin Li for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
450*67e74705SXin Li Record.AddSourceLocation(E->getStrTokenLoc(I));
451*67e74705SXin Li Code = serialization::EXPR_STRING_LITERAL;
452*67e74705SXin Li }
453*67e74705SXin Li
VisitCharacterLiteral(CharacterLiteral * E)454*67e74705SXin Li void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
455*67e74705SXin Li VisitExpr(E);
456*67e74705SXin Li Record.push_back(E->getValue());
457*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
458*67e74705SXin Li Record.push_back(E->getKind());
459*67e74705SXin Li
460*67e74705SXin Li AbbrevToUse = Writer.getCharacterLiteralAbbrev();
461*67e74705SXin Li
462*67e74705SXin Li Code = serialization::EXPR_CHARACTER_LITERAL;
463*67e74705SXin Li }
464*67e74705SXin Li
VisitParenExpr(ParenExpr * E)465*67e74705SXin Li void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
466*67e74705SXin Li VisitExpr(E);
467*67e74705SXin Li Record.AddSourceLocation(E->getLParen());
468*67e74705SXin Li Record.AddSourceLocation(E->getRParen());
469*67e74705SXin Li Record.AddStmt(E->getSubExpr());
470*67e74705SXin Li Code = serialization::EXPR_PAREN;
471*67e74705SXin Li }
472*67e74705SXin Li
VisitParenListExpr(ParenListExpr * E)473*67e74705SXin Li void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
474*67e74705SXin Li VisitExpr(E);
475*67e74705SXin Li Record.push_back(E->NumExprs);
476*67e74705SXin Li for (unsigned i=0; i != E->NumExprs; ++i)
477*67e74705SXin Li Record.AddStmt(E->Exprs[i]);
478*67e74705SXin Li Record.AddSourceLocation(E->LParenLoc);
479*67e74705SXin Li Record.AddSourceLocation(E->RParenLoc);
480*67e74705SXin Li Code = serialization::EXPR_PAREN_LIST;
481*67e74705SXin Li }
482*67e74705SXin Li
VisitUnaryOperator(UnaryOperator * E)483*67e74705SXin Li void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
484*67e74705SXin Li VisitExpr(E);
485*67e74705SXin Li Record.AddStmt(E->getSubExpr());
486*67e74705SXin Li Record.push_back(E->getOpcode()); // FIXME: stable encoding
487*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
488*67e74705SXin Li Code = serialization::EXPR_UNARY_OPERATOR;
489*67e74705SXin Li }
490*67e74705SXin Li
VisitOffsetOfExpr(OffsetOfExpr * E)491*67e74705SXin Li void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
492*67e74705SXin Li VisitExpr(E);
493*67e74705SXin Li Record.push_back(E->getNumComponents());
494*67e74705SXin Li Record.push_back(E->getNumExpressions());
495*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
496*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
497*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
498*67e74705SXin Li for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
499*67e74705SXin Li const OffsetOfNode &ON = E->getComponent(I);
500*67e74705SXin Li Record.push_back(ON.getKind()); // FIXME: Stable encoding
501*67e74705SXin Li Record.AddSourceLocation(ON.getSourceRange().getBegin());
502*67e74705SXin Li Record.AddSourceLocation(ON.getSourceRange().getEnd());
503*67e74705SXin Li switch (ON.getKind()) {
504*67e74705SXin Li case OffsetOfNode::Array:
505*67e74705SXin Li Record.push_back(ON.getArrayExprIndex());
506*67e74705SXin Li break;
507*67e74705SXin Li
508*67e74705SXin Li case OffsetOfNode::Field:
509*67e74705SXin Li Record.AddDeclRef(ON.getField());
510*67e74705SXin Li break;
511*67e74705SXin Li
512*67e74705SXin Li case OffsetOfNode::Identifier:
513*67e74705SXin Li Record.AddIdentifierRef(ON.getFieldName());
514*67e74705SXin Li break;
515*67e74705SXin Li
516*67e74705SXin Li case OffsetOfNode::Base:
517*67e74705SXin Li Record.AddCXXBaseSpecifier(*ON.getBase());
518*67e74705SXin Li break;
519*67e74705SXin Li }
520*67e74705SXin Li }
521*67e74705SXin Li for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
522*67e74705SXin Li Record.AddStmt(E->getIndexExpr(I));
523*67e74705SXin Li Code = serialization::EXPR_OFFSETOF;
524*67e74705SXin Li }
525*67e74705SXin Li
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)526*67e74705SXin Li void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
527*67e74705SXin Li VisitExpr(E);
528*67e74705SXin Li Record.push_back(E->getKind());
529*67e74705SXin Li if (E->isArgumentType())
530*67e74705SXin Li Record.AddTypeSourceInfo(E->getArgumentTypeInfo());
531*67e74705SXin Li else {
532*67e74705SXin Li Record.push_back(0);
533*67e74705SXin Li Record.AddStmt(E->getArgumentExpr());
534*67e74705SXin Li }
535*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
536*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
537*67e74705SXin Li Code = serialization::EXPR_SIZEOF_ALIGN_OF;
538*67e74705SXin Li }
539*67e74705SXin Li
VisitArraySubscriptExpr(ArraySubscriptExpr * E)540*67e74705SXin Li void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
541*67e74705SXin Li VisitExpr(E);
542*67e74705SXin Li Record.AddStmt(E->getLHS());
543*67e74705SXin Li Record.AddStmt(E->getRHS());
544*67e74705SXin Li Record.AddSourceLocation(E->getRBracketLoc());
545*67e74705SXin Li Code = serialization::EXPR_ARRAY_SUBSCRIPT;
546*67e74705SXin Li }
547*67e74705SXin Li
VisitOMPArraySectionExpr(OMPArraySectionExpr * E)548*67e74705SXin Li void ASTStmtWriter::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) {
549*67e74705SXin Li VisitExpr(E);
550*67e74705SXin Li Record.AddStmt(E->getBase());
551*67e74705SXin Li Record.AddStmt(E->getLowerBound());
552*67e74705SXin Li Record.AddStmt(E->getLength());
553*67e74705SXin Li Record.AddSourceLocation(E->getColonLoc());
554*67e74705SXin Li Record.AddSourceLocation(E->getRBracketLoc());
555*67e74705SXin Li Code = serialization::EXPR_OMP_ARRAY_SECTION;
556*67e74705SXin Li }
557*67e74705SXin Li
VisitCallExpr(CallExpr * E)558*67e74705SXin Li void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
559*67e74705SXin Li VisitExpr(E);
560*67e74705SXin Li Record.push_back(E->getNumArgs());
561*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
562*67e74705SXin Li Record.AddStmt(E->getCallee());
563*67e74705SXin Li for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
564*67e74705SXin Li Arg != ArgEnd; ++Arg)
565*67e74705SXin Li Record.AddStmt(*Arg);
566*67e74705SXin Li Code = serialization::EXPR_CALL;
567*67e74705SXin Li }
568*67e74705SXin Li
VisitMemberExpr(MemberExpr * E)569*67e74705SXin Li void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
570*67e74705SXin Li // Don't call VisitExpr, we'll write everything here.
571*67e74705SXin Li
572*67e74705SXin Li Record.push_back(E->hasQualifier());
573*67e74705SXin Li if (E->hasQualifier())
574*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
575*67e74705SXin Li
576*67e74705SXin Li Record.push_back(E->HasTemplateKWAndArgsInfo);
577*67e74705SXin Li if (E->HasTemplateKWAndArgsInfo) {
578*67e74705SXin Li Record.AddSourceLocation(E->getTemplateKeywordLoc());
579*67e74705SXin Li unsigned NumTemplateArgs = E->getNumTemplateArgs();
580*67e74705SXin Li Record.push_back(NumTemplateArgs);
581*67e74705SXin Li Record.AddSourceLocation(E->getLAngleLoc());
582*67e74705SXin Li Record.AddSourceLocation(E->getRAngleLoc());
583*67e74705SXin Li for (unsigned i=0; i != NumTemplateArgs; ++i)
584*67e74705SXin Li Record.AddTemplateArgumentLoc(E->getTemplateArgs()[i]);
585*67e74705SXin Li }
586*67e74705SXin Li
587*67e74705SXin Li Record.push_back(E->hadMultipleCandidates());
588*67e74705SXin Li
589*67e74705SXin Li DeclAccessPair FoundDecl = E->getFoundDecl();
590*67e74705SXin Li Record.AddDeclRef(FoundDecl.getDecl());
591*67e74705SXin Li Record.push_back(FoundDecl.getAccess());
592*67e74705SXin Li
593*67e74705SXin Li Record.AddTypeRef(E->getType());
594*67e74705SXin Li Record.push_back(E->getValueKind());
595*67e74705SXin Li Record.push_back(E->getObjectKind());
596*67e74705SXin Li Record.AddStmt(E->getBase());
597*67e74705SXin Li Record.AddDeclRef(E->getMemberDecl());
598*67e74705SXin Li Record.AddSourceLocation(E->getMemberLoc());
599*67e74705SXin Li Record.push_back(E->isArrow());
600*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
601*67e74705SXin Li Record.AddDeclarationNameLoc(E->MemberDNLoc,
602*67e74705SXin Li E->getMemberDecl()->getDeclName());
603*67e74705SXin Li Code = serialization::EXPR_MEMBER;
604*67e74705SXin Li }
605*67e74705SXin Li
VisitObjCIsaExpr(ObjCIsaExpr * E)606*67e74705SXin Li void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
607*67e74705SXin Li VisitExpr(E);
608*67e74705SXin Li Record.AddStmt(E->getBase());
609*67e74705SXin Li Record.AddSourceLocation(E->getIsaMemberLoc());
610*67e74705SXin Li Record.AddSourceLocation(E->getOpLoc());
611*67e74705SXin Li Record.push_back(E->isArrow());
612*67e74705SXin Li Code = serialization::EXPR_OBJC_ISA;
613*67e74705SXin Li }
614*67e74705SXin Li
615*67e74705SXin Li void ASTStmtWriter::
VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)616*67e74705SXin Li VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
617*67e74705SXin Li VisitExpr(E);
618*67e74705SXin Li Record.AddStmt(E->getSubExpr());
619*67e74705SXin Li Record.push_back(E->shouldCopy());
620*67e74705SXin Li Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
621*67e74705SXin Li }
622*67e74705SXin Li
VisitObjCBridgedCastExpr(ObjCBridgedCastExpr * E)623*67e74705SXin Li void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
624*67e74705SXin Li VisitExplicitCastExpr(E);
625*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
626*67e74705SXin Li Record.AddSourceLocation(E->getBridgeKeywordLoc());
627*67e74705SXin Li Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
628*67e74705SXin Li Code = serialization::EXPR_OBJC_BRIDGED_CAST;
629*67e74705SXin Li }
630*67e74705SXin Li
VisitCastExpr(CastExpr * E)631*67e74705SXin Li void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
632*67e74705SXin Li VisitExpr(E);
633*67e74705SXin Li Record.push_back(E->path_size());
634*67e74705SXin Li Record.AddStmt(E->getSubExpr());
635*67e74705SXin Li Record.push_back(E->getCastKind()); // FIXME: stable encoding
636*67e74705SXin Li
637*67e74705SXin Li for (CastExpr::path_iterator
638*67e74705SXin Li PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
639*67e74705SXin Li Record.AddCXXBaseSpecifier(**PI);
640*67e74705SXin Li }
641*67e74705SXin Li
VisitBinaryOperator(BinaryOperator * E)642*67e74705SXin Li void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
643*67e74705SXin Li VisitExpr(E);
644*67e74705SXin Li Record.AddStmt(E->getLHS());
645*67e74705SXin Li Record.AddStmt(E->getRHS());
646*67e74705SXin Li Record.push_back(E->getOpcode()); // FIXME: stable encoding
647*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
648*67e74705SXin Li Record.push_back(E->isFPContractable());
649*67e74705SXin Li Code = serialization::EXPR_BINARY_OPERATOR;
650*67e74705SXin Li }
651*67e74705SXin Li
VisitCompoundAssignOperator(CompoundAssignOperator * E)652*67e74705SXin Li void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
653*67e74705SXin Li VisitBinaryOperator(E);
654*67e74705SXin Li Record.AddTypeRef(E->getComputationLHSType());
655*67e74705SXin Li Record.AddTypeRef(E->getComputationResultType());
656*67e74705SXin Li Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
657*67e74705SXin Li }
658*67e74705SXin Li
VisitConditionalOperator(ConditionalOperator * E)659*67e74705SXin Li void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
660*67e74705SXin Li VisitExpr(E);
661*67e74705SXin Li Record.AddStmt(E->getCond());
662*67e74705SXin Li Record.AddStmt(E->getLHS());
663*67e74705SXin Li Record.AddStmt(E->getRHS());
664*67e74705SXin Li Record.AddSourceLocation(E->getQuestionLoc());
665*67e74705SXin Li Record.AddSourceLocation(E->getColonLoc());
666*67e74705SXin Li Code = serialization::EXPR_CONDITIONAL_OPERATOR;
667*67e74705SXin Li }
668*67e74705SXin Li
669*67e74705SXin Li void
VisitBinaryConditionalOperator(BinaryConditionalOperator * E)670*67e74705SXin Li ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
671*67e74705SXin Li VisitExpr(E);
672*67e74705SXin Li Record.AddStmt(E->getOpaqueValue());
673*67e74705SXin Li Record.AddStmt(E->getCommon());
674*67e74705SXin Li Record.AddStmt(E->getCond());
675*67e74705SXin Li Record.AddStmt(E->getTrueExpr());
676*67e74705SXin Li Record.AddStmt(E->getFalseExpr());
677*67e74705SXin Li Record.AddSourceLocation(E->getQuestionLoc());
678*67e74705SXin Li Record.AddSourceLocation(E->getColonLoc());
679*67e74705SXin Li Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
680*67e74705SXin Li }
681*67e74705SXin Li
VisitImplicitCastExpr(ImplicitCastExpr * E)682*67e74705SXin Li void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
683*67e74705SXin Li VisitCastExpr(E);
684*67e74705SXin Li
685*67e74705SXin Li if (E->path_size() == 0)
686*67e74705SXin Li AbbrevToUse = Writer.getExprImplicitCastAbbrev();
687*67e74705SXin Li
688*67e74705SXin Li Code = serialization::EXPR_IMPLICIT_CAST;
689*67e74705SXin Li }
690*67e74705SXin Li
VisitExplicitCastExpr(ExplicitCastExpr * E)691*67e74705SXin Li void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
692*67e74705SXin Li VisitCastExpr(E);
693*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeInfoAsWritten());
694*67e74705SXin Li }
695*67e74705SXin Li
VisitCStyleCastExpr(CStyleCastExpr * E)696*67e74705SXin Li void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
697*67e74705SXin Li VisitExplicitCastExpr(E);
698*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
699*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
700*67e74705SXin Li Code = serialization::EXPR_CSTYLE_CAST;
701*67e74705SXin Li }
702*67e74705SXin Li
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)703*67e74705SXin Li void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
704*67e74705SXin Li VisitExpr(E);
705*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
706*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
707*67e74705SXin Li Record.AddStmt(E->getInitializer());
708*67e74705SXin Li Record.push_back(E->isFileScope());
709*67e74705SXin Li Code = serialization::EXPR_COMPOUND_LITERAL;
710*67e74705SXin Li }
711*67e74705SXin Li
VisitExtVectorElementExpr(ExtVectorElementExpr * E)712*67e74705SXin Li void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
713*67e74705SXin Li VisitExpr(E);
714*67e74705SXin Li Record.AddStmt(E->getBase());
715*67e74705SXin Li Record.AddIdentifierRef(&E->getAccessor());
716*67e74705SXin Li Record.AddSourceLocation(E->getAccessorLoc());
717*67e74705SXin Li Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
718*67e74705SXin Li }
719*67e74705SXin Li
VisitInitListExpr(InitListExpr * E)720*67e74705SXin Li void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
721*67e74705SXin Li VisitExpr(E);
722*67e74705SXin Li // NOTE: only add the (possibly null) syntactic form.
723*67e74705SXin Li // No need to serialize the isSemanticForm flag and the semantic form.
724*67e74705SXin Li Record.AddStmt(E->getSyntacticForm());
725*67e74705SXin Li Record.AddSourceLocation(E->getLBraceLoc());
726*67e74705SXin Li Record.AddSourceLocation(E->getRBraceLoc());
727*67e74705SXin Li bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
728*67e74705SXin Li Record.push_back(isArrayFiller);
729*67e74705SXin Li if (isArrayFiller)
730*67e74705SXin Li Record.AddStmt(E->getArrayFiller());
731*67e74705SXin Li else
732*67e74705SXin Li Record.AddDeclRef(E->getInitializedFieldInUnion());
733*67e74705SXin Li Record.push_back(E->hadArrayRangeDesignator());
734*67e74705SXin Li Record.push_back(E->getNumInits());
735*67e74705SXin Li if (isArrayFiller) {
736*67e74705SXin Li // ArrayFiller may have filled "holes" due to designated initializer.
737*67e74705SXin Li // Replace them by 0 to indicate that the filler goes in that place.
738*67e74705SXin Li Expr *filler = E->getArrayFiller();
739*67e74705SXin Li for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
740*67e74705SXin Li Record.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);
741*67e74705SXin Li } else {
742*67e74705SXin Li for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
743*67e74705SXin Li Record.AddStmt(E->getInit(I));
744*67e74705SXin Li }
745*67e74705SXin Li Code = serialization::EXPR_INIT_LIST;
746*67e74705SXin Li }
747*67e74705SXin Li
VisitDesignatedInitExpr(DesignatedInitExpr * E)748*67e74705SXin Li void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
749*67e74705SXin Li VisitExpr(E);
750*67e74705SXin Li Record.push_back(E->getNumSubExprs());
751*67e74705SXin Li for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
752*67e74705SXin Li Record.AddStmt(E->getSubExpr(I));
753*67e74705SXin Li Record.AddSourceLocation(E->getEqualOrColonLoc());
754*67e74705SXin Li Record.push_back(E->usesGNUSyntax());
755*67e74705SXin Li for (const DesignatedInitExpr::Designator &D : E->designators()) {
756*67e74705SXin Li if (D.isFieldDesignator()) {
757*67e74705SXin Li if (FieldDecl *Field = D.getField()) {
758*67e74705SXin Li Record.push_back(serialization::DESIG_FIELD_DECL);
759*67e74705SXin Li Record.AddDeclRef(Field);
760*67e74705SXin Li } else {
761*67e74705SXin Li Record.push_back(serialization::DESIG_FIELD_NAME);
762*67e74705SXin Li Record.AddIdentifierRef(D.getFieldName());
763*67e74705SXin Li }
764*67e74705SXin Li Record.AddSourceLocation(D.getDotLoc());
765*67e74705SXin Li Record.AddSourceLocation(D.getFieldLoc());
766*67e74705SXin Li } else if (D.isArrayDesignator()) {
767*67e74705SXin Li Record.push_back(serialization::DESIG_ARRAY);
768*67e74705SXin Li Record.push_back(D.getFirstExprIndex());
769*67e74705SXin Li Record.AddSourceLocation(D.getLBracketLoc());
770*67e74705SXin Li Record.AddSourceLocation(D.getRBracketLoc());
771*67e74705SXin Li } else {
772*67e74705SXin Li assert(D.isArrayRangeDesignator() && "Unknown designator");
773*67e74705SXin Li Record.push_back(serialization::DESIG_ARRAY_RANGE);
774*67e74705SXin Li Record.push_back(D.getFirstExprIndex());
775*67e74705SXin Li Record.AddSourceLocation(D.getLBracketLoc());
776*67e74705SXin Li Record.AddSourceLocation(D.getEllipsisLoc());
777*67e74705SXin Li Record.AddSourceLocation(D.getRBracketLoc());
778*67e74705SXin Li }
779*67e74705SXin Li }
780*67e74705SXin Li Code = serialization::EXPR_DESIGNATED_INIT;
781*67e74705SXin Li }
782*67e74705SXin Li
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)783*67e74705SXin Li void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
784*67e74705SXin Li VisitExpr(E);
785*67e74705SXin Li Record.AddStmt(E->getBase());
786*67e74705SXin Li Record.AddStmt(E->getUpdater());
787*67e74705SXin Li Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;
788*67e74705SXin Li }
789*67e74705SXin Li
VisitNoInitExpr(NoInitExpr * E)790*67e74705SXin Li void ASTStmtWriter::VisitNoInitExpr(NoInitExpr *E) {
791*67e74705SXin Li VisitExpr(E);
792*67e74705SXin Li Code = serialization::EXPR_NO_INIT;
793*67e74705SXin Li }
794*67e74705SXin Li
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)795*67e74705SXin Li void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
796*67e74705SXin Li VisitExpr(E);
797*67e74705SXin Li Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
798*67e74705SXin Li }
799*67e74705SXin Li
VisitVAArgExpr(VAArgExpr * E)800*67e74705SXin Li void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
801*67e74705SXin Li VisitExpr(E);
802*67e74705SXin Li Record.AddStmt(E->getSubExpr());
803*67e74705SXin Li Record.AddTypeSourceInfo(E->getWrittenTypeInfo());
804*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
805*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
806*67e74705SXin Li Record.push_back(E->isMicrosoftABI());
807*67e74705SXin Li Code = serialization::EXPR_VA_ARG;
808*67e74705SXin Li }
809*67e74705SXin Li
VisitAddrLabelExpr(AddrLabelExpr * E)810*67e74705SXin Li void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
811*67e74705SXin Li VisitExpr(E);
812*67e74705SXin Li Record.AddSourceLocation(E->getAmpAmpLoc());
813*67e74705SXin Li Record.AddSourceLocation(E->getLabelLoc());
814*67e74705SXin Li Record.AddDeclRef(E->getLabel());
815*67e74705SXin Li Code = serialization::EXPR_ADDR_LABEL;
816*67e74705SXin Li }
817*67e74705SXin Li
VisitStmtExpr(StmtExpr * E)818*67e74705SXin Li void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
819*67e74705SXin Li VisitExpr(E);
820*67e74705SXin Li Record.AddStmt(E->getSubStmt());
821*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
822*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
823*67e74705SXin Li Code = serialization::EXPR_STMT;
824*67e74705SXin Li }
825*67e74705SXin Li
VisitChooseExpr(ChooseExpr * E)826*67e74705SXin Li void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
827*67e74705SXin Li VisitExpr(E);
828*67e74705SXin Li Record.AddStmt(E->getCond());
829*67e74705SXin Li Record.AddStmt(E->getLHS());
830*67e74705SXin Li Record.AddStmt(E->getRHS());
831*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
832*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
833*67e74705SXin Li Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());
834*67e74705SXin Li Code = serialization::EXPR_CHOOSE;
835*67e74705SXin Li }
836*67e74705SXin Li
VisitGNUNullExpr(GNUNullExpr * E)837*67e74705SXin Li void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
838*67e74705SXin Li VisitExpr(E);
839*67e74705SXin Li Record.AddSourceLocation(E->getTokenLocation());
840*67e74705SXin Li Code = serialization::EXPR_GNU_NULL;
841*67e74705SXin Li }
842*67e74705SXin Li
VisitShuffleVectorExpr(ShuffleVectorExpr * E)843*67e74705SXin Li void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
844*67e74705SXin Li VisitExpr(E);
845*67e74705SXin Li Record.push_back(E->getNumSubExprs());
846*67e74705SXin Li for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
847*67e74705SXin Li Record.AddStmt(E->getExpr(I));
848*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
849*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
850*67e74705SXin Li Code = serialization::EXPR_SHUFFLE_VECTOR;
851*67e74705SXin Li }
852*67e74705SXin Li
VisitConvertVectorExpr(ConvertVectorExpr * E)853*67e74705SXin Li void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
854*67e74705SXin Li VisitExpr(E);
855*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
856*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
857*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
858*67e74705SXin Li Record.AddStmt(E->getSrcExpr());
859*67e74705SXin Li Code = serialization::EXPR_CONVERT_VECTOR;
860*67e74705SXin Li }
861*67e74705SXin Li
VisitBlockExpr(BlockExpr * E)862*67e74705SXin Li void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
863*67e74705SXin Li VisitExpr(E);
864*67e74705SXin Li Record.AddDeclRef(E->getBlockDecl());
865*67e74705SXin Li Code = serialization::EXPR_BLOCK;
866*67e74705SXin Li }
867*67e74705SXin Li
VisitGenericSelectionExpr(GenericSelectionExpr * E)868*67e74705SXin Li void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
869*67e74705SXin Li VisitExpr(E);
870*67e74705SXin Li Record.push_back(E->getNumAssocs());
871*67e74705SXin Li
872*67e74705SXin Li Record.AddStmt(E->getControllingExpr());
873*67e74705SXin Li for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
874*67e74705SXin Li Record.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I));
875*67e74705SXin Li Record.AddStmt(E->getAssocExpr(I));
876*67e74705SXin Li }
877*67e74705SXin Li Record.push_back(E->isResultDependent() ? -1U : E->getResultIndex());
878*67e74705SXin Li
879*67e74705SXin Li Record.AddSourceLocation(E->getGenericLoc());
880*67e74705SXin Li Record.AddSourceLocation(E->getDefaultLoc());
881*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
882*67e74705SXin Li Code = serialization::EXPR_GENERIC_SELECTION;
883*67e74705SXin Li }
884*67e74705SXin Li
VisitPseudoObjectExpr(PseudoObjectExpr * E)885*67e74705SXin Li void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
886*67e74705SXin Li VisitExpr(E);
887*67e74705SXin Li Record.push_back(E->getNumSemanticExprs());
888*67e74705SXin Li
889*67e74705SXin Li // Push the result index. Currently, this needs to exactly match
890*67e74705SXin Li // the encoding used internally for ResultIndex.
891*67e74705SXin Li unsigned result = E->getResultExprIndex();
892*67e74705SXin Li result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
893*67e74705SXin Li Record.push_back(result);
894*67e74705SXin Li
895*67e74705SXin Li Record.AddStmt(E->getSyntacticForm());
896*67e74705SXin Li for (PseudoObjectExpr::semantics_iterator
897*67e74705SXin Li i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
898*67e74705SXin Li Record.AddStmt(*i);
899*67e74705SXin Li }
900*67e74705SXin Li Code = serialization::EXPR_PSEUDO_OBJECT;
901*67e74705SXin Li }
902*67e74705SXin Li
VisitAtomicExpr(AtomicExpr * E)903*67e74705SXin Li void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
904*67e74705SXin Li VisitExpr(E);
905*67e74705SXin Li Record.push_back(E->getOp());
906*67e74705SXin Li for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
907*67e74705SXin Li Record.AddStmt(E->getSubExprs()[I]);
908*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
909*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
910*67e74705SXin Li Code = serialization::EXPR_ATOMIC;
911*67e74705SXin Li }
912*67e74705SXin Li
913*67e74705SXin Li //===----------------------------------------------------------------------===//
914*67e74705SXin Li // Objective-C Expressions and Statements.
915*67e74705SXin Li //===----------------------------------------------------------------------===//
916*67e74705SXin Li
VisitObjCStringLiteral(ObjCStringLiteral * E)917*67e74705SXin Li void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
918*67e74705SXin Li VisitExpr(E);
919*67e74705SXin Li Record.AddStmt(E->getString());
920*67e74705SXin Li Record.AddSourceLocation(E->getAtLoc());
921*67e74705SXin Li Code = serialization::EXPR_OBJC_STRING_LITERAL;
922*67e74705SXin Li }
923*67e74705SXin Li
VisitObjCBoxedExpr(ObjCBoxedExpr * E)924*67e74705SXin Li void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
925*67e74705SXin Li VisitExpr(E);
926*67e74705SXin Li Record.AddStmt(E->getSubExpr());
927*67e74705SXin Li Record.AddDeclRef(E->getBoxingMethod());
928*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
929*67e74705SXin Li Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
930*67e74705SXin Li }
931*67e74705SXin Li
VisitObjCArrayLiteral(ObjCArrayLiteral * E)932*67e74705SXin Li void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
933*67e74705SXin Li VisitExpr(E);
934*67e74705SXin Li Record.push_back(E->getNumElements());
935*67e74705SXin Li for (unsigned i = 0; i < E->getNumElements(); i++)
936*67e74705SXin Li Record.AddStmt(E->getElement(i));
937*67e74705SXin Li Record.AddDeclRef(E->getArrayWithObjectsMethod());
938*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
939*67e74705SXin Li Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
940*67e74705SXin Li }
941*67e74705SXin Li
VisitObjCDictionaryLiteral(ObjCDictionaryLiteral * E)942*67e74705SXin Li void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
943*67e74705SXin Li VisitExpr(E);
944*67e74705SXin Li Record.push_back(E->getNumElements());
945*67e74705SXin Li Record.push_back(E->HasPackExpansions);
946*67e74705SXin Li for (unsigned i = 0; i < E->getNumElements(); i++) {
947*67e74705SXin Li ObjCDictionaryElement Element = E->getKeyValueElement(i);
948*67e74705SXin Li Record.AddStmt(Element.Key);
949*67e74705SXin Li Record.AddStmt(Element.Value);
950*67e74705SXin Li if (E->HasPackExpansions) {
951*67e74705SXin Li Record.AddSourceLocation(Element.EllipsisLoc);
952*67e74705SXin Li unsigned NumExpansions = 0;
953*67e74705SXin Li if (Element.NumExpansions)
954*67e74705SXin Li NumExpansions = *Element.NumExpansions + 1;
955*67e74705SXin Li Record.push_back(NumExpansions);
956*67e74705SXin Li }
957*67e74705SXin Li }
958*67e74705SXin Li
959*67e74705SXin Li Record.AddDeclRef(E->getDictWithObjectsMethod());
960*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
961*67e74705SXin Li Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
962*67e74705SXin Li }
963*67e74705SXin Li
VisitObjCEncodeExpr(ObjCEncodeExpr * E)964*67e74705SXin Li void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
965*67e74705SXin Li VisitExpr(E);
966*67e74705SXin Li Record.AddTypeSourceInfo(E->getEncodedTypeSourceInfo());
967*67e74705SXin Li Record.AddSourceLocation(E->getAtLoc());
968*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
969*67e74705SXin Li Code = serialization::EXPR_OBJC_ENCODE;
970*67e74705SXin Li }
971*67e74705SXin Li
VisitObjCSelectorExpr(ObjCSelectorExpr * E)972*67e74705SXin Li void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
973*67e74705SXin Li VisitExpr(E);
974*67e74705SXin Li Record.AddSelectorRef(E->getSelector());
975*67e74705SXin Li Record.AddSourceLocation(E->getAtLoc());
976*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
977*67e74705SXin Li Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
978*67e74705SXin Li }
979*67e74705SXin Li
VisitObjCProtocolExpr(ObjCProtocolExpr * E)980*67e74705SXin Li void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
981*67e74705SXin Li VisitExpr(E);
982*67e74705SXin Li Record.AddDeclRef(E->getProtocol());
983*67e74705SXin Li Record.AddSourceLocation(E->getAtLoc());
984*67e74705SXin Li Record.AddSourceLocation(E->ProtoLoc);
985*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
986*67e74705SXin Li Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
987*67e74705SXin Li }
988*67e74705SXin Li
VisitObjCIvarRefExpr(ObjCIvarRefExpr * E)989*67e74705SXin Li void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
990*67e74705SXin Li VisitExpr(E);
991*67e74705SXin Li Record.AddDeclRef(E->getDecl());
992*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
993*67e74705SXin Li Record.AddSourceLocation(E->getOpLoc());
994*67e74705SXin Li Record.AddStmt(E->getBase());
995*67e74705SXin Li Record.push_back(E->isArrow());
996*67e74705SXin Li Record.push_back(E->isFreeIvar());
997*67e74705SXin Li Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
998*67e74705SXin Li }
999*67e74705SXin Li
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * E)1000*67e74705SXin Li void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1001*67e74705SXin Li VisitExpr(E);
1002*67e74705SXin Li Record.push_back(E->SetterAndMethodRefFlags.getInt());
1003*67e74705SXin Li Record.push_back(E->isImplicitProperty());
1004*67e74705SXin Li if (E->isImplicitProperty()) {
1005*67e74705SXin Li Record.AddDeclRef(E->getImplicitPropertyGetter());
1006*67e74705SXin Li Record.AddDeclRef(E->getImplicitPropertySetter());
1007*67e74705SXin Li } else {
1008*67e74705SXin Li Record.AddDeclRef(E->getExplicitProperty());
1009*67e74705SXin Li }
1010*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1011*67e74705SXin Li Record.AddSourceLocation(E->getReceiverLocation());
1012*67e74705SXin Li if (E->isObjectReceiver()) {
1013*67e74705SXin Li Record.push_back(0);
1014*67e74705SXin Li Record.AddStmt(E->getBase());
1015*67e74705SXin Li } else if (E->isSuperReceiver()) {
1016*67e74705SXin Li Record.push_back(1);
1017*67e74705SXin Li Record.AddTypeRef(E->getSuperReceiverType());
1018*67e74705SXin Li } else {
1019*67e74705SXin Li Record.push_back(2);
1020*67e74705SXin Li Record.AddDeclRef(E->getClassReceiver());
1021*67e74705SXin Li }
1022*67e74705SXin Li
1023*67e74705SXin Li Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
1024*67e74705SXin Li }
1025*67e74705SXin Li
VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)1026*67e74705SXin Li void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
1027*67e74705SXin Li VisitExpr(E);
1028*67e74705SXin Li Record.AddSourceLocation(E->getRBracket());
1029*67e74705SXin Li Record.AddStmt(E->getBaseExpr());
1030*67e74705SXin Li Record.AddStmt(E->getKeyExpr());
1031*67e74705SXin Li Record.AddDeclRef(E->getAtIndexMethodDecl());
1032*67e74705SXin Li Record.AddDeclRef(E->setAtIndexMethodDecl());
1033*67e74705SXin Li
1034*67e74705SXin Li Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
1035*67e74705SXin Li }
1036*67e74705SXin Li
VisitObjCMessageExpr(ObjCMessageExpr * E)1037*67e74705SXin Li void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1038*67e74705SXin Li VisitExpr(E);
1039*67e74705SXin Li Record.push_back(E->getNumArgs());
1040*67e74705SXin Li Record.push_back(E->getNumStoredSelLocs());
1041*67e74705SXin Li Record.push_back(E->SelLocsKind);
1042*67e74705SXin Li Record.push_back(E->isDelegateInitCall());
1043*67e74705SXin Li Record.push_back(E->IsImplicit);
1044*67e74705SXin Li Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
1045*67e74705SXin Li switch (E->getReceiverKind()) {
1046*67e74705SXin Li case ObjCMessageExpr::Instance:
1047*67e74705SXin Li Record.AddStmt(E->getInstanceReceiver());
1048*67e74705SXin Li break;
1049*67e74705SXin Li
1050*67e74705SXin Li case ObjCMessageExpr::Class:
1051*67e74705SXin Li Record.AddTypeSourceInfo(E->getClassReceiverTypeInfo());
1052*67e74705SXin Li break;
1053*67e74705SXin Li
1054*67e74705SXin Li case ObjCMessageExpr::SuperClass:
1055*67e74705SXin Li case ObjCMessageExpr::SuperInstance:
1056*67e74705SXin Li Record.AddTypeRef(E->getSuperType());
1057*67e74705SXin Li Record.AddSourceLocation(E->getSuperLoc());
1058*67e74705SXin Li break;
1059*67e74705SXin Li }
1060*67e74705SXin Li
1061*67e74705SXin Li if (E->getMethodDecl()) {
1062*67e74705SXin Li Record.push_back(1);
1063*67e74705SXin Li Record.AddDeclRef(E->getMethodDecl());
1064*67e74705SXin Li } else {
1065*67e74705SXin Li Record.push_back(0);
1066*67e74705SXin Li Record.AddSelectorRef(E->getSelector());
1067*67e74705SXin Li }
1068*67e74705SXin Li
1069*67e74705SXin Li Record.AddSourceLocation(E->getLeftLoc());
1070*67e74705SXin Li Record.AddSourceLocation(E->getRightLoc());
1071*67e74705SXin Li
1072*67e74705SXin Li for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
1073*67e74705SXin Li Arg != ArgEnd; ++Arg)
1074*67e74705SXin Li Record.AddStmt(*Arg);
1075*67e74705SXin Li
1076*67e74705SXin Li SourceLocation *Locs = E->getStoredSelLocs();
1077*67e74705SXin Li for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
1078*67e74705SXin Li Record.AddSourceLocation(Locs[i]);
1079*67e74705SXin Li
1080*67e74705SXin Li Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
1081*67e74705SXin Li }
1082*67e74705SXin Li
VisitObjCForCollectionStmt(ObjCForCollectionStmt * S)1083*67e74705SXin Li void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
1084*67e74705SXin Li VisitStmt(S);
1085*67e74705SXin Li Record.AddStmt(S->getElement());
1086*67e74705SXin Li Record.AddStmt(S->getCollection());
1087*67e74705SXin Li Record.AddStmt(S->getBody());
1088*67e74705SXin Li Record.AddSourceLocation(S->getForLoc());
1089*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
1090*67e74705SXin Li Code = serialization::STMT_OBJC_FOR_COLLECTION;
1091*67e74705SXin Li }
1092*67e74705SXin Li
VisitObjCAtCatchStmt(ObjCAtCatchStmt * S)1093*67e74705SXin Li void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
1094*67e74705SXin Li Record.AddStmt(S->getCatchBody());
1095*67e74705SXin Li Record.AddDeclRef(S->getCatchParamDecl());
1096*67e74705SXin Li Record.AddSourceLocation(S->getAtCatchLoc());
1097*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
1098*67e74705SXin Li Code = serialization::STMT_OBJC_CATCH;
1099*67e74705SXin Li }
1100*67e74705SXin Li
VisitObjCAtFinallyStmt(ObjCAtFinallyStmt * S)1101*67e74705SXin Li void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
1102*67e74705SXin Li Record.AddStmt(S->getFinallyBody());
1103*67e74705SXin Li Record.AddSourceLocation(S->getAtFinallyLoc());
1104*67e74705SXin Li Code = serialization::STMT_OBJC_FINALLY;
1105*67e74705SXin Li }
1106*67e74705SXin Li
VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)1107*67e74705SXin Li void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
1108*67e74705SXin Li Record.AddStmt(S->getSubStmt());
1109*67e74705SXin Li Record.AddSourceLocation(S->getAtLoc());
1110*67e74705SXin Li Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
1111*67e74705SXin Li }
1112*67e74705SXin Li
VisitObjCAtTryStmt(ObjCAtTryStmt * S)1113*67e74705SXin Li void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1114*67e74705SXin Li Record.push_back(S->getNumCatchStmts());
1115*67e74705SXin Li Record.push_back(S->getFinallyStmt() != nullptr);
1116*67e74705SXin Li Record.AddStmt(S->getTryBody());
1117*67e74705SXin Li for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
1118*67e74705SXin Li Record.AddStmt(S->getCatchStmt(I));
1119*67e74705SXin Li if (S->getFinallyStmt())
1120*67e74705SXin Li Record.AddStmt(S->getFinallyStmt());
1121*67e74705SXin Li Record.AddSourceLocation(S->getAtTryLoc());
1122*67e74705SXin Li Code = serialization::STMT_OBJC_AT_TRY;
1123*67e74705SXin Li }
1124*67e74705SXin Li
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)1125*67e74705SXin Li void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1126*67e74705SXin Li Record.AddStmt(S->getSynchExpr());
1127*67e74705SXin Li Record.AddStmt(S->getSynchBody());
1128*67e74705SXin Li Record.AddSourceLocation(S->getAtSynchronizedLoc());
1129*67e74705SXin Li Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
1130*67e74705SXin Li }
1131*67e74705SXin Li
VisitObjCAtThrowStmt(ObjCAtThrowStmt * S)1132*67e74705SXin Li void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1133*67e74705SXin Li Record.AddStmt(S->getThrowExpr());
1134*67e74705SXin Li Record.AddSourceLocation(S->getThrowLoc());
1135*67e74705SXin Li Code = serialization::STMT_OBJC_AT_THROW;
1136*67e74705SXin Li }
1137*67e74705SXin Li
VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)1138*67e74705SXin Li void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1139*67e74705SXin Li VisitExpr(E);
1140*67e74705SXin Li Record.push_back(E->getValue());
1141*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1142*67e74705SXin Li Code = serialization::EXPR_OBJC_BOOL_LITERAL;
1143*67e74705SXin Li }
1144*67e74705SXin Li
1145*67e74705SXin Li //===----------------------------------------------------------------------===//
1146*67e74705SXin Li // C++ Expressions and Statements.
1147*67e74705SXin Li //===----------------------------------------------------------------------===//
1148*67e74705SXin Li
VisitCXXCatchStmt(CXXCatchStmt * S)1149*67e74705SXin Li void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
1150*67e74705SXin Li VisitStmt(S);
1151*67e74705SXin Li Record.AddSourceLocation(S->getCatchLoc());
1152*67e74705SXin Li Record.AddDeclRef(S->getExceptionDecl());
1153*67e74705SXin Li Record.AddStmt(S->getHandlerBlock());
1154*67e74705SXin Li Code = serialization::STMT_CXX_CATCH;
1155*67e74705SXin Li }
1156*67e74705SXin Li
VisitCXXTryStmt(CXXTryStmt * S)1157*67e74705SXin Li void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
1158*67e74705SXin Li VisitStmt(S);
1159*67e74705SXin Li Record.push_back(S->getNumHandlers());
1160*67e74705SXin Li Record.AddSourceLocation(S->getTryLoc());
1161*67e74705SXin Li Record.AddStmt(S->getTryBlock());
1162*67e74705SXin Li for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1163*67e74705SXin Li Record.AddStmt(S->getHandler(i));
1164*67e74705SXin Li Code = serialization::STMT_CXX_TRY;
1165*67e74705SXin Li }
1166*67e74705SXin Li
VisitCXXForRangeStmt(CXXForRangeStmt * S)1167*67e74705SXin Li void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1168*67e74705SXin Li VisitStmt(S);
1169*67e74705SXin Li Record.AddSourceLocation(S->getForLoc());
1170*67e74705SXin Li Record.AddSourceLocation(S->getCoawaitLoc());
1171*67e74705SXin Li Record.AddSourceLocation(S->getColonLoc());
1172*67e74705SXin Li Record.AddSourceLocation(S->getRParenLoc());
1173*67e74705SXin Li Record.AddStmt(S->getRangeStmt());
1174*67e74705SXin Li Record.AddStmt(S->getBeginStmt());
1175*67e74705SXin Li Record.AddStmt(S->getEndStmt());
1176*67e74705SXin Li Record.AddStmt(S->getCond());
1177*67e74705SXin Li Record.AddStmt(S->getInc());
1178*67e74705SXin Li Record.AddStmt(S->getLoopVarStmt());
1179*67e74705SXin Li Record.AddStmt(S->getBody());
1180*67e74705SXin Li Code = serialization::STMT_CXX_FOR_RANGE;
1181*67e74705SXin Li }
1182*67e74705SXin Li
VisitMSDependentExistsStmt(MSDependentExistsStmt * S)1183*67e74705SXin Li void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1184*67e74705SXin Li VisitStmt(S);
1185*67e74705SXin Li Record.AddSourceLocation(S->getKeywordLoc());
1186*67e74705SXin Li Record.push_back(S->isIfExists());
1187*67e74705SXin Li Record.AddNestedNameSpecifierLoc(S->getQualifierLoc());
1188*67e74705SXin Li Record.AddDeclarationNameInfo(S->getNameInfo());
1189*67e74705SXin Li Record.AddStmt(S->getSubStmt());
1190*67e74705SXin Li Code = serialization::STMT_MS_DEPENDENT_EXISTS;
1191*67e74705SXin Li }
1192*67e74705SXin Li
VisitCXXOperatorCallExpr(CXXOperatorCallExpr * E)1193*67e74705SXin Li void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1194*67e74705SXin Li VisitCallExpr(E);
1195*67e74705SXin Li Record.push_back(E->getOperator());
1196*67e74705SXin Li Record.AddSourceRange(E->Range);
1197*67e74705SXin Li Record.push_back(E->isFPContractable());
1198*67e74705SXin Li Code = serialization::EXPR_CXX_OPERATOR_CALL;
1199*67e74705SXin Li }
1200*67e74705SXin Li
VisitCXXMemberCallExpr(CXXMemberCallExpr * E)1201*67e74705SXin Li void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
1202*67e74705SXin Li VisitCallExpr(E);
1203*67e74705SXin Li Code = serialization::EXPR_CXX_MEMBER_CALL;
1204*67e74705SXin Li }
1205*67e74705SXin Li
VisitCXXConstructExpr(CXXConstructExpr * E)1206*67e74705SXin Li void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1207*67e74705SXin Li VisitExpr(E);
1208*67e74705SXin Li Record.push_back(E->getNumArgs());
1209*67e74705SXin Li for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1210*67e74705SXin Li Record.AddStmt(E->getArg(I));
1211*67e74705SXin Li Record.AddDeclRef(E->getConstructor());
1212*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1213*67e74705SXin Li Record.push_back(E->isElidable());
1214*67e74705SXin Li Record.push_back(E->hadMultipleCandidates());
1215*67e74705SXin Li Record.push_back(E->isListInitialization());
1216*67e74705SXin Li Record.push_back(E->isStdInitListInitialization());
1217*67e74705SXin Li Record.push_back(E->requiresZeroInitialization());
1218*67e74705SXin Li Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
1219*67e74705SXin Li Record.AddSourceRange(E->getParenOrBraceRange());
1220*67e74705SXin Li Code = serialization::EXPR_CXX_CONSTRUCT;
1221*67e74705SXin Li }
1222*67e74705SXin Li
VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)1223*67e74705SXin Li void ASTStmtWriter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
1224*67e74705SXin Li VisitExpr(E);
1225*67e74705SXin Li Record.AddDeclRef(E->getConstructor());
1226*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1227*67e74705SXin Li Record.push_back(E->constructsVBase());
1228*67e74705SXin Li Record.push_back(E->inheritedFromVBase());
1229*67e74705SXin Li Code = serialization::EXPR_CXX_INHERITED_CTOR_INIT;
1230*67e74705SXin Li }
1231*67e74705SXin Li
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)1232*67e74705SXin Li void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1233*67e74705SXin Li VisitCXXConstructExpr(E);
1234*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1235*67e74705SXin Li Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
1236*67e74705SXin Li }
1237*67e74705SXin Li
VisitLambdaExpr(LambdaExpr * E)1238*67e74705SXin Li void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
1239*67e74705SXin Li VisitExpr(E);
1240*67e74705SXin Li Record.push_back(E->NumCaptures);
1241*67e74705SXin Li unsigned NumArrayIndexVars = 0;
1242*67e74705SXin Li if (E->HasArrayIndexVars)
1243*67e74705SXin Li NumArrayIndexVars = E->getArrayIndexStarts()[E->NumCaptures];
1244*67e74705SXin Li Record.push_back(NumArrayIndexVars);
1245*67e74705SXin Li Record.AddSourceRange(E->IntroducerRange);
1246*67e74705SXin Li Record.push_back(E->CaptureDefault); // FIXME: stable encoding
1247*67e74705SXin Li Record.AddSourceLocation(E->CaptureDefaultLoc);
1248*67e74705SXin Li Record.push_back(E->ExplicitParams);
1249*67e74705SXin Li Record.push_back(E->ExplicitResultType);
1250*67e74705SXin Li Record.AddSourceLocation(E->ClosingBrace);
1251*67e74705SXin Li
1252*67e74705SXin Li // Add capture initializers.
1253*67e74705SXin Li for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1254*67e74705SXin Li CEnd = E->capture_init_end();
1255*67e74705SXin Li C != CEnd; ++C) {
1256*67e74705SXin Li Record.AddStmt(*C);
1257*67e74705SXin Li }
1258*67e74705SXin Li
1259*67e74705SXin Li // Add array index variables, if any.
1260*67e74705SXin Li if (NumArrayIndexVars) {
1261*67e74705SXin Li Record.append(E->getArrayIndexStarts(),
1262*67e74705SXin Li E->getArrayIndexStarts() + E->NumCaptures + 1);
1263*67e74705SXin Li VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1264*67e74705SXin Li for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1265*67e74705SXin Li Record.AddDeclRef(ArrayIndexVars[I]);
1266*67e74705SXin Li }
1267*67e74705SXin Li
1268*67e74705SXin Li Code = serialization::EXPR_LAMBDA;
1269*67e74705SXin Li }
1270*67e74705SXin Li
VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)1271*67e74705SXin Li void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
1272*67e74705SXin Li VisitExpr(E);
1273*67e74705SXin Li Record.AddStmt(E->getSubExpr());
1274*67e74705SXin Li Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;
1275*67e74705SXin Li }
1276*67e74705SXin Li
VisitCXXNamedCastExpr(CXXNamedCastExpr * E)1277*67e74705SXin Li void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1278*67e74705SXin Li VisitExplicitCastExpr(E);
1279*67e74705SXin Li Record.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()));
1280*67e74705SXin Li Record.AddSourceRange(E->getAngleBrackets());
1281*67e74705SXin Li }
1282*67e74705SXin Li
VisitCXXStaticCastExpr(CXXStaticCastExpr * E)1283*67e74705SXin Li void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1284*67e74705SXin Li VisitCXXNamedCastExpr(E);
1285*67e74705SXin Li Code = serialization::EXPR_CXX_STATIC_CAST;
1286*67e74705SXin Li }
1287*67e74705SXin Li
VisitCXXDynamicCastExpr(CXXDynamicCastExpr * E)1288*67e74705SXin Li void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1289*67e74705SXin Li VisitCXXNamedCastExpr(E);
1290*67e74705SXin Li Code = serialization::EXPR_CXX_DYNAMIC_CAST;
1291*67e74705SXin Li }
1292*67e74705SXin Li
VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)1293*67e74705SXin Li void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1294*67e74705SXin Li VisitCXXNamedCastExpr(E);
1295*67e74705SXin Li Code = serialization::EXPR_CXX_REINTERPRET_CAST;
1296*67e74705SXin Li }
1297*67e74705SXin Li
VisitCXXConstCastExpr(CXXConstCastExpr * E)1298*67e74705SXin Li void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1299*67e74705SXin Li VisitCXXNamedCastExpr(E);
1300*67e74705SXin Li Code = serialization::EXPR_CXX_CONST_CAST;
1301*67e74705SXin Li }
1302*67e74705SXin Li
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)1303*67e74705SXin Li void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1304*67e74705SXin Li VisitExplicitCastExpr(E);
1305*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
1306*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
1307*67e74705SXin Li Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
1308*67e74705SXin Li }
1309*67e74705SXin Li
VisitUserDefinedLiteral(UserDefinedLiteral * E)1310*67e74705SXin Li void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1311*67e74705SXin Li VisitCallExpr(E);
1312*67e74705SXin Li Record.AddSourceLocation(E->UDSuffixLoc);
1313*67e74705SXin Li Code = serialization::EXPR_USER_DEFINED_LITERAL;
1314*67e74705SXin Li }
1315*67e74705SXin Li
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)1316*67e74705SXin Li void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1317*67e74705SXin Li VisitExpr(E);
1318*67e74705SXin Li Record.push_back(E->getValue());
1319*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1320*67e74705SXin Li Code = serialization::EXPR_CXX_BOOL_LITERAL;
1321*67e74705SXin Li }
1322*67e74705SXin Li
VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)1323*67e74705SXin Li void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1324*67e74705SXin Li VisitExpr(E);
1325*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1326*67e74705SXin Li Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
1327*67e74705SXin Li }
1328*67e74705SXin Li
VisitCXXTypeidExpr(CXXTypeidExpr * E)1329*67e74705SXin Li void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1330*67e74705SXin Li VisitExpr(E);
1331*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1332*67e74705SXin Li if (E->isTypeOperand()) {
1333*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
1334*67e74705SXin Li Code = serialization::EXPR_CXX_TYPEID_TYPE;
1335*67e74705SXin Li } else {
1336*67e74705SXin Li Record.AddStmt(E->getExprOperand());
1337*67e74705SXin Li Code = serialization::EXPR_CXX_TYPEID_EXPR;
1338*67e74705SXin Li }
1339*67e74705SXin Li }
1340*67e74705SXin Li
VisitCXXThisExpr(CXXThisExpr * E)1341*67e74705SXin Li void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
1342*67e74705SXin Li VisitExpr(E);
1343*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1344*67e74705SXin Li Record.push_back(E->isImplicit());
1345*67e74705SXin Li Code = serialization::EXPR_CXX_THIS;
1346*67e74705SXin Li }
1347*67e74705SXin Li
VisitCXXThrowExpr(CXXThrowExpr * E)1348*67e74705SXin Li void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
1349*67e74705SXin Li VisitExpr(E);
1350*67e74705SXin Li Record.AddSourceLocation(E->getThrowLoc());
1351*67e74705SXin Li Record.AddStmt(E->getSubExpr());
1352*67e74705SXin Li Record.push_back(E->isThrownVariableInScope());
1353*67e74705SXin Li Code = serialization::EXPR_CXX_THROW;
1354*67e74705SXin Li }
1355*67e74705SXin Li
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * E)1356*67e74705SXin Li void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1357*67e74705SXin Li VisitExpr(E);
1358*67e74705SXin Li Record.AddDeclRef(E->getParam());
1359*67e74705SXin Li Record.AddSourceLocation(E->getUsedLocation());
1360*67e74705SXin Li Code = serialization::EXPR_CXX_DEFAULT_ARG;
1361*67e74705SXin Li }
1362*67e74705SXin Li
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * E)1363*67e74705SXin Li void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
1364*67e74705SXin Li VisitExpr(E);
1365*67e74705SXin Li Record.AddDeclRef(E->getField());
1366*67e74705SXin Li Record.AddSourceLocation(E->getExprLoc());
1367*67e74705SXin Li Code = serialization::EXPR_CXX_DEFAULT_INIT;
1368*67e74705SXin Li }
1369*67e74705SXin Li
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)1370*67e74705SXin Li void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1371*67e74705SXin Li VisitExpr(E);
1372*67e74705SXin Li Record.AddCXXTemporary(E->getTemporary());
1373*67e74705SXin Li Record.AddStmt(E->getSubExpr());
1374*67e74705SXin Li Code = serialization::EXPR_CXX_BIND_TEMPORARY;
1375*67e74705SXin Li }
1376*67e74705SXin Li
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)1377*67e74705SXin Li void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1378*67e74705SXin Li VisitExpr(E);
1379*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1380*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
1381*67e74705SXin Li Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
1382*67e74705SXin Li }
1383*67e74705SXin Li
VisitCXXNewExpr(CXXNewExpr * E)1384*67e74705SXin Li void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1385*67e74705SXin Li VisitExpr(E);
1386*67e74705SXin Li Record.push_back(E->isGlobalNew());
1387*67e74705SXin Li Record.push_back(E->isArray());
1388*67e74705SXin Li Record.push_back(E->doesUsualArrayDeleteWantSize());
1389*67e74705SXin Li Record.push_back(E->getNumPlacementArgs());
1390*67e74705SXin Li Record.push_back(E->StoredInitializationStyle);
1391*67e74705SXin Li Record.AddDeclRef(E->getOperatorNew());
1392*67e74705SXin Li Record.AddDeclRef(E->getOperatorDelete());
1393*67e74705SXin Li Record.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo());
1394*67e74705SXin Li Record.AddSourceRange(E->getTypeIdParens());
1395*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1396*67e74705SXin Li Record.AddSourceRange(E->getDirectInitRange());
1397*67e74705SXin Li for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
1398*67e74705SXin Li I != e; ++I)
1399*67e74705SXin Li Record.AddStmt(*I);
1400*67e74705SXin Li
1401*67e74705SXin Li Code = serialization::EXPR_CXX_NEW;
1402*67e74705SXin Li }
1403*67e74705SXin Li
VisitCXXDeleteExpr(CXXDeleteExpr * E)1404*67e74705SXin Li void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1405*67e74705SXin Li VisitExpr(E);
1406*67e74705SXin Li Record.push_back(E->isGlobalDelete());
1407*67e74705SXin Li Record.push_back(E->isArrayForm());
1408*67e74705SXin Li Record.push_back(E->isArrayFormAsWritten());
1409*67e74705SXin Li Record.push_back(E->doesUsualArrayDeleteWantSize());
1410*67e74705SXin Li Record.AddDeclRef(E->getOperatorDelete());
1411*67e74705SXin Li Record.AddStmt(E->getArgument());
1412*67e74705SXin Li Record.AddSourceLocation(E->getSourceRange().getBegin());
1413*67e74705SXin Li
1414*67e74705SXin Li Code = serialization::EXPR_CXX_DELETE;
1415*67e74705SXin Li }
1416*67e74705SXin Li
VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)1417*67e74705SXin Li void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1418*67e74705SXin Li VisitExpr(E);
1419*67e74705SXin Li
1420*67e74705SXin Li Record.AddStmt(E->getBase());
1421*67e74705SXin Li Record.push_back(E->isArrow());
1422*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
1423*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1424*67e74705SXin Li Record.AddTypeSourceInfo(E->getScopeTypeInfo());
1425*67e74705SXin Li Record.AddSourceLocation(E->getColonColonLoc());
1426*67e74705SXin Li Record.AddSourceLocation(E->getTildeLoc());
1427*67e74705SXin Li
1428*67e74705SXin Li // PseudoDestructorTypeStorage.
1429*67e74705SXin Li Record.AddIdentifierRef(E->getDestroyedTypeIdentifier());
1430*67e74705SXin Li if (E->getDestroyedTypeIdentifier())
1431*67e74705SXin Li Record.AddSourceLocation(E->getDestroyedTypeLoc());
1432*67e74705SXin Li else
1433*67e74705SXin Li Record.AddTypeSourceInfo(E->getDestroyedTypeInfo());
1434*67e74705SXin Li
1435*67e74705SXin Li Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
1436*67e74705SXin Li }
1437*67e74705SXin Li
VisitExprWithCleanups(ExprWithCleanups * E)1438*67e74705SXin Li void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
1439*67e74705SXin Li VisitExpr(E);
1440*67e74705SXin Li Record.push_back(E->getNumObjects());
1441*67e74705SXin Li for (unsigned i = 0, e = E->getNumObjects(); i != e; ++i)
1442*67e74705SXin Li Record.AddDeclRef(E->getObject(i));
1443*67e74705SXin Li
1444*67e74705SXin Li Record.push_back(E->cleanupsHaveSideEffects());
1445*67e74705SXin Li Record.AddStmt(E->getSubExpr());
1446*67e74705SXin Li Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
1447*67e74705SXin Li }
1448*67e74705SXin Li
1449*67e74705SXin Li void
VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)1450*67e74705SXin Li ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1451*67e74705SXin Li VisitExpr(E);
1452*67e74705SXin Li
1453*67e74705SXin Li // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1454*67e74705SXin Li // emitted first.
1455*67e74705SXin Li
1456*67e74705SXin Li Record.push_back(E->HasTemplateKWAndArgsInfo);
1457*67e74705SXin Li if (E->HasTemplateKWAndArgsInfo) {
1458*67e74705SXin Li const ASTTemplateKWAndArgsInfo &ArgInfo =
1459*67e74705SXin Li *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
1460*67e74705SXin Li Record.push_back(ArgInfo.NumTemplateArgs);
1461*67e74705SXin Li AddTemplateKWAndArgsInfo(ArgInfo,
1462*67e74705SXin Li E->getTrailingObjects<TemplateArgumentLoc>());
1463*67e74705SXin Li }
1464*67e74705SXin Li
1465*67e74705SXin Li if (!E->isImplicitAccess())
1466*67e74705SXin Li Record.AddStmt(E->getBase());
1467*67e74705SXin Li else
1468*67e74705SXin Li Record.AddStmt(nullptr);
1469*67e74705SXin Li Record.AddTypeRef(E->getBaseType());
1470*67e74705SXin Li Record.push_back(E->isArrow());
1471*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
1472*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1473*67e74705SXin Li Record.AddDeclRef(E->getFirstQualifierFoundInScope());
1474*67e74705SXin Li Record.AddDeclarationNameInfo(E->MemberNameInfo);
1475*67e74705SXin Li Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1476*67e74705SXin Li }
1477*67e74705SXin Li
1478*67e74705SXin Li void
VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)1479*67e74705SXin Li ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1480*67e74705SXin Li VisitExpr(E);
1481*67e74705SXin Li
1482*67e74705SXin Li // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1483*67e74705SXin Li // emitted first.
1484*67e74705SXin Li
1485*67e74705SXin Li Record.push_back(E->HasTemplateKWAndArgsInfo);
1486*67e74705SXin Li if (E->HasTemplateKWAndArgsInfo) {
1487*67e74705SXin Li const ASTTemplateKWAndArgsInfo &ArgInfo =
1488*67e74705SXin Li *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
1489*67e74705SXin Li Record.push_back(ArgInfo.NumTemplateArgs);
1490*67e74705SXin Li AddTemplateKWAndArgsInfo(ArgInfo,
1491*67e74705SXin Li E->getTrailingObjects<TemplateArgumentLoc>());
1492*67e74705SXin Li }
1493*67e74705SXin Li
1494*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1495*67e74705SXin Li Record.AddDeclarationNameInfo(E->NameInfo);
1496*67e74705SXin Li Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
1497*67e74705SXin Li }
1498*67e74705SXin Li
1499*67e74705SXin Li void
VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)1500*67e74705SXin Li ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1501*67e74705SXin Li VisitExpr(E);
1502*67e74705SXin Li Record.push_back(E->arg_size());
1503*67e74705SXin Li for (CXXUnresolvedConstructExpr::arg_iterator
1504*67e74705SXin Li ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1505*67e74705SXin Li Record.AddStmt(*ArgI);
1506*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeSourceInfo());
1507*67e74705SXin Li Record.AddSourceLocation(E->getLParenLoc());
1508*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
1509*67e74705SXin Li Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1510*67e74705SXin Li }
1511*67e74705SXin Li
VisitOverloadExpr(OverloadExpr * E)1512*67e74705SXin Li void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1513*67e74705SXin Li VisitExpr(E);
1514*67e74705SXin Li
1515*67e74705SXin Li // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1516*67e74705SXin Li // emitted first.
1517*67e74705SXin Li
1518*67e74705SXin Li Record.push_back(E->HasTemplateKWAndArgsInfo);
1519*67e74705SXin Li if (E->HasTemplateKWAndArgsInfo) {
1520*67e74705SXin Li const ASTTemplateKWAndArgsInfo &ArgInfo =
1521*67e74705SXin Li *E->getTrailingASTTemplateKWAndArgsInfo();
1522*67e74705SXin Li Record.push_back(ArgInfo.NumTemplateArgs);
1523*67e74705SXin Li AddTemplateKWAndArgsInfo(ArgInfo, E->getTrailingTemplateArgumentLoc());
1524*67e74705SXin Li }
1525*67e74705SXin Li
1526*67e74705SXin Li Record.push_back(E->getNumDecls());
1527*67e74705SXin Li for (OverloadExpr::decls_iterator
1528*67e74705SXin Li OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
1529*67e74705SXin Li Record.AddDeclRef(OvI.getDecl());
1530*67e74705SXin Li Record.push_back(OvI.getAccess());
1531*67e74705SXin Li }
1532*67e74705SXin Li
1533*67e74705SXin Li Record.AddDeclarationNameInfo(E->NameInfo);
1534*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1535*67e74705SXin Li }
1536*67e74705SXin Li
VisitUnresolvedMemberExpr(UnresolvedMemberExpr * E)1537*67e74705SXin Li void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1538*67e74705SXin Li VisitOverloadExpr(E);
1539*67e74705SXin Li Record.push_back(E->isArrow());
1540*67e74705SXin Li Record.push_back(E->hasUnresolvedUsing());
1541*67e74705SXin Li Record.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);
1542*67e74705SXin Li Record.AddTypeRef(E->getBaseType());
1543*67e74705SXin Li Record.AddSourceLocation(E->getOperatorLoc());
1544*67e74705SXin Li Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
1545*67e74705SXin Li }
1546*67e74705SXin Li
VisitUnresolvedLookupExpr(UnresolvedLookupExpr * E)1547*67e74705SXin Li void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1548*67e74705SXin Li VisitOverloadExpr(E);
1549*67e74705SXin Li Record.push_back(E->requiresADL());
1550*67e74705SXin Li Record.push_back(E->isOverloaded());
1551*67e74705SXin Li Record.AddDeclRef(E->getNamingClass());
1552*67e74705SXin Li Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
1553*67e74705SXin Li }
1554*67e74705SXin Li
VisitTypeTraitExpr(TypeTraitExpr * E)1555*67e74705SXin Li void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
1556*67e74705SXin Li VisitExpr(E);
1557*67e74705SXin Li Record.push_back(E->TypeTraitExprBits.NumArgs);
1558*67e74705SXin Li Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
1559*67e74705SXin Li Record.push_back(E->TypeTraitExprBits.Value);
1560*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1561*67e74705SXin Li for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1562*67e74705SXin Li Record.AddTypeSourceInfo(E->getArg(I));
1563*67e74705SXin Li Code = serialization::EXPR_TYPE_TRAIT;
1564*67e74705SXin Li }
1565*67e74705SXin Li
VisitArrayTypeTraitExpr(ArrayTypeTraitExpr * E)1566*67e74705SXin Li void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1567*67e74705SXin Li VisitExpr(E);
1568*67e74705SXin Li Record.push_back(E->getTrait());
1569*67e74705SXin Li Record.push_back(E->getValue());
1570*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1571*67e74705SXin Li Record.AddTypeSourceInfo(E->getQueriedTypeSourceInfo());
1572*67e74705SXin Li Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
1573*67e74705SXin Li }
1574*67e74705SXin Li
VisitExpressionTraitExpr(ExpressionTraitExpr * E)1575*67e74705SXin Li void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1576*67e74705SXin Li VisitExpr(E);
1577*67e74705SXin Li Record.push_back(E->getTrait());
1578*67e74705SXin Li Record.push_back(E->getValue());
1579*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1580*67e74705SXin Li Record.AddStmt(E->getQueriedExpression());
1581*67e74705SXin Li Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
1582*67e74705SXin Li }
1583*67e74705SXin Li
VisitCXXNoexceptExpr(CXXNoexceptExpr * E)1584*67e74705SXin Li void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1585*67e74705SXin Li VisitExpr(E);
1586*67e74705SXin Li Record.push_back(E->getValue());
1587*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1588*67e74705SXin Li Record.AddStmt(E->getOperand());
1589*67e74705SXin Li Code = serialization::EXPR_CXX_NOEXCEPT;
1590*67e74705SXin Li }
1591*67e74705SXin Li
VisitPackExpansionExpr(PackExpansionExpr * E)1592*67e74705SXin Li void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
1593*67e74705SXin Li VisitExpr(E);
1594*67e74705SXin Li Record.AddSourceLocation(E->getEllipsisLoc());
1595*67e74705SXin Li Record.push_back(E->NumExpansions);
1596*67e74705SXin Li Record.AddStmt(E->getPattern());
1597*67e74705SXin Li Code = serialization::EXPR_PACK_EXPANSION;
1598*67e74705SXin Li }
1599*67e74705SXin Li
VisitSizeOfPackExpr(SizeOfPackExpr * E)1600*67e74705SXin Li void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1601*67e74705SXin Li VisitExpr(E);
1602*67e74705SXin Li Record.push_back(E->isPartiallySubstituted() ? E->getPartialArguments().size()
1603*67e74705SXin Li : 0);
1604*67e74705SXin Li Record.AddSourceLocation(E->OperatorLoc);
1605*67e74705SXin Li Record.AddSourceLocation(E->PackLoc);
1606*67e74705SXin Li Record.AddSourceLocation(E->RParenLoc);
1607*67e74705SXin Li Record.AddDeclRef(E->Pack);
1608*67e74705SXin Li if (E->isPartiallySubstituted()) {
1609*67e74705SXin Li for (const auto &TA : E->getPartialArguments())
1610*67e74705SXin Li Record.AddTemplateArgument(TA);
1611*67e74705SXin Li } else if (!E->isValueDependent()) {
1612*67e74705SXin Li Record.push_back(E->getPackLength());
1613*67e74705SXin Li }
1614*67e74705SXin Li Code = serialization::EXPR_SIZEOF_PACK;
1615*67e74705SXin Li }
1616*67e74705SXin Li
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)1617*67e74705SXin Li void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
1618*67e74705SXin Li SubstNonTypeTemplateParmExpr *E) {
1619*67e74705SXin Li VisitExpr(E);
1620*67e74705SXin Li Record.AddDeclRef(E->getParameter());
1621*67e74705SXin Li Record.AddSourceLocation(E->getNameLoc());
1622*67e74705SXin Li Record.AddStmt(E->getReplacement());
1623*67e74705SXin Li Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
1624*67e74705SXin Li }
1625*67e74705SXin Li
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)1626*67e74705SXin Li void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
1627*67e74705SXin Li SubstNonTypeTemplateParmPackExpr *E) {
1628*67e74705SXin Li VisitExpr(E);
1629*67e74705SXin Li Record.AddDeclRef(E->getParameterPack());
1630*67e74705SXin Li Record.AddTemplateArgument(E->getArgumentPack());
1631*67e74705SXin Li Record.AddSourceLocation(E->getParameterPackLocation());
1632*67e74705SXin Li Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
1633*67e74705SXin Li }
1634*67e74705SXin Li
VisitFunctionParmPackExpr(FunctionParmPackExpr * E)1635*67e74705SXin Li void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
1636*67e74705SXin Li VisitExpr(E);
1637*67e74705SXin Li Record.push_back(E->getNumExpansions());
1638*67e74705SXin Li Record.AddDeclRef(E->getParameterPack());
1639*67e74705SXin Li Record.AddSourceLocation(E->getParameterPackLocation());
1640*67e74705SXin Li for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
1641*67e74705SXin Li I != End; ++I)
1642*67e74705SXin Li Record.AddDeclRef(*I);
1643*67e74705SXin Li Code = serialization::EXPR_FUNCTION_PARM_PACK;
1644*67e74705SXin Li }
1645*67e74705SXin Li
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)1646*67e74705SXin Li void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1647*67e74705SXin Li VisitExpr(E);
1648*67e74705SXin Li Record.AddStmt(E->getTemporary());
1649*67e74705SXin Li Record.AddDeclRef(E->getExtendingDecl());
1650*67e74705SXin Li Record.push_back(E->getManglingNumber());
1651*67e74705SXin Li Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
1652*67e74705SXin Li }
1653*67e74705SXin Li
VisitCXXFoldExpr(CXXFoldExpr * E)1654*67e74705SXin Li void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {
1655*67e74705SXin Li VisitExpr(E);
1656*67e74705SXin Li Record.AddSourceLocation(E->LParenLoc);
1657*67e74705SXin Li Record.AddSourceLocation(E->EllipsisLoc);
1658*67e74705SXin Li Record.AddSourceLocation(E->RParenLoc);
1659*67e74705SXin Li Record.AddStmt(E->SubExprs[0]);
1660*67e74705SXin Li Record.AddStmt(E->SubExprs[1]);
1661*67e74705SXin Li Record.push_back(E->Opcode);
1662*67e74705SXin Li Code = serialization::EXPR_CXX_FOLD;
1663*67e74705SXin Li }
1664*67e74705SXin Li
VisitOpaqueValueExpr(OpaqueValueExpr * E)1665*67e74705SXin Li void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1666*67e74705SXin Li VisitExpr(E);
1667*67e74705SXin Li Record.AddStmt(E->getSourceExpr());
1668*67e74705SXin Li Record.AddSourceLocation(E->getLocation());
1669*67e74705SXin Li Code = serialization::EXPR_OPAQUE_VALUE;
1670*67e74705SXin Li }
1671*67e74705SXin Li
VisitTypoExpr(TypoExpr * E)1672*67e74705SXin Li void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {
1673*67e74705SXin Li VisitExpr(E);
1674*67e74705SXin Li // TODO: Figure out sane writer behavior for a TypoExpr, if necessary
1675*67e74705SXin Li llvm_unreachable("Cannot write TypoExpr nodes");
1676*67e74705SXin Li }
1677*67e74705SXin Li
1678*67e74705SXin Li //===----------------------------------------------------------------------===//
1679*67e74705SXin Li // CUDA Expressions and Statements.
1680*67e74705SXin Li //===----------------------------------------------------------------------===//
1681*67e74705SXin Li
VisitCUDAKernelCallExpr(CUDAKernelCallExpr * E)1682*67e74705SXin Li void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1683*67e74705SXin Li VisitCallExpr(E);
1684*67e74705SXin Li Record.AddStmt(E->getConfig());
1685*67e74705SXin Li Code = serialization::EXPR_CUDA_KERNEL_CALL;
1686*67e74705SXin Li }
1687*67e74705SXin Li
1688*67e74705SXin Li //===----------------------------------------------------------------------===//
1689*67e74705SXin Li // OpenCL Expressions and Statements.
1690*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitAsTypeExpr(AsTypeExpr * E)1691*67e74705SXin Li void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
1692*67e74705SXin Li VisitExpr(E);
1693*67e74705SXin Li Record.AddSourceLocation(E->getBuiltinLoc());
1694*67e74705SXin Li Record.AddSourceLocation(E->getRParenLoc());
1695*67e74705SXin Li Record.AddStmt(E->getSrcExpr());
1696*67e74705SXin Li Code = serialization::EXPR_ASTYPE;
1697*67e74705SXin Li }
1698*67e74705SXin Li
1699*67e74705SXin Li //===----------------------------------------------------------------------===//
1700*67e74705SXin Li // Microsoft Expressions and Statements.
1701*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitMSPropertyRefExpr(MSPropertyRefExpr * E)1702*67e74705SXin Li void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
1703*67e74705SXin Li VisitExpr(E);
1704*67e74705SXin Li Record.push_back(E->isArrow());
1705*67e74705SXin Li Record.AddStmt(E->getBaseExpr());
1706*67e74705SXin Li Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
1707*67e74705SXin Li Record.AddSourceLocation(E->getMemberLoc());
1708*67e74705SXin Li Record.AddDeclRef(E->getPropertyDecl());
1709*67e74705SXin Li Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;
1710*67e74705SXin Li }
1711*67e74705SXin Li
VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)1712*67e74705SXin Li void ASTStmtWriter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {
1713*67e74705SXin Li VisitExpr(E);
1714*67e74705SXin Li Record.AddStmt(E->getBase());
1715*67e74705SXin Li Record.AddStmt(E->getIdx());
1716*67e74705SXin Li Record.AddSourceLocation(E->getRBracketLoc());
1717*67e74705SXin Li Code = serialization::EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR;
1718*67e74705SXin Li }
1719*67e74705SXin Li
VisitCXXUuidofExpr(CXXUuidofExpr * E)1720*67e74705SXin Li void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1721*67e74705SXin Li VisitExpr(E);
1722*67e74705SXin Li Record.AddSourceRange(E->getSourceRange());
1723*67e74705SXin Li Record.AddString(E->getUuidStr());
1724*67e74705SXin Li if (E->isTypeOperand()) {
1725*67e74705SXin Li Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
1726*67e74705SXin Li Code = serialization::EXPR_CXX_UUIDOF_TYPE;
1727*67e74705SXin Li } else {
1728*67e74705SXin Li Record.AddStmt(E->getExprOperand());
1729*67e74705SXin Li Code = serialization::EXPR_CXX_UUIDOF_EXPR;
1730*67e74705SXin Li }
1731*67e74705SXin Li }
1732*67e74705SXin Li
VisitSEHExceptStmt(SEHExceptStmt * S)1733*67e74705SXin Li void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
1734*67e74705SXin Li VisitStmt(S);
1735*67e74705SXin Li Record.AddSourceLocation(S->getExceptLoc());
1736*67e74705SXin Li Record.AddStmt(S->getFilterExpr());
1737*67e74705SXin Li Record.AddStmt(S->getBlock());
1738*67e74705SXin Li Code = serialization::STMT_SEH_EXCEPT;
1739*67e74705SXin Li }
1740*67e74705SXin Li
VisitSEHFinallyStmt(SEHFinallyStmt * S)1741*67e74705SXin Li void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1742*67e74705SXin Li VisitStmt(S);
1743*67e74705SXin Li Record.AddSourceLocation(S->getFinallyLoc());
1744*67e74705SXin Li Record.AddStmt(S->getBlock());
1745*67e74705SXin Li Code = serialization::STMT_SEH_FINALLY;
1746*67e74705SXin Li }
1747*67e74705SXin Li
VisitSEHTryStmt(SEHTryStmt * S)1748*67e74705SXin Li void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
1749*67e74705SXin Li VisitStmt(S);
1750*67e74705SXin Li Record.push_back(S->getIsCXXTry());
1751*67e74705SXin Li Record.AddSourceLocation(S->getTryLoc());
1752*67e74705SXin Li Record.AddStmt(S->getTryBlock());
1753*67e74705SXin Li Record.AddStmt(S->getHandler());
1754*67e74705SXin Li Code = serialization::STMT_SEH_TRY;
1755*67e74705SXin Li }
1756*67e74705SXin Li
VisitSEHLeaveStmt(SEHLeaveStmt * S)1757*67e74705SXin Li void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
1758*67e74705SXin Li VisitStmt(S);
1759*67e74705SXin Li Record.AddSourceLocation(S->getLeaveLoc());
1760*67e74705SXin Li Code = serialization::STMT_SEH_LEAVE;
1761*67e74705SXin Li }
1762*67e74705SXin Li
1763*67e74705SXin Li //===----------------------------------------------------------------------===//
1764*67e74705SXin Li // OpenMP Clauses.
1765*67e74705SXin Li //===----------------------------------------------------------------------===//
1766*67e74705SXin Li
1767*67e74705SXin Li namespace clang {
1768*67e74705SXin Li class OMPClauseWriter : public OMPClauseVisitor<OMPClauseWriter> {
1769*67e74705SXin Li ASTRecordWriter &Record;
1770*67e74705SXin Li public:
OMPClauseWriter(ASTRecordWriter & Record)1771*67e74705SXin Li OMPClauseWriter(ASTRecordWriter &Record) : Record(Record) {}
1772*67e74705SXin Li #define OPENMP_CLAUSE(Name, Class) \
1773*67e74705SXin Li void Visit##Class(Class *S);
1774*67e74705SXin Li #include "clang/Basic/OpenMPKinds.def"
1775*67e74705SXin Li void writeClause(OMPClause *C);
1776*67e74705SXin Li void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
1777*67e74705SXin Li void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
1778*67e74705SXin Li };
1779*67e74705SXin Li }
1780*67e74705SXin Li
writeClause(OMPClause * C)1781*67e74705SXin Li void OMPClauseWriter::writeClause(OMPClause *C) {
1782*67e74705SXin Li Record.push_back(C->getClauseKind());
1783*67e74705SXin Li Visit(C);
1784*67e74705SXin Li Record.AddSourceLocation(C->getLocStart());
1785*67e74705SXin Li Record.AddSourceLocation(C->getLocEnd());
1786*67e74705SXin Li }
1787*67e74705SXin Li
VisitOMPClauseWithPreInit(OMPClauseWithPreInit * C)1788*67e74705SXin Li void OMPClauseWriter::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
1789*67e74705SXin Li Record.AddStmt(C->getPreInitStmt());
1790*67e74705SXin Li }
1791*67e74705SXin Li
VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate * C)1792*67e74705SXin Li void OMPClauseWriter::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
1793*67e74705SXin Li VisitOMPClauseWithPreInit(C);
1794*67e74705SXin Li Record.AddStmt(C->getPostUpdateExpr());
1795*67e74705SXin Li }
1796*67e74705SXin Li
VisitOMPIfClause(OMPIfClause * C)1797*67e74705SXin Li void OMPClauseWriter::VisitOMPIfClause(OMPIfClause *C) {
1798*67e74705SXin Li Record.push_back(C->getNameModifier());
1799*67e74705SXin Li Record.AddSourceLocation(C->getNameModifierLoc());
1800*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
1801*67e74705SXin Li Record.AddStmt(C->getCondition());
1802*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1803*67e74705SXin Li }
1804*67e74705SXin Li
VisitOMPFinalClause(OMPFinalClause * C)1805*67e74705SXin Li void OMPClauseWriter::VisitOMPFinalClause(OMPFinalClause *C) {
1806*67e74705SXin Li Record.AddStmt(C->getCondition());
1807*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1808*67e74705SXin Li }
1809*67e74705SXin Li
VisitOMPNumThreadsClause(OMPNumThreadsClause * C)1810*67e74705SXin Li void OMPClauseWriter::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
1811*67e74705SXin Li Record.AddStmt(C->getNumThreads());
1812*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1813*67e74705SXin Li }
1814*67e74705SXin Li
VisitOMPSafelenClause(OMPSafelenClause * C)1815*67e74705SXin Li void OMPClauseWriter::VisitOMPSafelenClause(OMPSafelenClause *C) {
1816*67e74705SXin Li Record.AddStmt(C->getSafelen());
1817*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1818*67e74705SXin Li }
1819*67e74705SXin Li
VisitOMPSimdlenClause(OMPSimdlenClause * C)1820*67e74705SXin Li void OMPClauseWriter::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
1821*67e74705SXin Li Record.AddStmt(C->getSimdlen());
1822*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1823*67e74705SXin Li }
1824*67e74705SXin Li
VisitOMPCollapseClause(OMPCollapseClause * C)1825*67e74705SXin Li void OMPClauseWriter::VisitOMPCollapseClause(OMPCollapseClause *C) {
1826*67e74705SXin Li Record.AddStmt(C->getNumForLoops());
1827*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1828*67e74705SXin Li }
1829*67e74705SXin Li
VisitOMPDefaultClause(OMPDefaultClause * C)1830*67e74705SXin Li void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) {
1831*67e74705SXin Li Record.push_back(C->getDefaultKind());
1832*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1833*67e74705SXin Li Record.AddSourceLocation(C->getDefaultKindKwLoc());
1834*67e74705SXin Li }
1835*67e74705SXin Li
VisitOMPProcBindClause(OMPProcBindClause * C)1836*67e74705SXin Li void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *C) {
1837*67e74705SXin Li Record.push_back(C->getProcBindKind());
1838*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1839*67e74705SXin Li Record.AddSourceLocation(C->getProcBindKindKwLoc());
1840*67e74705SXin Li }
1841*67e74705SXin Li
VisitOMPScheduleClause(OMPScheduleClause * C)1842*67e74705SXin Li void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *C) {
1843*67e74705SXin Li VisitOMPClauseWithPreInit(C);
1844*67e74705SXin Li Record.push_back(C->getScheduleKind());
1845*67e74705SXin Li Record.push_back(C->getFirstScheduleModifier());
1846*67e74705SXin Li Record.push_back(C->getSecondScheduleModifier());
1847*67e74705SXin Li Record.AddStmt(C->getChunkSize());
1848*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1849*67e74705SXin Li Record.AddSourceLocation(C->getFirstScheduleModifierLoc());
1850*67e74705SXin Li Record.AddSourceLocation(C->getSecondScheduleModifierLoc());
1851*67e74705SXin Li Record.AddSourceLocation(C->getScheduleKindLoc());
1852*67e74705SXin Li Record.AddSourceLocation(C->getCommaLoc());
1853*67e74705SXin Li }
1854*67e74705SXin Li
VisitOMPOrderedClause(OMPOrderedClause * C)1855*67e74705SXin Li void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *C) {
1856*67e74705SXin Li Record.AddStmt(C->getNumForLoops());
1857*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1858*67e74705SXin Li }
1859*67e74705SXin Li
VisitOMPNowaitClause(OMPNowaitClause *)1860*67e74705SXin Li void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *) {}
1861*67e74705SXin Li
VisitOMPUntiedClause(OMPUntiedClause *)1862*67e74705SXin Li void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
1863*67e74705SXin Li
VisitOMPMergeableClause(OMPMergeableClause *)1864*67e74705SXin Li void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
1865*67e74705SXin Li
VisitOMPReadClause(OMPReadClause *)1866*67e74705SXin Li void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
1867*67e74705SXin Li
VisitOMPWriteClause(OMPWriteClause *)1868*67e74705SXin Li void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
1869*67e74705SXin Li
VisitOMPUpdateClause(OMPUpdateClause *)1870*67e74705SXin Li void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *) {}
1871*67e74705SXin Li
VisitOMPCaptureClause(OMPCaptureClause *)1872*67e74705SXin Li void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
1873*67e74705SXin Li
VisitOMPSeqCstClause(OMPSeqCstClause *)1874*67e74705SXin Li void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
1875*67e74705SXin Li
VisitOMPThreadsClause(OMPThreadsClause *)1876*67e74705SXin Li void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
1877*67e74705SXin Li
VisitOMPSIMDClause(OMPSIMDClause *)1878*67e74705SXin Li void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
1879*67e74705SXin Li
VisitOMPNogroupClause(OMPNogroupClause *)1880*67e74705SXin Li void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
1881*67e74705SXin Li
VisitOMPPrivateClause(OMPPrivateClause * C)1882*67e74705SXin Li void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) {
1883*67e74705SXin Li Record.push_back(C->varlist_size());
1884*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1885*67e74705SXin Li for (auto *VE : C->varlists()) {
1886*67e74705SXin Li Record.AddStmt(VE);
1887*67e74705SXin Li }
1888*67e74705SXin Li for (auto *VE : C->private_copies()) {
1889*67e74705SXin Li Record.AddStmt(VE);
1890*67e74705SXin Li }
1891*67e74705SXin Li }
1892*67e74705SXin Li
VisitOMPFirstprivateClause(OMPFirstprivateClause * C)1893*67e74705SXin Li void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
1894*67e74705SXin Li Record.push_back(C->varlist_size());
1895*67e74705SXin Li VisitOMPClauseWithPreInit(C);
1896*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1897*67e74705SXin Li for (auto *VE : C->varlists()) {
1898*67e74705SXin Li Record.AddStmt(VE);
1899*67e74705SXin Li }
1900*67e74705SXin Li for (auto *VE : C->private_copies()) {
1901*67e74705SXin Li Record.AddStmt(VE);
1902*67e74705SXin Li }
1903*67e74705SXin Li for (auto *VE : C->inits()) {
1904*67e74705SXin Li Record.AddStmt(VE);
1905*67e74705SXin Li }
1906*67e74705SXin Li }
1907*67e74705SXin Li
VisitOMPLastprivateClause(OMPLastprivateClause * C)1908*67e74705SXin Li void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
1909*67e74705SXin Li Record.push_back(C->varlist_size());
1910*67e74705SXin Li VisitOMPClauseWithPostUpdate(C);
1911*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1912*67e74705SXin Li for (auto *VE : C->varlists())
1913*67e74705SXin Li Record.AddStmt(VE);
1914*67e74705SXin Li for (auto *E : C->private_copies())
1915*67e74705SXin Li Record.AddStmt(E);
1916*67e74705SXin Li for (auto *E : C->source_exprs())
1917*67e74705SXin Li Record.AddStmt(E);
1918*67e74705SXin Li for (auto *E : C->destination_exprs())
1919*67e74705SXin Li Record.AddStmt(E);
1920*67e74705SXin Li for (auto *E : C->assignment_ops())
1921*67e74705SXin Li Record.AddStmt(E);
1922*67e74705SXin Li }
1923*67e74705SXin Li
VisitOMPSharedClause(OMPSharedClause * C)1924*67e74705SXin Li void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *C) {
1925*67e74705SXin Li Record.push_back(C->varlist_size());
1926*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1927*67e74705SXin Li for (auto *VE : C->varlists())
1928*67e74705SXin Li Record.AddStmt(VE);
1929*67e74705SXin Li }
1930*67e74705SXin Li
VisitOMPReductionClause(OMPReductionClause * C)1931*67e74705SXin Li void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *C) {
1932*67e74705SXin Li Record.push_back(C->varlist_size());
1933*67e74705SXin Li VisitOMPClauseWithPostUpdate(C);
1934*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1935*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
1936*67e74705SXin Li Record.AddNestedNameSpecifierLoc(C->getQualifierLoc());
1937*67e74705SXin Li Record.AddDeclarationNameInfo(C->getNameInfo());
1938*67e74705SXin Li for (auto *VE : C->varlists())
1939*67e74705SXin Li Record.AddStmt(VE);
1940*67e74705SXin Li for (auto *VE : C->privates())
1941*67e74705SXin Li Record.AddStmt(VE);
1942*67e74705SXin Li for (auto *E : C->lhs_exprs())
1943*67e74705SXin Li Record.AddStmt(E);
1944*67e74705SXin Li for (auto *E : C->rhs_exprs())
1945*67e74705SXin Li Record.AddStmt(E);
1946*67e74705SXin Li for (auto *E : C->reduction_ops())
1947*67e74705SXin Li Record.AddStmt(E);
1948*67e74705SXin Li }
1949*67e74705SXin Li
VisitOMPLinearClause(OMPLinearClause * C)1950*67e74705SXin Li void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *C) {
1951*67e74705SXin Li Record.push_back(C->varlist_size());
1952*67e74705SXin Li VisitOMPClauseWithPostUpdate(C);
1953*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1954*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
1955*67e74705SXin Li Record.push_back(C->getModifier());
1956*67e74705SXin Li Record.AddSourceLocation(C->getModifierLoc());
1957*67e74705SXin Li for (auto *VE : C->varlists()) {
1958*67e74705SXin Li Record.AddStmt(VE);
1959*67e74705SXin Li }
1960*67e74705SXin Li for (auto *VE : C->privates()) {
1961*67e74705SXin Li Record.AddStmt(VE);
1962*67e74705SXin Li }
1963*67e74705SXin Li for (auto *VE : C->inits()) {
1964*67e74705SXin Li Record.AddStmt(VE);
1965*67e74705SXin Li }
1966*67e74705SXin Li for (auto *VE : C->updates()) {
1967*67e74705SXin Li Record.AddStmt(VE);
1968*67e74705SXin Li }
1969*67e74705SXin Li for (auto *VE : C->finals()) {
1970*67e74705SXin Li Record.AddStmt(VE);
1971*67e74705SXin Li }
1972*67e74705SXin Li Record.AddStmt(C->getStep());
1973*67e74705SXin Li Record.AddStmt(C->getCalcStep());
1974*67e74705SXin Li }
1975*67e74705SXin Li
VisitOMPAlignedClause(OMPAlignedClause * C)1976*67e74705SXin Li void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *C) {
1977*67e74705SXin Li Record.push_back(C->varlist_size());
1978*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1979*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
1980*67e74705SXin Li for (auto *VE : C->varlists())
1981*67e74705SXin Li Record.AddStmt(VE);
1982*67e74705SXin Li Record.AddStmt(C->getAlignment());
1983*67e74705SXin Li }
1984*67e74705SXin Li
VisitOMPCopyinClause(OMPCopyinClause * C)1985*67e74705SXin Li void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *C) {
1986*67e74705SXin Li Record.push_back(C->varlist_size());
1987*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
1988*67e74705SXin Li for (auto *VE : C->varlists())
1989*67e74705SXin Li Record.AddStmt(VE);
1990*67e74705SXin Li for (auto *E : C->source_exprs())
1991*67e74705SXin Li Record.AddStmt(E);
1992*67e74705SXin Li for (auto *E : C->destination_exprs())
1993*67e74705SXin Li Record.AddStmt(E);
1994*67e74705SXin Li for (auto *E : C->assignment_ops())
1995*67e74705SXin Li Record.AddStmt(E);
1996*67e74705SXin Li }
1997*67e74705SXin Li
VisitOMPCopyprivateClause(OMPCopyprivateClause * C)1998*67e74705SXin Li void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
1999*67e74705SXin Li Record.push_back(C->varlist_size());
2000*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2001*67e74705SXin Li for (auto *VE : C->varlists())
2002*67e74705SXin Li Record.AddStmt(VE);
2003*67e74705SXin Li for (auto *E : C->source_exprs())
2004*67e74705SXin Li Record.AddStmt(E);
2005*67e74705SXin Li for (auto *E : C->destination_exprs())
2006*67e74705SXin Li Record.AddStmt(E);
2007*67e74705SXin Li for (auto *E : C->assignment_ops())
2008*67e74705SXin Li Record.AddStmt(E);
2009*67e74705SXin Li }
2010*67e74705SXin Li
VisitOMPFlushClause(OMPFlushClause * C)2011*67e74705SXin Li void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *C) {
2012*67e74705SXin Li Record.push_back(C->varlist_size());
2013*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2014*67e74705SXin Li for (auto *VE : C->varlists())
2015*67e74705SXin Li Record.AddStmt(VE);
2016*67e74705SXin Li }
2017*67e74705SXin Li
VisitOMPDependClause(OMPDependClause * C)2018*67e74705SXin Li void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *C) {
2019*67e74705SXin Li Record.push_back(C->varlist_size());
2020*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2021*67e74705SXin Li Record.push_back(C->getDependencyKind());
2022*67e74705SXin Li Record.AddSourceLocation(C->getDependencyLoc());
2023*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
2024*67e74705SXin Li for (auto *VE : C->varlists())
2025*67e74705SXin Li Record.AddStmt(VE);
2026*67e74705SXin Li Record.AddStmt(C->getCounterValue());
2027*67e74705SXin Li }
2028*67e74705SXin Li
VisitOMPDeviceClause(OMPDeviceClause * C)2029*67e74705SXin Li void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *C) {
2030*67e74705SXin Li Record.AddStmt(C->getDevice());
2031*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2032*67e74705SXin Li }
2033*67e74705SXin Li
VisitOMPMapClause(OMPMapClause * C)2034*67e74705SXin Li void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *C) {
2035*67e74705SXin Li Record.push_back(C->varlist_size());
2036*67e74705SXin Li Record.push_back(C->getUniqueDeclarationsNum());
2037*67e74705SXin Li Record.push_back(C->getTotalComponentListNum());
2038*67e74705SXin Li Record.push_back(C->getTotalComponentsNum());
2039*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2040*67e74705SXin Li Record.push_back(C->getMapTypeModifier());
2041*67e74705SXin Li Record.push_back(C->getMapType());
2042*67e74705SXin Li Record.AddSourceLocation(C->getMapLoc());
2043*67e74705SXin Li Record.AddSourceLocation(C->getColonLoc());
2044*67e74705SXin Li for (auto *E : C->varlists())
2045*67e74705SXin Li Record.AddStmt(E);
2046*67e74705SXin Li for (auto *D : C->all_decls())
2047*67e74705SXin Li Record.AddDeclRef(D);
2048*67e74705SXin Li for (auto N : C->all_num_lists())
2049*67e74705SXin Li Record.push_back(N);
2050*67e74705SXin Li for (auto N : C->all_lists_sizes())
2051*67e74705SXin Li Record.push_back(N);
2052*67e74705SXin Li for (auto &M : C->all_components()) {
2053*67e74705SXin Li Record.AddStmt(M.getAssociatedExpression());
2054*67e74705SXin Li Record.AddDeclRef(M.getAssociatedDeclaration());
2055*67e74705SXin Li }
2056*67e74705SXin Li }
2057*67e74705SXin Li
VisitOMPNumTeamsClause(OMPNumTeamsClause * C)2058*67e74705SXin Li void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
2059*67e74705SXin Li Record.AddStmt(C->getNumTeams());
2060*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2061*67e74705SXin Li }
2062*67e74705SXin Li
VisitOMPThreadLimitClause(OMPThreadLimitClause * C)2063*67e74705SXin Li void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
2064*67e74705SXin Li Record.AddStmt(C->getThreadLimit());
2065*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2066*67e74705SXin Li }
2067*67e74705SXin Li
VisitOMPPriorityClause(OMPPriorityClause * C)2068*67e74705SXin Li void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *C) {
2069*67e74705SXin Li Record.AddStmt(C->getPriority());
2070*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2071*67e74705SXin Li }
2072*67e74705SXin Li
VisitOMPGrainsizeClause(OMPGrainsizeClause * C)2073*67e74705SXin Li void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
2074*67e74705SXin Li Record.AddStmt(C->getGrainsize());
2075*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2076*67e74705SXin Li }
2077*67e74705SXin Li
VisitOMPNumTasksClause(OMPNumTasksClause * C)2078*67e74705SXin Li void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
2079*67e74705SXin Li Record.AddStmt(C->getNumTasks());
2080*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2081*67e74705SXin Li }
2082*67e74705SXin Li
VisitOMPHintClause(OMPHintClause * C)2083*67e74705SXin Li void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *C) {
2084*67e74705SXin Li Record.AddStmt(C->getHint());
2085*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2086*67e74705SXin Li }
2087*67e74705SXin Li
VisitOMPDistScheduleClause(OMPDistScheduleClause * C)2088*67e74705SXin Li void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
2089*67e74705SXin Li VisitOMPClauseWithPreInit(C);
2090*67e74705SXin Li Record.push_back(C->getDistScheduleKind());
2091*67e74705SXin Li Record.AddStmt(C->getChunkSize());
2092*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2093*67e74705SXin Li Record.AddSourceLocation(C->getDistScheduleKindLoc());
2094*67e74705SXin Li Record.AddSourceLocation(C->getCommaLoc());
2095*67e74705SXin Li }
2096*67e74705SXin Li
VisitOMPDefaultmapClause(OMPDefaultmapClause * C)2097*67e74705SXin Li void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
2098*67e74705SXin Li Record.push_back(C->getDefaultmapKind());
2099*67e74705SXin Li Record.push_back(C->getDefaultmapModifier());
2100*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2101*67e74705SXin Li Record.AddSourceLocation(C->getDefaultmapModifierLoc());
2102*67e74705SXin Li Record.AddSourceLocation(C->getDefaultmapKindLoc());
2103*67e74705SXin Li }
2104*67e74705SXin Li
VisitOMPToClause(OMPToClause * C)2105*67e74705SXin Li void OMPClauseWriter::VisitOMPToClause(OMPToClause *C) {
2106*67e74705SXin Li Record.push_back(C->varlist_size());
2107*67e74705SXin Li Record.push_back(C->getUniqueDeclarationsNum());
2108*67e74705SXin Li Record.push_back(C->getTotalComponentListNum());
2109*67e74705SXin Li Record.push_back(C->getTotalComponentsNum());
2110*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2111*67e74705SXin Li for (auto *E : C->varlists())
2112*67e74705SXin Li Record.AddStmt(E);
2113*67e74705SXin Li for (auto *D : C->all_decls())
2114*67e74705SXin Li Record.AddDeclRef(D);
2115*67e74705SXin Li for (auto N : C->all_num_lists())
2116*67e74705SXin Li Record.push_back(N);
2117*67e74705SXin Li for (auto N : C->all_lists_sizes())
2118*67e74705SXin Li Record.push_back(N);
2119*67e74705SXin Li for (auto &M : C->all_components()) {
2120*67e74705SXin Li Record.AddStmt(M.getAssociatedExpression());
2121*67e74705SXin Li Record.AddDeclRef(M.getAssociatedDeclaration());
2122*67e74705SXin Li }
2123*67e74705SXin Li }
2124*67e74705SXin Li
VisitOMPFromClause(OMPFromClause * C)2125*67e74705SXin Li void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *C) {
2126*67e74705SXin Li Record.push_back(C->varlist_size());
2127*67e74705SXin Li Record.push_back(C->getUniqueDeclarationsNum());
2128*67e74705SXin Li Record.push_back(C->getTotalComponentListNum());
2129*67e74705SXin Li Record.push_back(C->getTotalComponentsNum());
2130*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2131*67e74705SXin Li for (auto *E : C->varlists())
2132*67e74705SXin Li Record.AddStmt(E);
2133*67e74705SXin Li for (auto *D : C->all_decls())
2134*67e74705SXin Li Record.AddDeclRef(D);
2135*67e74705SXin Li for (auto N : C->all_num_lists())
2136*67e74705SXin Li Record.push_back(N);
2137*67e74705SXin Li for (auto N : C->all_lists_sizes())
2138*67e74705SXin Li Record.push_back(N);
2139*67e74705SXin Li for (auto &M : C->all_components()) {
2140*67e74705SXin Li Record.AddStmt(M.getAssociatedExpression());
2141*67e74705SXin Li Record.AddDeclRef(M.getAssociatedDeclaration());
2142*67e74705SXin Li }
2143*67e74705SXin Li }
2144*67e74705SXin Li
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)2145*67e74705SXin Li void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
2146*67e74705SXin Li Record.push_back(C->varlist_size());
2147*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2148*67e74705SXin Li for (auto *VE : C->varlists()) {
2149*67e74705SXin Li Record.AddStmt(VE);
2150*67e74705SXin Li }
2151*67e74705SXin Li }
2152*67e74705SXin Li
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)2153*67e74705SXin Li void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
2154*67e74705SXin Li Record.push_back(C->varlist_size());
2155*67e74705SXin Li Record.AddSourceLocation(C->getLParenLoc());
2156*67e74705SXin Li for (auto *VE : C->varlists()) {
2157*67e74705SXin Li Record.AddStmt(VE);
2158*67e74705SXin Li }
2159*67e74705SXin Li }
2160*67e74705SXin Li
2161*67e74705SXin Li //===----------------------------------------------------------------------===//
2162*67e74705SXin Li // OpenMP Directives.
2163*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitOMPExecutableDirective(OMPExecutableDirective * E)2164*67e74705SXin Li void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
2165*67e74705SXin Li Record.AddSourceLocation(E->getLocStart());
2166*67e74705SXin Li Record.AddSourceLocation(E->getLocEnd());
2167*67e74705SXin Li OMPClauseWriter ClauseWriter(Record);
2168*67e74705SXin Li for (unsigned i = 0; i < E->getNumClauses(); ++i) {
2169*67e74705SXin Li ClauseWriter.writeClause(E->getClause(i));
2170*67e74705SXin Li }
2171*67e74705SXin Li if (E->hasAssociatedStmt())
2172*67e74705SXin Li Record.AddStmt(E->getAssociatedStmt());
2173*67e74705SXin Li }
2174*67e74705SXin Li
VisitOMPLoopDirective(OMPLoopDirective * D)2175*67e74705SXin Li void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {
2176*67e74705SXin Li VisitStmt(D);
2177*67e74705SXin Li Record.push_back(D->getNumClauses());
2178*67e74705SXin Li Record.push_back(D->getCollapsedNumber());
2179*67e74705SXin Li VisitOMPExecutableDirective(D);
2180*67e74705SXin Li Record.AddStmt(D->getIterationVariable());
2181*67e74705SXin Li Record.AddStmt(D->getLastIteration());
2182*67e74705SXin Li Record.AddStmt(D->getCalcLastIteration());
2183*67e74705SXin Li Record.AddStmt(D->getPreCond());
2184*67e74705SXin Li Record.AddStmt(D->getCond());
2185*67e74705SXin Li Record.AddStmt(D->getInit());
2186*67e74705SXin Li Record.AddStmt(D->getInc());
2187*67e74705SXin Li Record.AddStmt(D->getPreInits());
2188*67e74705SXin Li if (isOpenMPWorksharingDirective(D->getDirectiveKind()) ||
2189*67e74705SXin Li isOpenMPTaskLoopDirective(D->getDirectiveKind()) ||
2190*67e74705SXin Li isOpenMPDistributeDirective(D->getDirectiveKind())) {
2191*67e74705SXin Li Record.AddStmt(D->getIsLastIterVariable());
2192*67e74705SXin Li Record.AddStmt(D->getLowerBoundVariable());
2193*67e74705SXin Li Record.AddStmt(D->getUpperBoundVariable());
2194*67e74705SXin Li Record.AddStmt(D->getStrideVariable());
2195*67e74705SXin Li Record.AddStmt(D->getEnsureUpperBound());
2196*67e74705SXin Li Record.AddStmt(D->getNextLowerBound());
2197*67e74705SXin Li Record.AddStmt(D->getNextUpperBound());
2198*67e74705SXin Li Record.AddStmt(D->getNumIterations());
2199*67e74705SXin Li }
2200*67e74705SXin Li if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) {
2201*67e74705SXin Li Record.AddStmt(D->getPrevLowerBoundVariable());
2202*67e74705SXin Li Record.AddStmt(D->getPrevUpperBoundVariable());
2203*67e74705SXin Li }
2204*67e74705SXin Li for (auto I : D->counters()) {
2205*67e74705SXin Li Record.AddStmt(I);
2206*67e74705SXin Li }
2207*67e74705SXin Li for (auto I : D->private_counters()) {
2208*67e74705SXin Li Record.AddStmt(I);
2209*67e74705SXin Li }
2210*67e74705SXin Li for (auto I : D->inits()) {
2211*67e74705SXin Li Record.AddStmt(I);
2212*67e74705SXin Li }
2213*67e74705SXin Li for (auto I : D->updates()) {
2214*67e74705SXin Li Record.AddStmt(I);
2215*67e74705SXin Li }
2216*67e74705SXin Li for (auto I : D->finals()) {
2217*67e74705SXin Li Record.AddStmt(I);
2218*67e74705SXin Li }
2219*67e74705SXin Li }
2220*67e74705SXin Li
VisitOMPParallelDirective(OMPParallelDirective * D)2221*67e74705SXin Li void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
2222*67e74705SXin Li VisitStmt(D);
2223*67e74705SXin Li Record.push_back(D->getNumClauses());
2224*67e74705SXin Li VisitOMPExecutableDirective(D);
2225*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2226*67e74705SXin Li Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
2227*67e74705SXin Li }
2228*67e74705SXin Li
VisitOMPSimdDirective(OMPSimdDirective * D)2229*67e74705SXin Li void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
2230*67e74705SXin Li VisitOMPLoopDirective(D);
2231*67e74705SXin Li Code = serialization::STMT_OMP_SIMD_DIRECTIVE;
2232*67e74705SXin Li }
2233*67e74705SXin Li
VisitOMPForDirective(OMPForDirective * D)2234*67e74705SXin Li void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
2235*67e74705SXin Li VisitOMPLoopDirective(D);
2236*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2237*67e74705SXin Li Code = serialization::STMT_OMP_FOR_DIRECTIVE;
2238*67e74705SXin Li }
2239*67e74705SXin Li
VisitOMPForSimdDirective(OMPForSimdDirective * D)2240*67e74705SXin Li void ASTStmtWriter::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
2241*67e74705SXin Li VisitOMPLoopDirective(D);
2242*67e74705SXin Li Code = serialization::STMT_OMP_FOR_SIMD_DIRECTIVE;
2243*67e74705SXin Li }
2244*67e74705SXin Li
VisitOMPSectionsDirective(OMPSectionsDirective * D)2245*67e74705SXin Li void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
2246*67e74705SXin Li VisitStmt(D);
2247*67e74705SXin Li Record.push_back(D->getNumClauses());
2248*67e74705SXin Li VisitOMPExecutableDirective(D);
2249*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2250*67e74705SXin Li Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
2251*67e74705SXin Li }
2252*67e74705SXin Li
VisitOMPSectionDirective(OMPSectionDirective * D)2253*67e74705SXin Li void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
2254*67e74705SXin Li VisitStmt(D);
2255*67e74705SXin Li VisitOMPExecutableDirective(D);
2256*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2257*67e74705SXin Li Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
2258*67e74705SXin Li }
2259*67e74705SXin Li
VisitOMPSingleDirective(OMPSingleDirective * D)2260*67e74705SXin Li void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {
2261*67e74705SXin Li VisitStmt(D);
2262*67e74705SXin Li Record.push_back(D->getNumClauses());
2263*67e74705SXin Li VisitOMPExecutableDirective(D);
2264*67e74705SXin Li Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;
2265*67e74705SXin Li }
2266*67e74705SXin Li
VisitOMPMasterDirective(OMPMasterDirective * D)2267*67e74705SXin Li void ASTStmtWriter::VisitOMPMasterDirective(OMPMasterDirective *D) {
2268*67e74705SXin Li VisitStmt(D);
2269*67e74705SXin Li VisitOMPExecutableDirective(D);
2270*67e74705SXin Li Code = serialization::STMT_OMP_MASTER_DIRECTIVE;
2271*67e74705SXin Li }
2272*67e74705SXin Li
VisitOMPCriticalDirective(OMPCriticalDirective * D)2273*67e74705SXin Li void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
2274*67e74705SXin Li VisitStmt(D);
2275*67e74705SXin Li Record.push_back(D->getNumClauses());
2276*67e74705SXin Li VisitOMPExecutableDirective(D);
2277*67e74705SXin Li Record.AddDeclarationNameInfo(D->getDirectiveName());
2278*67e74705SXin Li Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;
2279*67e74705SXin Li }
2280*67e74705SXin Li
VisitOMPParallelForDirective(OMPParallelForDirective * D)2281*67e74705SXin Li void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
2282*67e74705SXin Li VisitOMPLoopDirective(D);
2283*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2284*67e74705SXin Li Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
2285*67e74705SXin Li }
2286*67e74705SXin Li
VisitOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)2287*67e74705SXin Li void ASTStmtWriter::VisitOMPParallelForSimdDirective(
2288*67e74705SXin Li OMPParallelForSimdDirective *D) {
2289*67e74705SXin Li VisitOMPLoopDirective(D);
2290*67e74705SXin Li Code = serialization::STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE;
2291*67e74705SXin Li }
2292*67e74705SXin Li
VisitOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)2293*67e74705SXin Li void ASTStmtWriter::VisitOMPParallelSectionsDirective(
2294*67e74705SXin Li OMPParallelSectionsDirective *D) {
2295*67e74705SXin Li VisitStmt(D);
2296*67e74705SXin Li Record.push_back(D->getNumClauses());
2297*67e74705SXin Li VisitOMPExecutableDirective(D);
2298*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2299*67e74705SXin Li Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
2300*67e74705SXin Li }
2301*67e74705SXin Li
VisitOMPTaskDirective(OMPTaskDirective * D)2302*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {
2303*67e74705SXin Li VisitStmt(D);
2304*67e74705SXin Li Record.push_back(D->getNumClauses());
2305*67e74705SXin Li VisitOMPExecutableDirective(D);
2306*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2307*67e74705SXin Li Code = serialization::STMT_OMP_TASK_DIRECTIVE;
2308*67e74705SXin Li }
2309*67e74705SXin Li
VisitOMPAtomicDirective(OMPAtomicDirective * D)2310*67e74705SXin Li void ASTStmtWriter::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
2311*67e74705SXin Li VisitStmt(D);
2312*67e74705SXin Li Record.push_back(D->getNumClauses());
2313*67e74705SXin Li VisitOMPExecutableDirective(D);
2314*67e74705SXin Li Record.AddStmt(D->getX());
2315*67e74705SXin Li Record.AddStmt(D->getV());
2316*67e74705SXin Li Record.AddStmt(D->getExpr());
2317*67e74705SXin Li Record.AddStmt(D->getUpdateExpr());
2318*67e74705SXin Li Record.push_back(D->isXLHSInRHSPart() ? 1 : 0);
2319*67e74705SXin Li Record.push_back(D->isPostfixUpdate() ? 1 : 0);
2320*67e74705SXin Li Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;
2321*67e74705SXin Li }
2322*67e74705SXin Li
VisitOMPTargetDirective(OMPTargetDirective * D)2323*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetDirective(OMPTargetDirective *D) {
2324*67e74705SXin Li VisitStmt(D);
2325*67e74705SXin Li Record.push_back(D->getNumClauses());
2326*67e74705SXin Li VisitOMPExecutableDirective(D);
2327*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_DIRECTIVE;
2328*67e74705SXin Li }
2329*67e74705SXin Li
VisitOMPTargetDataDirective(OMPTargetDataDirective * D)2330*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
2331*67e74705SXin Li VisitStmt(D);
2332*67e74705SXin Li Record.push_back(D->getNumClauses());
2333*67e74705SXin Li VisitOMPExecutableDirective(D);
2334*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_DATA_DIRECTIVE;
2335*67e74705SXin Li }
2336*67e74705SXin Li
VisitOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)2337*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetEnterDataDirective(
2338*67e74705SXin Li OMPTargetEnterDataDirective *D) {
2339*67e74705SXin Li VisitStmt(D);
2340*67e74705SXin Li Record.push_back(D->getNumClauses());
2341*67e74705SXin Li VisitOMPExecutableDirective(D);
2342*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE;
2343*67e74705SXin Li }
2344*67e74705SXin Li
VisitOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)2345*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetExitDataDirective(
2346*67e74705SXin Li OMPTargetExitDataDirective *D) {
2347*67e74705SXin Li VisitStmt(D);
2348*67e74705SXin Li Record.push_back(D->getNumClauses());
2349*67e74705SXin Li VisitOMPExecutableDirective(D);
2350*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE;
2351*67e74705SXin Li }
2352*67e74705SXin Li
VisitOMPTargetParallelDirective(OMPTargetParallelDirective * D)2353*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetParallelDirective(
2354*67e74705SXin Li OMPTargetParallelDirective *D) {
2355*67e74705SXin Li VisitStmt(D);
2356*67e74705SXin Li Record.push_back(D->getNumClauses());
2357*67e74705SXin Li VisitOMPExecutableDirective(D);
2358*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_PARALLEL_DIRECTIVE;
2359*67e74705SXin Li }
2360*67e74705SXin Li
VisitOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)2361*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetParallelForDirective(
2362*67e74705SXin Li OMPTargetParallelForDirective *D) {
2363*67e74705SXin Li VisitOMPLoopDirective(D);
2364*67e74705SXin Li Record.push_back(D->hasCancel() ? 1 : 0);
2365*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE;
2366*67e74705SXin Li }
2367*67e74705SXin Li
VisitOMPTaskyieldDirective(OMPTaskyieldDirective * D)2368*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
2369*67e74705SXin Li VisitStmt(D);
2370*67e74705SXin Li VisitOMPExecutableDirective(D);
2371*67e74705SXin Li Code = serialization::STMT_OMP_TASKYIELD_DIRECTIVE;
2372*67e74705SXin Li }
2373*67e74705SXin Li
VisitOMPBarrierDirective(OMPBarrierDirective * D)2374*67e74705SXin Li void ASTStmtWriter::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
2375*67e74705SXin Li VisitStmt(D);
2376*67e74705SXin Li VisitOMPExecutableDirective(D);
2377*67e74705SXin Li Code = serialization::STMT_OMP_BARRIER_DIRECTIVE;
2378*67e74705SXin Li }
2379*67e74705SXin Li
VisitOMPTaskwaitDirective(OMPTaskwaitDirective * D)2380*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
2381*67e74705SXin Li VisitStmt(D);
2382*67e74705SXin Li VisitOMPExecutableDirective(D);
2383*67e74705SXin Li Code = serialization::STMT_OMP_TASKWAIT_DIRECTIVE;
2384*67e74705SXin Li }
2385*67e74705SXin Li
VisitOMPTaskgroupDirective(OMPTaskgroupDirective * D)2386*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
2387*67e74705SXin Li VisitStmt(D);
2388*67e74705SXin Li VisitOMPExecutableDirective(D);
2389*67e74705SXin Li Code = serialization::STMT_OMP_TASKGROUP_DIRECTIVE;
2390*67e74705SXin Li }
2391*67e74705SXin Li
VisitOMPFlushDirective(OMPFlushDirective * D)2392*67e74705SXin Li void ASTStmtWriter::VisitOMPFlushDirective(OMPFlushDirective *D) {
2393*67e74705SXin Li VisitStmt(D);
2394*67e74705SXin Li Record.push_back(D->getNumClauses());
2395*67e74705SXin Li VisitOMPExecutableDirective(D);
2396*67e74705SXin Li Code = serialization::STMT_OMP_FLUSH_DIRECTIVE;
2397*67e74705SXin Li }
2398*67e74705SXin Li
VisitOMPOrderedDirective(OMPOrderedDirective * D)2399*67e74705SXin Li void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
2400*67e74705SXin Li VisitStmt(D);
2401*67e74705SXin Li Record.push_back(D->getNumClauses());
2402*67e74705SXin Li VisitOMPExecutableDirective(D);
2403*67e74705SXin Li Code = serialization::STMT_OMP_ORDERED_DIRECTIVE;
2404*67e74705SXin Li }
2405*67e74705SXin Li
VisitOMPTeamsDirective(OMPTeamsDirective * D)2406*67e74705SXin Li void ASTStmtWriter::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
2407*67e74705SXin Li VisitStmt(D);
2408*67e74705SXin Li Record.push_back(D->getNumClauses());
2409*67e74705SXin Li VisitOMPExecutableDirective(D);
2410*67e74705SXin Li Code = serialization::STMT_OMP_TEAMS_DIRECTIVE;
2411*67e74705SXin Li }
2412*67e74705SXin Li
VisitOMPCancellationPointDirective(OMPCancellationPointDirective * D)2413*67e74705SXin Li void ASTStmtWriter::VisitOMPCancellationPointDirective(
2414*67e74705SXin Li OMPCancellationPointDirective *D) {
2415*67e74705SXin Li VisitStmt(D);
2416*67e74705SXin Li VisitOMPExecutableDirective(D);
2417*67e74705SXin Li Record.push_back(D->getCancelRegion());
2418*67e74705SXin Li Code = serialization::STMT_OMP_CANCELLATION_POINT_DIRECTIVE;
2419*67e74705SXin Li }
2420*67e74705SXin Li
VisitOMPCancelDirective(OMPCancelDirective * D)2421*67e74705SXin Li void ASTStmtWriter::VisitOMPCancelDirective(OMPCancelDirective *D) {
2422*67e74705SXin Li VisitStmt(D);
2423*67e74705SXin Li Record.push_back(D->getNumClauses());
2424*67e74705SXin Li VisitOMPExecutableDirective(D);
2425*67e74705SXin Li Record.push_back(D->getCancelRegion());
2426*67e74705SXin Li Code = serialization::STMT_OMP_CANCEL_DIRECTIVE;
2427*67e74705SXin Li }
2428*67e74705SXin Li
VisitOMPTaskLoopDirective(OMPTaskLoopDirective * D)2429*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
2430*67e74705SXin Li VisitOMPLoopDirective(D);
2431*67e74705SXin Li Code = serialization::STMT_OMP_TASKLOOP_DIRECTIVE;
2432*67e74705SXin Li }
2433*67e74705SXin Li
VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)2434*67e74705SXin Li void ASTStmtWriter::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
2435*67e74705SXin Li VisitOMPLoopDirective(D);
2436*67e74705SXin Li Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;
2437*67e74705SXin Li }
2438*67e74705SXin Li
VisitOMPDistributeDirective(OMPDistributeDirective * D)2439*67e74705SXin Li void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
2440*67e74705SXin Li VisitOMPLoopDirective(D);
2441*67e74705SXin Li Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;
2442*67e74705SXin Li }
2443*67e74705SXin Li
VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)2444*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2445*67e74705SXin Li VisitStmt(D);
2446*67e74705SXin Li Record.push_back(D->getNumClauses());
2447*67e74705SXin Li VisitOMPExecutableDirective(D);
2448*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_UPDATE_DIRECTIVE;
2449*67e74705SXin Li }
2450*67e74705SXin Li
VisitOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)2451*67e74705SXin Li void ASTStmtWriter::VisitOMPDistributeParallelForDirective(
2452*67e74705SXin Li OMPDistributeParallelForDirective *D) {
2453*67e74705SXin Li VisitOMPLoopDirective(D);
2454*67e74705SXin Li Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
2455*67e74705SXin Li }
2456*67e74705SXin Li
VisitOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)2457*67e74705SXin Li void ASTStmtWriter::VisitOMPDistributeParallelForSimdDirective(
2458*67e74705SXin Li OMPDistributeParallelForSimdDirective *D) {
2459*67e74705SXin Li VisitOMPLoopDirective(D);
2460*67e74705SXin Li Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
2461*67e74705SXin Li }
2462*67e74705SXin Li
VisitOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)2463*67e74705SXin Li void ASTStmtWriter::VisitOMPDistributeSimdDirective(
2464*67e74705SXin Li OMPDistributeSimdDirective *D) {
2465*67e74705SXin Li VisitOMPLoopDirective(D);
2466*67e74705SXin Li Code = serialization::STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE;
2467*67e74705SXin Li }
2468*67e74705SXin Li
VisitOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)2469*67e74705SXin Li void ASTStmtWriter::VisitOMPTargetParallelForSimdDirective(
2470*67e74705SXin Li OMPTargetParallelForSimdDirective *D) {
2471*67e74705SXin Li VisitOMPLoopDirective(D);
2472*67e74705SXin Li Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE;
2473*67e74705SXin Li }
2474*67e74705SXin Li
2475*67e74705SXin Li //===----------------------------------------------------------------------===//
2476*67e74705SXin Li // ASTWriter Implementation
2477*67e74705SXin Li //===----------------------------------------------------------------------===//
2478*67e74705SXin Li
RecordSwitchCaseID(SwitchCase * S)2479*67e74705SXin Li unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
2480*67e74705SXin Li assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
2481*67e74705SXin Li "SwitchCase recorded twice");
2482*67e74705SXin Li unsigned NextID = SwitchCaseIDs.size();
2483*67e74705SXin Li SwitchCaseIDs[S] = NextID;
2484*67e74705SXin Li return NextID;
2485*67e74705SXin Li }
2486*67e74705SXin Li
getSwitchCaseID(SwitchCase * S)2487*67e74705SXin Li unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
2488*67e74705SXin Li assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
2489*67e74705SXin Li "SwitchCase hasn't been seen yet");
2490*67e74705SXin Li return SwitchCaseIDs[S];
2491*67e74705SXin Li }
2492*67e74705SXin Li
ClearSwitchCaseIDs()2493*67e74705SXin Li void ASTWriter::ClearSwitchCaseIDs() {
2494*67e74705SXin Li SwitchCaseIDs.clear();
2495*67e74705SXin Li }
2496*67e74705SXin Li
2497*67e74705SXin Li /// \brief Write the given substatement or subexpression to the
2498*67e74705SXin Li /// bitstream.
WriteSubStmt(Stmt * S)2499*67e74705SXin Li void ASTWriter::WriteSubStmt(Stmt *S) {
2500*67e74705SXin Li RecordData Record;
2501*67e74705SXin Li ASTStmtWriter Writer(*this, Record);
2502*67e74705SXin Li ++NumStatements;
2503*67e74705SXin Li
2504*67e74705SXin Li if (!S) {
2505*67e74705SXin Li Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
2506*67e74705SXin Li return;
2507*67e74705SXin Li }
2508*67e74705SXin Li
2509*67e74705SXin Li llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
2510*67e74705SXin Li if (I != SubStmtEntries.end()) {
2511*67e74705SXin Li Record.push_back(I->second);
2512*67e74705SXin Li Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
2513*67e74705SXin Li return;
2514*67e74705SXin Li }
2515*67e74705SXin Li
2516*67e74705SXin Li #ifndef NDEBUG
2517*67e74705SXin Li assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
2518*67e74705SXin Li
2519*67e74705SXin Li struct ParentStmtInserterRAII {
2520*67e74705SXin Li Stmt *S;
2521*67e74705SXin Li llvm::DenseSet<Stmt *> &ParentStmts;
2522*67e74705SXin Li
2523*67e74705SXin Li ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
2524*67e74705SXin Li : S(S), ParentStmts(ParentStmts) {
2525*67e74705SXin Li ParentStmts.insert(S);
2526*67e74705SXin Li }
2527*67e74705SXin Li ~ParentStmtInserterRAII() {
2528*67e74705SXin Li ParentStmts.erase(S);
2529*67e74705SXin Li }
2530*67e74705SXin Li };
2531*67e74705SXin Li
2532*67e74705SXin Li ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
2533*67e74705SXin Li #endif
2534*67e74705SXin Li
2535*67e74705SXin Li Writer.Visit(S);
2536*67e74705SXin Li
2537*67e74705SXin Li uint64_t Offset = Writer.Emit();
2538*67e74705SXin Li SubStmtEntries[S] = Offset;
2539*67e74705SXin Li }
2540*67e74705SXin Li
2541*67e74705SXin Li /// \brief Flush all of the statements that have been added to the
2542*67e74705SXin Li /// queue via AddStmt().
FlushStmts()2543*67e74705SXin Li void ASTRecordWriter::FlushStmts() {
2544*67e74705SXin Li // We expect to be the only consumer of the two temporary statement maps,
2545*67e74705SXin Li // assert that they are empty.
2546*67e74705SXin Li assert(Writer->SubStmtEntries.empty() && "unexpected entries in sub-stmt map");
2547*67e74705SXin Li assert(Writer->ParentStmts.empty() && "unexpected entries in parent stmt map");
2548*67e74705SXin Li
2549*67e74705SXin Li for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
2550*67e74705SXin Li Writer->WriteSubStmt(StmtsToEmit[I]);
2551*67e74705SXin Li
2552*67e74705SXin Li assert(N == StmtsToEmit.size() && "record modified while being written!");
2553*67e74705SXin Li
2554*67e74705SXin Li // Note that we are at the end of a full expression. Any
2555*67e74705SXin Li // expression records that follow this one are part of a different
2556*67e74705SXin Li // expression.
2557*67e74705SXin Li Writer->Stream.EmitRecord(serialization::STMT_STOP, ArrayRef<uint32_t>());
2558*67e74705SXin Li
2559*67e74705SXin Li Writer->SubStmtEntries.clear();
2560*67e74705SXin Li Writer->ParentStmts.clear();
2561*67e74705SXin Li }
2562*67e74705SXin Li
2563*67e74705SXin Li StmtsToEmit.clear();
2564*67e74705SXin Li }
2565*67e74705SXin Li
FlushSubStmts()2566*67e74705SXin Li void ASTRecordWriter::FlushSubStmts() {
2567*67e74705SXin Li // For a nested statement, write out the substatements in reverse order (so
2568*67e74705SXin Li // that a simple stack machine can be used when loading), and don't emit a
2569*67e74705SXin Li // STMT_STOP after each one.
2570*67e74705SXin Li for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
2571*67e74705SXin Li Writer->WriteSubStmt(StmtsToEmit[N - I - 1]);
2572*67e74705SXin Li assert(N == StmtsToEmit.size() && "record modified while being written!");
2573*67e74705SXin Li }
2574*67e74705SXin Li
2575*67e74705SXin Li StmtsToEmit.clear();
2576*67e74705SXin Li }
2577