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