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