1 //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements serialization for Statements and Expressions.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Serialization/ASTWriter.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/StmtVisitor.h"
20 #include "llvm/Bitcode/BitstreamWriter.h"
21 using namespace clang;
22 
23 //===----------------------------------------------------------------------===//
24 // Statement/expression serialization
25 //===----------------------------------------------------------------------===//
26 
27 namespace clang {
28   class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
29     ASTWriter &Writer;
30     ASTWriter::RecordData &Record;
31 
32   public:
33     serialization::StmtCode Code;
34     unsigned AbbrevToUse;
35 
36     ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
37       : Writer(Writer), Record(Record) { }
38 
39     void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args);
40 
41     void VisitStmt(Stmt *S);
42 #define STMT(Type, Base) \
43     void Visit##Type(Type *);
44 #include "clang/AST/StmtNodes.inc"
45   };
46 }
47 
48 void ASTStmtWriter::
49 AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args) {
50   Writer.AddSourceLocation(Args.getTemplateKeywordLoc(), Record);
51   Writer.AddSourceLocation(Args.LAngleLoc, Record);
52   Writer.AddSourceLocation(Args.RAngleLoc, Record);
53   for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
54     Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
55 }
56 
57 void ASTStmtWriter::VisitStmt(Stmt *S) {
58 }
59 
60 void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
61   VisitStmt(S);
62   Writer.AddSourceLocation(S->getSemiLoc(), Record);
63   Record.push_back(S->HasLeadingEmptyMacro);
64   Code = serialization::STMT_NULL;
65 }
66 
67 void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
68   VisitStmt(S);
69   Record.push_back(S->size());
70   for (CompoundStmt::body_iterator CS = S->body_begin(), CSEnd = S->body_end();
71        CS != CSEnd; ++CS)
72     Writer.AddStmt(*CS);
73   Writer.AddSourceLocation(S->getLBracLoc(), Record);
74   Writer.AddSourceLocation(S->getRBracLoc(), Record);
75   Code = serialization::STMT_COMPOUND;
76 }
77 
78 void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
79   VisitStmt(S);
80   Record.push_back(Writer.getSwitchCaseID(S));
81 }
82 
83 void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
84   VisitSwitchCase(S);
85   Writer.AddStmt(S->getLHS());
86   Writer.AddStmt(S->getRHS());
87   Writer.AddStmt(S->getSubStmt());
88   Writer.AddSourceLocation(S->getCaseLoc(), Record);
89   Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
90   Writer.AddSourceLocation(S->getColonLoc(), Record);
91   Code = serialization::STMT_CASE;
92 }
93 
94 void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
95   VisitSwitchCase(S);
96   Writer.AddStmt(S->getSubStmt());
97   Writer.AddSourceLocation(S->getDefaultLoc(), Record);
98   Writer.AddSourceLocation(S->getColonLoc(), Record);
99   Code = serialization::STMT_DEFAULT;
100 }
101 
102 void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
103   VisitStmt(S);
104   Writer.AddDeclRef(S->getDecl(), Record);
105   Writer.AddStmt(S->getSubStmt());
106   Writer.AddSourceLocation(S->getIdentLoc(), Record);
107   Code = serialization::STMT_LABEL;
108 }
109 
110 void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
111   VisitStmt(S);
112   Record.push_back(S->getAttrs().size());
113   Writer.WriteAttributes(S->getAttrs(), Record);
114   Writer.AddStmt(S->getSubStmt());
115   Writer.AddSourceLocation(S->getAttrLoc(), Record);
116   Code = serialization::STMT_ATTRIBUTED;
117 }
118 
119 void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
120   VisitStmt(S);
121   Writer.AddDeclRef(S->getConditionVariable(), Record);
122   Writer.AddStmt(S->getCond());
123   Writer.AddStmt(S->getThen());
124   Writer.AddStmt(S->getElse());
125   Writer.AddSourceLocation(S->getIfLoc(), Record);
126   Writer.AddSourceLocation(S->getElseLoc(), Record);
127   Code = serialization::STMT_IF;
128 }
129 
130 void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
131   VisitStmt(S);
132   Writer.AddDeclRef(S->getConditionVariable(), Record);
133   Writer.AddStmt(S->getCond());
134   Writer.AddStmt(S->getBody());
135   Writer.AddSourceLocation(S->getSwitchLoc(), Record);
136   Record.push_back(S->isAllEnumCasesCovered());
137   for (SwitchCase *SC = S->getSwitchCaseList(); SC;
138        SC = SC->getNextSwitchCase())
139     Record.push_back(Writer.RecordSwitchCaseID(SC));
140   Code = serialization::STMT_SWITCH;
141 }
142 
143 void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
144   VisitStmt(S);
145   Writer.AddDeclRef(S->getConditionVariable(), Record);
146   Writer.AddStmt(S->getCond());
147   Writer.AddStmt(S->getBody());
148   Writer.AddSourceLocation(S->getWhileLoc(), Record);
149   Code = serialization::STMT_WHILE;
150 }
151 
152 void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
153   VisitStmt(S);
154   Writer.AddStmt(S->getCond());
155   Writer.AddStmt(S->getBody());
156   Writer.AddSourceLocation(S->getDoLoc(), Record);
157   Writer.AddSourceLocation(S->getWhileLoc(), Record);
158   Writer.AddSourceLocation(S->getRParenLoc(), Record);
159   Code = serialization::STMT_DO;
160 }
161 
162 void ASTStmtWriter::VisitForStmt(ForStmt *S) {
163   VisitStmt(S);
164   Writer.AddStmt(S->getInit());
165   Writer.AddStmt(S->getCond());
166   Writer.AddDeclRef(S->getConditionVariable(), Record);
167   Writer.AddStmt(S->getInc());
168   Writer.AddStmt(S->getBody());
169   Writer.AddSourceLocation(S->getForLoc(), Record);
170   Writer.AddSourceLocation(S->getLParenLoc(), Record);
171   Writer.AddSourceLocation(S->getRParenLoc(), Record);
172   Code = serialization::STMT_FOR;
173 }
174 
175 void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
176   VisitStmt(S);
177   Writer.AddDeclRef(S->getLabel(), Record);
178   Writer.AddSourceLocation(S->getGotoLoc(), Record);
179   Writer.AddSourceLocation(S->getLabelLoc(), Record);
180   Code = serialization::STMT_GOTO;
181 }
182 
183 void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
184   VisitStmt(S);
185   Writer.AddSourceLocation(S->getGotoLoc(), Record);
186   Writer.AddSourceLocation(S->getStarLoc(), Record);
187   Writer.AddStmt(S->getTarget());
188   Code = serialization::STMT_INDIRECT_GOTO;
189 }
190 
191 void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
192   VisitStmt(S);
193   Writer.AddSourceLocation(S->getContinueLoc(), Record);
194   Code = serialization::STMT_CONTINUE;
195 }
196 
197 void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
198   VisitStmt(S);
199   Writer.AddSourceLocation(S->getBreakLoc(), Record);
200   Code = serialization::STMT_BREAK;
201 }
202 
203 void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
204   VisitStmt(S);
205   Writer.AddStmt(S->getRetValue());
206   Writer.AddSourceLocation(S->getReturnLoc(), Record);
207   Writer.AddDeclRef(S->getNRVOCandidate(), Record);
208   Code = serialization::STMT_RETURN;
209 }
210 
211 void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
212   VisitStmt(S);
213   Writer.AddSourceLocation(S->getStartLoc(), Record);
214   Writer.AddSourceLocation(S->getEndLoc(), Record);
215   DeclGroupRef DG = S->getDeclGroup();
216   for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
217     Writer.AddDeclRef(*D, Record);
218   Code = serialization::STMT_DECL;
219 }
220 
221 void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
222   VisitStmt(S);
223   Record.push_back(S->getNumOutputs());
224   Record.push_back(S->getNumInputs());
225   Record.push_back(S->getNumClobbers());
226   Writer.AddSourceLocation(S->getAsmLoc(), Record);
227   Writer.AddSourceLocation(S->getRParenLoc(), Record);
228   Record.push_back(S->isVolatile());
229   Record.push_back(S->isSimple());
230   Record.push_back(S->isMSAsm());
231   Writer.AddStmt(S->getAsmString());
232 
233   // Outputs
234   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
235     Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
236     Writer.AddStmt(S->getOutputConstraintLiteral(I));
237     Writer.AddStmt(S->getOutputExpr(I));
238   }
239 
240   // Inputs
241   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
242     Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
243     Writer.AddStmt(S->getInputConstraintLiteral(I));
244     Writer.AddStmt(S->getInputExpr(I));
245   }
246 
247   // Clobbers
248   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
249     Writer.AddStmt(S->getClobber(I));
250 
251   Code = serialization::STMT_ASM;
252 }
253 
254 void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
255   // FIXME: Statement writer not yet implemented for MS style inline asm.
256   VisitStmt(S);
257 }
258 
259 void ASTStmtWriter::VisitExpr(Expr *E) {
260   VisitStmt(E);
261   Writer.AddTypeRef(E->getType(), Record);
262   Record.push_back(E->isTypeDependent());
263   Record.push_back(E->isValueDependent());
264   Record.push_back(E->isInstantiationDependent());
265   Record.push_back(E->containsUnexpandedParameterPack());
266   Record.push_back(E->getValueKind());
267   Record.push_back(E->getObjectKind());
268 }
269 
270 void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
271   VisitExpr(E);
272   Writer.AddSourceLocation(E->getLocation(), Record);
273   Record.push_back(E->getIdentType()); // FIXME: stable encoding
274   Code = serialization::EXPR_PREDEFINED;
275 }
276 
277 void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
278   VisitExpr(E);
279 
280   Record.push_back(E->hasQualifier());
281   Record.push_back(E->getDecl() != E->getFoundDecl());
282   Record.push_back(E->hasTemplateKWAndArgsInfo());
283   Record.push_back(E->hadMultipleCandidates());
284   Record.push_back(E->refersToEnclosingLocal());
285 
286   if (E->hasTemplateKWAndArgsInfo()) {
287     unsigned NumTemplateArgs = E->getNumTemplateArgs();
288     Record.push_back(NumTemplateArgs);
289   }
290 
291   DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
292 
293   if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
294       (E->getDecl() == E->getFoundDecl()) &&
295       nk == DeclarationName::Identifier) {
296     AbbrevToUse = Writer.getDeclRefExprAbbrev();
297   }
298 
299   if (E->hasQualifier())
300     Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
301 
302   if (E->getDecl() != E->getFoundDecl())
303     Writer.AddDeclRef(E->getFoundDecl(), Record);
304 
305   if (E->hasTemplateKWAndArgsInfo())
306     AddTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo());
307 
308   Writer.AddDeclRef(E->getDecl(), Record);
309   Writer.AddSourceLocation(E->getLocation(), Record);
310   Writer.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record);
311   Code = serialization::EXPR_DECL_REF;
312 }
313 
314 void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
315   VisitExpr(E);
316   Writer.AddSourceLocation(E->getLocation(), Record);
317   Writer.AddAPInt(E->getValue(), Record);
318 
319   if (E->getValue().getBitWidth() == 32) {
320     AbbrevToUse = Writer.getIntegerLiteralAbbrev();
321   }
322 
323   Code = serialization::EXPR_INTEGER_LITERAL;
324 }
325 
326 void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
327   VisitExpr(E);
328   Writer.AddAPFloat(E->getValue(), Record);
329   Record.push_back(E->isExact());
330   Writer.AddSourceLocation(E->getLocation(), Record);
331   Code = serialization::EXPR_FLOATING_LITERAL;
332 }
333 
334 void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
335   VisitExpr(E);
336   Writer.AddStmt(E->getSubExpr());
337   Code = serialization::EXPR_IMAGINARY_LITERAL;
338 }
339 
340 void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
341   VisitExpr(E);
342   Record.push_back(E->getByteLength());
343   Record.push_back(E->getNumConcatenated());
344   Record.push_back(E->getKind());
345   Record.push_back(E->isPascal());
346   // FIXME: String data should be stored as a blob at the end of the
347   // StringLiteral. However, we can't do so now because we have no
348   // provision for coping with abbreviations when we're jumping around
349   // the AST file during deserialization.
350   Record.append(E->getBytes().begin(), E->getBytes().end());
351   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
352     Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
353   Code = serialization::EXPR_STRING_LITERAL;
354 }
355 
356 void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
357   VisitExpr(E);
358   Record.push_back(E->getValue());
359   Writer.AddSourceLocation(E->getLocation(), Record);
360   Record.push_back(E->getKind());
361 
362   AbbrevToUse = Writer.getCharacterLiteralAbbrev();
363 
364   Code = serialization::EXPR_CHARACTER_LITERAL;
365 }
366 
367 void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
368   VisitExpr(E);
369   Writer.AddSourceLocation(E->getLParen(), Record);
370   Writer.AddSourceLocation(E->getRParen(), Record);
371   Writer.AddStmt(E->getSubExpr());
372   Code = serialization::EXPR_PAREN;
373 }
374 
375 void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
376   VisitExpr(E);
377   Record.push_back(E->NumExprs);
378   for (unsigned i=0; i != E->NumExprs; ++i)
379     Writer.AddStmt(E->Exprs[i]);
380   Writer.AddSourceLocation(E->LParenLoc, Record);
381   Writer.AddSourceLocation(E->RParenLoc, Record);
382   Code = serialization::EXPR_PAREN_LIST;
383 }
384 
385 void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
386   VisitExpr(E);
387   Writer.AddStmt(E->getSubExpr());
388   Record.push_back(E->getOpcode()); // FIXME: stable encoding
389   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
390   Code = serialization::EXPR_UNARY_OPERATOR;
391 }
392 
393 void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
394   VisitExpr(E);
395   Record.push_back(E->getNumComponents());
396   Record.push_back(E->getNumExpressions());
397   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
398   Writer.AddSourceLocation(E->getRParenLoc(), Record);
399   Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
400   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
401     const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
402     Record.push_back(ON.getKind()); // FIXME: Stable encoding
403     Writer.AddSourceLocation(ON.getSourceRange().getBegin(), Record);
404     Writer.AddSourceLocation(ON.getSourceRange().getEnd(), Record);
405     switch (ON.getKind()) {
406     case OffsetOfExpr::OffsetOfNode::Array:
407       Record.push_back(ON.getArrayExprIndex());
408       break;
409 
410     case OffsetOfExpr::OffsetOfNode::Field:
411       Writer.AddDeclRef(ON.getField(), Record);
412       break;
413 
414     case OffsetOfExpr::OffsetOfNode::Identifier:
415       Writer.AddIdentifierRef(ON.getFieldName(), Record);
416       break;
417 
418     case OffsetOfExpr::OffsetOfNode::Base:
419       Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);
420       break;
421     }
422   }
423   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
424     Writer.AddStmt(E->getIndexExpr(I));
425   Code = serialization::EXPR_OFFSETOF;
426 }
427 
428 void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
429   VisitExpr(E);
430   Record.push_back(E->getKind());
431   if (E->isArgumentType())
432     Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
433   else {
434     Record.push_back(0);
435     Writer.AddStmt(E->getArgumentExpr());
436   }
437   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
438   Writer.AddSourceLocation(E->getRParenLoc(), Record);
439   Code = serialization::EXPR_SIZEOF_ALIGN_OF;
440 }
441 
442 void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
443   VisitExpr(E);
444   Writer.AddStmt(E->getLHS());
445   Writer.AddStmt(E->getRHS());
446   Writer.AddSourceLocation(E->getRBracketLoc(), Record);
447   Code = serialization::EXPR_ARRAY_SUBSCRIPT;
448 }
449 
450 void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
451   VisitExpr(E);
452   Record.push_back(E->getNumArgs());
453   Writer.AddSourceLocation(E->getRParenLoc(), Record);
454   Writer.AddStmt(E->getCallee());
455   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
456        Arg != ArgEnd; ++Arg)
457     Writer.AddStmt(*Arg);
458   Code = serialization::EXPR_CALL;
459 }
460 
461 void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
462   // Don't call VisitExpr, we'll write everything here.
463 
464   Record.push_back(E->hasQualifier());
465   if (E->hasQualifier())
466     Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
467 
468   Record.push_back(E->HasTemplateKWAndArgsInfo);
469   if (E->HasTemplateKWAndArgsInfo) {
470     Writer.AddSourceLocation(E->getTemplateKeywordLoc(), Record);
471     unsigned NumTemplateArgs = E->getNumTemplateArgs();
472     Record.push_back(NumTemplateArgs);
473     Writer.AddSourceLocation(E->getLAngleLoc(), Record);
474     Writer.AddSourceLocation(E->getRAngleLoc(), Record);
475     for (unsigned i=0; i != NumTemplateArgs; ++i)
476       Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
477   }
478 
479   Record.push_back(E->hadMultipleCandidates());
480 
481   DeclAccessPair FoundDecl = E->getFoundDecl();
482   Writer.AddDeclRef(FoundDecl.getDecl(), Record);
483   Record.push_back(FoundDecl.getAccess());
484 
485   Writer.AddTypeRef(E->getType(), Record);
486   Record.push_back(E->getValueKind());
487   Record.push_back(E->getObjectKind());
488   Writer.AddStmt(E->getBase());
489   Writer.AddDeclRef(E->getMemberDecl(), Record);
490   Writer.AddSourceLocation(E->getMemberLoc(), Record);
491   Record.push_back(E->isArrow());
492   Writer.AddDeclarationNameLoc(E->MemberDNLoc,
493                                E->getMemberDecl()->getDeclName(), Record);
494   Code = serialization::EXPR_MEMBER;
495 }
496 
497 void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
498   VisitExpr(E);
499   Writer.AddStmt(E->getBase());
500   Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
501   Record.push_back(E->isArrow());
502   Code = serialization::EXPR_OBJC_ISA;
503 }
504 
505 void ASTStmtWriter::
506 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
507   VisitExpr(E);
508   Writer.AddStmt(E->getSubExpr());
509   Record.push_back(E->shouldCopy());
510   Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
511 }
512 
513 void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
514   VisitExplicitCastExpr(E);
515   Writer.AddSourceLocation(E->getLParenLoc(), Record);
516   Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record);
517   Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
518   Code = serialization::EXPR_OBJC_BRIDGED_CAST;
519 }
520 
521 void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
522   VisitExpr(E);
523   Record.push_back(E->path_size());
524   Writer.AddStmt(E->getSubExpr());
525   Record.push_back(E->getCastKind()); // FIXME: stable encoding
526 
527   for (CastExpr::path_iterator
528          PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
529     Writer.AddCXXBaseSpecifier(**PI, Record);
530 }
531 
532 void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
533   VisitExpr(E);
534   Writer.AddStmt(E->getLHS());
535   Writer.AddStmt(E->getRHS());
536   Record.push_back(E->getOpcode()); // FIXME: stable encoding
537   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
538   Code = serialization::EXPR_BINARY_OPERATOR;
539 }
540 
541 void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
542   VisitBinaryOperator(E);
543   Writer.AddTypeRef(E->getComputationLHSType(), Record);
544   Writer.AddTypeRef(E->getComputationResultType(), Record);
545   Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
546 }
547 
548 void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
549   VisitExpr(E);
550   Writer.AddStmt(E->getCond());
551   Writer.AddStmt(E->getLHS());
552   Writer.AddStmt(E->getRHS());
553   Writer.AddSourceLocation(E->getQuestionLoc(), Record);
554   Writer.AddSourceLocation(E->getColonLoc(), Record);
555   Code = serialization::EXPR_CONDITIONAL_OPERATOR;
556 }
557 
558 void
559 ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
560   VisitExpr(E);
561   Writer.AddStmt(E->getOpaqueValue());
562   Writer.AddStmt(E->getCommon());
563   Writer.AddStmt(E->getCond());
564   Writer.AddStmt(E->getTrueExpr());
565   Writer.AddStmt(E->getFalseExpr());
566   Writer.AddSourceLocation(E->getQuestionLoc(), Record);
567   Writer.AddSourceLocation(E->getColonLoc(), Record);
568   Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
569 }
570 
571 void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
572   VisitCastExpr(E);
573   Code = serialization::EXPR_IMPLICIT_CAST;
574 }
575 
576 void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
577   VisitCastExpr(E);
578   Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
579 }
580 
581 void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
582   VisitExplicitCastExpr(E);
583   Writer.AddSourceLocation(E->getLParenLoc(), Record);
584   Writer.AddSourceLocation(E->getRParenLoc(), Record);
585   Code = serialization::EXPR_CSTYLE_CAST;
586 }
587 
588 void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
589   VisitExpr(E);
590   Writer.AddSourceLocation(E->getLParenLoc(), Record);
591   Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
592   Writer.AddStmt(E->getInitializer());
593   Record.push_back(E->isFileScope());
594   Code = serialization::EXPR_COMPOUND_LITERAL;
595 }
596 
597 void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
598   VisitExpr(E);
599   Writer.AddStmt(E->getBase());
600   Writer.AddIdentifierRef(&E->getAccessor(), Record);
601   Writer.AddSourceLocation(E->getAccessorLoc(), Record);
602   Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
603 }
604 
605 void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
606   VisitExpr(E);
607   Writer.AddStmt(E->getSyntacticForm());
608   Writer.AddSourceLocation(E->getLBraceLoc(), Record);
609   Writer.AddSourceLocation(E->getRBraceLoc(), Record);
610   bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
611   Record.push_back(isArrayFiller);
612   if (isArrayFiller)
613     Writer.AddStmt(E->getArrayFiller());
614   else
615     Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
616   Record.push_back(E->hadArrayRangeDesignator());
617   Record.push_back(E->initializesStdInitializerList());
618   Record.push_back(E->getNumInits());
619   if (isArrayFiller) {
620     // ArrayFiller may have filled "holes" due to designated initializer.
621     // Replace them by 0 to indicate that the filler goes in that place.
622     Expr *filler = E->getArrayFiller();
623     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
624       Writer.AddStmt(E->getInit(I) != filler ? E->getInit(I) : 0);
625   } else {
626     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
627       Writer.AddStmt(E->getInit(I));
628   }
629   Code = serialization::EXPR_INIT_LIST;
630 }
631 
632 void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
633   VisitExpr(E);
634   Record.push_back(E->getNumSubExprs());
635   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
636     Writer.AddStmt(E->getSubExpr(I));
637   Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
638   Record.push_back(E->usesGNUSyntax());
639   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
640                                              DEnd = E->designators_end();
641        D != DEnd; ++D) {
642     if (D->isFieldDesignator()) {
643       if (FieldDecl *Field = D->getField()) {
644         Record.push_back(serialization::DESIG_FIELD_DECL);
645         Writer.AddDeclRef(Field, Record);
646       } else {
647         Record.push_back(serialization::DESIG_FIELD_NAME);
648         Writer.AddIdentifierRef(D->getFieldName(), Record);
649       }
650       Writer.AddSourceLocation(D->getDotLoc(), Record);
651       Writer.AddSourceLocation(D->getFieldLoc(), Record);
652     } else if (D->isArrayDesignator()) {
653       Record.push_back(serialization::DESIG_ARRAY);
654       Record.push_back(D->getFirstExprIndex());
655       Writer.AddSourceLocation(D->getLBracketLoc(), Record);
656       Writer.AddSourceLocation(D->getRBracketLoc(), Record);
657     } else {
658       assert(D->isArrayRangeDesignator() && "Unknown designator");
659       Record.push_back(serialization::DESIG_ARRAY_RANGE);
660       Record.push_back(D->getFirstExprIndex());
661       Writer.AddSourceLocation(D->getLBracketLoc(), Record);
662       Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
663       Writer.AddSourceLocation(D->getRBracketLoc(), Record);
664     }
665   }
666   Code = serialization::EXPR_DESIGNATED_INIT;
667 }
668 
669 void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
670   VisitExpr(E);
671   Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
672 }
673 
674 void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
675   VisitExpr(E);
676   Writer.AddStmt(E->getSubExpr());
677   Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record);
678   Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
679   Writer.AddSourceLocation(E->getRParenLoc(), Record);
680   Code = serialization::EXPR_VA_ARG;
681 }
682 
683 void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
684   VisitExpr(E);
685   Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
686   Writer.AddSourceLocation(E->getLabelLoc(), Record);
687   Writer.AddDeclRef(E->getLabel(), Record);
688   Code = serialization::EXPR_ADDR_LABEL;
689 }
690 
691 void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
692   VisitExpr(E);
693   Writer.AddStmt(E->getSubStmt());
694   Writer.AddSourceLocation(E->getLParenLoc(), Record);
695   Writer.AddSourceLocation(E->getRParenLoc(), Record);
696   Code = serialization::EXPR_STMT;
697 }
698 
699 void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
700   VisitExpr(E);
701   Writer.AddStmt(E->getCond());
702   Writer.AddStmt(E->getLHS());
703   Writer.AddStmt(E->getRHS());
704   Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
705   Writer.AddSourceLocation(E->getRParenLoc(), Record);
706   Code = serialization::EXPR_CHOOSE;
707 }
708 
709 void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
710   VisitExpr(E);
711   Writer.AddSourceLocation(E->getTokenLocation(), Record);
712   Code = serialization::EXPR_GNU_NULL;
713 }
714 
715 void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
716   VisitExpr(E);
717   Record.push_back(E->getNumSubExprs());
718   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
719     Writer.AddStmt(E->getExpr(I));
720   Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
721   Writer.AddSourceLocation(E->getRParenLoc(), Record);
722   Code = serialization::EXPR_SHUFFLE_VECTOR;
723 }
724 
725 void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
726   VisitExpr(E);
727   Writer.AddDeclRef(E->getBlockDecl(), Record);
728   Code = serialization::EXPR_BLOCK;
729 }
730 
731 void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
732   VisitExpr(E);
733   Record.push_back(E->getNumAssocs());
734 
735   Writer.AddStmt(E->getControllingExpr());
736   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
737     Writer.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I), Record);
738     Writer.AddStmt(E->getAssocExpr(I));
739   }
740   Record.push_back(E->isResultDependent() ? -1U : E->getResultIndex());
741 
742   Writer.AddSourceLocation(E->getGenericLoc(), Record);
743   Writer.AddSourceLocation(E->getDefaultLoc(), Record);
744   Writer.AddSourceLocation(E->getRParenLoc(), Record);
745   Code = serialization::EXPR_GENERIC_SELECTION;
746 }
747 
748 void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
749   VisitExpr(E);
750   Record.push_back(E->getNumSemanticExprs());
751 
752   // Push the result index.  Currently, this needs to exactly match
753   // the encoding used internally for ResultIndex.
754   unsigned result = E->getResultExprIndex();
755   result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
756   Record.push_back(result);
757 
758   Writer.AddStmt(E->getSyntacticForm());
759   for (PseudoObjectExpr::semantics_iterator
760          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
761     Writer.AddStmt(*i);
762   }
763   Code = serialization::EXPR_PSEUDO_OBJECT;
764 }
765 
766 void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
767   VisitExpr(E);
768   Record.push_back(E->getOp());
769   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
770     Writer.AddStmt(E->getSubExprs()[I]);
771   Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
772   Writer.AddSourceLocation(E->getRParenLoc(), Record);
773   Code = serialization::EXPR_ATOMIC;
774 }
775 
776 //===----------------------------------------------------------------------===//
777 // Objective-C Expressions and Statements.
778 //===----------------------------------------------------------------------===//
779 
780 void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
781   VisitExpr(E);
782   Writer.AddStmt(E->getString());
783   Writer.AddSourceLocation(E->getAtLoc(), Record);
784   Code = serialization::EXPR_OBJC_STRING_LITERAL;
785 }
786 
787 void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
788   VisitExpr(E);
789   Writer.AddStmt(E->getSubExpr());
790   Writer.AddDeclRef(E->getBoxingMethod(), Record);
791   Writer.AddSourceRange(E->getSourceRange(), Record);
792   Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
793 }
794 
795 void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
796   VisitExpr(E);
797   Record.push_back(E->getNumElements());
798   for (unsigned i = 0; i < E->getNumElements(); i++)
799     Writer.AddStmt(E->getElement(i));
800   Writer.AddDeclRef(E->getArrayWithObjectsMethod(), Record);
801   Writer.AddSourceRange(E->getSourceRange(), Record);
802   Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
803 }
804 
805 void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
806   VisitExpr(E);
807   Record.push_back(E->getNumElements());
808   Record.push_back(E->HasPackExpansions);
809   for (unsigned i = 0; i < E->getNumElements(); i++) {
810     ObjCDictionaryElement Element = E->getKeyValueElement(i);
811     Writer.AddStmt(Element.Key);
812     Writer.AddStmt(Element.Value);
813     if (E->HasPackExpansions) {
814       Writer.AddSourceLocation(Element.EllipsisLoc, Record);
815       unsigned NumExpansions = 0;
816       if (Element.NumExpansions)
817         NumExpansions = *Element.NumExpansions + 1;
818       Record.push_back(NumExpansions);
819     }
820   }
821 
822   Writer.AddDeclRef(E->getDictWithObjectsMethod(), Record);
823   Writer.AddSourceRange(E->getSourceRange(), Record);
824   Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
825 }
826 
827 void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
828   VisitExpr(E);
829   Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
830   Writer.AddSourceLocation(E->getAtLoc(), Record);
831   Writer.AddSourceLocation(E->getRParenLoc(), Record);
832   Code = serialization::EXPR_OBJC_ENCODE;
833 }
834 
835 void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
836   VisitExpr(E);
837   Writer.AddSelectorRef(E->getSelector(), Record);
838   Writer.AddSourceLocation(E->getAtLoc(), Record);
839   Writer.AddSourceLocation(E->getRParenLoc(), Record);
840   Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
841 }
842 
843 void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
844   VisitExpr(E);
845   Writer.AddDeclRef(E->getProtocol(), Record);
846   Writer.AddSourceLocation(E->getAtLoc(), Record);
847   Writer.AddSourceLocation(E->ProtoLoc, Record);
848   Writer.AddSourceLocation(E->getRParenLoc(), Record);
849   Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
850 }
851 
852 void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
853   VisitExpr(E);
854   Writer.AddDeclRef(E->getDecl(), Record);
855   Writer.AddSourceLocation(E->getLocation(), Record);
856   Writer.AddStmt(E->getBase());
857   Record.push_back(E->isArrow());
858   Record.push_back(E->isFreeIvar());
859   Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
860 }
861 
862 void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
863   VisitExpr(E);
864   Record.push_back(E->SetterAndMethodRefFlags.getInt());
865   Record.push_back(E->isImplicitProperty());
866   if (E->isImplicitProperty()) {
867     Writer.AddDeclRef(E->getImplicitPropertyGetter(), Record);
868     Writer.AddDeclRef(E->getImplicitPropertySetter(), Record);
869   } else {
870     Writer.AddDeclRef(E->getExplicitProperty(), Record);
871   }
872   Writer.AddSourceLocation(E->getLocation(), Record);
873   Writer.AddSourceLocation(E->getReceiverLocation(), Record);
874   if (E->isObjectReceiver()) {
875     Record.push_back(0);
876     Writer.AddStmt(E->getBase());
877   } else if (E->isSuperReceiver()) {
878     Record.push_back(1);
879     Writer.AddTypeRef(E->getSuperReceiverType(), Record);
880   } else {
881     Record.push_back(2);
882     Writer.AddDeclRef(E->getClassReceiver(), Record);
883   }
884 
885   Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
886 }
887 
888 void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
889   VisitExpr(E);
890   Writer.AddSourceLocation(E->getRBracket(), Record);
891   Writer.AddStmt(E->getBaseExpr());
892   Writer.AddStmt(E->getKeyExpr());
893   Writer.AddDeclRef(E->getAtIndexMethodDecl(), Record);
894   Writer.AddDeclRef(E->setAtIndexMethodDecl(), Record);
895 
896   Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
897 }
898 
899 void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
900   VisitExpr(E);
901   Record.push_back(E->getNumArgs());
902   Record.push_back(E->getNumStoredSelLocs());
903   Record.push_back(E->SelLocsKind);
904   Record.push_back(E->isDelegateInitCall());
905   Record.push_back(E->IsImplicit);
906   Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
907   switch (E->getReceiverKind()) {
908   case ObjCMessageExpr::Instance:
909     Writer.AddStmt(E->getInstanceReceiver());
910     break;
911 
912   case ObjCMessageExpr::Class:
913     Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
914     break;
915 
916   case ObjCMessageExpr::SuperClass:
917   case ObjCMessageExpr::SuperInstance:
918     Writer.AddTypeRef(E->getSuperType(), Record);
919     Writer.AddSourceLocation(E->getSuperLoc(), Record);
920     break;
921   }
922 
923   if (E->getMethodDecl()) {
924     Record.push_back(1);
925     Writer.AddDeclRef(E->getMethodDecl(), Record);
926   } else {
927     Record.push_back(0);
928     Writer.AddSelectorRef(E->getSelector(), Record);
929   }
930 
931   Writer.AddSourceLocation(E->getLeftLoc(), Record);
932   Writer.AddSourceLocation(E->getRightLoc(), Record);
933 
934   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
935        Arg != ArgEnd; ++Arg)
936     Writer.AddStmt(*Arg);
937 
938   SourceLocation *Locs = E->getStoredSelLocs();
939   for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
940     Writer.AddSourceLocation(Locs[i], Record);
941 
942   Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
943 }
944 
945 void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
946   VisitStmt(S);
947   Writer.AddStmt(S->getElement());
948   Writer.AddStmt(S->getCollection());
949   Writer.AddStmt(S->getBody());
950   Writer.AddSourceLocation(S->getForLoc(), Record);
951   Writer.AddSourceLocation(S->getRParenLoc(), Record);
952   Code = serialization::STMT_OBJC_FOR_COLLECTION;
953 }
954 
955 void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
956   Writer.AddStmt(S->getCatchBody());
957   Writer.AddDeclRef(S->getCatchParamDecl(), Record);
958   Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
959   Writer.AddSourceLocation(S->getRParenLoc(), Record);
960   Code = serialization::STMT_OBJC_CATCH;
961 }
962 
963 void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
964   Writer.AddStmt(S->getFinallyBody());
965   Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
966   Code = serialization::STMT_OBJC_FINALLY;
967 }
968 
969 void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
970   Writer.AddStmt(S->getSubStmt());
971   Writer.AddSourceLocation(S->getAtLoc(), Record);
972   Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
973 }
974 
975 void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
976   Record.push_back(S->getNumCatchStmts());
977   Record.push_back(S->getFinallyStmt() != 0);
978   Writer.AddStmt(S->getTryBody());
979   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
980     Writer.AddStmt(S->getCatchStmt(I));
981   if (S->getFinallyStmt())
982     Writer.AddStmt(S->getFinallyStmt());
983   Writer.AddSourceLocation(S->getAtTryLoc(), Record);
984   Code = serialization::STMT_OBJC_AT_TRY;
985 }
986 
987 void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
988   Writer.AddStmt(S->getSynchExpr());
989   Writer.AddStmt(S->getSynchBody());
990   Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
991   Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
992 }
993 
994 void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
995   Writer.AddStmt(S->getThrowExpr());
996   Writer.AddSourceLocation(S->getThrowLoc(), Record);
997   Code = serialization::STMT_OBJC_AT_THROW;
998 }
999 
1000 void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1001   VisitExpr(E);
1002   Record.push_back(E->getValue());
1003   Writer.AddSourceLocation(E->getLocation(), Record);
1004   Code = serialization::EXPR_OBJC_BOOL_LITERAL;
1005 }
1006 
1007 //===----------------------------------------------------------------------===//
1008 // C++ Expressions and Statements.
1009 //===----------------------------------------------------------------------===//
1010 
1011 void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
1012   VisitStmt(S);
1013   Writer.AddSourceLocation(S->getCatchLoc(), Record);
1014   Writer.AddDeclRef(S->getExceptionDecl(), Record);
1015   Writer.AddStmt(S->getHandlerBlock());
1016   Code = serialization::STMT_CXX_CATCH;
1017 }
1018 
1019 void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
1020   VisitStmt(S);
1021   Record.push_back(S->getNumHandlers());
1022   Writer.AddSourceLocation(S->getTryLoc(), Record);
1023   Writer.AddStmt(S->getTryBlock());
1024   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1025     Writer.AddStmt(S->getHandler(i));
1026   Code = serialization::STMT_CXX_TRY;
1027 }
1028 
1029 void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1030   VisitStmt(S);
1031   Writer.AddSourceLocation(S->getForLoc(), Record);
1032   Writer.AddSourceLocation(S->getColonLoc(), Record);
1033   Writer.AddSourceLocation(S->getRParenLoc(), Record);
1034   Writer.AddStmt(S->getRangeStmt());
1035   Writer.AddStmt(S->getBeginEndStmt());
1036   Writer.AddStmt(S->getCond());
1037   Writer.AddStmt(S->getInc());
1038   Writer.AddStmt(S->getLoopVarStmt());
1039   Writer.AddStmt(S->getBody());
1040   Code = serialization::STMT_CXX_FOR_RANGE;
1041 }
1042 
1043 void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1044   VisitStmt(S);
1045   Writer.AddSourceLocation(S->getKeywordLoc(), Record);
1046   Record.push_back(S->isIfExists());
1047   Writer.AddNestedNameSpecifierLoc(S->getQualifierLoc(), Record);
1048   Writer.AddDeclarationNameInfo(S->getNameInfo(), Record);
1049   Writer.AddStmt(S->getSubStmt());
1050   Code = serialization::STMT_MS_DEPENDENT_EXISTS;
1051 }
1052 
1053 void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1054   VisitCallExpr(E);
1055   Record.push_back(E->getOperator());
1056   Writer.AddSourceRange(E->Range, Record);
1057   Code = serialization::EXPR_CXX_OPERATOR_CALL;
1058 }
1059 
1060 void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
1061   VisitCallExpr(E);
1062   Code = serialization::EXPR_CXX_MEMBER_CALL;
1063 }
1064 
1065 void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1066   VisitExpr(E);
1067   Record.push_back(E->getNumArgs());
1068   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1069     Writer.AddStmt(E->getArg(I));
1070   Writer.AddDeclRef(E->getConstructor(), Record);
1071   Writer.AddSourceLocation(E->getLocation(), Record);
1072   Record.push_back(E->isElidable());
1073   Record.push_back(E->hadMultipleCandidates());
1074   Record.push_back(E->requiresZeroInitialization());
1075   Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
1076   Writer.AddSourceRange(E->getParenRange(), Record);
1077   Code = serialization::EXPR_CXX_CONSTRUCT;
1078 }
1079 
1080 void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1081   VisitCXXConstructExpr(E);
1082   Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1083   Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
1084 }
1085 
1086 void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
1087   VisitExpr(E);
1088   Record.push_back(E->NumCaptures);
1089   unsigned NumArrayIndexVars = 0;
1090   if (E->HasArrayIndexVars)
1091     NumArrayIndexVars = E->getArrayIndexStarts()[E->NumCaptures];
1092   Record.push_back(NumArrayIndexVars);
1093   Writer.AddSourceRange(E->IntroducerRange, Record);
1094   Record.push_back(E->CaptureDefault); // FIXME: stable encoding
1095   Record.push_back(E->ExplicitParams);
1096   Record.push_back(E->ExplicitResultType);
1097   Writer.AddSourceLocation(E->ClosingBrace, Record);
1098 
1099   // Add capture initializers.
1100   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1101                                       CEnd = E->capture_init_end();
1102        C != CEnd; ++C) {
1103     Writer.AddStmt(*C);
1104   }
1105 
1106   // Add array index variables, if any.
1107   if (NumArrayIndexVars) {
1108     Record.append(E->getArrayIndexStarts(),
1109                   E->getArrayIndexStarts() + E->NumCaptures + 1);
1110     VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1111     for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1112       Writer.AddDeclRef(ArrayIndexVars[I], Record);
1113   }
1114 
1115   Code = serialization::EXPR_LAMBDA;
1116 }
1117 
1118 void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1119   VisitExplicitCastExpr(E);
1120   Writer.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()),
1121                         Record);
1122 }
1123 
1124 void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1125   VisitCXXNamedCastExpr(E);
1126   Code = serialization::EXPR_CXX_STATIC_CAST;
1127 }
1128 
1129 void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1130   VisitCXXNamedCastExpr(E);
1131   Code = serialization::EXPR_CXX_DYNAMIC_CAST;
1132 }
1133 
1134 void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1135   VisitCXXNamedCastExpr(E);
1136   Code = serialization::EXPR_CXX_REINTERPRET_CAST;
1137 }
1138 
1139 void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1140   VisitCXXNamedCastExpr(E);
1141   Code = serialization::EXPR_CXX_CONST_CAST;
1142 }
1143 
1144 void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1145   VisitExplicitCastExpr(E);
1146   Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
1147   Writer.AddSourceLocation(E->getRParenLoc(), Record);
1148   Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
1149 }
1150 
1151 void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1152   VisitCallExpr(E);
1153   Writer.AddSourceLocation(E->UDSuffixLoc, Record);
1154   Code = serialization::EXPR_USER_DEFINED_LITERAL;
1155 }
1156 
1157 void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1158   VisitExpr(E);
1159   Record.push_back(E->getValue());
1160   Writer.AddSourceLocation(E->getLocation(), Record);
1161   Code = serialization::EXPR_CXX_BOOL_LITERAL;
1162 }
1163 
1164 void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1165   VisitExpr(E);
1166   Writer.AddSourceLocation(E->getLocation(), Record);
1167   Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
1168 }
1169 
1170 void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1171   VisitExpr(E);
1172   Writer.AddSourceRange(E->getSourceRange(), Record);
1173   if (E->isTypeOperand()) {
1174     Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
1175     Code = serialization::EXPR_CXX_TYPEID_TYPE;
1176   } else {
1177     Writer.AddStmt(E->getExprOperand());
1178     Code = serialization::EXPR_CXX_TYPEID_EXPR;
1179   }
1180 }
1181 
1182 void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
1183   VisitExpr(E);
1184   Writer.AddSourceLocation(E->getLocation(), Record);
1185   Record.push_back(E->isImplicit());
1186   Code = serialization::EXPR_CXX_THIS;
1187 }
1188 
1189 void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
1190   VisitExpr(E);
1191   Writer.AddSourceLocation(E->getThrowLoc(), Record);
1192   Writer.AddStmt(E->getSubExpr());
1193   Record.push_back(E->isThrownVariableInScope());
1194   Code = serialization::EXPR_CXX_THROW;
1195 }
1196 
1197 void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1198   VisitExpr(E);
1199 
1200   bool HasOtherExprStored = E->Param.getInt();
1201   // Store these first, the reader reads them before creation.
1202   Record.push_back(HasOtherExprStored);
1203   if (HasOtherExprStored)
1204     Writer.AddStmt(E->getExpr());
1205   Writer.AddDeclRef(E->getParam(), Record);
1206   Writer.AddSourceLocation(E->getUsedLocation(), Record);
1207 
1208   Code = serialization::EXPR_CXX_DEFAULT_ARG;
1209 }
1210 
1211 void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1212   VisitExpr(E);
1213   Writer.AddCXXTemporary(E->getTemporary(), Record);
1214   Writer.AddStmt(E->getSubExpr());
1215   Code = serialization::EXPR_CXX_BIND_TEMPORARY;
1216 }
1217 
1218 void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1219   VisitExpr(E);
1220   Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1221   Writer.AddSourceLocation(E->getRParenLoc(), Record);
1222   Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
1223 }
1224 
1225 void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1226   VisitExpr(E);
1227   Record.push_back(E->isGlobalNew());
1228   Record.push_back(E->isArray());
1229   Record.push_back(E->doesUsualArrayDeleteWantSize());
1230   Record.push_back(E->getNumPlacementArgs());
1231   Record.push_back(E->StoredInitializationStyle);
1232   Writer.AddDeclRef(E->getOperatorNew(), Record);
1233   Writer.AddDeclRef(E->getOperatorDelete(), Record);
1234   Writer.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo(), Record);
1235   Writer.AddSourceRange(E->getTypeIdParens(), Record);
1236   Writer.AddSourceLocation(E->getStartLoc(), Record);
1237   Writer.AddSourceRange(E->getDirectInitRange(), Record);
1238   for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
1239        I != e; ++I)
1240     Writer.AddStmt(*I);
1241 
1242   Code = serialization::EXPR_CXX_NEW;
1243 }
1244 
1245 void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1246   VisitExpr(E);
1247   Record.push_back(E->isGlobalDelete());
1248   Record.push_back(E->isArrayForm());
1249   Record.push_back(E->isArrayFormAsWritten());
1250   Record.push_back(E->doesUsualArrayDeleteWantSize());
1251   Writer.AddDeclRef(E->getOperatorDelete(), Record);
1252   Writer.AddStmt(E->getArgument());
1253   Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1254 
1255   Code = serialization::EXPR_CXX_DELETE;
1256 }
1257 
1258 void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1259   VisitExpr(E);
1260 
1261   Writer.AddStmt(E->getBase());
1262   Record.push_back(E->isArrow());
1263   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1264   Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1265   Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);
1266   Writer.AddSourceLocation(E->getColonColonLoc(), Record);
1267   Writer.AddSourceLocation(E->getTildeLoc(), Record);
1268 
1269   // PseudoDestructorTypeStorage.
1270   Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);
1271   if (E->getDestroyedTypeIdentifier())
1272     Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);
1273   else
1274     Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);
1275 
1276   Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
1277 }
1278 
1279 void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
1280   VisitExpr(E);
1281   Record.push_back(E->getNumObjects());
1282   for (unsigned i = 0, e = E->getNumObjects(); i != e; ++i)
1283     Writer.AddDeclRef(E->getObject(i), Record);
1284 
1285   Writer.AddStmt(E->getSubExpr());
1286   Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
1287 }
1288 
1289 void
1290 ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1291   VisitExpr(E);
1292 
1293   // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1294   // emitted first.
1295 
1296   Record.push_back(E->HasTemplateKWAndArgsInfo);
1297   if (E->HasTemplateKWAndArgsInfo) {
1298     const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1299     Record.push_back(Args.NumTemplateArgs);
1300     AddTemplateKWAndArgsInfo(Args);
1301   }
1302 
1303   if (!E->isImplicitAccess())
1304     Writer.AddStmt(E->getBase());
1305   else
1306     Writer.AddStmt(0);
1307   Writer.AddTypeRef(E->getBaseType(), Record);
1308   Record.push_back(E->isArrow());
1309   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1310   Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1311   Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
1312   Writer.AddDeclarationNameInfo(E->MemberNameInfo, Record);
1313   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1314 }
1315 
1316 void
1317 ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1318   VisitExpr(E);
1319 
1320   // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1321   // emitted first.
1322 
1323   Record.push_back(E->HasTemplateKWAndArgsInfo);
1324   if (E->HasTemplateKWAndArgsInfo) {
1325     const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1326     Record.push_back(Args.NumTemplateArgs);
1327     AddTemplateKWAndArgsInfo(Args);
1328   }
1329 
1330   Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1331   Writer.AddDeclarationNameInfo(E->NameInfo, Record);
1332   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
1333 }
1334 
1335 void
1336 ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1337   VisitExpr(E);
1338   Record.push_back(E->arg_size());
1339   for (CXXUnresolvedConstructExpr::arg_iterator
1340          ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1341     Writer.AddStmt(*ArgI);
1342   Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
1343   Writer.AddSourceLocation(E->getLParenLoc(), Record);
1344   Writer.AddSourceLocation(E->getRParenLoc(), Record);
1345   Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1346 }
1347 
1348 void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1349   VisitExpr(E);
1350 
1351   // Don't emit anything here, HasTemplateKWAndArgsInfo must be
1352   // emitted first.
1353 
1354   Record.push_back(E->HasTemplateKWAndArgsInfo);
1355   if (E->HasTemplateKWAndArgsInfo) {
1356     const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
1357     Record.push_back(Args.NumTemplateArgs);
1358     AddTemplateKWAndArgsInfo(Args);
1359   }
1360 
1361   Record.push_back(E->getNumDecls());
1362   for (OverloadExpr::decls_iterator
1363          OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
1364     Writer.AddDeclRef(OvI.getDecl(), Record);
1365     Record.push_back(OvI.getAccess());
1366   }
1367 
1368   Writer.AddDeclarationNameInfo(E->NameInfo, Record);
1369   Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
1370 }
1371 
1372 void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1373   VisitOverloadExpr(E);
1374   Record.push_back(E->isArrow());
1375   Record.push_back(E->hasUnresolvedUsing());
1376   Writer.AddStmt(!E->isImplicitAccess() ? E->getBase() : 0);
1377   Writer.AddTypeRef(E->getBaseType(), Record);
1378   Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1379   Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
1380 }
1381 
1382 void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1383   VisitOverloadExpr(E);
1384   Record.push_back(E->requiresADL());
1385   if (E->requiresADL())
1386     Record.push_back(E->isStdAssociatedNamespace());
1387   Record.push_back(E->isOverloaded());
1388   Writer.AddDeclRef(E->getNamingClass(), Record);
1389   Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
1390 }
1391 
1392 void ASTStmtWriter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1393   VisitExpr(E);
1394   Record.push_back(E->getTrait());
1395   Record.push_back(E->getValue());
1396   Writer.AddSourceRange(E->getSourceRange(), Record);
1397   Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);
1398   Code = serialization::EXPR_CXX_UNARY_TYPE_TRAIT;
1399 }
1400 
1401 void ASTStmtWriter::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
1402   VisitExpr(E);
1403   Record.push_back(E->getTrait());
1404   Record.push_back(E->getValue());
1405   Writer.AddSourceRange(E->getSourceRange(), Record);
1406   Writer.AddTypeSourceInfo(E->getLhsTypeSourceInfo(), Record);
1407   Writer.AddTypeSourceInfo(E->getRhsTypeSourceInfo(), Record);
1408   Code = serialization::EXPR_BINARY_TYPE_TRAIT;
1409 }
1410 
1411 void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
1412   VisitExpr(E);
1413   Record.push_back(E->TypeTraitExprBits.NumArgs);
1414   Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
1415   Record.push_back(E->TypeTraitExprBits.Value);
1416   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1417     Writer.AddTypeSourceInfo(E->getArg(I), Record);
1418   Code = serialization::EXPR_TYPE_TRAIT;
1419 }
1420 
1421 void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1422   VisitExpr(E);
1423   Record.push_back(E->getTrait());
1424   Record.push_back(E->getValue());
1425   Writer.AddSourceRange(E->getSourceRange(), Record);
1426   Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);
1427   Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
1428 }
1429 
1430 void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1431   VisitExpr(E);
1432   Record.push_back(E->getTrait());
1433   Record.push_back(E->getValue());
1434   Writer.AddSourceRange(E->getSourceRange(), Record);
1435   Writer.AddStmt(E->getQueriedExpression());
1436   Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
1437 }
1438 
1439 void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1440   VisitExpr(E);
1441   Record.push_back(E->getValue());
1442   Writer.AddSourceRange(E->getSourceRange(), Record);
1443   Writer.AddStmt(E->getOperand());
1444   Code = serialization::EXPR_CXX_NOEXCEPT;
1445 }
1446 
1447 void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
1448   VisitExpr(E);
1449   Writer.AddSourceLocation(E->getEllipsisLoc(), Record);
1450   Record.push_back(E->NumExpansions);
1451   Writer.AddStmt(E->getPattern());
1452   Code = serialization::EXPR_PACK_EXPANSION;
1453 }
1454 
1455 void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1456   VisitExpr(E);
1457   Writer.AddSourceLocation(E->OperatorLoc, Record);
1458   Writer.AddSourceLocation(E->PackLoc, Record);
1459   Writer.AddSourceLocation(E->RParenLoc, Record);
1460   Record.push_back(E->Length);
1461   Writer.AddDeclRef(E->Pack, Record);
1462   Code = serialization::EXPR_SIZEOF_PACK;
1463 }
1464 
1465 void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
1466                                               SubstNonTypeTemplateParmExpr *E) {
1467   VisitExpr(E);
1468   Writer.AddDeclRef(E->getParameter(), Record);
1469   Writer.AddSourceLocation(E->getNameLoc(), Record);
1470   Writer.AddStmt(E->getReplacement());
1471   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
1472 }
1473 
1474 void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
1475                                           SubstNonTypeTemplateParmPackExpr *E) {
1476   VisitExpr(E);
1477   Writer.AddDeclRef(E->getParameterPack(), Record);
1478   Writer.AddTemplateArgument(E->getArgumentPack(), Record);
1479   Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
1480   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
1481 }
1482 
1483 void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1484   VisitExpr(E);
1485   Writer.AddStmt(E->Temporary);
1486   Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
1487 }
1488 
1489 void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1490   VisitExpr(E);
1491   Writer.AddStmt(E->getSourceExpr());
1492   Writer.AddSourceLocation(E->getLocation(), Record);
1493   Code = serialization::EXPR_OPAQUE_VALUE;
1494 }
1495 
1496 //===----------------------------------------------------------------------===//
1497 // CUDA Expressions and Statements.
1498 //===----------------------------------------------------------------------===//
1499 
1500 void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1501   VisitCallExpr(E);
1502   Writer.AddStmt(E->getConfig());
1503   Code = serialization::EXPR_CUDA_KERNEL_CALL;
1504 }
1505 
1506 //===----------------------------------------------------------------------===//
1507 // OpenCL Expressions and Statements.
1508 //===----------------------------------------------------------------------===//
1509 void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
1510   VisitExpr(E);
1511   Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
1512   Writer.AddSourceLocation(E->getRParenLoc(), Record);
1513   Writer.AddStmt(E->getSrcExpr());
1514   Code = serialization::EXPR_ASTYPE;
1515 }
1516 
1517 //===----------------------------------------------------------------------===//
1518 // Microsoft Expressions and Statements.
1519 //===----------------------------------------------------------------------===//
1520 void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1521   VisitExpr(E);
1522   Writer.AddSourceRange(E->getSourceRange(), Record);
1523   if (E->isTypeOperand()) {
1524     Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
1525     Code = serialization::EXPR_CXX_UUIDOF_TYPE;
1526   } else {
1527     Writer.AddStmt(E->getExprOperand());
1528     Code = serialization::EXPR_CXX_UUIDOF_EXPR;
1529   }
1530 }
1531 
1532 void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
1533   VisitStmt(S);
1534   Writer.AddSourceLocation(S->getExceptLoc(), Record);
1535   Writer.AddStmt(S->getFilterExpr());
1536   Writer.AddStmt(S->getBlock());
1537   Code = serialization::STMT_SEH_EXCEPT;
1538 }
1539 
1540 void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1541   VisitStmt(S);
1542   Writer.AddSourceLocation(S->getFinallyLoc(), Record);
1543   Writer.AddStmt(S->getBlock());
1544   Code = serialization::STMT_SEH_FINALLY;
1545 }
1546 
1547 void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
1548   VisitStmt(S);
1549   Record.push_back(S->getIsCXXTry());
1550   Writer.AddSourceLocation(S->getTryLoc(), Record);
1551   Writer.AddStmt(S->getTryBlock());
1552   Writer.AddStmt(S->getHandler());
1553   Code = serialization::STMT_SEH_TRY;
1554 }
1555 
1556 //===----------------------------------------------------------------------===//
1557 // ASTWriter Implementation
1558 //===----------------------------------------------------------------------===//
1559 
1560 unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
1561   assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
1562          "SwitchCase recorded twice");
1563   unsigned NextID = SwitchCaseIDs.size();
1564   SwitchCaseIDs[S] = NextID;
1565   return NextID;
1566 }
1567 
1568 unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
1569   assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
1570          "SwitchCase hasn't been seen yet");
1571   return SwitchCaseIDs[S];
1572 }
1573 
1574 void ASTWriter::ClearSwitchCaseIDs() {
1575   SwitchCaseIDs.clear();
1576 }
1577 
1578 /// \brief Write the given substatement or subexpression to the
1579 /// bitstream.
1580 void ASTWriter::WriteSubStmt(Stmt *S,
1581                              llvm::DenseMap<Stmt *, uint64_t> &SubStmtEntries,
1582                              llvm::DenseSet<Stmt *> &ParentStmts) {
1583   RecordData Record;
1584   ASTStmtWriter Writer(*this, Record);
1585   ++NumStatements;
1586 
1587   if (!S) {
1588     Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
1589     return;
1590   }
1591 
1592   llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
1593   if (I != SubStmtEntries.end()) {
1594     Record.push_back(I->second);
1595     Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
1596     return;
1597   }
1598 
1599 #ifndef NDEBUG
1600   assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
1601 
1602   struct ParentStmtInserterRAII {
1603     Stmt *S;
1604     llvm::DenseSet<Stmt *> &ParentStmts;
1605 
1606     ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
1607       : S(S), ParentStmts(ParentStmts) {
1608       ParentStmts.insert(S);
1609     }
1610     ~ParentStmtInserterRAII() {
1611       ParentStmts.erase(S);
1612     }
1613   };
1614 
1615   ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
1616 #endif
1617 
1618   // Redirect ASTWriter::AddStmt to collect sub stmts.
1619   SmallVector<Stmt *, 16> SubStmts;
1620   CollectedStmts = &SubStmts;
1621 
1622   Writer.Code = serialization::STMT_NULL_PTR;
1623   Writer.AbbrevToUse = 0;
1624   Writer.Visit(S);
1625 
1626 #ifndef NDEBUG
1627   if (Writer.Code == serialization::STMT_NULL_PTR) {
1628     SourceManager &SrcMgr
1629       = DeclIDs.begin()->first->getASTContext().getSourceManager();
1630     S->dump(SrcMgr);
1631     llvm_unreachable("Unhandled sub statement writing AST file");
1632   }
1633 #endif
1634 
1635   // Revert ASTWriter::AddStmt.
1636   CollectedStmts = &StmtsToEmit;
1637 
1638   // Write the sub stmts in reverse order, last to first. When reading them back
1639   // we will read them in correct order by "pop"ing them from the Stmts stack.
1640   // This simplifies reading and allows to store a variable number of sub stmts
1641   // without knowing it in advance.
1642   while (!SubStmts.empty())
1643     WriteSubStmt(SubStmts.pop_back_val(), SubStmtEntries, ParentStmts);
1644 
1645   Stream.EmitRecord(Writer.Code, Record, Writer.AbbrevToUse);
1646 
1647   SubStmtEntries[S] = Stream.GetCurrentBitNo();
1648 }
1649 
1650 /// \brief Flush all of the statements that have been added to the
1651 /// queue via AddStmt().
1652 void ASTWriter::FlushStmts() {
1653   RecordData Record;
1654 
1655   // We expect to be the only consumer of the two temporary statement maps,
1656   // assert that they are empty.
1657   assert(SubStmtEntries.empty() && "unexpected entries in sub stmt map");
1658   assert(ParentStmts.empty() && "unexpected entries in parent stmt map");
1659 
1660   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1661     WriteSubStmt(StmtsToEmit[I], SubStmtEntries, ParentStmts);
1662 
1663     assert(N == StmtsToEmit.size() &&
1664            "Substatement written via AddStmt rather than WriteSubStmt!");
1665 
1666     // Note that we are at the end of a full expression. Any
1667     // expression records that follow this one are part of a different
1668     // expression.
1669     Stream.EmitRecord(serialization::STMT_STOP, Record);
1670 
1671     SubStmtEntries.clear();
1672     ParentStmts.clear();
1673   }
1674 
1675   StmtsToEmit.clear();
1676 }
1677