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