blob: fdc54072a9120d674d284f5d4391eb8f982e9907 [file] [log] [blame]
Chris Lattner1f551822009-04-27 06:20:01 +00001//===--- PCHWriterStmt.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/Frontend/PCHWriter.h"
Douglas Gregor5d3507d2009-09-09 23:08:42 +000015#include "clang/AST/DeclCXX.h"
Chris Lattner1f551822009-04-27 06:20:01 +000016#include "clang/AST/DeclObjC.h"
17#include "clang/AST/StmtVisitor.h"
18#include "llvm/Bitcode/BitstreamWriter.h"
19using namespace clang;
20
21//===----------------------------------------------------------------------===//
22// Statement/expression serialization
23//===----------------------------------------------------------------------===//
24
25namespace {
26 class PCHStmtWriter : public StmtVisitor<PCHStmtWriter, void> {
Chris Lattner1f551822009-04-27 06:20:01 +000027 PCHWriter &Writer;
28 PCHWriter::RecordData &Record;
29
30 public:
31 pch::StmtCode Code;
32
33 PCHStmtWriter(PCHWriter &Writer, PCHWriter::RecordData &Record)
34 : Writer(Writer), Record(Record) { }
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +000035
36 void
37 AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args);
Chris Lattner1f551822009-04-27 06:20:01 +000038
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 VisitUnaryOperator(UnaryOperator *E);
Douglas Gregor882211c2010-04-28 22:16:22 +000068 void VisitOffsetOfExpr(OffsetOfExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +000069 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
70 void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
71 void VisitCallExpr(CallExpr *E);
72 void VisitMemberExpr(MemberExpr *E);
73 void VisitCastExpr(CastExpr *E);
74 void VisitBinaryOperator(BinaryOperator *E);
75 void VisitCompoundAssignOperator(CompoundAssignOperator *E);
76 void VisitConditionalOperator(ConditionalOperator *E);
77 void VisitImplicitCastExpr(ImplicitCastExpr *E);
78 void VisitExplicitCastExpr(ExplicitCastExpr *E);
79 void VisitCStyleCastExpr(CStyleCastExpr *E);
80 void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
81 void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
82 void VisitInitListExpr(InitListExpr *E);
83 void VisitDesignatedInitExpr(DesignatedInitExpr *E);
84 void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
85 void VisitVAArgExpr(VAArgExpr *E);
86 void VisitAddrLabelExpr(AddrLabelExpr *E);
87 void VisitStmtExpr(StmtExpr *E);
88 void VisitTypesCompatibleExpr(TypesCompatibleExpr *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);
Mike Stump11289f42009-09-09 15:08:12 +000094
Chris Lattner1f551822009-04-27 06:20:01 +000095 // 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);
Fariborz Jahanian9a846652009-08-20 17:02:02 +0000102 void VisitObjCImplicitSetterGetterRefExpr(
103 ObjCImplicitSetterGetterRefExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +0000104 void VisitObjCMessageExpr(ObjCMessageExpr *E);
105 void VisitObjCSuperExpr(ObjCSuperExpr *E);
Steve Naroffe87026a2009-07-24 17:54:45 +0000106 void VisitObjCIsaExpr(ObjCIsaExpr *E);
Mike Stump11289f42009-09-09 15:08:12 +0000107
108 // Objective-C Statements
Chris Lattner1f551822009-04-27 06:20:01 +0000109 void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
110 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
111 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
112 void VisitObjCAtTryStmt(ObjCAtTryStmt *);
113 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
114 void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000115
Mike Stump11289f42009-09-09 15:08:12 +0000116 // C++ Statements
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000117 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Chris Lattnerb7e7f722010-05-09 05:36:05 +0000118 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000119 void VisitCXXConstructExpr(CXXConstructExpr *E);
Sam Weinigd01101e2010-01-16 21:21:01 +0000120 void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
121 void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
122 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
123 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
124 void VisitCXXConstCastExpr(CXXConstCastExpr *E);
125 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
Sam Weinige83b3ac2010-02-07 06:32:43 +0000126 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
127 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Chris Lattner13a5ecc2010-05-09 06:03:39 +0000128 void VisitCXXTypeidExpr(CXXTypeidExpr *E);
Chris Lattner98267332010-05-09 06:15:05 +0000129 void VisitCXXThisExpr(CXXThisExpr *E);
130 void VisitCXXThrowExpr(CXXThrowExpr *E);
Chris Lattnere2437f42010-05-09 06:40:08 +0000131 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
Chris Lattnercba86142010-05-10 00:25:06 +0000132 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000133
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000134 void VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
135 void VisitCXXNewExpr(CXXNewExpr *E);
Argyrios Kyrtzidis6e57c352010-06-22 17:07:59 +0000136 void VisitCXXDeleteExpr(CXXDeleteExpr *E);
Argyrios Kyrtzidis99a226d2010-06-28 09:32:03 +0000137 void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000138
Chris Lattnercba86142010-05-10 00:25:06 +0000139 void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000140 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +0000141 void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000142 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000143
144 void VisitOverloadExpr(OverloadExpr *E);
145 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
Argyrios Kyrtzidis58e01ad2010-06-25 09:03:34 +0000146 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +0000147 };
148}
149
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +0000150/// \brief Return the number of Exprs contained in the given TemplateArgument.
151static unsigned NumExprsContainedIn(const TemplateArgument &Arg) {
152 switch (Arg.getKind()) {
153 default: break;
154 case TemplateArgument::Expression:
155 return 1;
156 case TemplateArgument::Pack: {
157 unsigned Count = 0;
158 for (TemplateArgument::pack_iterator I=Arg.pack_begin(), E=Arg.pack_end();
159 I != E; ++I)
160 Count += NumExprsContainedIn(*I);
161 return Count;
162 }
163 }
164
165 return 0;
166}
167
168/// \brief Return the number of Exprs contained in the given
169/// ExplicitTemplateArgumentList.
170static unsigned NumExprsContainedIn(const ExplicitTemplateArgumentList &Args) {
171 unsigned Count = 0;
172 for (unsigned i=0; i != Args.NumTemplateArgs; ++i) {
173 const TemplateArgumentLoc &ArgLoc = Args.getTemplateArgs()[i];
174 const TemplateArgument &TemplA = ArgLoc.getArgument();
175 Count += NumExprsContainedIn(TemplA);
176 if (TemplA.getKind() == TemplateArgument::Expression &&
177 TemplA.getAsExpr() != ArgLoc.getLocInfo().getAsExpr())
178 ++Count; // 1 in TemplateArgumentLocInfo.
179 }
180
181 return Count;
182}
183
184void PCHStmtWriter::
185AddExplicitTemplateArgumentList(const ExplicitTemplateArgumentList &Args) {
186 Record.push_back(NumExprsContainedIn(Args));
187 Writer.AddSourceLocation(Args.LAngleLoc, Record);
188 Writer.AddSourceLocation(Args.RAngleLoc, Record);
189 for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
190 Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
191}
192
Mike Stump11289f42009-09-09 15:08:12 +0000193void PCHStmtWriter::VisitStmt(Stmt *S) {
Chris Lattner1f551822009-04-27 06:20:01 +0000194}
195
196void PCHStmtWriter::VisitNullStmt(NullStmt *S) {
197 VisitStmt(S);
198 Writer.AddSourceLocation(S->getSemiLoc(), Record);
199 Code = pch::STMT_NULL;
200}
201
202void PCHStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
203 VisitStmt(S);
204 Record.push_back(S->size());
205 for (CompoundStmt::body_iterator CS = S->body_begin(), CSEnd = S->body_end();
206 CS != CSEnd; ++CS)
207 Writer.WriteSubStmt(*CS);
208 Writer.AddSourceLocation(S->getLBracLoc(), Record);
209 Writer.AddSourceLocation(S->getRBracLoc(), Record);
210 Code = pch::STMT_COMPOUND;
211}
212
213void PCHStmtWriter::VisitSwitchCase(SwitchCase *S) {
214 VisitStmt(S);
215 Record.push_back(Writer.RecordSwitchCaseID(S));
216}
217
218void PCHStmtWriter::VisitCaseStmt(CaseStmt *S) {
219 VisitSwitchCase(S);
220 Writer.WriteSubStmt(S->getLHS());
221 Writer.WriteSubStmt(S->getRHS());
222 Writer.WriteSubStmt(S->getSubStmt());
223 Writer.AddSourceLocation(S->getCaseLoc(), Record);
Douglas Gregor2a2d00f2009-05-15 23:57:33 +0000224 Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
225 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000226 Code = pch::STMT_CASE;
227}
228
229void PCHStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
230 VisitSwitchCase(S);
231 Writer.WriteSubStmt(S->getSubStmt());
232 Writer.AddSourceLocation(S->getDefaultLoc(), Record);
Douglas Gregor2a2d00f2009-05-15 23:57:33 +0000233 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000234 Code = pch::STMT_DEFAULT;
235}
236
237void PCHStmtWriter::VisitLabelStmt(LabelStmt *S) {
238 VisitStmt(S);
239 Writer.AddIdentifierRef(S->getID(), Record);
240 Writer.WriteSubStmt(S->getSubStmt());
241 Writer.AddSourceLocation(S->getIdentLoc(), Record);
242 Record.push_back(Writer.GetLabelID(S));
243 Code = pch::STMT_LABEL;
244}
245
246void PCHStmtWriter::VisitIfStmt(IfStmt *S) {
247 VisitStmt(S);
Douglas Gregor633caca2009-11-23 23:44:04 +0000248 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000249 Writer.WriteSubStmt(S->getCond());
250 Writer.WriteSubStmt(S->getThen());
251 Writer.WriteSubStmt(S->getElse());
252 Writer.AddSourceLocation(S->getIfLoc(), Record);
Douglas Gregor9d73cab2009-05-15 18:53:42 +0000253 Writer.AddSourceLocation(S->getElseLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000254 Code = pch::STMT_IF;
255}
256
257void PCHStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
258 VisitStmt(S);
Douglas Gregordcf19622009-11-24 17:07:59 +0000259 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000260 Writer.WriteSubStmt(S->getCond());
261 Writer.WriteSubStmt(S->getBody());
262 Writer.AddSourceLocation(S->getSwitchLoc(), Record);
Mike Stump11289f42009-09-09 15:08:12 +0000263 for (SwitchCase *SC = S->getSwitchCaseList(); SC;
Chris Lattner1f551822009-04-27 06:20:01 +0000264 SC = SC->getNextSwitchCase())
265 Record.push_back(Writer.getSwitchCaseID(SC));
266 Code = pch::STMT_SWITCH;
267}
268
269void PCHStmtWriter::VisitWhileStmt(WhileStmt *S) {
270 VisitStmt(S);
Douglas Gregor680f8612009-11-24 21:15:44 +0000271 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000272 Writer.WriteSubStmt(S->getCond());
273 Writer.WriteSubStmt(S->getBody());
274 Writer.AddSourceLocation(S->getWhileLoc(), Record);
275 Code = pch::STMT_WHILE;
276}
277
278void PCHStmtWriter::VisitDoStmt(DoStmt *S) {
279 VisitStmt(S);
280 Writer.WriteSubStmt(S->getCond());
281 Writer.WriteSubStmt(S->getBody());
282 Writer.AddSourceLocation(S->getDoLoc(), Record);
Douglas Gregor3daa82d2009-05-15 21:56:04 +0000283 Writer.AddSourceLocation(S->getWhileLoc(), Record);
Chris Lattner815b70e2009-06-12 23:04:47 +0000284 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000285 Code = pch::STMT_DO;
286}
287
288void PCHStmtWriter::VisitForStmt(ForStmt *S) {
289 VisitStmt(S);
290 Writer.WriteSubStmt(S->getInit());
291 Writer.WriteSubStmt(S->getCond());
Douglas Gregor7bab5ff2009-11-25 00:27:52 +0000292 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000293 Writer.WriteSubStmt(S->getInc());
294 Writer.WriteSubStmt(S->getBody());
295 Writer.AddSourceLocation(S->getForLoc(), Record);
Douglas Gregor5d138682009-05-15 22:12:32 +0000296 Writer.AddSourceLocation(S->getLParenLoc(), Record);
297 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000298 Code = pch::STMT_FOR;
299}
300
301void PCHStmtWriter::VisitGotoStmt(GotoStmt *S) {
302 VisitStmt(S);
303 Record.push_back(Writer.GetLabelID(S->getLabel()));
304 Writer.AddSourceLocation(S->getGotoLoc(), Record);
305 Writer.AddSourceLocation(S->getLabelLoc(), Record);
306 Code = pch::STMT_GOTO;
307}
308
309void PCHStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
310 VisitStmt(S);
311 Writer.AddSourceLocation(S->getGotoLoc(), Record);
Douglas Gregor30776d42009-05-16 00:20:29 +0000312 Writer.AddSourceLocation(S->getStarLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000313 Writer.WriteSubStmt(S->getTarget());
314 Code = pch::STMT_INDIRECT_GOTO;
315}
316
317void PCHStmtWriter::VisitContinueStmt(ContinueStmt *S) {
318 VisitStmt(S);
319 Writer.AddSourceLocation(S->getContinueLoc(), Record);
320 Code = pch::STMT_CONTINUE;
321}
322
323void PCHStmtWriter::VisitBreakStmt(BreakStmt *S) {
324 VisitStmt(S);
325 Writer.AddSourceLocation(S->getBreakLoc(), Record);
326 Code = pch::STMT_BREAK;
327}
328
329void PCHStmtWriter::VisitReturnStmt(ReturnStmt *S) {
330 VisitStmt(S);
331 Writer.WriteSubStmt(S->getRetValue());
332 Writer.AddSourceLocation(S->getReturnLoc(), Record);
Douglas Gregor6fd1b182010-05-15 06:01:05 +0000333 Writer.AddDeclRef(S->getNRVOCandidate(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000334 Code = pch::STMT_RETURN;
335}
336
337void PCHStmtWriter::VisitDeclStmt(DeclStmt *S) {
338 VisitStmt(S);
339 Writer.AddSourceLocation(S->getStartLoc(), Record);
340 Writer.AddSourceLocation(S->getEndLoc(), Record);
341 DeclGroupRef DG = S->getDeclGroup();
342 for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
343 Writer.AddDeclRef(*D, Record);
344 Code = pch::STMT_DECL;
345}
346
347void PCHStmtWriter::VisitAsmStmt(AsmStmt *S) {
348 VisitStmt(S);
349 Record.push_back(S->getNumOutputs());
350 Record.push_back(S->getNumInputs());
351 Record.push_back(S->getNumClobbers());
352 Writer.AddSourceLocation(S->getAsmLoc(), Record);
353 Writer.AddSourceLocation(S->getRParenLoc(), Record);
354 Record.push_back(S->isVolatile());
355 Record.push_back(S->isSimple());
Mike Stump90be58a2010-01-04 22:37:17 +0000356 Record.push_back(S->isMSAsm());
Chris Lattner1f551822009-04-27 06:20:01 +0000357 Writer.WriteSubStmt(S->getAsmString());
358
359 // Outputs
Anders Carlsson9a020f92010-01-30 22:25:16 +0000360 for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
361 Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000362 Writer.WriteSubStmt(S->getOutputConstraintLiteral(I));
363 Writer.WriteSubStmt(S->getOutputExpr(I));
364 }
365
366 // Inputs
367 for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
Anders Carlsson9a020f92010-01-30 22:25:16 +0000368 Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000369 Writer.WriteSubStmt(S->getInputConstraintLiteral(I));
370 Writer.WriteSubStmt(S->getInputExpr(I));
371 }
372
373 // Clobbers
374 for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
375 Writer.WriteSubStmt(S->getClobber(I));
376
377 Code = pch::STMT_ASM;
378}
379
380void PCHStmtWriter::VisitExpr(Expr *E) {
381 VisitStmt(E);
382 Writer.AddTypeRef(E->getType(), Record);
383 Record.push_back(E->isTypeDependent());
384 Record.push_back(E->isValueDependent());
385}
386
387void PCHStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
388 VisitExpr(E);
389 Writer.AddSourceLocation(E->getLocation(), Record);
390 Record.push_back(E->getIdentType()); // FIXME: stable encoding
391 Code = pch::EXPR_PREDEFINED;
392}
393
394void PCHStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
395 VisitExpr(E);
396 Writer.AddDeclRef(E->getDecl(), Record);
397 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000398 // FIXME: write qualifier
399 // FIXME: write explicit template arguments
Chris Lattner1f551822009-04-27 06:20:01 +0000400 Code = pch::EXPR_DECL_REF;
401}
402
403void PCHStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
404 VisitExpr(E);
405 Writer.AddSourceLocation(E->getLocation(), Record);
406 Writer.AddAPInt(E->getValue(), Record);
407 Code = pch::EXPR_INTEGER_LITERAL;
408}
409
410void PCHStmtWriter::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 = pch::EXPR_FLOATING_LITERAL;
416}
417
418void PCHStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
419 VisitExpr(E);
420 Writer.WriteSubStmt(E->getSubExpr());
421 Code = pch::EXPR_IMAGINARY_LITERAL;
422}
423
424void PCHStmtWriter::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 // FIXME: String data should be stored as a blob at the end of the
430 // StringLiteral. However, we can't do so now because we have no
431 // provision for coping with abbreviations when we're jumping around
432 // the PCH file during deserialization.
Mike Stump11289f42009-09-09 15:08:12 +0000433 Record.insert(Record.end(),
Chris Lattner1f551822009-04-27 06:20:01 +0000434 E->getStrData(), E->getStrData() + E->getByteLength());
435 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
436 Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
437 Code = pch::EXPR_STRING_LITERAL;
438}
439
440void PCHStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
441 VisitExpr(E);
442 Record.push_back(E->getValue());
Chris Lattnere6434cb2009-08-24 17:39:36 +0000443 Writer.AddSourceLocation(E->getLocation(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000444 Record.push_back(E->isWide());
445 Code = pch::EXPR_CHARACTER_LITERAL;
446}
447
448void PCHStmtWriter::VisitParenExpr(ParenExpr *E) {
449 VisitExpr(E);
450 Writer.AddSourceLocation(E->getLParen(), Record);
451 Writer.AddSourceLocation(E->getRParen(), Record);
452 Writer.WriteSubStmt(E->getSubExpr());
453 Code = pch::EXPR_PAREN;
454}
455
456void PCHStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
457 VisitExpr(E);
458 Writer.WriteSubStmt(E->getSubExpr());
459 Record.push_back(E->getOpcode()); // FIXME: stable encoding
460 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
461 Code = pch::EXPR_UNARY_OPERATOR;
462}
463
Douglas Gregor882211c2010-04-28 22:16:22 +0000464void PCHStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
465 VisitExpr(E);
466 Record.push_back(E->getNumComponents());
467 Record.push_back(E->getNumExpressions());
468 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
469 Writer.AddSourceLocation(E->getRParenLoc(), Record);
470 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
471 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
472 const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
473 Record.push_back(ON.getKind()); // FIXME: Stable encoding
474 Writer.AddSourceLocation(ON.getRange().getBegin(), Record);
475 Writer.AddSourceLocation(ON.getRange().getEnd(), Record);
476 switch (ON.getKind()) {
477 case OffsetOfExpr::OffsetOfNode::Array:
478 Record.push_back(ON.getArrayExprIndex());
479 break;
480
481 case OffsetOfExpr::OffsetOfNode::Field:
482 Writer.AddDeclRef(ON.getField(), Record);
483 break;
484
485 case OffsetOfExpr::OffsetOfNode::Identifier:
486 Writer.AddIdentifierRef(ON.getFieldName(), Record);
487 break;
Douglas Gregord1702062010-04-29 00:18:15 +0000488
489 case OffsetOfExpr::OffsetOfNode::Base:
490 // FIXME: Implement this!
491 llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
492 break;
Douglas Gregor882211c2010-04-28 22:16:22 +0000493 }
494 }
495 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
496 Writer.WriteSubStmt(E->getIndexExpr(I));
497 Code = pch::EXPR_OFFSETOF;
498}
499
Mike Stump11289f42009-09-09 15:08:12 +0000500void PCHStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000501 VisitExpr(E);
502 Record.push_back(E->isSizeOf());
503 if (E->isArgumentType())
John McCallbcd03502009-12-07 02:54:59 +0000504 Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000505 else {
506 Record.push_back(0);
507 Writer.WriteSubStmt(E->getArgumentExpr());
508 }
509 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
510 Writer.AddSourceLocation(E->getRParenLoc(), Record);
511 Code = pch::EXPR_SIZEOF_ALIGN_OF;
512}
513
514void PCHStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
515 VisitExpr(E);
516 Writer.WriteSubStmt(E->getLHS());
517 Writer.WriteSubStmt(E->getRHS());
518 Writer.AddSourceLocation(E->getRBracketLoc(), Record);
519 Code = pch::EXPR_ARRAY_SUBSCRIPT;
520}
521
522void PCHStmtWriter::VisitCallExpr(CallExpr *E) {
523 VisitExpr(E);
524 Record.push_back(E->getNumArgs());
525 Writer.AddSourceLocation(E->getRParenLoc(), Record);
526 Writer.WriteSubStmt(E->getCallee());
527 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
528 Arg != ArgEnd; ++Arg)
529 Writer.WriteSubStmt(*Arg);
530 Code = pch::EXPR_CALL;
531}
532
533void PCHStmtWriter::VisitMemberExpr(MemberExpr *E) {
534 VisitExpr(E);
535 Writer.WriteSubStmt(E->getBase());
536 Writer.AddDeclRef(E->getMemberDecl(), Record);
537 Writer.AddSourceLocation(E->getMemberLoc(), Record);
538 Record.push_back(E->isArrow());
Douglas Gregorf4b34ba2009-08-31 23:44:04 +0000539 // FIXME: C++ nested-name-specifier
Douglas Gregor84f14dd2009-09-01 00:37:14 +0000540 // FIXME: C++ template argument list
Chris Lattner1f551822009-04-27 06:20:01 +0000541 Code = pch::EXPR_MEMBER;
542}
543
Steve Naroffe87026a2009-07-24 17:54:45 +0000544void PCHStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
545 VisitExpr(E);
546 Writer.WriteSubStmt(E->getBase());
547 Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
548 Record.push_back(E->isArrow());
549 Code = pch::EXPR_OBJC_ISA;
550}
551
Chris Lattner1f551822009-04-27 06:20:01 +0000552void PCHStmtWriter::VisitCastExpr(CastExpr *E) {
553 VisitExpr(E);
554 Writer.WriteSubStmt(E->getSubExpr());
Anders Carlssona2615922009-07-31 00:48:10 +0000555 Record.push_back(E->getCastKind()); // FIXME: stable encoding
Chris Lattner1f551822009-04-27 06:20:01 +0000556}
557
558void PCHStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
559 VisitExpr(E);
560 Writer.WriteSubStmt(E->getLHS());
561 Writer.WriteSubStmt(E->getRHS());
562 Record.push_back(E->getOpcode()); // FIXME: stable encoding
563 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
564 Code = pch::EXPR_BINARY_OPERATOR;
565}
566
567void PCHStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
568 VisitBinaryOperator(E);
569 Writer.AddTypeRef(E->getComputationLHSType(), Record);
570 Writer.AddTypeRef(E->getComputationResultType(), Record);
571 Code = pch::EXPR_COMPOUND_ASSIGN_OPERATOR;
572}
573
574void PCHStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
575 VisitExpr(E);
576 Writer.WriteSubStmt(E->getCond());
577 Writer.WriteSubStmt(E->getLHS());
578 Writer.WriteSubStmt(E->getRHS());
Douglas Gregor7e112b02009-08-26 14:37:04 +0000579 Writer.AddSourceLocation(E->getQuestionLoc(), Record);
580 Writer.AddSourceLocation(E->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000581 Code = pch::EXPR_CONDITIONAL_OPERATOR;
582}
583
584void PCHStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
585 VisitCastExpr(E);
586 Record.push_back(E->isLvalueCast());
587 Code = pch::EXPR_IMPLICIT_CAST;
588}
589
590void PCHStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
591 VisitCastExpr(E);
John McCall97513962010-01-15 18:39:57 +0000592 Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000593}
594
595void PCHStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
596 VisitExplicitCastExpr(E);
597 Writer.AddSourceLocation(E->getLParenLoc(), Record);
598 Writer.AddSourceLocation(E->getRParenLoc(), Record);
599 Code = pch::EXPR_CSTYLE_CAST;
600}
601
602void PCHStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
603 VisitExpr(E);
604 Writer.AddSourceLocation(E->getLParenLoc(), Record);
John McCalle15bbff2010-01-18 19:35:47 +0000605 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000606 Writer.WriteSubStmt(E->getInitializer());
607 Record.push_back(E->isFileScope());
608 Code = pch::EXPR_COMPOUND_LITERAL;
609}
610
611void PCHStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
612 VisitExpr(E);
613 Writer.WriteSubStmt(E->getBase());
614 Writer.AddIdentifierRef(&E->getAccessor(), Record);
615 Writer.AddSourceLocation(E->getAccessorLoc(), Record);
616 Code = pch::EXPR_EXT_VECTOR_ELEMENT;
617}
618
619void PCHStmtWriter::VisitInitListExpr(InitListExpr *E) {
620 VisitExpr(E);
621 Record.push_back(E->getNumInits());
622 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
623 Writer.WriteSubStmt(E->getInit(I));
624 Writer.WriteSubStmt(E->getSyntacticForm());
625 Writer.AddSourceLocation(E->getLBraceLoc(), Record);
626 Writer.AddSourceLocation(E->getRBraceLoc(), Record);
627 Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
628 Record.push_back(E->hadArrayRangeDesignator());
629 Code = pch::EXPR_INIT_LIST;
630}
631
632void PCHStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
633 VisitExpr(E);
634 Record.push_back(E->getNumSubExprs());
635 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
636 Writer.WriteSubStmt(E->getSubExpr(I));
637 Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
638 Record.push_back(E->usesGNUSyntax());
639 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
640 DEnd = E->designators_end();
641 D != DEnd; ++D) {
642 if (D->isFieldDesignator()) {
643 if (FieldDecl *Field = D->getField()) {
644 Record.push_back(pch::DESIG_FIELD_DECL);
645 Writer.AddDeclRef(Field, Record);
646 } else {
647 Record.push_back(pch::DESIG_FIELD_NAME);
648 Writer.AddIdentifierRef(D->getFieldName(), Record);
649 }
650 Writer.AddSourceLocation(D->getDotLoc(), Record);
651 Writer.AddSourceLocation(D->getFieldLoc(), Record);
652 } else if (D->isArrayDesignator()) {
653 Record.push_back(pch::DESIG_ARRAY);
654 Record.push_back(D->getFirstExprIndex());
655 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
656 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
657 } else {
658 assert(D->isArrayRangeDesignator() && "Unknown designator");
659 Record.push_back(pch::DESIG_ARRAY_RANGE);
660 Record.push_back(D->getFirstExprIndex());
661 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
662 Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
663 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
664 }
665 }
666 Code = pch::EXPR_DESIGNATED_INIT;
667}
668
669void PCHStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
670 VisitExpr(E);
671 Code = pch::EXPR_IMPLICIT_VALUE_INIT;
672}
673
674void PCHStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
675 VisitExpr(E);
676 Writer.WriteSubStmt(E->getSubExpr());
677 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
678 Writer.AddSourceLocation(E->getRParenLoc(), Record);
679 Code = pch::EXPR_VA_ARG;
680}
681
682void PCHStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
683 VisitExpr(E);
684 Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
685 Writer.AddSourceLocation(E->getLabelLoc(), Record);
686 Record.push_back(Writer.GetLabelID(E->getLabel()));
687 Code = pch::EXPR_ADDR_LABEL;
688}
689
690void PCHStmtWriter::VisitStmtExpr(StmtExpr *E) {
691 VisitExpr(E);
692 Writer.WriteSubStmt(E->getSubStmt());
693 Writer.AddSourceLocation(E->getLParenLoc(), Record);
694 Writer.AddSourceLocation(E->getRParenLoc(), Record);
695 Code = pch::EXPR_STMT;
696}
697
698void PCHStmtWriter::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
699 VisitExpr(E);
700 Writer.AddTypeRef(E->getArgType1(), Record);
701 Writer.AddTypeRef(E->getArgType2(), Record);
702 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
703 Writer.AddSourceLocation(E->getRParenLoc(), Record);
704 Code = pch::EXPR_TYPES_COMPATIBLE;
705}
706
707void PCHStmtWriter::VisitChooseExpr(ChooseExpr *E) {
708 VisitExpr(E);
709 Writer.WriteSubStmt(E->getCond());
710 Writer.WriteSubStmt(E->getLHS());
711 Writer.WriteSubStmt(E->getRHS());
712 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
713 Writer.AddSourceLocation(E->getRParenLoc(), Record);
714 Code = pch::EXPR_CHOOSE;
715}
716
717void PCHStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
718 VisitExpr(E);
719 Writer.AddSourceLocation(E->getTokenLocation(), Record);
720 Code = pch::EXPR_GNU_NULL;
721}
722
723void PCHStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
724 VisitExpr(E);
725 Record.push_back(E->getNumSubExprs());
726 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
727 Writer.WriteSubStmt(E->getExpr(I));
728 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
729 Writer.AddSourceLocation(E->getRParenLoc(), Record);
730 Code = pch::EXPR_SHUFFLE_VECTOR;
731}
732
733void PCHStmtWriter::VisitBlockExpr(BlockExpr *E) {
734 VisitExpr(E);
735 Writer.AddDeclRef(E->getBlockDecl(), Record);
736 Record.push_back(E->hasBlockDeclRefExprs());
737 Code = pch::EXPR_BLOCK;
738}
739
740void PCHStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
741 VisitExpr(E);
742 Writer.AddDeclRef(E->getDecl(), Record);
743 Writer.AddSourceLocation(E->getLocation(), Record);
744 Record.push_back(E->isByRef());
Fariborz Jahaniane8918d52009-06-20 00:02:26 +0000745 Record.push_back(E->isConstQualAdded());
Fariborz Jahanian96433992010-06-04 19:06:53 +0000746 Writer.WriteSubStmt(E->getCopyConstructorExpr());
Chris Lattner1f551822009-04-27 06:20:01 +0000747 Code = pch::EXPR_BLOCK_DECL_REF;
748}
749
750//===----------------------------------------------------------------------===//
751// Objective-C Expressions and Statements.
752//===----------------------------------------------------------------------===//
753
754void PCHStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
755 VisitExpr(E);
756 Writer.WriteSubStmt(E->getString());
757 Writer.AddSourceLocation(E->getAtLoc(), Record);
758 Code = pch::EXPR_OBJC_STRING_LITERAL;
759}
760
Mike Stump11289f42009-09-09 15:08:12 +0000761void PCHStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000762 VisitExpr(E);
Douglas Gregorabd9e962010-04-20 15:39:42 +0000763 Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000764 Writer.AddSourceLocation(E->getAtLoc(), Record);
765 Writer.AddSourceLocation(E->getRParenLoc(), Record);
766 Code = pch::EXPR_OBJC_ENCODE;
767}
768
769void PCHStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
770 VisitExpr(E);
771 Writer.AddSelectorRef(E->getSelector(), Record);
772 Writer.AddSourceLocation(E->getAtLoc(), Record);
773 Writer.AddSourceLocation(E->getRParenLoc(), Record);
774 Code = pch::EXPR_OBJC_SELECTOR_EXPR;
775}
776
777void PCHStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
778 VisitExpr(E);
779 Writer.AddDeclRef(E->getProtocol(), Record);
780 Writer.AddSourceLocation(E->getAtLoc(), Record);
781 Writer.AddSourceLocation(E->getRParenLoc(), Record);
782 Code = pch::EXPR_OBJC_PROTOCOL_EXPR;
783}
784
785void PCHStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
786 VisitExpr(E);
787 Writer.AddDeclRef(E->getDecl(), Record);
788 Writer.AddSourceLocation(E->getLocation(), Record);
789 Writer.WriteSubStmt(E->getBase());
790 Record.push_back(E->isArrow());
791 Record.push_back(E->isFreeIvar());
792 Code = pch::EXPR_OBJC_IVAR_REF_EXPR;
793}
794
795void PCHStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
796 VisitExpr(E);
797 Writer.AddDeclRef(E->getProperty(), Record);
798 Writer.AddSourceLocation(E->getLocation(), Record);
799 Writer.WriteSubStmt(E->getBase());
800 Code = pch::EXPR_OBJC_PROPERTY_REF_EXPR;
801}
802
Fariborz Jahanian9a846652009-08-20 17:02:02 +0000803void PCHStmtWriter::VisitObjCImplicitSetterGetterRefExpr(
804 ObjCImplicitSetterGetterRefExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000805 VisitExpr(E);
806 Writer.AddDeclRef(E->getGetterMethod(), Record);
807 Writer.AddDeclRef(E->getSetterMethod(), Record);
Mike Stump11289f42009-09-09 15:08:12 +0000808
Fariborz Jahanian19380c42009-08-18 21:37:33 +0000809 // NOTE: InterfaceDecl and Base are mutually exclusive.
810 Writer.AddDeclRef(E->getInterfaceDecl(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000811 Writer.WriteSubStmt(E->getBase());
812 Writer.AddSourceLocation(E->getLocation(), Record);
813 Writer.AddSourceLocation(E->getClassLoc(), Record);
814 Code = pch::EXPR_OBJC_KVC_REF_EXPR;
815}
816
817void PCHStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
818 VisitExpr(E);
819 Record.push_back(E->getNumArgs());
Douglas Gregor9a129192010-04-21 00:45:42 +0000820 Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
821 switch (E->getReceiverKind()) {
822 case ObjCMessageExpr::Instance:
823 Writer.WriteSubStmt(E->getInstanceReceiver());
824 break;
825
826 case ObjCMessageExpr::Class:
827 Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
828 break;
829
830 case ObjCMessageExpr::SuperClass:
831 case ObjCMessageExpr::SuperInstance:
832 Writer.AddTypeRef(E->getSuperType(), Record);
833 Writer.AddSourceLocation(E->getSuperLoc(), Record);
834 break;
835 }
836
837 if (E->getMethodDecl()) {
838 Record.push_back(1);
839 Writer.AddDeclRef(E->getMethodDecl(), Record);
840 } else {
841 Record.push_back(0);
842 Writer.AddSelectorRef(E->getSelector(), Record);
843 }
844
Chris Lattner1f551822009-04-27 06:20:01 +0000845 Writer.AddSourceLocation(E->getLeftLoc(), Record);
846 Writer.AddSourceLocation(E->getRightLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000847
848 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
849 Arg != ArgEnd; ++Arg)
850 Writer.WriteSubStmt(*Arg);
851 Code = pch::EXPR_OBJC_MESSAGE_EXPR;
852}
853
854void PCHStmtWriter::VisitObjCSuperExpr(ObjCSuperExpr *E) {
855 VisitExpr(E);
856 Writer.AddSourceLocation(E->getLoc(), Record);
857 Code = pch::EXPR_OBJC_SUPER_EXPR;
858}
859
860void PCHStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
861 VisitStmt(S);
862 Writer.WriteSubStmt(S->getElement());
863 Writer.WriteSubStmt(S->getCollection());
864 Writer.WriteSubStmt(S->getBody());
865 Writer.AddSourceLocation(S->getForLoc(), Record);
866 Writer.AddSourceLocation(S->getRParenLoc(), Record);
867 Code = pch::STMT_OBJC_FOR_COLLECTION;
868}
869
870void PCHStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
871 Writer.WriteSubStmt(S->getCatchBody());
Chris Lattner1f551822009-04-27 06:20:01 +0000872 Writer.AddDeclRef(S->getCatchParamDecl(), Record);
873 Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
874 Writer.AddSourceLocation(S->getRParenLoc(), Record);
875 Code = pch::STMT_OBJC_CATCH;
876}
877
878void PCHStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
879 Writer.WriteSubStmt(S->getFinallyBody());
880 Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
881 Code = pch::STMT_OBJC_FINALLY;
882}
883
884void PCHStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregor96c79492010-04-23 22:50:49 +0000885 Record.push_back(S->getNumCatchStmts());
886 Record.push_back(S->getFinallyStmt() != 0);
Chris Lattner1f551822009-04-27 06:20:01 +0000887 Writer.WriteSubStmt(S->getTryBody());
Douglas Gregor96c79492010-04-23 22:50:49 +0000888 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
889 Writer.WriteSubStmt(S->getCatchStmt(I));
890 if (S->getFinallyStmt())
891 Writer.WriteSubStmt(S->getFinallyStmt());
Chris Lattner1f551822009-04-27 06:20:01 +0000892 Writer.AddSourceLocation(S->getAtTryLoc(), Record);
893 Code = pch::STMT_OBJC_AT_TRY;
894}
895
896void PCHStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
897 Writer.WriteSubStmt(S->getSynchExpr());
898 Writer.WriteSubStmt(S->getSynchBody());
899 Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
900 Code = pch::STMT_OBJC_AT_SYNCHRONIZED;
901}
902
903void PCHStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
904 Writer.WriteSubStmt(S->getThrowExpr());
905 Writer.AddSourceLocation(S->getThrowLoc(), Record);
906 Code = pch::STMT_OBJC_AT_THROW;
907}
908
909//===----------------------------------------------------------------------===//
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000910// C++ Expressions and Statements.
911//===----------------------------------------------------------------------===//
912
913void PCHStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
914 VisitCallExpr(E);
915 Record.push_back(E->getOperator());
916 Code = pch::EXPR_CXX_OPERATOR_CALL;
917}
918
Chris Lattnerb7e7f722010-05-09 05:36:05 +0000919void PCHStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
920 VisitCallExpr(E);
921 Code = pch::EXPR_CXX_MEMBER_CALL;
922}
923
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000924void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
925 VisitExpr(E);
Argyrios Kyrtzidis30d98f32010-06-24 08:57:09 +0000926 Record.push_back(E->getNumArgs());
927 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
928 Writer.WriteSubStmt(E->getArg(I));
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000929 Writer.AddDeclRef(E->getConstructor(), Record);
Douglas Gregor85dabae2009-12-16 01:38:02 +0000930 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000931 Record.push_back(E->isElidable());
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000932 Record.push_back(E->requiresZeroInitialization());
Douglas Gregor222cf0e2010-05-15 00:13:29 +0000933 Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000934 Code = pch::EXPR_CXX_CONSTRUCT;
935}
936
Sam Weinigd01101e2010-01-16 21:21:01 +0000937void PCHStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
938 VisitExplicitCastExpr(E);
939 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
940}
941
942void PCHStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
943 VisitCXXNamedCastExpr(E);
944 Code = pch::EXPR_CXX_STATIC_CAST;
945}
946
947void PCHStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
948 VisitCXXNamedCastExpr(E);
949 Code = pch::EXPR_CXX_DYNAMIC_CAST;
950}
951
952void PCHStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
953 VisitCXXNamedCastExpr(E);
954 Code = pch::EXPR_CXX_REINTERPRET_CAST;
955}
956
957void PCHStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
958 VisitCXXNamedCastExpr(E);
959 Code = pch::EXPR_CXX_CONST_CAST;
960}
961
962void PCHStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
963 VisitExplicitCastExpr(E);
964 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
965 Writer.AddSourceLocation(E->getRParenLoc(), Record);
966 Code = pch::EXPR_CXX_FUNCTIONAL_CAST;
967}
968
Sam Weinige83b3ac2010-02-07 06:32:43 +0000969void PCHStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
970 VisitExpr(E);
971 Record.push_back(E->getValue());
972 Writer.AddSourceLocation(E->getLocation(), Record);
973 Code = pch::EXPR_CXX_BOOL_LITERAL;
974}
975
976void PCHStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
977 VisitExpr(E);
978 Writer.AddSourceLocation(E->getLocation(), Record);
979 Code = pch::EXPR_CXX_NULL_PTR_LITERAL;
980}
981
Chris Lattner13a5ecc2010-05-09 06:03:39 +0000982void PCHStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
983 VisitExpr(E);
984 Writer.AddSourceRange(E->getSourceRange(), Record);
985 if (E->isTypeOperand()) {
986 Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
987 Code = pch::EXPR_CXX_TYPEID_TYPE;
988 } else {
989 Writer.WriteSubStmt(E->getExprOperand());
990 Code = pch::EXPR_CXX_TYPEID_EXPR;
991 }
992}
993
Chris Lattner98267332010-05-09 06:15:05 +0000994void PCHStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
995 VisitExpr(E);
996 Writer.AddSourceLocation(E->getLocation(), Record);
997 Record.push_back(E->isImplicit());
998 Code = pch::EXPR_CXX_THIS;
999}
1000
1001void PCHStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
Chris Lattnere2437f42010-05-09 06:40:08 +00001002 VisitExpr(E);
Chris Lattner98267332010-05-09 06:15:05 +00001003 Writer.AddSourceLocation(E->getThrowLoc(), Record);
1004 Writer.WriteSubStmt(E->getSubExpr());
1005 Code = pch::EXPR_CXX_THROW;
1006}
1007
Chris Lattnere2437f42010-05-09 06:40:08 +00001008void PCHStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1009 VisitExpr(E);
1010 Writer.AddSourceLocation(E->getUsedLocation(), Record);
1011 if (E->isExprStored()) {
1012 Record.push_back(1);
1013 Writer.WriteSubStmt(E->getExpr());
1014 } else {
1015 Record.push_back(0);
1016 }
1017
1018 Code = pch::EXPR_CXX_DEFAULT_ARG;
1019}
1020
Chris Lattnercba86142010-05-10 00:25:06 +00001021void PCHStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1022 VisitExpr(E);
1023 Writer.AddCXXTemporary(E->getTemporary(), Record);
1024 Writer.WriteSubStmt(E->getSubExpr());
1025 Code = pch::EXPR_CXX_BIND_TEMPORARY;
1026}
1027
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001028void PCHStmtWriter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1029 VisitExpr(E);
1030 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
1031 Writer.AddSourceLocation(E->getRParenLoc(), Record);
1032 Code = pch::EXPR_CXX_ZERO_INIT_VALUE;
1033}
1034
1035void PCHStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
1036 VisitExpr(E);
1037 Record.push_back(E->isGlobalNew());
1038 Record.push_back(E->isParenTypeId());
1039 Record.push_back(E->hasInitializer());
1040 Record.push_back(E->isArray());
1041 Record.push_back(E->getNumPlacementArgs());
1042 Record.push_back(E->getNumConstructorArgs());
1043 Writer.AddDeclRef(E->getOperatorNew(), Record);
1044 Writer.AddDeclRef(E->getOperatorDelete(), Record);
1045 Writer.AddDeclRef(E->getConstructor(), Record);
1046 Writer.AddSourceLocation(E->getStartLoc(), Record);
1047 Writer.AddSourceLocation(E->getEndLoc(), Record);
1048 for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
1049 I != e; ++I)
1050 Writer.WriteSubStmt(*I);
1051
1052 Code = pch::EXPR_CXX_NEW;
1053}
1054
Argyrios Kyrtzidis6e57c352010-06-22 17:07:59 +00001055void PCHStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1056 VisitExpr(E);
1057 Record.push_back(E->isGlobalDelete());
1058 Record.push_back(E->isArrayForm());
1059 Writer.AddDeclRef(E->getOperatorDelete(), Record);
1060 Writer.WriteSubStmt(E->getArgument());
1061 Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1062
1063 Code = pch::EXPR_CXX_DELETE;
1064}
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001065
Argyrios Kyrtzidis99a226d2010-06-28 09:32:03 +00001066void PCHStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1067 VisitExpr(E);
1068
1069 Writer.AddStmt(E->getBase());
1070 Record.push_back(E->isArrow());
1071 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1072 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1073 Writer.AddSourceRange(E->getQualifierRange(), Record);
1074 Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);
1075 Writer.AddSourceLocation(E->getColonColonLoc(), Record);
1076 Writer.AddSourceLocation(E->getTildeLoc(), Record);
1077
1078 // PseudoDestructorTypeStorage.
1079 Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);
1080 if (E->getDestroyedTypeIdentifier())
1081 Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);
1082 else
1083 Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);
1084
1085 Code = pch::EXPR_CXX_PSEUDO_DESTRUCTOR;
1086}
1087
Chris Lattnercba86142010-05-10 00:25:06 +00001088void PCHStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1089 VisitExpr(E);
1090 Record.push_back(E->getNumTemporaries());
1091 for (unsigned i = 0, e = E->getNumTemporaries(); i != e; ++i)
1092 Writer.AddCXXTemporary(E->getTemporary(i), Record);
1093
1094 Writer.WriteSubStmt(E->getSubExpr());
1095 Code = pch::EXPR_CXX_EXPR_WITH_TEMPORARIES;
1096}
1097
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001098void
1099PCHStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1100 VisitExpr(E);
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +00001101
1102 // Don't emit anything here, NumTemplateArgs must be emitted first.
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001103
1104 if (E->hasExplicitTemplateArgs()) {
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +00001105 const ExplicitTemplateArgumentList &Args
1106 = *E->getExplicitTemplateArgumentList();
1107 assert(Args.NumTemplateArgs &&
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001108 "Num of template args was zero! PCH reading will mess up!");
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +00001109 Record.push_back(Args.NumTemplateArgs);
1110 AddExplicitTemplateArgumentList(Args);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001111 } else {
1112 Record.push_back(0);
1113 }
1114
1115 if (!E->isImplicitAccess())
1116 Writer.WriteSubStmt(E->getBase());
1117 else
1118 Writer.WriteSubStmt(0);
1119 Writer.AddTypeRef(E->getBaseType(), Record);
1120 Record.push_back(E->isArrow());
1121 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1122 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1123 Writer.AddSourceRange(E->getQualifierRange(), Record);
1124 Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
1125 Writer.AddDeclarationName(E->getMember(), Record);
1126 Writer.AddSourceLocation(E->getMemberLoc(), Record);
1127 Code = pch::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1128}
1129
1130void
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +00001131PCHStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1132 VisitExpr(E);
1133
1134 // Don't emit anything here, NumTemplateArgs must be emitted first.
1135
1136 if (E->hasExplicitTemplateArgs()) {
1137 const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
1138 assert(Args.NumTemplateArgs &&
1139 "Num of template args was zero! PCH reading will mess up!");
1140 Record.push_back(Args.NumTemplateArgs);
1141 AddExplicitTemplateArgumentList(Args);
1142 } else {
1143 Record.push_back(0);
1144 }
1145
1146 Writer.AddDeclarationName(E->getDeclName(), Record);
1147 Writer.AddSourceLocation(E->getLocation(), Record);
1148 Writer.AddSourceRange(E->getQualifierRange(), Record);
1149 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1150 Code = pch::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
1151}
1152
1153void
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001154PCHStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1155 VisitExpr(E);
1156 Record.push_back(E->arg_size());
1157 for (CXXUnresolvedConstructExpr::arg_iterator
1158 ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1159 Writer.WriteSubStmt(*ArgI);
1160 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
1161 Writer.AddTypeRef(E->getTypeAsWritten(), Record);
1162 Writer.AddSourceLocation(E->getLParenLoc(), Record);
1163 Writer.AddSourceLocation(E->getRParenLoc(), Record);
1164 Code = pch::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1165}
Chris Lattner98267332010-05-09 06:15:05 +00001166
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +00001167void PCHStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1168 VisitExpr(E);
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +00001169
1170 // Don't emit anything here, NumTemplateArgs must be emitted first.
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +00001171
1172 if (E->hasExplicitTemplateArgs()) {
1173 const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
1174 assert(Args.NumTemplateArgs &&
1175 "Num of template args was zero! PCH reading will mess up!");
1176 Record.push_back(Args.NumTemplateArgs);
Argyrios Kyrtzidisb5288de2010-06-28 09:31:48 +00001177 AddExplicitTemplateArgumentList(Args);
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +00001178 } else {
1179 Record.push_back(0);
1180 }
1181
1182 Record.push_back(E->getNumDecls());
1183 for (OverloadExpr::decls_iterator
1184 OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
1185 Writer.AddDeclRef(OvI.getDecl(), Record);
1186 Record.push_back(OvI.getAccess());
1187 }
1188
1189 Writer.AddDeclarationName(E->getName(), Record);
1190 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1191 Writer.AddSourceRange(E->getQualifierRange(), Record);
1192 Writer.AddSourceLocation(E->getNameLoc(), Record);
1193}
1194
1195void PCHStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1196 VisitOverloadExpr(E);
1197 Record.push_back(E->isArrow());
1198 Record.push_back(E->hasUnresolvedUsing());
1199 Writer.WriteSubStmt(!E->isImplicitAccess() ? E->getBase() : 0);
1200 Writer.AddTypeRef(E->getBaseType(), Record);
1201 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1202 Code = pch::EXPR_CXX_UNRESOLVED_MEMBER;
1203}
1204
Argyrios Kyrtzidis58e01ad2010-06-25 09:03:34 +00001205void PCHStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1206 VisitOverloadExpr(E);
1207 Record.push_back(E->requiresADL());
1208 Record.push_back(E->isOverloaded());
1209 Writer.AddDeclRef(E->getNamingClass(), Record);
1210 Code = pch::EXPR_CXX_UNRESOLVED_LOOKUP;
1211}
1212
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +00001213//===----------------------------------------------------------------------===//
Chris Lattner1f551822009-04-27 06:20:01 +00001214// PCHWriter Implementation
1215//===----------------------------------------------------------------------===//
1216
1217unsigned PCHWriter::RecordSwitchCaseID(SwitchCase *S) {
Mike Stump11289f42009-09-09 15:08:12 +00001218 assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001219 "SwitchCase recorded twice");
1220 unsigned NextID = SwitchCaseIDs.size();
1221 SwitchCaseIDs[S] = NextID;
1222 return NextID;
1223}
1224
1225unsigned PCHWriter::getSwitchCaseID(SwitchCase *S) {
Mike Stump11289f42009-09-09 15:08:12 +00001226 assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001227 "SwitchCase hasn't been seen yet");
1228 return SwitchCaseIDs[S];
1229}
1230
1231/// \brief Retrieve the ID for the given label statement, which may
1232/// or may not have been emitted yet.
1233unsigned PCHWriter::GetLabelID(LabelStmt *S) {
1234 std::map<LabelStmt *, unsigned>::iterator Pos = LabelIDs.find(S);
1235 if (Pos != LabelIDs.end())
1236 return Pos->second;
Mike Stump11289f42009-09-09 15:08:12 +00001237
Chris Lattner1f551822009-04-27 06:20:01 +00001238 unsigned NextID = LabelIDs.size();
1239 LabelIDs[S] = NextID;
1240 return NextID;
1241}
1242
1243/// \brief Write the given substatement or subexpression to the
1244/// bitstream.
1245void PCHWriter::WriteSubStmt(Stmt *S) {
1246 RecordData Record;
1247 PCHStmtWriter Writer(*this, Record);
1248 ++NumStatements;
Mike Stump11289f42009-09-09 15:08:12 +00001249
Chris Lattner1f551822009-04-27 06:20:01 +00001250 if (!S) {
1251 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
1252 return;
1253 }
Mike Stump11289f42009-09-09 15:08:12 +00001254
Chris Lattner1f551822009-04-27 06:20:01 +00001255 Writer.Code = pch::STMT_NULL_PTR;
1256 Writer.Visit(S);
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001257
1258#ifndef NDEBUG
1259 if (Writer.Code == pch::STMT_NULL_PTR) {
Argyrios Kyrtzidis6ba1bb52010-06-25 09:03:12 +00001260 SourceManager &SrcMgr
1261 = DeclIDs.begin()->first->getASTContext().getSourceManager();
1262 S->dump(SrcMgr);
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001263 assert(0 && "Unhandled sub statement writing PCH file");
1264 }
1265#endif
Mike Stump11289f42009-09-09 15:08:12 +00001266 Stream.EmitRecord(Writer.Code, Record);
Chris Lattner1f551822009-04-27 06:20:01 +00001267}
1268
1269/// \brief Flush all of the statements that have been added to the
1270/// queue via AddStmt().
1271void PCHWriter::FlushStmts() {
1272 RecordData Record;
1273 PCHStmtWriter Writer(*this, Record);
Argyrios Kyrtzidisddf5f212010-06-28 09:31:42 +00001274
1275 EmittingStmts = true;
Mike Stump11289f42009-09-09 15:08:12 +00001276
Chris Lattner1f551822009-04-27 06:20:01 +00001277 for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1278 ++NumStatements;
1279 Stmt *S = StmtsToEmit[I];
Mike Stump11289f42009-09-09 15:08:12 +00001280
Chris Lattner1f551822009-04-27 06:20:01 +00001281 if (!S) {
1282 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
Argyrios Kyrtzidis03e5e042010-06-25 16:25:02 +00001283 Stream.EmitRecord(pch::STMT_STOP, Record);
Chris Lattner1f551822009-04-27 06:20:01 +00001284 continue;
1285 }
Mike Stump11289f42009-09-09 15:08:12 +00001286
Chris Lattner1f551822009-04-27 06:20:01 +00001287 Writer.Code = pch::STMT_NULL_PTR;
1288 Writer.Visit(S);
Chris Lattnercba86142010-05-10 00:25:06 +00001289#ifndef NDEBUG
1290 if (Writer.Code == pch::STMT_NULL_PTR) {
1291 S->dump();
1292 assert(0 && "Unhandled expression writing PCH file");
1293 }
1294#endif
Mike Stump11289f42009-09-09 15:08:12 +00001295 Stream.EmitRecord(Writer.Code, Record);
1296
1297 assert(N == StmtsToEmit.size() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001298 "Substatement writen via AddStmt rather than WriteSubStmt!");
Mike Stump11289f42009-09-09 15:08:12 +00001299
Chris Lattner1f551822009-04-27 06:20:01 +00001300 // Note that we are at the end of a full expression. Any
1301 // expression records that follow this one are part of a different
1302 // expression.
1303 Record.clear();
1304 Stream.EmitRecord(pch::STMT_STOP, Record);
1305 }
Mike Stump11289f42009-09-09 15:08:12 +00001306
Argyrios Kyrtzidisddf5f212010-06-28 09:31:42 +00001307 EmittingStmts = false;
1308
Chris Lattner1f551822009-04-27 06:20:01 +00001309 StmtsToEmit.clear();
Chris Lattner1f551822009-04-27 06:20:01 +00001310}