ASTWriterStmt.cpp revision a25b6a4b43e8b9611f7506e5fe1b448833b10a46
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
3344abd362cfe2d03ed956666527352826b67bde5Dmitry Shmidt//                     The LLVM Compiler Infrastructure
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file is distributed under the University of Illinois Open Source
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// License. See LICENSE.TXT for details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//  This file implements serialization for Statements and Expressions.
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt#include "clang/Serialization/ASTWriter.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "clang/AST/DeclCXX.h"
1604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "clang/AST/DeclObjC.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "clang/AST/StmtVisitor.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Bitcode/BitstreamWriter.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace clang;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Statement/expression serialization
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace clang {
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASTWriter &Writer;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASTWriter::RecordData &Record;
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  public:
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    serialization::StmtCode Code;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
3404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt      : Writer(Writer), Record(Record) { }
35051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args);
3804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitStmt(Stmt *S);
40c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt    void VisitNullStmt(NullStmt *S);
41cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitCompoundStmt(CompoundStmt *S);
42cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitSwitchCase(SwitchCase *S);
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCaseStmt(CaseStmt *S);
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitDefaultStmt(DefaultStmt *S);
4504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitLabelStmt(LabelStmt *S);
4604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitIfStmt(IfStmt *S);
4704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitSwitchStmt(SwitchStmt *S);
4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitWhileStmt(WhileStmt *S);
4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitDoStmt(DoStmt *S);
5004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitForStmt(ForStmt *S);
5104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitGotoStmt(GotoStmt *S);
5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitIndirectGotoStmt(IndirectGotoStmt *S);
5304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitContinueStmt(ContinueStmt *S);
5404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitBreakStmt(BreakStmt *S);
5504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitReturnStmt(ReturnStmt *S);
5604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitDeclStmt(DeclStmt *S);
5704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitAsmStmt(AsmStmt *S);
5804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitExpr(Expr *E);
5904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitPredefinedExpr(PredefinedExpr *E);
6004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitDeclRefExpr(DeclRefExpr *E);
6104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitIntegerLiteral(IntegerLiteral *E);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitFloatingLiteral(FloatingLiteral *E);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitImaginaryLiteral(ImaginaryLiteral *E);
64cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitStringLiteral(StringLiteral *E);
65cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitCharacterLiteral(CharacterLiteral *E);
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitParenExpr(ParenExpr *E);
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitParenListExpr(ParenListExpr *E);
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitUnaryOperator(UnaryOperator *E);
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitOffsetOfExpr(OffsetOfExpr *E);
70cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
71cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
72cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitCallExpr(CallExpr *E);
73cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitMemberExpr(MemberExpr *E);
74cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitCastExpr(CastExpr *E);
75cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitBinaryOperator(BinaryOperator *E);
76cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitCompoundAssignOperator(CompoundAssignOperator *E);
77cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitConditionalOperator(ConditionalOperator *E);
78cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitImplicitCastExpr(ImplicitCastExpr *E);
79cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    void VisitExplicitCastExpr(ExplicitCastExpr *E);
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCStyleCastExpr(CStyleCastExpr *E);
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitInitListExpr(InitListExpr *E);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitDesignatedInitExpr(DesignatedInitExpr *E);
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitVAArgExpr(VAArgExpr *E);
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitAddrLabelExpr(AddrLabelExpr *E);
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitStmtExpr(StmtExpr *E);
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    void VisitChooseExpr(ChooseExpr *E);
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitGNUNullExpr(GNUNullExpr *E);
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    void VisitBlockExpr(BlockExpr *E);
941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // Objective-C Expressions
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCStringLiteral(ObjCStringLiteral *E);
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCImplicitSetterGetterRefExpr(
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                        ObjCImplicitSetterGetterRefExpr *E);
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCMessageExpr(ObjCMessageExpr *E);
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCIsaExpr(ObjCIsaExpr *E);
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // Objective-C Statements
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCAtTryStmt(ObjCAtTryStmt *);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
11461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // C++ Statements
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXCatchStmt(CXXCatchStmt *S);
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXTryStmt(CXXTryStmt *S);
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXConstructExpr(CXXConstructExpr *E);
123444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXConstCastExpr(CXXConstCastExpr *E);
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
13204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitCXXTypeidExpr(CXXTypeidExpr *E);
13304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    void VisitCXXUuidofExpr(CXXUuidofExpr *E);
134c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt    void VisitCXXThisExpr(CXXThisExpr *E);
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXThrowExpr(CXXThrowExpr *E);
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXNewExpr(CXXNewExpr *E);
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void VisitCXXDeleteExpr(CXXDeleteExpr *E);
142444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
143444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
144444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
145444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
146444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
147444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
148444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
149444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitOverloadExpr(OverloadExpr *E);
150444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
151444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
152444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
153444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
154444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
155444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
156444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    void VisitOpaqueValueExpr(OpaqueValueExpr *E);
157444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  };
158444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
159444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
160444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtvoid ASTStmtWriter::
161444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry ShmidtAddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args) {
162444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  Writer.AddSourceLocation(Args.LAngleLoc, Record);
163444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  Writer.AddSourceLocation(Args.RAngleLoc, Record);
164444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt  for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
165444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt    Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
166444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitStmt(Stmt *S) {
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitNullStmt(NullStmt *S) {
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getSemiLoc(), Record);
174cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::STMT_NULL;
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->size());
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (CompoundStmt::body_iterator CS = S->body_begin(), CSEnd = S->body_end();
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       CS != CSEnd; ++CS)
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(*CS);
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getLBracLoc(), Record);
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getRBracLoc(), Record);
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_COMPOUND;
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(Writer.getSwitchCaseID(S));
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitSwitchCase(S);
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getLHS());
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getRHS());
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getSubStmt());
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getCaseLoc(), Record);
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getColonLoc(), Record);
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_CASE;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitSwitchCase(S);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getSubStmt());
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getDefaultLoc(), Record);
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getColonLoc(), Record);
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_DEFAULT;
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddIdentifierRef(S->getID(), Record);
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getSubStmt());
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getIdentLoc(), Record);
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->isUsed());
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->HasUnusedAttribute());
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(Writer.GetLabelID(S));
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_LABEL;
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitIfStmt(IfStmt *S) {
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(S->getConditionVariable(), Record);
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getCond());
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getThen());
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getElse());
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getIfLoc(), Record);
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getElseLoc(), Record);
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->MacroExpandedInThenStmt);
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_IF;
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(S->getConditionVariable(), Record);
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getCond());
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getBody());
24004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getSwitchLoc(), Record);
24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(S->isAllEnumCasesCovered());
242fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt  for (SwitchCase *SC = S->getSwitchCaseList(); SC;
243fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt       SC = SC->getNextSwitchCase())
244fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt    Record.push_back(Writer.RecordSwitchCaseID(SC));
245fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt  Code = serialization::STMT_SWITCH;
246fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt}
247fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt
248fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidtvoid ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
2495460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  VisitStmt(S);
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(S->getConditionVariable(), Record);
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getCond());
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getBody());
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getWhileLoc(), Record);
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_WHILE;
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitDoStmt(DoStmt *S) {
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
25904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(S->getCond());
26004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(S->getBody());
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getDoLoc(), Record);
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getWhileLoc(), Record);
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getRParenLoc(), Record);
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_DO;
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2675460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtvoid ASTStmtWriter::VisitForStmt(ForStmt *S) {
2685460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  VisitStmt(S);
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getInit());
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getCond());
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(S->getConditionVariable(), Record);
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getInc());
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getBody());
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getForLoc(), Record);
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getLParenLoc(), Record);
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getRParenLoc(), Record);
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_FOR;
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(S);
2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  Record.push_back(Writer.GetLabelID(S->getLabel()));
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  Writer.AddSourceLocation(S->getGotoLoc(), Record);
28404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getLabelLoc(), Record);
28504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_GOTO;
28604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
28704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
288d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtvoid ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
289d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  VisitStmt(S);
290d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  Writer.AddSourceLocation(S->getGotoLoc(), Record);
291d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  Writer.AddSourceLocation(S->getStarLoc(), Record);
292d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  Writer.AddStmt(S->getTarget());
29304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_INDIRECT_GOTO;
29404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
29504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
29604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
29704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitStmt(S);
29804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getContinueLoc(), Record);
29904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_CONTINUE;
30004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
3015460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
3025460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtvoid ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
30304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitStmt(S);
30404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getBreakLoc(), Record);
30504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_BREAK;
3065460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt}
3075460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
30861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
30961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  VisitStmt(S);
31061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Writer.AddStmt(S->getRetValue());
31104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getReturnLoc(), Record);
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(S->getNRVOCandidate(), Record);
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::STMT_RETURN;
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
31604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
3175460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  VisitStmt(S);
31804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getStartLoc(), Record);
31904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(S->getEndLoc(), Record);
32004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  DeclGroupRef DG = S->getDeclGroup();
32104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
32204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    Writer.AddDeclRef(*D, Record);
32304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_DECL;
32404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
32504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
32604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
32704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitStmt(S);
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->getNumOutputs());
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->getNumInputs());
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->getNumClobbers());
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getAsmLoc(), Record);
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(S->getRParenLoc(), Record);
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->isVolatile());
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->isSimple());
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(S->isMSAsm());
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(S->getAsmString());
3375460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
338cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // Outputs
339cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
34004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(S->getOutputConstraintLiteral(I));
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(S->getOutputExpr(I));
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Inputs
3465460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(S->getInputConstraintLiteral(I));
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(S->getInputExpr(I));
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
35104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
35204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  // Clobbers
35304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
35404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    Writer.AddStmt(S->getClobber(I));
35504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
35604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::STMT_ASM;
35704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
35804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
35904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitExpr(Expr *E) {
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitStmt(E);
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeRef(E->getType(), Record);
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isTypeDependent());
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isValueDependent());
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getValueKind());
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getObjectKind());
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
37175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  Record.push_back(E->getIdentType()); // FIXME: stable encoding
37275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  Code = serialization::EXPR_PREDEFINED;
37375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen}
37475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
37575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinenvoid ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
37675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  VisitExpr(E);
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->hasQualifier());
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned NumTemplateArgs = E->getNumTemplateArgs();
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt         "Template args list with no args ?");
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(NumTemplateArgs);
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (E->hasQualifier()) {
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddSourceRange(E->getQualifierRange(), Record);
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (NumTemplateArgs)
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    AddExplicitTemplateArgumentList(E->getExplicitTemplateArgs());
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getDecl(), Record);
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record);
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_DECL_REF;
39604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddAPInt(E->getValue(), Record);
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_INTEGER_LITERAL;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  VisitExpr(E);
4071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  Writer.AddAPFloat(E->getValue(), Record);
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isExact());
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  Code = serialization::EXPR_FLOATING_LITERAL;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_IMAGINARY_LITERAL;
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getByteLength());
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumConcatenated());
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isWide());
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // FIXME: String data should be stored as a blob at the end of the
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // StringLiteral. However, we can't do so now because we have no
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // provision for coping with abbreviations when we're jumping around
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // the AST file during deserialization.
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.append(E->getString().begin(), E->getString().end());
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_STRING_LITERAL;
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getValue());
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isWide());
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CHARACTER_LITERAL;
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLParen(), Record);
445cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getRParen(), Record);
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_PAREN;
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->NumExprs);
453cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned i=0; i != E->NumExprs; ++i)
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->Exprs[i]);
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->LParenLoc, Record);
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->RParenLoc, Record);
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_PAREN_LIST;
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getOpcode()); // FIXME: stable encoding
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_UNARY_OPERATOR;
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumComponents());
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumExpressions());
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(ON.getKind()); // FIXME: Stable encoding
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddSourceLocation(ON.getRange().getBegin(), Record);
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddSourceLocation(ON.getRange().getEnd(), Record);
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    switch (ON.getKind()) {
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    case OffsetOfExpr::OffsetOfNode::Array:
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Record.push_back(ON.getArrayExprIndex());
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      break;
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    case OffsetOfExpr::OffsetOfNode::Field:
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddDeclRef(ON.getField(), Record);
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      break;
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    case OffsetOfExpr::OffsetOfNode::Identifier:
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddIdentifierRef(ON.getFieldName(), Record);
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      break;
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    case OffsetOfExpr::OffsetOfNode::Base:
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      break;
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getIndexExpr(I));
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OFFSETOF;
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isSizeOf());
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (E->isArgumentType())
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  else {
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(0);
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getArgumentExpr());
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_SIZEOF_ALIGN_OF;
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
518cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getLHS());
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getRHS());
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRBracketLoc(), Record);
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_ARRAY_SUBSCRIPT;
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCallExpr(CallExpr *E) {
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
52704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->getNumArgs());
52804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
52904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getCallee());
53004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
53104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt       Arg != ArgEnd; ++Arg)
53213ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    Writer.AddStmt(*Arg);
53313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  Code = serialization::EXPR_CALL;
53413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt}
53513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
53613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidtvoid ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
53713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  // Don't call VisitExpr, we'll write everything here.
53813ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
53913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  Record.push_back(E->hasQualifier());
54013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  if (E->hasQualifier()) {
54113ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
54213ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    Writer.AddSourceRange(E->getQualifierRange(), Record);
54313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  }
54413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
54513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  unsigned NumTemplateArgs = E->getNumTemplateArgs();
54613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
54713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt         "Template args list with no args ?");
54813ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  Record.push_back(NumTemplateArgs);
54913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  if (NumTemplateArgs) {
55013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    Writer.AddSourceLocation(E->getLAngleLoc(), Record);
55113ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    Writer.AddSourceLocation(E->getRAngleLoc(), Record);
55213ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt    for (unsigned i=0; i != NumTemplateArgs; ++i)
55313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt      Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
55413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  }
55513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
55613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  DeclAccessPair FoundDecl = E->getFoundDecl();
55713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  Writer.AddDeclRef(FoundDecl.getDecl(), Record);
55813ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt  Record.push_back(FoundDecl.getAccess());
55913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
56004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddTypeRef(E->getType(), Record);
56104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->getValueKind());
56204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->getObjectKind());
56304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getBase());
56404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddDeclRef(E->getMemberDecl(), Record);
56504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getMemberLoc(), Record);
56604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isArrow());
56704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddDeclarationNameLoc(E->MemberDNLoc,
56804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt                               E->getMemberDecl()->getDeclName(), Record);
56904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_MEMBER;
57004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
57104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
57204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
57304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
57404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getBase());
57504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
57604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isArrow());
57704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_OBJC_ISA;
57804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
57904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
58004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitCastExpr(CastExpr *E) {
58104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
58204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->path_size());
58304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getSubExpr());
58404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->getCastKind()); // FIXME: stable encoding
58504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
58604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  for (CastExpr::path_iterator
58704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt         PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
58804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    Writer.AddCXXBaseSpecifier(**PI, Record);
58904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
59004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
59104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
59204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
59304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getLHS());
59404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getRHS());
59504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->getOpcode()); // FIXME: stable encoding
59604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
59704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_BINARY_OPERATOR;
59804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
59904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
60004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
60104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitBinaryOperator(E);
60204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddTypeRef(E->getComputationLHSType(), Record);
60304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddTypeRef(E->getComputationResultType(), Record);
60404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
60504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
60604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
60704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
60804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
60904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getCond());
61004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getLHS());
61104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getRHS());
61204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getSAVE());
61304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getQuestionLoc(), Record);
61404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getColonLoc(), Record);
61504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_CONDITIONAL_OPERATOR;
61604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
61704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
61804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
61904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitCastExpr(E);
62004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_IMPLICIT_CAST;
62104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
62204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
62304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
62404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitCastExpr(E);
62504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
62613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt}
62713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
62804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
62904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExplicitCastExpr(E);
63004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getLParenLoc(), Record);
63104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
63204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_CSTYLE_CAST;
63304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
63404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
63504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLParenLoc(), Record);
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getInitializer());
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isFileScope());
641cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_COMPOUND_LITERAL;
642cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getBase());
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddIdentifierRef(&E->getAccessor(), Record);
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAccessorLoc(), Record);
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumInits());
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getInit(I));
6575460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Writer.AddStmt(E->getSyntacticForm());
6585460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Writer.AddSourceLocation(E->getLBraceLoc(), Record);
6595460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Writer.AddSourceLocation(E->getRBraceLoc(), Record);
6605460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
6615460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Record.push_back(E->hadArrayRangeDesignator());
6625460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Code = serialization::EXPR_INIT_LIST;
6635460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt}
6645460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
6655460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtvoid ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6665460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  VisitExpr(E);
667cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->getNumSubExprs());
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getSubExpr(I));
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->usesGNUSyntax());
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                             DEnd = E->designators_end();
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       D != DEnd; ++D) {
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (D->isFieldDesignator()) {
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      if (FieldDecl *Field = D->getField()) {
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Record.push_back(serialization::DESIG_FIELD_DECL);
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Writer.AddDeclRef(Field, Record);
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } else {
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Record.push_back(serialization::DESIG_FIELD_NAME);
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Writer.AddIdentifierRef(D->getFieldName(), Record);
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      }
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getDotLoc(), Record);
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getFieldLoc(), Record);
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } else if (D->isArrayDesignator()) {
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Record.push_back(serialization::DESIG_ARRAY);
6875460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt      Record.push_back(D->getFirstExprIndex());
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getLBracketLoc(), Record);
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getRBracketLoc(), Record);
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } else {
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      assert(D->isArrayRangeDesignator() && "Unknown designator");
692cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt      Record.push_back(serialization::DESIG_ARRAY_RANGE);
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Record.push_back(D->getFirstExprIndex());
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getLBracketLoc(), Record);
6953cf6f79011d16f23e60cbf2846aab0fd440511daDmitry Shmidt      Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Writer.AddSourceLocation(D->getRBracketLoc(), Record);
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_DESIGNATED_INIT;
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
70304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record);
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_VA_ARG;
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLabelLoc(), Record);
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(Writer.GetLabelID(E->getLabel()));
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_ADDR_LABEL;
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubStmt());
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLParenLoc(), Record);
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_STMT;
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getArgTInfo1(), Record);
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getArgTInfo2(), Record);
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_TYPES_COMPATIBLE;
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
74061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
74261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  VisitExpr(E);
74361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Writer.AddStmt(E->getCond());
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getLHS());
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getRHS());
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CHOOSE;
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
75361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Writer.AddSourceLocation(E->getTokenLocation(), Record);
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_GNU_NULL;
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumSubExprs());
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getExpr(I));
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_SHUFFLE_VECTOR;
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
76704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
76804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
76904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddDeclRef(E->getBlockDecl(), Record);
77004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->hasBlockDeclRefExprs());
77104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_BLOCK;
77204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
77304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
77404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid ASTStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
77504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
77604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddDeclRef(E->getDecl(), Record);
77704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
77804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isByRef());
77904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isConstQualAdded());
78004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getCopyConstructorExpr());
78104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Code = serialization::EXPR_BLOCK_DECL_REF;
78204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
78304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
78404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt//===----------------------------------------------------------------------===//
78504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt// Objective-C Expressions and Statements.
78604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt//===----------------------------------------------------------------------===//
78704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getString());
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAtLoc(), Record);
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OBJC_STRING_LITERAL;
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAtLoc(), Record);
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OBJC_ENCODE;
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSelectorRef(E->getSelector(), Record);
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAtLoc(), Record);
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getProtocol(), Record);
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getAtLoc(), Record);
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
82004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  VisitExpr(E);
82104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddDeclRef(E->getDecl(), Record);
82204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
82304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Writer.AddStmt(E->getBase());
82404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isArrow());
82504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  Record.push_back(E->isFreeIvar());
826cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
827cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
828cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
829cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getProperty(), Record);
832cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getSuperLocation(), Record);
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (E->isSuperReceiver())
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddTypeRef(E->getSuperType(), Record);
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  else
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getBase());
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
839fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
840fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt}
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ASTStmtWriter::VisitObjCImplicitSetterGetterRefExpr(
8431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                  ObjCImplicitSetterGetterRefExpr *E) {
8441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt  VisitExpr(E);
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getGetterMethod(), Record);
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getSetterMethod(), Record);
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // NOTE: InterfaceDecl and Base are mutually exclusive.
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getInterfaceDecl(), Record);
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getBase());
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getClassLoc(), Record);
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getSuperLocation(), Record);
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeRef(E->getSuperType(), Record);
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_OBJC_KVC_REF_EXPR;
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumArgs());
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  switch (E->getReceiverKind()) {
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  case ObjCMessageExpr::Instance:
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getInstanceReceiver());
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    break;
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  case ObjCMessageExpr::Class:
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    break;
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8718bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  case ObjCMessageExpr::SuperClass:
8728bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  case ObjCMessageExpr::SuperInstance:
8738bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Writer.AddTypeRef(E->getSuperType(), Record);
8748bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Writer.AddSourceLocation(E->getSuperLoc(), Record);
8758bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    break;
8768bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  }
8778bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
8788bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  if (E->getMethodDecl()) {
8798bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Record.push_back(1);
8808bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Writer.AddDeclRef(E->getMethodDecl(), Record);
8818bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  } else {
8828bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Record.push_back(0);
8838bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Writer.AddSelectorRef(E->getSelector(), Record);
8848bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  }
8858bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
8868bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(E->getLeftLoc(), Record);
8878bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(E->getRightLoc(), Record);
8888bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
8898bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
8908bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt       Arg != ArgEnd; ++Arg)
8918bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt    Writer.AddStmt(*Arg);
8928bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
8938bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
8948bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
8958bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtvoid ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
8968bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  VisitStmt(S);
8978bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getElement());
8988bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getCollection());
8998bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getBody());
9008bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(S->getForLoc(), Record);
9018bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(S->getRParenLoc(), Record);
9028bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::STMT_OBJC_FOR_COLLECTION;
9038bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
9048bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
9058bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtvoid ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
906cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddStmt(S->getCatchBody());
9078bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddDeclRef(S->getCatchParamDecl(), Record);
9088bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
909cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(S->getRParenLoc(), Record);
910cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::STMT_OBJC_CATCH;
9118bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
912cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
913cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
914cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddStmt(S->getFinallyBody());
9158bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
9168bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::STMT_OBJC_FINALLY;
9178bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
9188bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
9198bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtvoid ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9208bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Record.push_back(S->getNumCatchStmts());
9218bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Record.push_back(S->getFinallyStmt() != 0);
9228bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getTryBody());
923cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
924cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddStmt(S->getCatchStmt(I));
9258bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  if (S->getFinallyStmt())
926cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddStmt(S->getFinallyStmt());
927cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(S->getAtTryLoc(), Record);
9288bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::STMT_OBJC_AT_TRY;
9298bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
9308bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
9318bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtvoid ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9328bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getSynchExpr());
9338bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getSynchBody());
9348bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
9358bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
9368bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
9378bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt
9388bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtvoid ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9398bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Writer.AddStmt(S->getThrowExpr());
940cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(S->getThrowLoc(), Record);
941cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::STMT_OBJC_AT_THROW;
942cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
943cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
944cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt//===----------------------------------------------------------------------===//
945cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt// C++ Expressions and Statements.
946cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt//===----------------------------------------------------------------------===//
947cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
948cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
949cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitStmt(S);
950cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(S->getCatchLoc(), Record);
951cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddDeclRef(S->getExceptionDecl(), Record);
952cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddStmt(S->getHandlerBlock());
953cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::STMT_CXX_CATCH;
954cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
955cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
956cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
957cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitStmt(S);
958cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(S->getNumHandlers());
959cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(S->getTryLoc(), Record);
960cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddStmt(S->getTryBlock());
961cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
962cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddStmt(S->getHandler(i));
963cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::STMT_CXX_TRY;
964cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
965cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
966cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
967cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCallExpr(E);
968cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->getOperator());
969cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_OPERATOR_CALL;
970cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
971cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
972cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
973cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCallExpr(E);
974cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_MEMBER_CALL;
975cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
976cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
977cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
978cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
979cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->getNumArgs());
980cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
981cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddStmt(E->getArg(I));
982cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddDeclRef(E->getConstructor(), Record);
983cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
984cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isElidable());
985cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->requiresZeroInitialization());
986cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
987cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceRange(E->getParenRange(), Record);
988cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_CONSTRUCT;
989cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
990cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
991cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
992cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCXXConstructExpr(E);
993cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
994cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
995cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
996e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
997cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
998e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt  VisitExplicitCastExpr(E);
999cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1000cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1001cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1002cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1003cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCXXNamedCastExpr(E);
1004cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_STATIC_CAST;
1005cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1006cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitCXXNamedCastExpr(E);
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_DYNAMIC_CAST;
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1011cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1012cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1013cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCXXNamedCastExpr(E);
1014cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_REINTERPRET_CAST;
1015cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1016cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1017cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1018cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitCXXNamedCastExpr(E);
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_CONST_CAST;
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExplicitCastExpr(E);
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getValue());
1032cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
1033cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_BOOL_LITERAL;
1034cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1035cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1036cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1037cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
1038cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
1039cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1041cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1042cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1043cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
1044cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceRange(E->getSourceRange(), Record);
1045cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  if (E->isTypeOperand()) {
1046cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Code = serialization::EXPR_CXX_TYPEID_TYPE;
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  } else {
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getExprOperand());
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Code = serialization::EXPR_CXX_TYPEID_EXPR;
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1053cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1054cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1055cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
1056cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceRange(E->getSourceRange(), Record);
1057cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  if (E->isTypeOperand()) {
1058cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
1059cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Code = serialization::EXPR_CXX_UUIDOF_TYPE;
10609767226d8e6a1adaa33beb9f517ef40dddfa460cDmitry Shmidt  } else {
1061cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Writer.AddStmt(E->getExprOperand());
1062cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Code = serialization::EXPR_CXX_UUIDOF_EXPR;
1063cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  }
1064cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
1067cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
1068cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getLocation(), Record);
1069cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isImplicit());
1070cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_THIS;
1071cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1072cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1073cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
1074cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getThrowLoc(), Record);
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_THROW;
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool HasOtherExprStored = E->Param.getInt();
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Store these first, the reader reads them before creation.
1085391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt  Record.push_back(HasOtherExprStored);
1086391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt  if (HasOtherExprStored)
1087391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    Writer.AddStmt(E->getExpr());
1088391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt  Writer.AddDeclRef(E->getParam(), Record);
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getUsedLocation(), Record);
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_DEFAULT_ARG;
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddCXXTemporary(E->getTemporary(), Record);
1097051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
1098051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt  Code = serialization::EXPR_CXX_BIND_TEMPORARY;
1099051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
1105cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
1106cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1107cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1108cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1109cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  VisitExpr(E);
1110cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isGlobalNew());
1111cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->hasInitializer());
1112cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isArray());
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumPlacementArgs());
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumConstructorArgs());
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getOperatorNew(), Record);
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getOperatorDelete(), Record);
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getConstructor(), Record);
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo(), Record);
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceRange(E->getTypeIdParens(), Record);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getStartLoc(), Record);
1121cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceLocation(E->getEndLoc(), Record);
1122b96dad47218788efffa3db0fe7f1b54a7d19e366Dmitry Shmidt  Writer.AddSourceLocation(E->getConstructorLParen(), Record);
1123b96dad47218788efffa3db0fe7f1b54a7d19e366Dmitry Shmidt  Writer.AddSourceLocation(E->getConstructorRParen(), Record);
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       I != e; ++I)
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(*I);
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1128cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Code = serialization::EXPR_CXX_NEW;
1129051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1130051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1131051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtvoid ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1132051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt  VisitExpr(E);
1133cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isGlobalDelete());
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isArrayForm());
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isArrayFormAsWritten());
1136cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddDeclRef(E->getOperatorDelete(), Record);
1137cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddStmt(E->getArgument());
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1139051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1140051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt  Code = serialization::EXPR_CXX_DELETE;
1141cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1142051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1143051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtvoid ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1144051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt  VisitExpr(E);
1145051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getBase());
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isArrow());
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1149a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1150a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  Writer.AddSourceRange(E->getQualifierRange(), Record);
1151a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);
1152a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  Writer.AddSourceLocation(E->getColonColonLoc(), Record);
1153a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  Writer.AddSourceLocation(E->getTildeLoc(), Record);
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // PseudoDestructorTypeStorage.
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (E->getDestroyedTypeIdentifier())
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  else
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);
11611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumTemporaries());
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (unsigned i = 0, e = E->getNumTemporaries(); i != e; ++i)
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddCXXTemporary(E->getTemporary(i), Record);
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getSubExpr());
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_EXPR_WITH_TEMPORARIES;
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Don't emit anything here, NumTemplateArgs must be emitted first.
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (E->hasExplicitTemplateArgs()) {
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assert(Args.NumTemplateArgs &&
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt           "Num of template args was zero! AST reading will mess up!");
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(Args.NumTemplateArgs);
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    AddExplicitTemplateArgumentList(Args);
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  } else {
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(0);
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (!E->isImplicitAccess())
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(E->getBase());
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  else
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(0);
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeRef(E->getBaseType(), Record);
1196cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Record.push_back(E->isArrow());
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceRange(E->getQualifierRange(), Record);
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclarationNameInfo(E->MemberNameInfo, Record);
12028bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt  Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
12038bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt}
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Don't emit anything here, NumTemplateArgs must be emitted first.
121087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen
121187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen  if (E->hasExplicitTemplateArgs()) {
121287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen    const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
121387fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen    assert(Args.NumTemplateArgs &&
121487fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen           "Num of template args was zero! AST reading will mess up!");
121587fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen    Record.push_back(Args.NumTemplateArgs);
121687fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen    AddExplicitTemplateArgumentList(Args);
121787fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen  } else {
121887fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen    Record.push_back(0);
121987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen  }
122087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen
1221cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddDeclarationNameInfo(E->NameInfo, Record);
1222cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.AddSourceRange(E->getQualifierRange(), Record);
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid
1228b96dad47218788efffa3db0fe7f1b54a7d19e366Dmitry ShmidtASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1229b96dad47218788efffa3db0fe7f1b54a7d19e366Dmitry Shmidt  VisitExpr(E);
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->arg_size());
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (CXXUnresolvedConstructExpr::arg_iterator
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt         ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddStmt(*ArgI);
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getLParenLoc(), Record);
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getRParenLoc(), Record);
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Don't emit anything here, NumTemplateArgs must be emitted first.
1244cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1245cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  if (E->hasExplicitTemplateArgs()) {
1246cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
1247cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    assert(Args.NumTemplateArgs &&
1248cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt           "Num of template args was zero! AST reading will mess up!");
1249cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Record.push_back(Args.NumTemplateArgs);
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    AddExplicitTemplateArgumentList(Args);
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  } else {
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(0);
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getNumDecls());
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (OverloadExpr::decls_iterator
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt         OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Writer.AddDeclRef(OvI.getDecl(), Record);
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Record.push_back(OvI.getAccess());
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclarationNameInfo(E->NameInfo, Record);
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceRange(E->getQualifierRange(), Record);
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitOverloadExpr(E);
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isArrow());
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->hasUnresolvedUsing());
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(!E->isImplicitAccess() ? E->getBase() : 0);
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeRef(E->getBaseType(), Record);
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceLocation(E->getOperatorLoc(), Record);
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitOverloadExpr(E);
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->requiresADL());
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->isOverloaded());
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddDeclRef(E->getNamingClass(), Record);
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getTrait());
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getValue());
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceRange(E->getSourceRange(), Record);
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Code = serialization::EXPR_CXX_UNARY_TYPE_TRAIT;
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
129304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  VisitExpr(E);
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Record.push_back(E->getValue());
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddSourceRange(E->getSourceRange(), Record);
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Writer.AddStmt(E->getOperand());
12995460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Code = serialization::EXPR_CXX_NOEXCEPT;
13005460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt}
13015460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
13025460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtvoid ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
13035460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  VisitExpr(E);
13045460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  Code = serialization::EXPR_OPAQUE_VALUE;
13055460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt}
13065460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
13075460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt//===----------------------------------------------------------------------===//
13085460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt// ASTWriter Implementation
13095460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt//===----------------------------------------------------------------------===//
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtunsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
1312cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt         "SwitchCase recorded twice");
13145460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  unsigned NextID = SwitchCaseIDs.size();
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  SwitchCaseIDs[S] = NextID;
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return NextID;
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1318cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1319cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtunsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
1320cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
13215460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt         "SwitchCase hasn't been seen yet");
13225460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  return SwitchCaseIDs[S];
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ASTWriter::ClearSwitchCaseIDs() {
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  SwitchCaseIDs.clear();
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13295460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt/// \brief Retrieve the ID for the given label statement, which may
13305460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt/// or may not have been emitted yet.
13315460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtunsigned ASTWriter::GetLabelID(LabelStmt *S) {
13325460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt  std::map<LabelStmt *, unsigned>::iterator Pos = LabelIDs.find(S);
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Pos != LabelIDs.end())
13345460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt    return Pos->second;
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned NextID = LabelIDs.size();
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  LabelIDs[S] = NextID;
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return NextID;
1339cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1340cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1341cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt/// \brief Write the given substatement or subexpression to the
1342cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt/// bitstream.
1343cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTWriter::WriteSubStmt(Stmt *S) {
1344cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  RecordData Record;
1345cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  ASTStmtWriter Writer(*this, Record);
1346cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  ++NumStatements;
1347cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1348cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  if (!S) {
1349cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
1350cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    return;
1351cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  }
1352cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1353cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // Redirect ASTWriter::AddStmt to collect sub stmts.
1354cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  llvm::SmallVector<Stmt *, 16> SubStmts;
1355cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  CollectedStmts = &SubStmts;
1356cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1357cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.Code = serialization::STMT_NULL_PTR;
1358cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Writer.Visit(S);
1359cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1360cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt#ifndef NDEBUG
1361cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  if (Writer.Code == serialization::STMT_NULL_PTR) {
1362cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    SourceManager &SrcMgr
1363cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt      = DeclIDs.begin()->first->getASTContext().getSourceManager();
1364cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    S->dump(SrcMgr);
1365cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    assert(0 && "Unhandled sub statement writing AST file");
1366cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  }
1367cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt#endif
1368cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1369cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // Revert ASTWriter::AddStmt.
1370cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  CollectedStmts = &StmtsToEmit;
1371cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1372cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // Write the sub stmts in reverse order, last to first. When reading them back
1373cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // we will read them in correct order by "pop"ing them from the Stmts stack.
1374cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // This simplifies reading and allows to store a variable number of sub stmts
1375cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  // without knowing it in advance.
1376cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  while (!SubStmts.empty())
1377cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    WriteSubStmt(SubStmts.pop_back_val());
1378cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1379cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  Stream.EmitRecord(Writer.Code, Record);
1380cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1381cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1382cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt/// \brief Flush all of the statements that have been added to the
1383cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt/// queue via AddStmt().
1384cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidtvoid ASTWriter::FlushStmts() {
1385cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  RecordData Record;
1386cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1387cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1388cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    WriteSubStmt(StmtsToEmit[I]);
1389cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1390cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    assert(N == StmtsToEmit.size() &&
1391cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt           "Substatement writen via AddStmt rather than WriteSubStmt!");
1392cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1393cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    // Note that we are at the end of a full expression. Any
13945460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt    // expression records that follow this one are part of a different
13955460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt    // expression.
1396cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt    Stream.EmitRecord(serialization::STMT_STOP, Record);
1397cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  }
1398cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt
1399cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt  StmtsToEmit.clear();
1400cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt}
1401cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt