1 //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements serialization for Statements and Expressions.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Serialization/ASTWriter.h"
15 #include "clang/AST/DeclCXX.h"
16 #include "clang/AST/DeclObjC.h"
17 #include "clang/AST/StmtVisitor.h"
18 #include "llvm/Bitcode/BitstreamWriter.h"
19 using namespace clang
;
21 //===----------------------------------------------------------------------===//
22 // Statement/expression serialization
23 //===----------------------------------------------------------------------===//
26 class ASTStmtWriter
: public StmtVisitor
<ASTStmtWriter
, void> {
28 ASTWriter::RecordData
&Record
;
31 serialization::StmtCode Code
;
33 ASTStmtWriter(ASTWriter
&Writer
, ASTWriter::RecordData
&Record
)
34 : Writer(Writer
), Record(Record
) { }
37 AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList
&Args
);
39 void VisitStmt(Stmt
*S
);
40 void VisitNullStmt(NullStmt
*S
);
41 void VisitCompoundStmt(CompoundStmt
*S
);
42 void VisitSwitchCase(SwitchCase
*S
);
43 void VisitCaseStmt(CaseStmt
*S
);
44 void VisitDefaultStmt(DefaultStmt
*S
);
45 void VisitLabelStmt(LabelStmt
*S
);
46 void VisitIfStmt(IfStmt
*S
);
47 void VisitSwitchStmt(SwitchStmt
*S
);
48 void VisitWhileStmt(WhileStmt
*S
);
49 void VisitDoStmt(DoStmt
*S
);
50 void VisitForStmt(ForStmt
*S
);
51 void VisitGotoStmt(GotoStmt
*S
);
52 void VisitIndirectGotoStmt(IndirectGotoStmt
*S
);
53 void VisitContinueStmt(ContinueStmt
*S
);
54 void VisitBreakStmt(BreakStmt
*S
);
55 void VisitReturnStmt(ReturnStmt
*S
);
56 void VisitDeclStmt(DeclStmt
*S
);
57 void VisitAsmStmt(AsmStmt
*S
);
58 void VisitExpr(Expr
*E
);
59 void VisitPredefinedExpr(PredefinedExpr
*E
);
60 void VisitDeclRefExpr(DeclRefExpr
*E
);
61 void VisitIntegerLiteral(IntegerLiteral
*E
);
62 void VisitFloatingLiteral(FloatingLiteral
*E
);
63 void VisitImaginaryLiteral(ImaginaryLiteral
*E
);
64 void VisitStringLiteral(StringLiteral
*E
);
65 void VisitCharacterLiteral(CharacterLiteral
*E
);
66 void VisitParenExpr(ParenExpr
*E
);
67 void VisitParenListExpr(ParenListExpr
*E
);
68 void VisitUnaryOperator(UnaryOperator
*E
);
69 void VisitOffsetOfExpr(OffsetOfExpr
*E
);
70 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr
*E
);
71 void VisitArraySubscriptExpr(ArraySubscriptExpr
*E
);
72 void VisitCallExpr(CallExpr
*E
);
73 void VisitMemberExpr(MemberExpr
*E
);
74 void VisitCastExpr(CastExpr
*E
);
75 void VisitBinaryOperator(BinaryOperator
*E
);
76 void VisitCompoundAssignOperator(CompoundAssignOperator
*E
);
77 void VisitConditionalOperator(ConditionalOperator
*E
);
78 void VisitImplicitCastExpr(ImplicitCastExpr
*E
);
79 void VisitExplicitCastExpr(ExplicitCastExpr
*E
);
80 void VisitCStyleCastExpr(CStyleCastExpr
*E
);
81 void VisitCompoundLiteralExpr(CompoundLiteralExpr
*E
);
82 void VisitExtVectorElementExpr(ExtVectorElementExpr
*E
);
83 void VisitInitListExpr(InitListExpr
*E
);
84 void VisitDesignatedInitExpr(DesignatedInitExpr
*E
);
85 void VisitImplicitValueInitExpr(ImplicitValueInitExpr
*E
);
86 void VisitVAArgExpr(VAArgExpr
*E
);
87 void VisitAddrLabelExpr(AddrLabelExpr
*E
);
88 void VisitStmtExpr(StmtExpr
*E
);
89 void VisitChooseExpr(ChooseExpr
*E
);
90 void VisitGNUNullExpr(GNUNullExpr
*E
);
91 void VisitShuffleVectorExpr(ShuffleVectorExpr
*E
);
92 void VisitBlockExpr(BlockExpr
*E
);
93 void VisitBlockDeclRefExpr(BlockDeclRefExpr
*E
);
95 // Objective-C Expressions
96 void VisitObjCStringLiteral(ObjCStringLiteral
*E
);
97 void VisitObjCEncodeExpr(ObjCEncodeExpr
*E
);
98 void VisitObjCSelectorExpr(ObjCSelectorExpr
*E
);
99 void VisitObjCProtocolExpr(ObjCProtocolExpr
*E
);
100 void VisitObjCIvarRefExpr(ObjCIvarRefExpr
*E
);
101 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr
*E
);
102 void VisitObjCMessageExpr(ObjCMessageExpr
*E
);
103 void VisitObjCIsaExpr(ObjCIsaExpr
*E
);
105 // Objective-C Statements
106 void VisitObjCForCollectionStmt(ObjCForCollectionStmt
*);
107 void VisitObjCAtCatchStmt(ObjCAtCatchStmt
*);
108 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt
*);
109 void VisitObjCAtTryStmt(ObjCAtTryStmt
*);
110 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt
*);
111 void VisitObjCAtThrowStmt(ObjCAtThrowStmt
*);
114 void VisitCXXCatchStmt(CXXCatchStmt
*S
);
115 void VisitCXXTryStmt(CXXTryStmt
*S
);
117 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr
*E
);
118 void VisitCXXMemberCallExpr(CXXMemberCallExpr
*E
);
119 void VisitCXXConstructExpr(CXXConstructExpr
*E
);
120 void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr
*E
);
121 void VisitCXXNamedCastExpr(CXXNamedCastExpr
*E
);
122 void VisitCXXStaticCastExpr(CXXStaticCastExpr
*E
);
123 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr
*E
);
124 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr
*E
);
125 void VisitCXXConstCastExpr(CXXConstCastExpr
*E
);
126 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr
*E
);
127 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr
*E
);
128 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr
*E
);
129 void VisitCXXTypeidExpr(CXXTypeidExpr
*E
);
130 void VisitCXXUuidofExpr(CXXUuidofExpr
*E
);
131 void VisitCXXThisExpr(CXXThisExpr
*E
);
132 void VisitCXXThrowExpr(CXXThrowExpr
*E
);
133 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr
*E
);
134 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr
*E
);
136 void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr
*E
);
137 void VisitCXXNewExpr(CXXNewExpr
*E
);
138 void VisitCXXDeleteExpr(CXXDeleteExpr
*E
);
139 void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr
*E
);
141 void VisitExprWithCleanups(ExprWithCleanups
*E
);
142 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr
*E
);
143 void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr
*E
);
144 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr
*E
);
146 void VisitOverloadExpr(OverloadExpr
*E
);
147 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr
*E
);
148 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr
*E
);
150 void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr
*E
);
151 void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr
*E
);
152 void VisitCXXNoexceptExpr(CXXNoexceptExpr
*E
);
154 void VisitOpaqueValueExpr(OpaqueValueExpr
*E
);
159 AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList
&Args
) {
160 Writer
.AddSourceLocation(Args
.LAngleLoc
, Record
);
161 Writer
.AddSourceLocation(Args
.RAngleLoc
, Record
);
162 for (unsigned i
=0; i
!= Args
.NumTemplateArgs
; ++i
)
163 Writer
.AddTemplateArgumentLoc(Args
.getTemplateArgs()[i
], Record
);
166 void ASTStmtWriter::VisitStmt(Stmt
*S
) {
169 void ASTStmtWriter::VisitNullStmt(NullStmt
*S
) {
171 Writer
.AddSourceLocation(S
->getSemiLoc(), Record
);
172 Record
.push_back(S
->LeadingEmptyMacro
);
173 Code
= serialization::STMT_NULL
;
176 void ASTStmtWriter::VisitCompoundStmt(CompoundStmt
*S
) {
178 Record
.push_back(S
->size());
179 for (CompoundStmt::body_iterator CS
= S
->body_begin(), CSEnd
= S
->body_end();
182 Writer
.AddSourceLocation(S
->getLBracLoc(), Record
);
183 Writer
.AddSourceLocation(S
->getRBracLoc(), Record
);
184 Code
= serialization::STMT_COMPOUND
;
187 void ASTStmtWriter::VisitSwitchCase(SwitchCase
*S
) {
189 Record
.push_back(Writer
.getSwitchCaseID(S
));
192 void ASTStmtWriter::VisitCaseStmt(CaseStmt
*S
) {
194 Writer
.AddStmt(S
->getLHS());
195 Writer
.AddStmt(S
->getRHS());
196 Writer
.AddStmt(S
->getSubStmt());
197 Writer
.AddSourceLocation(S
->getCaseLoc(), Record
);
198 Writer
.AddSourceLocation(S
->getEllipsisLoc(), Record
);
199 Writer
.AddSourceLocation(S
->getColonLoc(), Record
);
200 Code
= serialization::STMT_CASE
;
203 void ASTStmtWriter::VisitDefaultStmt(DefaultStmt
*S
) {
205 Writer
.AddStmt(S
->getSubStmt());
206 Writer
.AddSourceLocation(S
->getDefaultLoc(), Record
);
207 Writer
.AddSourceLocation(S
->getColonLoc(), Record
);
208 Code
= serialization::STMT_DEFAULT
;
211 void ASTStmtWriter::VisitLabelStmt(LabelStmt
*S
) {
213 Writer
.AddIdentifierRef(S
->getID(), Record
);
214 Writer
.AddStmt(S
->getSubStmt());
215 Writer
.AddSourceLocation(S
->getIdentLoc(), Record
);
216 Record
.push_back(S
->isUsed());
217 Record
.push_back(S
->HasUnusedAttribute());
218 Record
.push_back(Writer
.GetLabelID(S
));
219 Code
= serialization::STMT_LABEL
;
222 void ASTStmtWriter::VisitIfStmt(IfStmt
*S
) {
224 Writer
.AddDeclRef(S
->getConditionVariable(), Record
);
225 Writer
.AddStmt(S
->getCond());
226 Writer
.AddStmt(S
->getThen());
227 Writer
.AddStmt(S
->getElse());
228 Writer
.AddSourceLocation(S
->getIfLoc(), Record
);
229 Writer
.AddSourceLocation(S
->getElseLoc(), Record
);
230 Code
= serialization::STMT_IF
;
233 void ASTStmtWriter::VisitSwitchStmt(SwitchStmt
*S
) {
235 Writer
.AddDeclRef(S
->getConditionVariable(), Record
);
236 Writer
.AddStmt(S
->getCond());
237 Writer
.AddStmt(S
->getBody());
238 Writer
.AddSourceLocation(S
->getSwitchLoc(), Record
);
239 Record
.push_back(S
->isAllEnumCasesCovered());
240 for (SwitchCase
*SC
= S
->getSwitchCaseList(); SC
;
241 SC
= SC
->getNextSwitchCase())
242 Record
.push_back(Writer
.RecordSwitchCaseID(SC
));
243 Code
= serialization::STMT_SWITCH
;
246 void ASTStmtWriter::VisitWhileStmt(WhileStmt
*S
) {
248 Writer
.AddDeclRef(S
->getConditionVariable(), Record
);
249 Writer
.AddStmt(S
->getCond());
250 Writer
.AddStmt(S
->getBody());
251 Writer
.AddSourceLocation(S
->getWhileLoc(), Record
);
252 Code
= serialization::STMT_WHILE
;
255 void ASTStmtWriter::VisitDoStmt(DoStmt
*S
) {
257 Writer
.AddStmt(S
->getCond());
258 Writer
.AddStmt(S
->getBody());
259 Writer
.AddSourceLocation(S
->getDoLoc(), Record
);
260 Writer
.AddSourceLocation(S
->getWhileLoc(), Record
);
261 Writer
.AddSourceLocation(S
->getRParenLoc(), Record
);
262 Code
= serialization::STMT_DO
;
265 void ASTStmtWriter::VisitForStmt(ForStmt
*S
) {
267 Writer
.AddStmt(S
->getInit());
268 Writer
.AddStmt(S
->getCond());
269 Writer
.AddDeclRef(S
->getConditionVariable(), Record
);
270 Writer
.AddStmt(S
->getInc());
271 Writer
.AddStmt(S
->getBody());
272 Writer
.AddSourceLocation(S
->getForLoc(), Record
);
273 Writer
.AddSourceLocation(S
->getLParenLoc(), Record
);
274 Writer
.AddSourceLocation(S
->getRParenLoc(), Record
);
275 Code
= serialization::STMT_FOR
;
278 void ASTStmtWriter::VisitGotoStmt(GotoStmt
*S
) {
280 Record
.push_back(Writer
.GetLabelID(S
->getLabel()));
281 Writer
.AddSourceLocation(S
->getGotoLoc(), Record
);
282 Writer
.AddSourceLocation(S
->getLabelLoc(), Record
);
283 Code
= serialization::STMT_GOTO
;
286 void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt
*S
) {
288 Writer
.AddSourceLocation(S
->getGotoLoc(), Record
);
289 Writer
.AddSourceLocation(S
->getStarLoc(), Record
);
290 Writer
.AddStmt(S
->getTarget());
291 Code
= serialization::STMT_INDIRECT_GOTO
;
294 void ASTStmtWriter::VisitContinueStmt(ContinueStmt
*S
) {
296 Writer
.AddSourceLocation(S
->getContinueLoc(), Record
);
297 Code
= serialization::STMT_CONTINUE
;
300 void ASTStmtWriter::VisitBreakStmt(BreakStmt
*S
) {
302 Writer
.AddSourceLocation(S
->getBreakLoc(), Record
);
303 Code
= serialization::STMT_BREAK
;
306 void ASTStmtWriter::VisitReturnStmt(ReturnStmt
*S
) {
308 Writer
.AddStmt(S
->getRetValue());
309 Writer
.AddSourceLocation(S
->getReturnLoc(), Record
);
310 Writer
.AddDeclRef(S
->getNRVOCandidate(), Record
);
311 Code
= serialization::STMT_RETURN
;
314 void ASTStmtWriter::VisitDeclStmt(DeclStmt
*S
) {
316 Writer
.AddSourceLocation(S
->getStartLoc(), Record
);
317 Writer
.AddSourceLocation(S
->getEndLoc(), Record
);
318 DeclGroupRef DG
= S
->getDeclGroup();
319 for (DeclGroupRef::iterator D
= DG
.begin(), DEnd
= DG
.end(); D
!= DEnd
; ++D
)
320 Writer
.AddDeclRef(*D
, Record
);
321 Code
= serialization::STMT_DECL
;
324 void ASTStmtWriter::VisitAsmStmt(AsmStmt
*S
) {
326 Record
.push_back(S
->getNumOutputs());
327 Record
.push_back(S
->getNumInputs());
328 Record
.push_back(S
->getNumClobbers());
329 Writer
.AddSourceLocation(S
->getAsmLoc(), Record
);
330 Writer
.AddSourceLocation(S
->getRParenLoc(), Record
);
331 Record
.push_back(S
->isVolatile());
332 Record
.push_back(S
->isSimple());
333 Record
.push_back(S
->isMSAsm());
334 Writer
.AddStmt(S
->getAsmString());
337 for (unsigned I
= 0, N
= S
->getNumOutputs(); I
!= N
; ++I
) {
338 Writer
.AddIdentifierRef(S
->getOutputIdentifier(I
), Record
);
339 Writer
.AddStmt(S
->getOutputConstraintLiteral(I
));
340 Writer
.AddStmt(S
->getOutputExpr(I
));
344 for (unsigned I
= 0, N
= S
->getNumInputs(); I
!= N
; ++I
) {
345 Writer
.AddIdentifierRef(S
->getInputIdentifier(I
), Record
);
346 Writer
.AddStmt(S
->getInputConstraintLiteral(I
));
347 Writer
.AddStmt(S
->getInputExpr(I
));
351 for (unsigned I
= 0, N
= S
->getNumClobbers(); I
!= N
; ++I
)
352 Writer
.AddStmt(S
->getClobber(I
));
354 Code
= serialization::STMT_ASM
;
357 void ASTStmtWriter::VisitExpr(Expr
*E
) {
359 Writer
.AddTypeRef(E
->getType(), Record
);
360 Record
.push_back(E
->isTypeDependent());
361 Record
.push_back(E
->isValueDependent());
362 Record
.push_back(E
->getValueKind());
363 Record
.push_back(E
->getObjectKind());
366 void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr
*E
) {
368 Writer
.AddSourceLocation(E
->getLocation(), Record
);
369 Record
.push_back(E
->getIdentType()); // FIXME: stable encoding
370 Code
= serialization::EXPR_PREDEFINED
;
373 void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr
*E
) {
376 Record
.push_back(E
->hasQualifier());
377 unsigned NumTemplateArgs
= E
->getNumTemplateArgs();
378 assert((NumTemplateArgs
!= 0) == E
->hasExplicitTemplateArgs() &&
379 "Template args list with no args ?");
380 Record
.push_back(NumTemplateArgs
);
382 if (E
->hasQualifier()) {
383 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
384 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
388 AddExplicitTemplateArgumentList(E
->getExplicitTemplateArgs());
390 Writer
.AddDeclRef(E
->getDecl(), Record
);
391 Writer
.AddSourceLocation(E
->getLocation(), Record
);
392 Writer
.AddDeclarationNameLoc(E
->DNLoc
, E
->getDecl()->getDeclName(), Record
);
393 Code
= serialization::EXPR_DECL_REF
;
396 void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral
*E
) {
398 Writer
.AddSourceLocation(E
->getLocation(), Record
);
399 Writer
.AddAPInt(E
->getValue(), Record
);
400 Code
= serialization::EXPR_INTEGER_LITERAL
;
403 void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral
*E
) {
405 Writer
.AddAPFloat(E
->getValue(), Record
);
406 Record
.push_back(E
->isExact());
407 Writer
.AddSourceLocation(E
->getLocation(), Record
);
408 Code
= serialization::EXPR_FLOATING_LITERAL
;
411 void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral
*E
) {
413 Writer
.AddStmt(E
->getSubExpr());
414 Code
= serialization::EXPR_IMAGINARY_LITERAL
;
417 void ASTStmtWriter::VisitStringLiteral(StringLiteral
*E
) {
419 Record
.push_back(E
->getByteLength());
420 Record
.push_back(E
->getNumConcatenated());
421 Record
.push_back(E
->isWide());
422 // FIXME: String data should be stored as a blob at the end of the
423 // StringLiteral. However, we can't do so now because we have no
424 // provision for coping with abbreviations when we're jumping around
425 // the AST file during deserialization.
426 Record
.append(E
->getString().begin(), E
->getString().end());
427 for (unsigned I
= 0, N
= E
->getNumConcatenated(); I
!= N
; ++I
)
428 Writer
.AddSourceLocation(E
->getStrTokenLoc(I
), Record
);
429 Code
= serialization::EXPR_STRING_LITERAL
;
432 void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral
*E
) {
434 Record
.push_back(E
->getValue());
435 Writer
.AddSourceLocation(E
->getLocation(), Record
);
436 Record
.push_back(E
->isWide());
437 Code
= serialization::EXPR_CHARACTER_LITERAL
;
440 void ASTStmtWriter::VisitParenExpr(ParenExpr
*E
) {
442 Writer
.AddSourceLocation(E
->getLParen(), Record
);
443 Writer
.AddSourceLocation(E
->getRParen(), Record
);
444 Writer
.AddStmt(E
->getSubExpr());
445 Code
= serialization::EXPR_PAREN
;
448 void ASTStmtWriter::VisitParenListExpr(ParenListExpr
*E
) {
450 Record
.push_back(E
->NumExprs
);
451 for (unsigned i
=0; i
!= E
->NumExprs
; ++i
)
452 Writer
.AddStmt(E
->Exprs
[i
]);
453 Writer
.AddSourceLocation(E
->LParenLoc
, Record
);
454 Writer
.AddSourceLocation(E
->RParenLoc
, Record
);
455 Code
= serialization::EXPR_PAREN_LIST
;
458 void ASTStmtWriter::VisitUnaryOperator(UnaryOperator
*E
) {
460 Writer
.AddStmt(E
->getSubExpr());
461 Record
.push_back(E
->getOpcode()); // FIXME: stable encoding
462 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
463 Code
= serialization::EXPR_UNARY_OPERATOR
;
466 void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr
*E
) {
468 Record
.push_back(E
->getNumComponents());
469 Record
.push_back(E
->getNumExpressions());
470 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
471 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
472 Writer
.AddTypeSourceInfo(E
->getTypeSourceInfo(), Record
);
473 for (unsigned I
= 0, N
= E
->getNumComponents(); I
!= N
; ++I
) {
474 const OffsetOfExpr::OffsetOfNode
&ON
= E
->getComponent(I
);
475 Record
.push_back(ON
.getKind()); // FIXME: Stable encoding
476 Writer
.AddSourceLocation(ON
.getRange().getBegin(), Record
);
477 Writer
.AddSourceLocation(ON
.getRange().getEnd(), Record
);
478 switch (ON
.getKind()) {
479 case OffsetOfExpr::OffsetOfNode::Array
:
480 Record
.push_back(ON
.getArrayExprIndex());
483 case OffsetOfExpr::OffsetOfNode::Field
:
484 Writer
.AddDeclRef(ON
.getField(), Record
);
487 case OffsetOfExpr::OffsetOfNode::Identifier
:
488 Writer
.AddIdentifierRef(ON
.getFieldName(), Record
);
491 case OffsetOfExpr::OffsetOfNode::Base
:
492 Writer
.AddCXXBaseSpecifier(*ON
.getBase(), Record
);
496 for (unsigned I
= 0, N
= E
->getNumExpressions(); I
!= N
; ++I
)
497 Writer
.AddStmt(E
->getIndexExpr(I
));
498 Code
= serialization::EXPR_OFFSETOF
;
501 void ASTStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr
*E
) {
503 Record
.push_back(E
->isSizeOf());
504 if (E
->isArgumentType())
505 Writer
.AddTypeSourceInfo(E
->getArgumentTypeInfo(), Record
);
508 Writer
.AddStmt(E
->getArgumentExpr());
510 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
511 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
512 Code
= serialization::EXPR_SIZEOF_ALIGN_OF
;
515 void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr
*E
) {
517 Writer
.AddStmt(E
->getLHS());
518 Writer
.AddStmt(E
->getRHS());
519 Writer
.AddSourceLocation(E
->getRBracketLoc(), Record
);
520 Code
= serialization::EXPR_ARRAY_SUBSCRIPT
;
523 void ASTStmtWriter::VisitCallExpr(CallExpr
*E
) {
525 Record
.push_back(E
->getNumArgs());
526 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
527 Writer
.AddStmt(E
->getCallee());
528 for (CallExpr::arg_iterator Arg
= E
->arg_begin(), ArgEnd
= E
->arg_end();
529 Arg
!= ArgEnd
; ++Arg
)
530 Writer
.AddStmt(*Arg
);
531 Code
= serialization::EXPR_CALL
;
534 void ASTStmtWriter::VisitMemberExpr(MemberExpr
*E
) {
535 // Don't call VisitExpr, we'll write everything here.
537 Record
.push_back(E
->hasQualifier());
538 if (E
->hasQualifier()) {
539 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
540 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
543 unsigned NumTemplateArgs
= E
->getNumTemplateArgs();
544 assert((NumTemplateArgs
!= 0) == E
->hasExplicitTemplateArgs() &&
545 "Template args list with no args ?");
546 Record
.push_back(NumTemplateArgs
);
547 if (NumTemplateArgs
) {
548 Writer
.AddSourceLocation(E
->getLAngleLoc(), Record
);
549 Writer
.AddSourceLocation(E
->getRAngleLoc(), Record
);
550 for (unsigned i
=0; i
!= NumTemplateArgs
; ++i
)
551 Writer
.AddTemplateArgumentLoc(E
->getTemplateArgs()[i
], Record
);
554 DeclAccessPair FoundDecl
= E
->getFoundDecl();
555 Writer
.AddDeclRef(FoundDecl
.getDecl(), Record
);
556 Record
.push_back(FoundDecl
.getAccess());
558 Writer
.AddTypeRef(E
->getType(), Record
);
559 Record
.push_back(E
->getValueKind());
560 Record
.push_back(E
->getObjectKind());
561 Writer
.AddStmt(E
->getBase());
562 Writer
.AddDeclRef(E
->getMemberDecl(), Record
);
563 Writer
.AddSourceLocation(E
->getMemberLoc(), Record
);
564 Record
.push_back(E
->isArrow());
565 Writer
.AddDeclarationNameLoc(E
->MemberDNLoc
,
566 E
->getMemberDecl()->getDeclName(), Record
);
567 Code
= serialization::EXPR_MEMBER
;
570 void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr
*E
) {
572 Writer
.AddStmt(E
->getBase());
573 Writer
.AddSourceLocation(E
->getIsaMemberLoc(), Record
);
574 Record
.push_back(E
->isArrow());
575 Code
= serialization::EXPR_OBJC_ISA
;
578 void ASTStmtWriter::VisitCastExpr(CastExpr
*E
) {
580 Record
.push_back(E
->path_size());
581 Writer
.AddStmt(E
->getSubExpr());
582 Record
.push_back(E
->getCastKind()); // FIXME: stable encoding
584 for (CastExpr::path_iterator
585 PI
= E
->path_begin(), PE
= E
->path_end(); PI
!= PE
; ++PI
)
586 Writer
.AddCXXBaseSpecifier(**PI
, Record
);
589 void ASTStmtWriter::VisitBinaryOperator(BinaryOperator
*E
) {
591 Writer
.AddStmt(E
->getLHS());
592 Writer
.AddStmt(E
->getRHS());
593 Record
.push_back(E
->getOpcode()); // FIXME: stable encoding
594 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
595 Code
= serialization::EXPR_BINARY_OPERATOR
;
598 void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator
*E
) {
599 VisitBinaryOperator(E
);
600 Writer
.AddTypeRef(E
->getComputationLHSType(), Record
);
601 Writer
.AddTypeRef(E
->getComputationResultType(), Record
);
602 Code
= serialization::EXPR_COMPOUND_ASSIGN_OPERATOR
;
605 void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator
*E
) {
607 Writer
.AddStmt(E
->getCond());
608 Writer
.AddStmt(E
->getLHS());
609 Writer
.AddStmt(E
->getRHS());
610 Writer
.AddStmt(E
->getSAVE());
611 Writer
.AddSourceLocation(E
->getQuestionLoc(), Record
);
612 Writer
.AddSourceLocation(E
->getColonLoc(), Record
);
613 Code
= serialization::EXPR_CONDITIONAL_OPERATOR
;
616 void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr
*E
) {
618 Code
= serialization::EXPR_IMPLICIT_CAST
;
621 void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr
*E
) {
623 Writer
.AddTypeSourceInfo(E
->getTypeInfoAsWritten(), Record
);
626 void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr
*E
) {
627 VisitExplicitCastExpr(E
);
628 Writer
.AddSourceLocation(E
->getLParenLoc(), Record
);
629 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
630 Code
= serialization::EXPR_CSTYLE_CAST
;
633 void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr
*E
) {
635 Writer
.AddSourceLocation(E
->getLParenLoc(), Record
);
636 Writer
.AddTypeSourceInfo(E
->getTypeSourceInfo(), Record
);
637 Writer
.AddStmt(E
->getInitializer());
638 Record
.push_back(E
->isFileScope());
639 Code
= serialization::EXPR_COMPOUND_LITERAL
;
642 void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr
*E
) {
644 Writer
.AddStmt(E
->getBase());
645 Writer
.AddIdentifierRef(&E
->getAccessor(), Record
);
646 Writer
.AddSourceLocation(E
->getAccessorLoc(), Record
);
647 Code
= serialization::EXPR_EXT_VECTOR_ELEMENT
;
650 void ASTStmtWriter::VisitInitListExpr(InitListExpr
*E
) {
652 Record
.push_back(E
->getNumInits());
653 for (unsigned I
= 0, N
= E
->getNumInits(); I
!= N
; ++I
)
654 Writer
.AddStmt(E
->getInit(I
));
655 Writer
.AddStmt(E
->getSyntacticForm());
656 Writer
.AddSourceLocation(E
->getLBraceLoc(), Record
);
657 Writer
.AddSourceLocation(E
->getRBraceLoc(), Record
);
658 Writer
.AddDeclRef(E
->getInitializedFieldInUnion(), Record
);
659 Record
.push_back(E
->hadArrayRangeDesignator());
660 Code
= serialization::EXPR_INIT_LIST
;
663 void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr
*E
) {
665 Record
.push_back(E
->getNumSubExprs());
666 for (unsigned I
= 0, N
= E
->getNumSubExprs(); I
!= N
; ++I
)
667 Writer
.AddStmt(E
->getSubExpr(I
));
668 Writer
.AddSourceLocation(E
->getEqualOrColonLoc(), Record
);
669 Record
.push_back(E
->usesGNUSyntax());
670 for (DesignatedInitExpr::designators_iterator D
= E
->designators_begin(),
671 DEnd
= E
->designators_end();
673 if (D
->isFieldDesignator()) {
674 if (FieldDecl
*Field
= D
->getField()) {
675 Record
.push_back(serialization::DESIG_FIELD_DECL
);
676 Writer
.AddDeclRef(Field
, Record
);
678 Record
.push_back(serialization::DESIG_FIELD_NAME
);
679 Writer
.AddIdentifierRef(D
->getFieldName(), Record
);
681 Writer
.AddSourceLocation(D
->getDotLoc(), Record
);
682 Writer
.AddSourceLocation(D
->getFieldLoc(), Record
);
683 } else if (D
->isArrayDesignator()) {
684 Record
.push_back(serialization::DESIG_ARRAY
);
685 Record
.push_back(D
->getFirstExprIndex());
686 Writer
.AddSourceLocation(D
->getLBracketLoc(), Record
);
687 Writer
.AddSourceLocation(D
->getRBracketLoc(), Record
);
689 assert(D
->isArrayRangeDesignator() && "Unknown designator");
690 Record
.push_back(serialization::DESIG_ARRAY_RANGE
);
691 Record
.push_back(D
->getFirstExprIndex());
692 Writer
.AddSourceLocation(D
->getLBracketLoc(), Record
);
693 Writer
.AddSourceLocation(D
->getEllipsisLoc(), Record
);
694 Writer
.AddSourceLocation(D
->getRBracketLoc(), Record
);
697 Code
= serialization::EXPR_DESIGNATED_INIT
;
700 void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr
*E
) {
702 Code
= serialization::EXPR_IMPLICIT_VALUE_INIT
;
705 void ASTStmtWriter::VisitVAArgExpr(VAArgExpr
*E
) {
707 Writer
.AddStmt(E
->getSubExpr());
708 Writer
.AddTypeSourceInfo(E
->getWrittenTypeInfo(), Record
);
709 Writer
.AddSourceLocation(E
->getBuiltinLoc(), Record
);
710 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
711 Code
= serialization::EXPR_VA_ARG
;
714 void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr
*E
) {
716 Writer
.AddSourceLocation(E
->getAmpAmpLoc(), Record
);
717 Writer
.AddSourceLocation(E
->getLabelLoc(), Record
);
718 Record
.push_back(Writer
.GetLabelID(E
->getLabel()));
719 Code
= serialization::EXPR_ADDR_LABEL
;
722 void ASTStmtWriter::VisitStmtExpr(StmtExpr
*E
) {
724 Writer
.AddStmt(E
->getSubStmt());
725 Writer
.AddSourceLocation(E
->getLParenLoc(), Record
);
726 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
727 Code
= serialization::EXPR_STMT
;
730 void ASTStmtWriter::VisitChooseExpr(ChooseExpr
*E
) {
732 Writer
.AddStmt(E
->getCond());
733 Writer
.AddStmt(E
->getLHS());
734 Writer
.AddStmt(E
->getRHS());
735 Writer
.AddSourceLocation(E
->getBuiltinLoc(), Record
);
736 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
737 Code
= serialization::EXPR_CHOOSE
;
740 void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr
*E
) {
742 Writer
.AddSourceLocation(E
->getTokenLocation(), Record
);
743 Code
= serialization::EXPR_GNU_NULL
;
746 void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr
*E
) {
748 Record
.push_back(E
->getNumSubExprs());
749 for (unsigned I
= 0, N
= E
->getNumSubExprs(); I
!= N
; ++I
)
750 Writer
.AddStmt(E
->getExpr(I
));
751 Writer
.AddSourceLocation(E
->getBuiltinLoc(), Record
);
752 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
753 Code
= serialization::EXPR_SHUFFLE_VECTOR
;
756 void ASTStmtWriter::VisitBlockExpr(BlockExpr
*E
) {
758 Writer
.AddDeclRef(E
->getBlockDecl(), Record
);
759 Record
.push_back(E
->hasBlockDeclRefExprs());
760 Code
= serialization::EXPR_BLOCK
;
763 void ASTStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr
*E
) {
765 Writer
.AddDeclRef(E
->getDecl(), Record
);
766 Writer
.AddSourceLocation(E
->getLocation(), Record
);
767 Record
.push_back(E
->isByRef());
768 Record
.push_back(E
->isConstQualAdded());
769 Writer
.AddStmt(E
->getCopyConstructorExpr());
770 Code
= serialization::EXPR_BLOCK_DECL_REF
;
773 //===----------------------------------------------------------------------===//
774 // Objective-C Expressions and Statements.
775 //===----------------------------------------------------------------------===//
777 void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral
*E
) {
779 Writer
.AddStmt(E
->getString());
780 Writer
.AddSourceLocation(E
->getAtLoc(), Record
);
781 Code
= serialization::EXPR_OBJC_STRING_LITERAL
;
784 void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr
*E
) {
786 Writer
.AddTypeSourceInfo(E
->getEncodedTypeSourceInfo(), Record
);
787 Writer
.AddSourceLocation(E
->getAtLoc(), Record
);
788 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
789 Code
= serialization::EXPR_OBJC_ENCODE
;
792 void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr
*E
) {
794 Writer
.AddSelectorRef(E
->getSelector(), Record
);
795 Writer
.AddSourceLocation(E
->getAtLoc(), Record
);
796 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
797 Code
= serialization::EXPR_OBJC_SELECTOR_EXPR
;
800 void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr
*E
) {
802 Writer
.AddDeclRef(E
->getProtocol(), Record
);
803 Writer
.AddSourceLocation(E
->getAtLoc(), Record
);
804 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
805 Code
= serialization::EXPR_OBJC_PROTOCOL_EXPR
;
808 void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr
*E
) {
810 Writer
.AddDeclRef(E
->getDecl(), Record
);
811 Writer
.AddSourceLocation(E
->getLocation(), Record
);
812 Writer
.AddStmt(E
->getBase());
813 Record
.push_back(E
->isArrow());
814 Record
.push_back(E
->isFreeIvar());
815 Code
= serialization::EXPR_OBJC_IVAR_REF_EXPR
;
818 void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr
*E
) {
820 Record
.push_back(E
->isImplicitProperty());
821 if (E
->isImplicitProperty()) {
822 Writer
.AddDeclRef(E
->getImplicitPropertyGetter(), Record
);
823 Writer
.AddDeclRef(E
->getImplicitPropertySetter(), Record
);
825 Writer
.AddDeclRef(E
->getExplicitProperty(), Record
);
827 Writer
.AddSourceLocation(E
->getLocation(), Record
);
828 Writer
.AddSourceLocation(E
->getReceiverLocation(), Record
);
829 if (E
->isObjectReceiver()) {
831 Writer
.AddStmt(E
->getBase());
832 } else if (E
->isSuperReceiver()) {
834 Writer
.AddTypeRef(E
->getSuperReceiverType(), Record
);
837 Writer
.AddDeclRef(E
->getClassReceiver(), Record
);
840 Code
= serialization::EXPR_OBJC_PROPERTY_REF_EXPR
;
843 void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr
*E
) {
845 Record
.push_back(E
->getNumArgs());
846 Record
.push_back((unsigned)E
->getReceiverKind()); // FIXME: stable encoding
847 switch (E
->getReceiverKind()) {
848 case ObjCMessageExpr::Instance
:
849 Writer
.AddStmt(E
->getInstanceReceiver());
852 case ObjCMessageExpr::Class
:
853 Writer
.AddTypeSourceInfo(E
->getClassReceiverTypeInfo(), Record
);
856 case ObjCMessageExpr::SuperClass
:
857 case ObjCMessageExpr::SuperInstance
:
858 Writer
.AddTypeRef(E
->getSuperType(), Record
);
859 Writer
.AddSourceLocation(E
->getSuperLoc(), Record
);
863 if (E
->getMethodDecl()) {
865 Writer
.AddDeclRef(E
->getMethodDecl(), Record
);
868 Writer
.AddSelectorRef(E
->getSelector(), Record
);
871 Writer
.AddSourceLocation(E
->getLeftLoc(), Record
);
872 Writer
.AddSourceLocation(E
->getRightLoc(), Record
);
873 Writer
.AddSourceLocation(E
->getSelectorLoc(), Record
);
875 for (CallExpr::arg_iterator Arg
= E
->arg_begin(), ArgEnd
= E
->arg_end();
876 Arg
!= ArgEnd
; ++Arg
)
877 Writer
.AddStmt(*Arg
);
878 Code
= serialization::EXPR_OBJC_MESSAGE_EXPR
;
881 void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt
*S
) {
883 Writer
.AddStmt(S
->getElement());
884 Writer
.AddStmt(S
->getCollection());
885 Writer
.AddStmt(S
->getBody());
886 Writer
.AddSourceLocation(S
->getForLoc(), Record
);
887 Writer
.AddSourceLocation(S
->getRParenLoc(), Record
);
888 Code
= serialization::STMT_OBJC_FOR_COLLECTION
;
891 void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt
*S
) {
892 Writer
.AddStmt(S
->getCatchBody());
893 Writer
.AddDeclRef(S
->getCatchParamDecl(), Record
);
894 Writer
.AddSourceLocation(S
->getAtCatchLoc(), Record
);
895 Writer
.AddSourceLocation(S
->getRParenLoc(), Record
);
896 Code
= serialization::STMT_OBJC_CATCH
;
899 void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt
*S
) {
900 Writer
.AddStmt(S
->getFinallyBody());
901 Writer
.AddSourceLocation(S
->getAtFinallyLoc(), Record
);
902 Code
= serialization::STMT_OBJC_FINALLY
;
905 void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt
*S
) {
906 Record
.push_back(S
->getNumCatchStmts());
907 Record
.push_back(S
->getFinallyStmt() != 0);
908 Writer
.AddStmt(S
->getTryBody());
909 for (unsigned I
= 0, N
= S
->getNumCatchStmts(); I
!= N
; ++I
)
910 Writer
.AddStmt(S
->getCatchStmt(I
));
911 if (S
->getFinallyStmt())
912 Writer
.AddStmt(S
->getFinallyStmt());
913 Writer
.AddSourceLocation(S
->getAtTryLoc(), Record
);
914 Code
= serialization::STMT_OBJC_AT_TRY
;
917 void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt
*S
) {
918 Writer
.AddStmt(S
->getSynchExpr());
919 Writer
.AddStmt(S
->getSynchBody());
920 Writer
.AddSourceLocation(S
->getAtSynchronizedLoc(), Record
);
921 Code
= serialization::STMT_OBJC_AT_SYNCHRONIZED
;
924 void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt
*S
) {
925 Writer
.AddStmt(S
->getThrowExpr());
926 Writer
.AddSourceLocation(S
->getThrowLoc(), Record
);
927 Code
= serialization::STMT_OBJC_AT_THROW
;
930 //===----------------------------------------------------------------------===//
931 // C++ Expressions and Statements.
932 //===----------------------------------------------------------------------===//
934 void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt
*S
) {
936 Writer
.AddSourceLocation(S
->getCatchLoc(), Record
);
937 Writer
.AddDeclRef(S
->getExceptionDecl(), Record
);
938 Writer
.AddStmt(S
->getHandlerBlock());
939 Code
= serialization::STMT_CXX_CATCH
;
942 void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt
*S
) {
944 Record
.push_back(S
->getNumHandlers());
945 Writer
.AddSourceLocation(S
->getTryLoc(), Record
);
946 Writer
.AddStmt(S
->getTryBlock());
947 for (unsigned i
= 0, e
= S
->getNumHandlers(); i
!= e
; ++i
)
948 Writer
.AddStmt(S
->getHandler(i
));
949 Code
= serialization::STMT_CXX_TRY
;
952 void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr
*E
) {
954 Record
.push_back(E
->getOperator());
955 Code
= serialization::EXPR_CXX_OPERATOR_CALL
;
958 void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr
*E
) {
960 Code
= serialization::EXPR_CXX_MEMBER_CALL
;
963 void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr
*E
) {
965 Record
.push_back(E
->getNumArgs());
966 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
)
967 Writer
.AddStmt(E
->getArg(I
));
968 Writer
.AddDeclRef(E
->getConstructor(), Record
);
969 Writer
.AddSourceLocation(E
->getLocation(), Record
);
970 Record
.push_back(E
->isElidable());
971 Record
.push_back(E
->requiresZeroInitialization());
972 Record
.push_back(E
->getConstructionKind()); // FIXME: stable encoding
973 Writer
.AddSourceRange(E
->getParenRange(), Record
);
974 Code
= serialization::EXPR_CXX_CONSTRUCT
;
977 void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr
*E
) {
978 VisitCXXConstructExpr(E
);
979 Writer
.AddTypeSourceInfo(E
->getTypeSourceInfo(), Record
);
980 Code
= serialization::EXPR_CXX_TEMPORARY_OBJECT
;
983 void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr
*E
) {
984 VisitExplicitCastExpr(E
);
985 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
988 void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr
*E
) {
989 VisitCXXNamedCastExpr(E
);
990 Code
= serialization::EXPR_CXX_STATIC_CAST
;
993 void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr
*E
) {
994 VisitCXXNamedCastExpr(E
);
995 Code
= serialization::EXPR_CXX_DYNAMIC_CAST
;
998 void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr
*E
) {
999 VisitCXXNamedCastExpr(E
);
1000 Code
= serialization::EXPR_CXX_REINTERPRET_CAST
;
1003 void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr
*E
) {
1004 VisitCXXNamedCastExpr(E
);
1005 Code
= serialization::EXPR_CXX_CONST_CAST
;
1008 void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr
*E
) {
1009 VisitExplicitCastExpr(E
);
1010 Writer
.AddSourceLocation(E
->getTypeBeginLoc(), Record
);
1011 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
1012 Code
= serialization::EXPR_CXX_FUNCTIONAL_CAST
;
1015 void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr
*E
) {
1017 Record
.push_back(E
->getValue());
1018 Writer
.AddSourceLocation(E
->getLocation(), Record
);
1019 Code
= serialization::EXPR_CXX_BOOL_LITERAL
;
1022 void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr
*E
) {
1024 Writer
.AddSourceLocation(E
->getLocation(), Record
);
1025 Code
= serialization::EXPR_CXX_NULL_PTR_LITERAL
;
1028 void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr
*E
) {
1030 Writer
.AddSourceRange(E
->getSourceRange(), Record
);
1031 if (E
->isTypeOperand()) {
1032 Writer
.AddTypeSourceInfo(E
->getTypeOperandSourceInfo(), Record
);
1033 Code
= serialization::EXPR_CXX_TYPEID_TYPE
;
1035 Writer
.AddStmt(E
->getExprOperand());
1036 Code
= serialization::EXPR_CXX_TYPEID_EXPR
;
1040 void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr
*E
) {
1042 Writer
.AddSourceRange(E
->getSourceRange(), Record
);
1043 if (E
->isTypeOperand()) {
1044 Writer
.AddTypeSourceInfo(E
->getTypeOperandSourceInfo(), Record
);
1045 Code
= serialization::EXPR_CXX_UUIDOF_TYPE
;
1047 Writer
.AddStmt(E
->getExprOperand());
1048 Code
= serialization::EXPR_CXX_UUIDOF_EXPR
;
1052 void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr
*E
) {
1054 Writer
.AddSourceLocation(E
->getLocation(), Record
);
1055 Record
.push_back(E
->isImplicit());
1056 Code
= serialization::EXPR_CXX_THIS
;
1059 void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr
*E
) {
1061 Writer
.AddSourceLocation(E
->getThrowLoc(), Record
);
1062 Writer
.AddStmt(E
->getSubExpr());
1063 Code
= serialization::EXPR_CXX_THROW
;
1066 void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr
*E
) {
1069 bool HasOtherExprStored
= E
->Param
.getInt();
1070 // Store these first, the reader reads them before creation.
1071 Record
.push_back(HasOtherExprStored
);
1072 if (HasOtherExprStored
)
1073 Writer
.AddStmt(E
->getExpr());
1074 Writer
.AddDeclRef(E
->getParam(), Record
);
1075 Writer
.AddSourceLocation(E
->getUsedLocation(), Record
);
1077 Code
= serialization::EXPR_CXX_DEFAULT_ARG
;
1080 void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr
*E
) {
1082 Writer
.AddCXXTemporary(E
->getTemporary(), Record
);
1083 Writer
.AddStmt(E
->getSubExpr());
1084 Code
= serialization::EXPR_CXX_BIND_TEMPORARY
;
1087 void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr
*E
) {
1089 Writer
.AddTypeSourceInfo(E
->getTypeSourceInfo(), Record
);
1090 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
1091 Code
= serialization::EXPR_CXX_SCALAR_VALUE_INIT
;
1094 void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr
*E
) {
1096 Record
.push_back(E
->isGlobalNew());
1097 Record
.push_back(E
->hasInitializer());
1098 Record
.push_back(E
->isArray());
1099 Record
.push_back(E
->getNumPlacementArgs());
1100 Record
.push_back(E
->getNumConstructorArgs());
1101 Writer
.AddDeclRef(E
->getOperatorNew(), Record
);
1102 Writer
.AddDeclRef(E
->getOperatorDelete(), Record
);
1103 Writer
.AddDeclRef(E
->getConstructor(), Record
);
1104 Writer
.AddTypeSourceInfo(E
->getAllocatedTypeSourceInfo(), Record
);
1105 Writer
.AddSourceRange(E
->getTypeIdParens(), Record
);
1106 Writer
.AddSourceLocation(E
->getStartLoc(), Record
);
1107 Writer
.AddSourceLocation(E
->getEndLoc(), Record
);
1108 Writer
.AddSourceLocation(E
->getConstructorLParen(), Record
);
1109 Writer
.AddSourceLocation(E
->getConstructorRParen(), Record
);
1110 for (CXXNewExpr::arg_iterator I
= E
->raw_arg_begin(), e
= E
->raw_arg_end();
1114 Code
= serialization::EXPR_CXX_NEW
;
1117 void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr
*E
) {
1119 Record
.push_back(E
->isGlobalDelete());
1120 Record
.push_back(E
->isArrayForm());
1121 Record
.push_back(E
->isArrayFormAsWritten());
1122 Writer
.AddDeclRef(E
->getOperatorDelete(), Record
);
1123 Writer
.AddStmt(E
->getArgument());
1124 Writer
.AddSourceLocation(E
->getSourceRange().getBegin(), Record
);
1126 Code
= serialization::EXPR_CXX_DELETE
;
1129 void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr
*E
) {
1132 Writer
.AddStmt(E
->getBase());
1133 Record
.push_back(E
->isArrow());
1134 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
1135 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
1136 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
1137 Writer
.AddTypeSourceInfo(E
->getScopeTypeInfo(), Record
);
1138 Writer
.AddSourceLocation(E
->getColonColonLoc(), Record
);
1139 Writer
.AddSourceLocation(E
->getTildeLoc(), Record
);
1141 // PseudoDestructorTypeStorage.
1142 Writer
.AddIdentifierRef(E
->getDestroyedTypeIdentifier(), Record
);
1143 if (E
->getDestroyedTypeIdentifier())
1144 Writer
.AddSourceLocation(E
->getDestroyedTypeLoc(), Record
);
1146 Writer
.AddTypeSourceInfo(E
->getDestroyedTypeInfo(), Record
);
1148 Code
= serialization::EXPR_CXX_PSEUDO_DESTRUCTOR
;
1151 void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups
*E
) {
1153 Record
.push_back(E
->getNumTemporaries());
1154 for (unsigned i
= 0, e
= E
->getNumTemporaries(); i
!= e
; ++i
)
1155 Writer
.AddCXXTemporary(E
->getTemporary(i
), Record
);
1157 Writer
.AddStmt(E
->getSubExpr());
1158 Code
= serialization::EXPR_EXPR_WITH_CLEANUPS
;
1162 ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr
*E
){
1165 // Don't emit anything here, NumTemplateArgs must be emitted first.
1167 if (E
->hasExplicitTemplateArgs()) {
1168 const ExplicitTemplateArgumentList
&Args
= E
->getExplicitTemplateArgs();
1169 assert(Args
.NumTemplateArgs
&&
1170 "Num of template args was zero! AST reading will mess up!");
1171 Record
.push_back(Args
.NumTemplateArgs
);
1172 AddExplicitTemplateArgumentList(Args
);
1174 Record
.push_back(0);
1177 if (!E
->isImplicitAccess())
1178 Writer
.AddStmt(E
->getBase());
1181 Writer
.AddTypeRef(E
->getBaseType(), Record
);
1182 Record
.push_back(E
->isArrow());
1183 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
1184 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
1185 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
1186 Writer
.AddDeclRef(E
->getFirstQualifierFoundInScope(), Record
);
1187 Writer
.AddDeclarationNameInfo(E
->MemberNameInfo
, Record
);
1188 Code
= serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER
;
1192 ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr
*E
) {
1195 // Don't emit anything here, NumTemplateArgs must be emitted first.
1197 if (E
->hasExplicitTemplateArgs()) {
1198 const ExplicitTemplateArgumentList
&Args
= E
->getExplicitTemplateArgs();
1199 assert(Args
.NumTemplateArgs
&&
1200 "Num of template args was zero! AST reading will mess up!");
1201 Record
.push_back(Args
.NumTemplateArgs
);
1202 AddExplicitTemplateArgumentList(Args
);
1204 Record
.push_back(0);
1207 Writer
.AddDeclarationNameInfo(E
->NameInfo
, Record
);
1208 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
1209 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
1210 Code
= serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF
;
1214 ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr
*E
) {
1216 Record
.push_back(E
->arg_size());
1217 for (CXXUnresolvedConstructExpr::arg_iterator
1218 ArgI
= E
->arg_begin(), ArgE
= E
->arg_end(); ArgI
!= ArgE
; ++ArgI
)
1219 Writer
.AddStmt(*ArgI
);
1220 Writer
.AddTypeSourceInfo(E
->getTypeSourceInfo(), Record
);
1221 Writer
.AddSourceLocation(E
->getLParenLoc(), Record
);
1222 Writer
.AddSourceLocation(E
->getRParenLoc(), Record
);
1223 Code
= serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT
;
1226 void ASTStmtWriter::VisitOverloadExpr(OverloadExpr
*E
) {
1229 // Don't emit anything here, NumTemplateArgs must be emitted first.
1231 if (E
->hasExplicitTemplateArgs()) {
1232 const ExplicitTemplateArgumentList
&Args
= E
->getExplicitTemplateArgs();
1233 assert(Args
.NumTemplateArgs
&&
1234 "Num of template args was zero! AST reading will mess up!");
1235 Record
.push_back(Args
.NumTemplateArgs
);
1236 AddExplicitTemplateArgumentList(Args
);
1238 Record
.push_back(0);
1241 Record
.push_back(E
->getNumDecls());
1242 for (OverloadExpr::decls_iterator
1243 OvI
= E
->decls_begin(), OvE
= E
->decls_end(); OvI
!= OvE
; ++OvI
) {
1244 Writer
.AddDeclRef(OvI
.getDecl(), Record
);
1245 Record
.push_back(OvI
.getAccess());
1248 Writer
.AddDeclarationNameInfo(E
->NameInfo
, Record
);
1249 Writer
.AddNestedNameSpecifier(E
->getQualifier(), Record
);
1250 Writer
.AddSourceRange(E
->getQualifierRange(), Record
);
1253 void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr
*E
) {
1254 VisitOverloadExpr(E
);
1255 Record
.push_back(E
->isArrow());
1256 Record
.push_back(E
->hasUnresolvedUsing());
1257 Writer
.AddStmt(!E
->isImplicitAccess() ? E
->getBase() : 0);
1258 Writer
.AddTypeRef(E
->getBaseType(), Record
);
1259 Writer
.AddSourceLocation(E
->getOperatorLoc(), Record
);
1260 Code
= serialization::EXPR_CXX_UNRESOLVED_MEMBER
;
1263 void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr
*E
) {
1264 VisitOverloadExpr(E
);
1265 Record
.push_back(E
->requiresADL());
1266 Record
.push_back(E
->isOverloaded());
1267 Writer
.AddDeclRef(E
->getNamingClass(), Record
);
1268 Code
= serialization::EXPR_CXX_UNRESOLVED_LOOKUP
;
1271 void ASTStmtWriter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr
*E
) {
1273 Record
.push_back(E
->getTrait());
1274 Record
.push_back(E
->getValue());
1275 Writer
.AddSourceRange(E
->getSourceRange(), Record
);
1276 Writer
.AddTypeSourceInfo(E
->getQueriedTypeSourceInfo(), Record
);
1277 Code
= serialization::EXPR_CXX_UNARY_TYPE_TRAIT
;
1280 void ASTStmtWriter::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr
*E
) {
1282 Record
.push_back(E
->getTrait());
1283 Record
.push_back(E
->getValue());
1284 Writer
.AddSourceRange(E
->getSourceRange(), Record
);
1285 Writer
.AddTypeSourceInfo(E
->getLhsTypeSourceInfo(), Record
);
1286 Writer
.AddTypeSourceInfo(E
->getRhsTypeSourceInfo(), Record
);
1287 Code
= serialization::EXPR_BINARY_TYPE_TRAIT
;
1290 void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr
*E
) {
1292 Record
.push_back(E
->getValue());
1293 Writer
.AddSourceRange(E
->getSourceRange(), Record
);
1294 Writer
.AddStmt(E
->getOperand());
1295 Code
= serialization::EXPR_CXX_NOEXCEPT
;
1298 void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr
*E
) {
1300 Code
= serialization::EXPR_OPAQUE_VALUE
;
1303 //===----------------------------------------------------------------------===//
1304 // ASTWriter Implementation
1305 //===----------------------------------------------------------------------===//
1307 unsigned ASTWriter::RecordSwitchCaseID(SwitchCase
*S
) {
1308 assert(SwitchCaseIDs
.find(S
) == SwitchCaseIDs
.end() &&
1309 "SwitchCase recorded twice");
1310 unsigned NextID
= SwitchCaseIDs
.size();
1311 SwitchCaseIDs
[S
] = NextID
;
1315 unsigned ASTWriter::getSwitchCaseID(SwitchCase
*S
) {
1316 assert(SwitchCaseIDs
.find(S
) != SwitchCaseIDs
.end() &&
1317 "SwitchCase hasn't been seen yet");
1318 return SwitchCaseIDs
[S
];
1321 void ASTWriter::ClearSwitchCaseIDs() {
1322 SwitchCaseIDs
.clear();
1325 /// \brief Retrieve the ID for the given label statement, which may
1326 /// or may not have been emitted yet.
1327 unsigned ASTWriter::GetLabelID(LabelStmt
*S
) {
1328 std::map
<LabelStmt
*, unsigned>::iterator Pos
= LabelIDs
.find(S
);
1329 if (Pos
!= LabelIDs
.end())
1332 unsigned NextID
= LabelIDs
.size();
1333 LabelIDs
[S
] = NextID
;
1337 /// \brief Write the given substatement or subexpression to the
1339 void ASTWriter::WriteSubStmt(Stmt
*S
) {
1341 ASTStmtWriter
Writer(*this, Record
);
1345 Stream
.EmitRecord(serialization::STMT_NULL_PTR
, Record
);
1349 // Redirect ASTWriter::AddStmt to collect sub stmts.
1350 llvm::SmallVector
<Stmt
*, 16> SubStmts
;
1351 CollectedStmts
= &SubStmts
;
1353 Writer
.Code
= serialization::STMT_NULL_PTR
;
1357 if (Writer
.Code
== serialization::STMT_NULL_PTR
) {
1358 SourceManager
&SrcMgr
1359 = DeclIDs
.begin()->first
->getASTContext().getSourceManager();
1361 assert(0 && "Unhandled sub statement writing AST file");
1365 // Revert ASTWriter::AddStmt.
1366 CollectedStmts
= &StmtsToEmit
;
1368 // Write the sub stmts in reverse order, last to first. When reading them back
1369 // we will read them in correct order by "pop"ing them from the Stmts stack.
1370 // This simplifies reading and allows to store a variable number of sub stmts
1371 // without knowing it in advance.
1372 while (!SubStmts
.empty())
1373 WriteSubStmt(SubStmts
.pop_back_val());
1375 Stream
.EmitRecord(Writer
.Code
, Record
);
1378 /// \brief Flush all of the statements that have been added to the
1379 /// queue via AddStmt().
1380 void ASTWriter::FlushStmts() {
1383 for (unsigned I
= 0, N
= StmtsToEmit
.size(); I
!= N
; ++I
) {
1384 WriteSubStmt(StmtsToEmit
[I
]);
1386 assert(N
== StmtsToEmit
.size() &&
1387 "Substatement writen via AddStmt rather than WriteSubStmt!");
1389 // Note that we are at the end of a full expression. Any
1390 // expression records that follow this one are part of a different
1392 Stream
.EmitRecord(serialization::STMT_STOP
, Record
);
1395 StmtsToEmit
.clear();