blob: ffddad6754a67cd0a014edf76cf62d24681a02d7 [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) { }
35
36 void VisitStmt(Stmt *S);
37 void VisitNullStmt(NullStmt *S);
38 void VisitCompoundStmt(CompoundStmt *S);
39 void VisitSwitchCase(SwitchCase *S);
40 void VisitCaseStmt(CaseStmt *S);
41 void VisitDefaultStmt(DefaultStmt *S);
42 void VisitLabelStmt(LabelStmt *S);
43 void VisitIfStmt(IfStmt *S);
44 void VisitSwitchStmt(SwitchStmt *S);
45 void VisitWhileStmt(WhileStmt *S);
46 void VisitDoStmt(DoStmt *S);
47 void VisitForStmt(ForStmt *S);
48 void VisitGotoStmt(GotoStmt *S);
49 void VisitIndirectGotoStmt(IndirectGotoStmt *S);
50 void VisitContinueStmt(ContinueStmt *S);
51 void VisitBreakStmt(BreakStmt *S);
52 void VisitReturnStmt(ReturnStmt *S);
53 void VisitDeclStmt(DeclStmt *S);
54 void VisitAsmStmt(AsmStmt *S);
55 void VisitExpr(Expr *E);
56 void VisitPredefinedExpr(PredefinedExpr *E);
57 void VisitDeclRefExpr(DeclRefExpr *E);
58 void VisitIntegerLiteral(IntegerLiteral *E);
59 void VisitFloatingLiteral(FloatingLiteral *E);
60 void VisitImaginaryLiteral(ImaginaryLiteral *E);
61 void VisitStringLiteral(StringLiteral *E);
62 void VisitCharacterLiteral(CharacterLiteral *E);
63 void VisitParenExpr(ParenExpr *E);
64 void VisitUnaryOperator(UnaryOperator *E);
Douglas Gregor882211c2010-04-28 22:16:22 +000065 void VisitOffsetOfExpr(OffsetOfExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +000066 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
67 void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
68 void VisitCallExpr(CallExpr *E);
69 void VisitMemberExpr(MemberExpr *E);
70 void VisitCastExpr(CastExpr *E);
71 void VisitBinaryOperator(BinaryOperator *E);
72 void VisitCompoundAssignOperator(CompoundAssignOperator *E);
73 void VisitConditionalOperator(ConditionalOperator *E);
74 void VisitImplicitCastExpr(ImplicitCastExpr *E);
75 void VisitExplicitCastExpr(ExplicitCastExpr *E);
76 void VisitCStyleCastExpr(CStyleCastExpr *E);
77 void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
78 void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
79 void VisitInitListExpr(InitListExpr *E);
80 void VisitDesignatedInitExpr(DesignatedInitExpr *E);
81 void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
82 void VisitVAArgExpr(VAArgExpr *E);
83 void VisitAddrLabelExpr(AddrLabelExpr *E);
84 void VisitStmtExpr(StmtExpr *E);
85 void VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
86 void VisitChooseExpr(ChooseExpr *E);
87 void VisitGNUNullExpr(GNUNullExpr *E);
88 void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
89 void VisitBlockExpr(BlockExpr *E);
90 void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
Mike Stump11289f42009-09-09 15:08:12 +000091
Chris Lattner1f551822009-04-27 06:20:01 +000092 // Objective-C Expressions
93 void VisitObjCStringLiteral(ObjCStringLiteral *E);
94 void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
95 void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
96 void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
97 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
98 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
Fariborz Jahanian9a846652009-08-20 17:02:02 +000099 void VisitObjCImplicitSetterGetterRefExpr(
100 ObjCImplicitSetterGetterRefExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +0000101 void VisitObjCMessageExpr(ObjCMessageExpr *E);
102 void VisitObjCSuperExpr(ObjCSuperExpr *E);
Steve Naroffe87026a2009-07-24 17:54:45 +0000103 void VisitObjCIsaExpr(ObjCIsaExpr *E);
Mike Stump11289f42009-09-09 15:08:12 +0000104
105 // Objective-C Statements
Chris Lattner1f551822009-04-27 06:20:01 +0000106 void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
107 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
108 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
109 void VisitObjCAtTryStmt(ObjCAtTryStmt *);
110 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
111 void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000112
Mike Stump11289f42009-09-09 15:08:12 +0000113 // C++ Statements
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000114 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Chris Lattnerb7e7f722010-05-09 05:36:05 +0000115 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000116 void VisitCXXConstructExpr(CXXConstructExpr *E);
Sam Weinigd01101e2010-01-16 21:21:01 +0000117 void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
118 void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
119 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
120 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
121 void VisitCXXConstCastExpr(CXXConstCastExpr *E);
122 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
Sam Weinige83b3ac2010-02-07 06:32:43 +0000123 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
124 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Chris Lattner13a5ecc2010-05-09 06:03:39 +0000125 void VisitCXXTypeidExpr(CXXTypeidExpr *E);
Chris Lattner98267332010-05-09 06:15:05 +0000126 void VisitCXXThisExpr(CXXThisExpr *E);
127 void VisitCXXThrowExpr(CXXThrowExpr *E);
Chris Lattnere2437f42010-05-09 06:40:08 +0000128 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
Chris Lattnercba86142010-05-10 00:25:06 +0000129 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000130
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000131 void VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
132 void VisitCXXNewExpr(CXXNewExpr *E);
Argyrios Kyrtzidis6e57c352010-06-22 17:07:59 +0000133 void VisitCXXDeleteExpr(CXXDeleteExpr *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000134
Chris Lattnercba86142010-05-10 00:25:06 +0000135 void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000136 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
137 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000138
139 void VisitOverloadExpr(OverloadExpr *E);
140 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
Chris Lattner1f551822009-04-27 06:20:01 +0000141 };
142}
143
Mike Stump11289f42009-09-09 15:08:12 +0000144void PCHStmtWriter::VisitStmt(Stmt *S) {
Chris Lattner1f551822009-04-27 06:20:01 +0000145}
146
147void PCHStmtWriter::VisitNullStmt(NullStmt *S) {
148 VisitStmt(S);
149 Writer.AddSourceLocation(S->getSemiLoc(), Record);
150 Code = pch::STMT_NULL;
151}
152
153void PCHStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
154 VisitStmt(S);
155 Record.push_back(S->size());
156 for (CompoundStmt::body_iterator CS = S->body_begin(), CSEnd = S->body_end();
157 CS != CSEnd; ++CS)
158 Writer.WriteSubStmt(*CS);
159 Writer.AddSourceLocation(S->getLBracLoc(), Record);
160 Writer.AddSourceLocation(S->getRBracLoc(), Record);
161 Code = pch::STMT_COMPOUND;
162}
163
164void PCHStmtWriter::VisitSwitchCase(SwitchCase *S) {
165 VisitStmt(S);
166 Record.push_back(Writer.RecordSwitchCaseID(S));
167}
168
169void PCHStmtWriter::VisitCaseStmt(CaseStmt *S) {
170 VisitSwitchCase(S);
171 Writer.WriteSubStmt(S->getLHS());
172 Writer.WriteSubStmt(S->getRHS());
173 Writer.WriteSubStmt(S->getSubStmt());
174 Writer.AddSourceLocation(S->getCaseLoc(), Record);
Douglas Gregor2a2d00f2009-05-15 23:57:33 +0000175 Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
176 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000177 Code = pch::STMT_CASE;
178}
179
180void PCHStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
181 VisitSwitchCase(S);
182 Writer.WriteSubStmt(S->getSubStmt());
183 Writer.AddSourceLocation(S->getDefaultLoc(), Record);
Douglas Gregor2a2d00f2009-05-15 23:57:33 +0000184 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000185 Code = pch::STMT_DEFAULT;
186}
187
188void PCHStmtWriter::VisitLabelStmt(LabelStmt *S) {
189 VisitStmt(S);
190 Writer.AddIdentifierRef(S->getID(), Record);
191 Writer.WriteSubStmt(S->getSubStmt());
192 Writer.AddSourceLocation(S->getIdentLoc(), Record);
193 Record.push_back(Writer.GetLabelID(S));
194 Code = pch::STMT_LABEL;
195}
196
197void PCHStmtWriter::VisitIfStmt(IfStmt *S) {
198 VisitStmt(S);
Douglas Gregor633caca2009-11-23 23:44:04 +0000199 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000200 Writer.WriteSubStmt(S->getCond());
201 Writer.WriteSubStmt(S->getThen());
202 Writer.WriteSubStmt(S->getElse());
203 Writer.AddSourceLocation(S->getIfLoc(), Record);
Douglas Gregor9d73cab2009-05-15 18:53:42 +0000204 Writer.AddSourceLocation(S->getElseLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000205 Code = pch::STMT_IF;
206}
207
208void PCHStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
209 VisitStmt(S);
Douglas Gregordcf19622009-11-24 17:07:59 +0000210 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000211 Writer.WriteSubStmt(S->getCond());
212 Writer.WriteSubStmt(S->getBody());
213 Writer.AddSourceLocation(S->getSwitchLoc(), Record);
Mike Stump11289f42009-09-09 15:08:12 +0000214 for (SwitchCase *SC = S->getSwitchCaseList(); SC;
Chris Lattner1f551822009-04-27 06:20:01 +0000215 SC = SC->getNextSwitchCase())
216 Record.push_back(Writer.getSwitchCaseID(SC));
217 Code = pch::STMT_SWITCH;
218}
219
220void PCHStmtWriter::VisitWhileStmt(WhileStmt *S) {
221 VisitStmt(S);
Douglas Gregor680f8612009-11-24 21:15:44 +0000222 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000223 Writer.WriteSubStmt(S->getCond());
224 Writer.WriteSubStmt(S->getBody());
225 Writer.AddSourceLocation(S->getWhileLoc(), Record);
226 Code = pch::STMT_WHILE;
227}
228
229void PCHStmtWriter::VisitDoStmt(DoStmt *S) {
230 VisitStmt(S);
231 Writer.WriteSubStmt(S->getCond());
232 Writer.WriteSubStmt(S->getBody());
233 Writer.AddSourceLocation(S->getDoLoc(), Record);
Douglas Gregor3daa82d2009-05-15 21:56:04 +0000234 Writer.AddSourceLocation(S->getWhileLoc(), Record);
Chris Lattner815b70e2009-06-12 23:04:47 +0000235 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000236 Code = pch::STMT_DO;
237}
238
239void PCHStmtWriter::VisitForStmt(ForStmt *S) {
240 VisitStmt(S);
241 Writer.WriteSubStmt(S->getInit());
242 Writer.WriteSubStmt(S->getCond());
Douglas Gregor7bab5ff2009-11-25 00:27:52 +0000243 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000244 Writer.WriteSubStmt(S->getInc());
245 Writer.WriteSubStmt(S->getBody());
246 Writer.AddSourceLocation(S->getForLoc(), Record);
Douglas Gregor5d138682009-05-15 22:12:32 +0000247 Writer.AddSourceLocation(S->getLParenLoc(), Record);
248 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000249 Code = pch::STMT_FOR;
250}
251
252void PCHStmtWriter::VisitGotoStmt(GotoStmt *S) {
253 VisitStmt(S);
254 Record.push_back(Writer.GetLabelID(S->getLabel()));
255 Writer.AddSourceLocation(S->getGotoLoc(), Record);
256 Writer.AddSourceLocation(S->getLabelLoc(), Record);
257 Code = pch::STMT_GOTO;
258}
259
260void PCHStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
261 VisitStmt(S);
262 Writer.AddSourceLocation(S->getGotoLoc(), Record);
Douglas Gregor30776d42009-05-16 00:20:29 +0000263 Writer.AddSourceLocation(S->getStarLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000264 Writer.WriteSubStmt(S->getTarget());
265 Code = pch::STMT_INDIRECT_GOTO;
266}
267
268void PCHStmtWriter::VisitContinueStmt(ContinueStmt *S) {
269 VisitStmt(S);
270 Writer.AddSourceLocation(S->getContinueLoc(), Record);
271 Code = pch::STMT_CONTINUE;
272}
273
274void PCHStmtWriter::VisitBreakStmt(BreakStmt *S) {
275 VisitStmt(S);
276 Writer.AddSourceLocation(S->getBreakLoc(), Record);
277 Code = pch::STMT_BREAK;
278}
279
280void PCHStmtWriter::VisitReturnStmt(ReturnStmt *S) {
281 VisitStmt(S);
282 Writer.WriteSubStmt(S->getRetValue());
283 Writer.AddSourceLocation(S->getReturnLoc(), Record);
Douglas Gregor6fd1b182010-05-15 06:01:05 +0000284 Writer.AddDeclRef(S->getNRVOCandidate(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000285 Code = pch::STMT_RETURN;
286}
287
288void PCHStmtWriter::VisitDeclStmt(DeclStmt *S) {
289 VisitStmt(S);
290 Writer.AddSourceLocation(S->getStartLoc(), Record);
291 Writer.AddSourceLocation(S->getEndLoc(), Record);
292 DeclGroupRef DG = S->getDeclGroup();
293 for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
294 Writer.AddDeclRef(*D, Record);
295 Code = pch::STMT_DECL;
296}
297
298void PCHStmtWriter::VisitAsmStmt(AsmStmt *S) {
299 VisitStmt(S);
300 Record.push_back(S->getNumOutputs());
301 Record.push_back(S->getNumInputs());
302 Record.push_back(S->getNumClobbers());
303 Writer.AddSourceLocation(S->getAsmLoc(), Record);
304 Writer.AddSourceLocation(S->getRParenLoc(), Record);
305 Record.push_back(S->isVolatile());
306 Record.push_back(S->isSimple());
Mike Stump90be58a2010-01-04 22:37:17 +0000307 Record.push_back(S->isMSAsm());
Chris Lattner1f551822009-04-27 06:20:01 +0000308 Writer.WriteSubStmt(S->getAsmString());
309
310 // Outputs
Anders Carlsson9a020f92010-01-30 22:25:16 +0000311 for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
312 Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000313 Writer.WriteSubStmt(S->getOutputConstraintLiteral(I));
314 Writer.WriteSubStmt(S->getOutputExpr(I));
315 }
316
317 // Inputs
318 for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
Anders Carlsson9a020f92010-01-30 22:25:16 +0000319 Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000320 Writer.WriteSubStmt(S->getInputConstraintLiteral(I));
321 Writer.WriteSubStmt(S->getInputExpr(I));
322 }
323
324 // Clobbers
325 for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
326 Writer.WriteSubStmt(S->getClobber(I));
327
328 Code = pch::STMT_ASM;
329}
330
331void PCHStmtWriter::VisitExpr(Expr *E) {
332 VisitStmt(E);
333 Writer.AddTypeRef(E->getType(), Record);
334 Record.push_back(E->isTypeDependent());
335 Record.push_back(E->isValueDependent());
336}
337
338void PCHStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
339 VisitExpr(E);
340 Writer.AddSourceLocation(E->getLocation(), Record);
341 Record.push_back(E->getIdentType()); // FIXME: stable encoding
342 Code = pch::EXPR_PREDEFINED;
343}
344
345void PCHStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
346 VisitExpr(E);
347 Writer.AddDeclRef(E->getDecl(), Record);
348 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000349 // FIXME: write qualifier
350 // FIXME: write explicit template arguments
Chris Lattner1f551822009-04-27 06:20:01 +0000351 Code = pch::EXPR_DECL_REF;
352}
353
354void PCHStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
355 VisitExpr(E);
356 Writer.AddSourceLocation(E->getLocation(), Record);
357 Writer.AddAPInt(E->getValue(), Record);
358 Code = pch::EXPR_INTEGER_LITERAL;
359}
360
361void PCHStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
362 VisitExpr(E);
363 Writer.AddAPFloat(E->getValue(), Record);
364 Record.push_back(E->isExact());
365 Writer.AddSourceLocation(E->getLocation(), Record);
366 Code = pch::EXPR_FLOATING_LITERAL;
367}
368
369void PCHStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
370 VisitExpr(E);
371 Writer.WriteSubStmt(E->getSubExpr());
372 Code = pch::EXPR_IMAGINARY_LITERAL;
373}
374
375void PCHStmtWriter::VisitStringLiteral(StringLiteral *E) {
376 VisitExpr(E);
377 Record.push_back(E->getByteLength());
378 Record.push_back(E->getNumConcatenated());
379 Record.push_back(E->isWide());
380 // FIXME: String data should be stored as a blob at the end of the
381 // StringLiteral. However, we can't do so now because we have no
382 // provision for coping with abbreviations when we're jumping around
383 // the PCH file during deserialization.
Mike Stump11289f42009-09-09 15:08:12 +0000384 Record.insert(Record.end(),
Chris Lattner1f551822009-04-27 06:20:01 +0000385 E->getStrData(), E->getStrData() + E->getByteLength());
386 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
387 Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
388 Code = pch::EXPR_STRING_LITERAL;
389}
390
391void PCHStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
392 VisitExpr(E);
393 Record.push_back(E->getValue());
Chris Lattnere6434cb2009-08-24 17:39:36 +0000394 Writer.AddSourceLocation(E->getLocation(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000395 Record.push_back(E->isWide());
396 Code = pch::EXPR_CHARACTER_LITERAL;
397}
398
399void PCHStmtWriter::VisitParenExpr(ParenExpr *E) {
400 VisitExpr(E);
401 Writer.AddSourceLocation(E->getLParen(), Record);
402 Writer.AddSourceLocation(E->getRParen(), Record);
403 Writer.WriteSubStmt(E->getSubExpr());
404 Code = pch::EXPR_PAREN;
405}
406
407void PCHStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
408 VisitExpr(E);
409 Writer.WriteSubStmt(E->getSubExpr());
410 Record.push_back(E->getOpcode()); // FIXME: stable encoding
411 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
412 Code = pch::EXPR_UNARY_OPERATOR;
413}
414
Douglas Gregor882211c2010-04-28 22:16:22 +0000415void PCHStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
416 VisitExpr(E);
417 Record.push_back(E->getNumComponents());
418 Record.push_back(E->getNumExpressions());
419 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
420 Writer.AddSourceLocation(E->getRParenLoc(), Record);
421 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
422 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
423 const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
424 Record.push_back(ON.getKind()); // FIXME: Stable encoding
425 Writer.AddSourceLocation(ON.getRange().getBegin(), Record);
426 Writer.AddSourceLocation(ON.getRange().getEnd(), Record);
427 switch (ON.getKind()) {
428 case OffsetOfExpr::OffsetOfNode::Array:
429 Record.push_back(ON.getArrayExprIndex());
430 break;
431
432 case OffsetOfExpr::OffsetOfNode::Field:
433 Writer.AddDeclRef(ON.getField(), Record);
434 break;
435
436 case OffsetOfExpr::OffsetOfNode::Identifier:
437 Writer.AddIdentifierRef(ON.getFieldName(), Record);
438 break;
Douglas Gregord1702062010-04-29 00:18:15 +0000439
440 case OffsetOfExpr::OffsetOfNode::Base:
441 // FIXME: Implement this!
442 llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
443 break;
Douglas Gregor882211c2010-04-28 22:16:22 +0000444 }
445 }
446 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
447 Writer.WriteSubStmt(E->getIndexExpr(I));
448 Code = pch::EXPR_OFFSETOF;
449}
450
Mike Stump11289f42009-09-09 15:08:12 +0000451void PCHStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000452 VisitExpr(E);
453 Record.push_back(E->isSizeOf());
454 if (E->isArgumentType())
John McCallbcd03502009-12-07 02:54:59 +0000455 Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000456 else {
457 Record.push_back(0);
458 Writer.WriteSubStmt(E->getArgumentExpr());
459 }
460 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
461 Writer.AddSourceLocation(E->getRParenLoc(), Record);
462 Code = pch::EXPR_SIZEOF_ALIGN_OF;
463}
464
465void PCHStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
466 VisitExpr(E);
467 Writer.WriteSubStmt(E->getLHS());
468 Writer.WriteSubStmt(E->getRHS());
469 Writer.AddSourceLocation(E->getRBracketLoc(), Record);
470 Code = pch::EXPR_ARRAY_SUBSCRIPT;
471}
472
473void PCHStmtWriter::VisitCallExpr(CallExpr *E) {
474 VisitExpr(E);
475 Record.push_back(E->getNumArgs());
476 Writer.AddSourceLocation(E->getRParenLoc(), Record);
477 Writer.WriteSubStmt(E->getCallee());
478 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
479 Arg != ArgEnd; ++Arg)
480 Writer.WriteSubStmt(*Arg);
481 Code = pch::EXPR_CALL;
482}
483
484void PCHStmtWriter::VisitMemberExpr(MemberExpr *E) {
485 VisitExpr(E);
486 Writer.WriteSubStmt(E->getBase());
487 Writer.AddDeclRef(E->getMemberDecl(), Record);
488 Writer.AddSourceLocation(E->getMemberLoc(), Record);
489 Record.push_back(E->isArrow());
Douglas Gregorf4b34ba2009-08-31 23:44:04 +0000490 // FIXME: C++ nested-name-specifier
Douglas Gregor84f14dd2009-09-01 00:37:14 +0000491 // FIXME: C++ template argument list
Chris Lattner1f551822009-04-27 06:20:01 +0000492 Code = pch::EXPR_MEMBER;
493}
494
Steve Naroffe87026a2009-07-24 17:54:45 +0000495void PCHStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
496 VisitExpr(E);
497 Writer.WriteSubStmt(E->getBase());
498 Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
499 Record.push_back(E->isArrow());
500 Code = pch::EXPR_OBJC_ISA;
501}
502
Chris Lattner1f551822009-04-27 06:20:01 +0000503void PCHStmtWriter::VisitCastExpr(CastExpr *E) {
504 VisitExpr(E);
505 Writer.WriteSubStmt(E->getSubExpr());
Anders Carlssona2615922009-07-31 00:48:10 +0000506 Record.push_back(E->getCastKind()); // FIXME: stable encoding
Chris Lattner1f551822009-04-27 06:20:01 +0000507}
508
509void PCHStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
510 VisitExpr(E);
511 Writer.WriteSubStmt(E->getLHS());
512 Writer.WriteSubStmt(E->getRHS());
513 Record.push_back(E->getOpcode()); // FIXME: stable encoding
514 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
515 Code = pch::EXPR_BINARY_OPERATOR;
516}
517
518void PCHStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
519 VisitBinaryOperator(E);
520 Writer.AddTypeRef(E->getComputationLHSType(), Record);
521 Writer.AddTypeRef(E->getComputationResultType(), Record);
522 Code = pch::EXPR_COMPOUND_ASSIGN_OPERATOR;
523}
524
525void PCHStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
526 VisitExpr(E);
527 Writer.WriteSubStmt(E->getCond());
528 Writer.WriteSubStmt(E->getLHS());
529 Writer.WriteSubStmt(E->getRHS());
Douglas Gregor7e112b02009-08-26 14:37:04 +0000530 Writer.AddSourceLocation(E->getQuestionLoc(), Record);
531 Writer.AddSourceLocation(E->getColonLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000532 Code = pch::EXPR_CONDITIONAL_OPERATOR;
533}
534
535void PCHStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
536 VisitCastExpr(E);
537 Record.push_back(E->isLvalueCast());
538 Code = pch::EXPR_IMPLICIT_CAST;
539}
540
541void PCHStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
542 VisitCastExpr(E);
John McCall97513962010-01-15 18:39:57 +0000543 Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000544}
545
546void PCHStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
547 VisitExplicitCastExpr(E);
548 Writer.AddSourceLocation(E->getLParenLoc(), Record);
549 Writer.AddSourceLocation(E->getRParenLoc(), Record);
550 Code = pch::EXPR_CSTYLE_CAST;
551}
552
553void PCHStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
554 VisitExpr(E);
555 Writer.AddSourceLocation(E->getLParenLoc(), Record);
John McCalle15bbff2010-01-18 19:35:47 +0000556 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000557 Writer.WriteSubStmt(E->getInitializer());
558 Record.push_back(E->isFileScope());
559 Code = pch::EXPR_COMPOUND_LITERAL;
560}
561
562void PCHStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
563 VisitExpr(E);
564 Writer.WriteSubStmt(E->getBase());
565 Writer.AddIdentifierRef(&E->getAccessor(), Record);
566 Writer.AddSourceLocation(E->getAccessorLoc(), Record);
567 Code = pch::EXPR_EXT_VECTOR_ELEMENT;
568}
569
570void PCHStmtWriter::VisitInitListExpr(InitListExpr *E) {
571 VisitExpr(E);
572 Record.push_back(E->getNumInits());
573 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
574 Writer.WriteSubStmt(E->getInit(I));
575 Writer.WriteSubStmt(E->getSyntacticForm());
576 Writer.AddSourceLocation(E->getLBraceLoc(), Record);
577 Writer.AddSourceLocation(E->getRBraceLoc(), Record);
578 Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
579 Record.push_back(E->hadArrayRangeDesignator());
580 Code = pch::EXPR_INIT_LIST;
581}
582
583void PCHStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
584 VisitExpr(E);
585 Record.push_back(E->getNumSubExprs());
586 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
587 Writer.WriteSubStmt(E->getSubExpr(I));
588 Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
589 Record.push_back(E->usesGNUSyntax());
590 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
591 DEnd = E->designators_end();
592 D != DEnd; ++D) {
593 if (D->isFieldDesignator()) {
594 if (FieldDecl *Field = D->getField()) {
595 Record.push_back(pch::DESIG_FIELD_DECL);
596 Writer.AddDeclRef(Field, Record);
597 } else {
598 Record.push_back(pch::DESIG_FIELD_NAME);
599 Writer.AddIdentifierRef(D->getFieldName(), Record);
600 }
601 Writer.AddSourceLocation(D->getDotLoc(), Record);
602 Writer.AddSourceLocation(D->getFieldLoc(), Record);
603 } else if (D->isArrayDesignator()) {
604 Record.push_back(pch::DESIG_ARRAY);
605 Record.push_back(D->getFirstExprIndex());
606 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
607 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
608 } else {
609 assert(D->isArrayRangeDesignator() && "Unknown designator");
610 Record.push_back(pch::DESIG_ARRAY_RANGE);
611 Record.push_back(D->getFirstExprIndex());
612 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
613 Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
614 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
615 }
616 }
617 Code = pch::EXPR_DESIGNATED_INIT;
618}
619
620void PCHStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
621 VisitExpr(E);
622 Code = pch::EXPR_IMPLICIT_VALUE_INIT;
623}
624
625void PCHStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
626 VisitExpr(E);
627 Writer.WriteSubStmt(E->getSubExpr());
628 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
629 Writer.AddSourceLocation(E->getRParenLoc(), Record);
630 Code = pch::EXPR_VA_ARG;
631}
632
633void PCHStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
634 VisitExpr(E);
635 Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
636 Writer.AddSourceLocation(E->getLabelLoc(), Record);
637 Record.push_back(Writer.GetLabelID(E->getLabel()));
638 Code = pch::EXPR_ADDR_LABEL;
639}
640
641void PCHStmtWriter::VisitStmtExpr(StmtExpr *E) {
642 VisitExpr(E);
643 Writer.WriteSubStmt(E->getSubStmt());
644 Writer.AddSourceLocation(E->getLParenLoc(), Record);
645 Writer.AddSourceLocation(E->getRParenLoc(), Record);
646 Code = pch::EXPR_STMT;
647}
648
649void PCHStmtWriter::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
650 VisitExpr(E);
651 Writer.AddTypeRef(E->getArgType1(), Record);
652 Writer.AddTypeRef(E->getArgType2(), Record);
653 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
654 Writer.AddSourceLocation(E->getRParenLoc(), Record);
655 Code = pch::EXPR_TYPES_COMPATIBLE;
656}
657
658void PCHStmtWriter::VisitChooseExpr(ChooseExpr *E) {
659 VisitExpr(E);
660 Writer.WriteSubStmt(E->getCond());
661 Writer.WriteSubStmt(E->getLHS());
662 Writer.WriteSubStmt(E->getRHS());
663 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
664 Writer.AddSourceLocation(E->getRParenLoc(), Record);
665 Code = pch::EXPR_CHOOSE;
666}
667
668void PCHStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
669 VisitExpr(E);
670 Writer.AddSourceLocation(E->getTokenLocation(), Record);
671 Code = pch::EXPR_GNU_NULL;
672}
673
674void PCHStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
675 VisitExpr(E);
676 Record.push_back(E->getNumSubExprs());
677 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
678 Writer.WriteSubStmt(E->getExpr(I));
679 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
680 Writer.AddSourceLocation(E->getRParenLoc(), Record);
681 Code = pch::EXPR_SHUFFLE_VECTOR;
682}
683
684void PCHStmtWriter::VisitBlockExpr(BlockExpr *E) {
685 VisitExpr(E);
686 Writer.AddDeclRef(E->getBlockDecl(), Record);
687 Record.push_back(E->hasBlockDeclRefExprs());
688 Code = pch::EXPR_BLOCK;
689}
690
691void PCHStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
692 VisitExpr(E);
693 Writer.AddDeclRef(E->getDecl(), Record);
694 Writer.AddSourceLocation(E->getLocation(), Record);
695 Record.push_back(E->isByRef());
Fariborz Jahaniane8918d52009-06-20 00:02:26 +0000696 Record.push_back(E->isConstQualAdded());
Fariborz Jahanian96433992010-06-04 19:06:53 +0000697 Writer.WriteSubStmt(E->getCopyConstructorExpr());
Chris Lattner1f551822009-04-27 06:20:01 +0000698 Code = pch::EXPR_BLOCK_DECL_REF;
699}
700
701//===----------------------------------------------------------------------===//
702// Objective-C Expressions and Statements.
703//===----------------------------------------------------------------------===//
704
705void PCHStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
706 VisitExpr(E);
707 Writer.WriteSubStmt(E->getString());
708 Writer.AddSourceLocation(E->getAtLoc(), Record);
709 Code = pch::EXPR_OBJC_STRING_LITERAL;
710}
711
Mike Stump11289f42009-09-09 15:08:12 +0000712void PCHStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000713 VisitExpr(E);
Douglas Gregorabd9e962010-04-20 15:39:42 +0000714 Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000715 Writer.AddSourceLocation(E->getAtLoc(), Record);
716 Writer.AddSourceLocation(E->getRParenLoc(), Record);
717 Code = pch::EXPR_OBJC_ENCODE;
718}
719
720void PCHStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
721 VisitExpr(E);
722 Writer.AddSelectorRef(E->getSelector(), Record);
723 Writer.AddSourceLocation(E->getAtLoc(), Record);
724 Writer.AddSourceLocation(E->getRParenLoc(), Record);
725 Code = pch::EXPR_OBJC_SELECTOR_EXPR;
726}
727
728void PCHStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
729 VisitExpr(E);
730 Writer.AddDeclRef(E->getProtocol(), Record);
731 Writer.AddSourceLocation(E->getAtLoc(), Record);
732 Writer.AddSourceLocation(E->getRParenLoc(), Record);
733 Code = pch::EXPR_OBJC_PROTOCOL_EXPR;
734}
735
736void PCHStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
737 VisitExpr(E);
738 Writer.AddDeclRef(E->getDecl(), Record);
739 Writer.AddSourceLocation(E->getLocation(), Record);
740 Writer.WriteSubStmt(E->getBase());
741 Record.push_back(E->isArrow());
742 Record.push_back(E->isFreeIvar());
743 Code = pch::EXPR_OBJC_IVAR_REF_EXPR;
744}
745
746void PCHStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
747 VisitExpr(E);
748 Writer.AddDeclRef(E->getProperty(), Record);
749 Writer.AddSourceLocation(E->getLocation(), Record);
750 Writer.WriteSubStmt(E->getBase());
751 Code = pch::EXPR_OBJC_PROPERTY_REF_EXPR;
752}
753
Fariborz Jahanian9a846652009-08-20 17:02:02 +0000754void PCHStmtWriter::VisitObjCImplicitSetterGetterRefExpr(
755 ObjCImplicitSetterGetterRefExpr *E) {
Chris Lattner1f551822009-04-27 06:20:01 +0000756 VisitExpr(E);
757 Writer.AddDeclRef(E->getGetterMethod(), Record);
758 Writer.AddDeclRef(E->getSetterMethod(), Record);
Mike Stump11289f42009-09-09 15:08:12 +0000759
Fariborz Jahanian19380c42009-08-18 21:37:33 +0000760 // NOTE: InterfaceDecl and Base are mutually exclusive.
761 Writer.AddDeclRef(E->getInterfaceDecl(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000762 Writer.WriteSubStmt(E->getBase());
763 Writer.AddSourceLocation(E->getLocation(), Record);
764 Writer.AddSourceLocation(E->getClassLoc(), Record);
765 Code = pch::EXPR_OBJC_KVC_REF_EXPR;
766}
767
768void PCHStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
769 VisitExpr(E);
770 Record.push_back(E->getNumArgs());
Douglas Gregor9a129192010-04-21 00:45:42 +0000771 Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
772 switch (E->getReceiverKind()) {
773 case ObjCMessageExpr::Instance:
774 Writer.WriteSubStmt(E->getInstanceReceiver());
775 break;
776
777 case ObjCMessageExpr::Class:
778 Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
779 break;
780
781 case ObjCMessageExpr::SuperClass:
782 case ObjCMessageExpr::SuperInstance:
783 Writer.AddTypeRef(E->getSuperType(), Record);
784 Writer.AddSourceLocation(E->getSuperLoc(), Record);
785 break;
786 }
787
788 if (E->getMethodDecl()) {
789 Record.push_back(1);
790 Writer.AddDeclRef(E->getMethodDecl(), Record);
791 } else {
792 Record.push_back(0);
793 Writer.AddSelectorRef(E->getSelector(), Record);
794 }
795
Chris Lattner1f551822009-04-27 06:20:01 +0000796 Writer.AddSourceLocation(E->getLeftLoc(), Record);
797 Writer.AddSourceLocation(E->getRightLoc(), Record);
Chris Lattner1f551822009-04-27 06:20:01 +0000798
799 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
800 Arg != ArgEnd; ++Arg)
801 Writer.WriteSubStmt(*Arg);
802 Code = pch::EXPR_OBJC_MESSAGE_EXPR;
803}
804
805void PCHStmtWriter::VisitObjCSuperExpr(ObjCSuperExpr *E) {
806 VisitExpr(E);
807 Writer.AddSourceLocation(E->getLoc(), Record);
808 Code = pch::EXPR_OBJC_SUPER_EXPR;
809}
810
811void PCHStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
812 VisitStmt(S);
813 Writer.WriteSubStmt(S->getElement());
814 Writer.WriteSubStmt(S->getCollection());
815 Writer.WriteSubStmt(S->getBody());
816 Writer.AddSourceLocation(S->getForLoc(), Record);
817 Writer.AddSourceLocation(S->getRParenLoc(), Record);
818 Code = pch::STMT_OBJC_FOR_COLLECTION;
819}
820
821void PCHStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
822 Writer.WriteSubStmt(S->getCatchBody());
Chris Lattner1f551822009-04-27 06:20:01 +0000823 Writer.AddDeclRef(S->getCatchParamDecl(), Record);
824 Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
825 Writer.AddSourceLocation(S->getRParenLoc(), Record);
826 Code = pch::STMT_OBJC_CATCH;
827}
828
829void PCHStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
830 Writer.WriteSubStmt(S->getFinallyBody());
831 Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
832 Code = pch::STMT_OBJC_FINALLY;
833}
834
835void PCHStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregor96c79492010-04-23 22:50:49 +0000836 Record.push_back(S->getNumCatchStmts());
837 Record.push_back(S->getFinallyStmt() != 0);
Chris Lattner1f551822009-04-27 06:20:01 +0000838 Writer.WriteSubStmt(S->getTryBody());
Douglas Gregor96c79492010-04-23 22:50:49 +0000839 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
840 Writer.WriteSubStmt(S->getCatchStmt(I));
841 if (S->getFinallyStmt())
842 Writer.WriteSubStmt(S->getFinallyStmt());
Chris Lattner1f551822009-04-27 06:20:01 +0000843 Writer.AddSourceLocation(S->getAtTryLoc(), Record);
844 Code = pch::STMT_OBJC_AT_TRY;
845}
846
847void PCHStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
848 Writer.WriteSubStmt(S->getSynchExpr());
849 Writer.WriteSubStmt(S->getSynchBody());
850 Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
851 Code = pch::STMT_OBJC_AT_SYNCHRONIZED;
852}
853
854void PCHStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
855 Writer.WriteSubStmt(S->getThrowExpr());
856 Writer.AddSourceLocation(S->getThrowLoc(), Record);
857 Code = pch::STMT_OBJC_AT_THROW;
858}
859
860//===----------------------------------------------------------------------===//
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +0000861// C++ Expressions and Statements.
862//===----------------------------------------------------------------------===//
863
864void PCHStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
865 VisitCallExpr(E);
866 Record.push_back(E->getOperator());
867 Code = pch::EXPR_CXX_OPERATOR_CALL;
868}
869
Chris Lattnerb7e7f722010-05-09 05:36:05 +0000870void PCHStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
871 VisitCallExpr(E);
872 Code = pch::EXPR_CXX_MEMBER_CALL;
873}
874
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000875void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
876 VisitExpr(E);
Argyrios Kyrtzidis30d98f32010-06-24 08:57:09 +0000877 Record.push_back(E->getNumArgs());
878 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
879 Writer.WriteSubStmt(E->getArg(I));
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000880 Writer.AddDeclRef(E->getConstructor(), Record);
Douglas Gregor85dabae2009-12-16 01:38:02 +0000881 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000882 Record.push_back(E->isElidable());
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000883 Record.push_back(E->requiresZeroInitialization());
Douglas Gregor222cf0e2010-05-15 00:13:29 +0000884 Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000885 Code = pch::EXPR_CXX_CONSTRUCT;
886}
887
Sam Weinigd01101e2010-01-16 21:21:01 +0000888void PCHStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
889 VisitExplicitCastExpr(E);
890 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
891}
892
893void PCHStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
894 VisitCXXNamedCastExpr(E);
895 Code = pch::EXPR_CXX_STATIC_CAST;
896}
897
898void PCHStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
899 VisitCXXNamedCastExpr(E);
900 Code = pch::EXPR_CXX_DYNAMIC_CAST;
901}
902
903void PCHStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
904 VisitCXXNamedCastExpr(E);
905 Code = pch::EXPR_CXX_REINTERPRET_CAST;
906}
907
908void PCHStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
909 VisitCXXNamedCastExpr(E);
910 Code = pch::EXPR_CXX_CONST_CAST;
911}
912
913void PCHStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
914 VisitExplicitCastExpr(E);
915 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
916 Writer.AddSourceLocation(E->getRParenLoc(), Record);
917 Code = pch::EXPR_CXX_FUNCTIONAL_CAST;
918}
919
Sam Weinige83b3ac2010-02-07 06:32:43 +0000920void PCHStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
921 VisitExpr(E);
922 Record.push_back(E->getValue());
923 Writer.AddSourceLocation(E->getLocation(), Record);
924 Code = pch::EXPR_CXX_BOOL_LITERAL;
925}
926
927void PCHStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
928 VisitExpr(E);
929 Writer.AddSourceLocation(E->getLocation(), Record);
930 Code = pch::EXPR_CXX_NULL_PTR_LITERAL;
931}
932
Chris Lattner13a5ecc2010-05-09 06:03:39 +0000933void PCHStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
934 VisitExpr(E);
935 Writer.AddSourceRange(E->getSourceRange(), Record);
936 if (E->isTypeOperand()) {
937 Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
938 Code = pch::EXPR_CXX_TYPEID_TYPE;
939 } else {
940 Writer.WriteSubStmt(E->getExprOperand());
941 Code = pch::EXPR_CXX_TYPEID_EXPR;
942 }
943}
944
Chris Lattner98267332010-05-09 06:15:05 +0000945void PCHStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
946 VisitExpr(E);
947 Writer.AddSourceLocation(E->getLocation(), Record);
948 Record.push_back(E->isImplicit());
949 Code = pch::EXPR_CXX_THIS;
950}
951
952void PCHStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
Chris Lattnere2437f42010-05-09 06:40:08 +0000953 VisitExpr(E);
Chris Lattner98267332010-05-09 06:15:05 +0000954 Writer.AddSourceLocation(E->getThrowLoc(), Record);
955 Writer.WriteSubStmt(E->getSubExpr());
956 Code = pch::EXPR_CXX_THROW;
957}
958
Chris Lattnere2437f42010-05-09 06:40:08 +0000959void PCHStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
960 VisitExpr(E);
961 Writer.AddSourceLocation(E->getUsedLocation(), Record);
962 if (E->isExprStored()) {
963 Record.push_back(1);
964 Writer.WriteSubStmt(E->getExpr());
965 } else {
966 Record.push_back(0);
967 }
968
969 Code = pch::EXPR_CXX_DEFAULT_ARG;
970}
971
Chris Lattnercba86142010-05-10 00:25:06 +0000972void PCHStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
973 VisitExpr(E);
974 Writer.AddCXXTemporary(E->getTemporary(), Record);
975 Writer.WriteSubStmt(E->getSubExpr());
976 Code = pch::EXPR_CXX_BIND_TEMPORARY;
977}
978
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000979void PCHStmtWriter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
980 VisitExpr(E);
981 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
982 Writer.AddSourceLocation(E->getRParenLoc(), Record);
983 Code = pch::EXPR_CXX_ZERO_INIT_VALUE;
984}
985
986void PCHStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
987 VisitExpr(E);
988 Record.push_back(E->isGlobalNew());
989 Record.push_back(E->isParenTypeId());
990 Record.push_back(E->hasInitializer());
991 Record.push_back(E->isArray());
992 Record.push_back(E->getNumPlacementArgs());
993 Record.push_back(E->getNumConstructorArgs());
994 Writer.AddDeclRef(E->getOperatorNew(), Record);
995 Writer.AddDeclRef(E->getOperatorDelete(), Record);
996 Writer.AddDeclRef(E->getConstructor(), Record);
997 Writer.AddSourceLocation(E->getStartLoc(), Record);
998 Writer.AddSourceLocation(E->getEndLoc(), Record);
999 for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
1000 I != e; ++I)
1001 Writer.WriteSubStmt(*I);
1002
1003 Code = pch::EXPR_CXX_NEW;
1004}
1005
Argyrios Kyrtzidis6e57c352010-06-22 17:07:59 +00001006void PCHStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1007 VisitExpr(E);
1008 Record.push_back(E->isGlobalDelete());
1009 Record.push_back(E->isArrayForm());
1010 Writer.AddDeclRef(E->getOperatorDelete(), Record);
1011 Writer.WriteSubStmt(E->getArgument());
1012 Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1013
1014 Code = pch::EXPR_CXX_DELETE;
1015}
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001016
Chris Lattnercba86142010-05-10 00:25:06 +00001017void PCHStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1018 VisitExpr(E);
1019 Record.push_back(E->getNumTemporaries());
1020 for (unsigned i = 0, e = E->getNumTemporaries(); i != e; ++i)
1021 Writer.AddCXXTemporary(E->getTemporary(i), Record);
1022
1023 Writer.WriteSubStmt(E->getSubExpr());
1024 Code = pch::EXPR_CXX_EXPR_WITH_TEMPORARIES;
1025}
1026
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +00001027void
1028PCHStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1029 VisitExpr(E);
1030
1031 if (E->hasExplicitTemplateArgs()) {
1032 assert(E->getNumTemplateArgs() &&
1033 "Num of template args was zero! PCH reading will mess up!");
1034 Record.push_back(E->getNumTemplateArgs());
1035 Writer.AddSourceLocation(E->getLAngleLoc(), Record);
1036 Writer.AddSourceLocation(E->getRAngleLoc(), Record);
1037 for (int i=0, e = E->getNumTemplateArgs(); i != e; ++i)
1038 Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
1039 } else {
1040 Record.push_back(0);
1041 }
1042
1043 if (!E->isImplicitAccess())
1044 Writer.WriteSubStmt(E->getBase());
1045 else
1046 Writer.WriteSubStmt(0);
1047 Writer.AddTypeRef(E->getBaseType(), Record);
1048 Record.push_back(E->isArrow());
1049 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1050 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1051 Writer.AddSourceRange(E->getQualifierRange(), Record);
1052 Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
1053 Writer.AddDeclarationName(E->getMember(), Record);
1054 Writer.AddSourceLocation(E->getMemberLoc(), Record);
1055 Code = pch::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
1056}
1057
1058void
1059PCHStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1060 VisitExpr(E);
1061 Record.push_back(E->arg_size());
1062 for (CXXUnresolvedConstructExpr::arg_iterator
1063 ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
1064 Writer.WriteSubStmt(*ArgI);
1065 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
1066 Writer.AddTypeRef(E->getTypeAsWritten(), Record);
1067 Writer.AddSourceLocation(E->getLParenLoc(), Record);
1068 Writer.AddSourceLocation(E->getRParenLoc(), Record);
1069 Code = pch::EXPR_CXX_UNRESOLVED_CONSTRUCT;
1070}
Chris Lattner98267332010-05-09 06:15:05 +00001071
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +00001072void PCHStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
1073 VisitExpr(E);
1074
1075 if (E->hasExplicitTemplateArgs()) {
1076 const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
1077 assert(Args.NumTemplateArgs &&
1078 "Num of template args was zero! PCH reading will mess up!");
1079 Record.push_back(Args.NumTemplateArgs);
1080 Writer.AddSourceLocation(Args.LAngleLoc, Record);
1081 Writer.AddSourceLocation(Args.RAngleLoc, Record);
1082 for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
1083 Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
1084 } else {
1085 Record.push_back(0);
1086 }
1087
1088 Record.push_back(E->getNumDecls());
1089 for (OverloadExpr::decls_iterator
1090 OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
1091 Writer.AddDeclRef(OvI.getDecl(), Record);
1092 Record.push_back(OvI.getAccess());
1093 }
1094
1095 Writer.AddDeclarationName(E->getName(), Record);
1096 Writer.AddNestedNameSpecifier(E->getQualifier(), Record);
1097 Writer.AddSourceRange(E->getQualifierRange(), Record);
1098 Writer.AddSourceLocation(E->getNameLoc(), Record);
1099}
1100
1101void PCHStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1102 VisitOverloadExpr(E);
1103 Record.push_back(E->isArrow());
1104 Record.push_back(E->hasUnresolvedUsing());
1105 Writer.WriteSubStmt(!E->isImplicitAccess() ? E->getBase() : 0);
1106 Writer.AddTypeRef(E->getBaseType(), Record);
1107 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
1108 Code = pch::EXPR_CXX_UNRESOLVED_MEMBER;
1109}
1110
Argyrios Kyrtzidiseeaaead2009-07-14 03:19:21 +00001111//===----------------------------------------------------------------------===//
Chris Lattner1f551822009-04-27 06:20:01 +00001112// PCHWriter Implementation
1113//===----------------------------------------------------------------------===//
1114
1115unsigned PCHWriter::RecordSwitchCaseID(SwitchCase *S) {
Mike Stump11289f42009-09-09 15:08:12 +00001116 assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001117 "SwitchCase recorded twice");
1118 unsigned NextID = SwitchCaseIDs.size();
1119 SwitchCaseIDs[S] = NextID;
1120 return NextID;
1121}
1122
1123unsigned PCHWriter::getSwitchCaseID(SwitchCase *S) {
Mike Stump11289f42009-09-09 15:08:12 +00001124 assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001125 "SwitchCase hasn't been seen yet");
1126 return SwitchCaseIDs[S];
1127}
1128
1129/// \brief Retrieve the ID for the given label statement, which may
1130/// or may not have been emitted yet.
1131unsigned PCHWriter::GetLabelID(LabelStmt *S) {
1132 std::map<LabelStmt *, unsigned>::iterator Pos = LabelIDs.find(S);
1133 if (Pos != LabelIDs.end())
1134 return Pos->second;
Mike Stump11289f42009-09-09 15:08:12 +00001135
Chris Lattner1f551822009-04-27 06:20:01 +00001136 unsigned NextID = LabelIDs.size();
1137 LabelIDs[S] = NextID;
1138 return NextID;
1139}
1140
1141/// \brief Write the given substatement or subexpression to the
1142/// bitstream.
1143void PCHWriter::WriteSubStmt(Stmt *S) {
1144 RecordData Record;
1145 PCHStmtWriter Writer(*this, Record);
1146 ++NumStatements;
Mike Stump11289f42009-09-09 15:08:12 +00001147
Chris Lattner1f551822009-04-27 06:20:01 +00001148 if (!S) {
1149 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
1150 return;
1151 }
Mike Stump11289f42009-09-09 15:08:12 +00001152
Chris Lattner1f551822009-04-27 06:20:01 +00001153 Writer.Code = pch::STMT_NULL_PTR;
1154 Writer.Visit(S);
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001155
1156#ifndef NDEBUG
1157 if (Writer.Code == pch::STMT_NULL_PTR) {
Argyrios Kyrtzidis6ba1bb52010-06-25 09:03:12 +00001158 SourceManager &SrcMgr
1159 = DeclIDs.begin()->first->getASTContext().getSourceManager();
1160 S->dump(SrcMgr);
Chris Lattnerabfb58d2010-05-10 01:22:27 +00001161 assert(0 && "Unhandled sub statement writing PCH file");
1162 }
1163#endif
Mike Stump11289f42009-09-09 15:08:12 +00001164 Stream.EmitRecord(Writer.Code, Record);
Chris Lattner1f551822009-04-27 06:20:01 +00001165}
1166
1167/// \brief Flush all of the statements that have been added to the
1168/// queue via AddStmt().
1169void PCHWriter::FlushStmts() {
1170 RecordData Record;
1171 PCHStmtWriter Writer(*this, Record);
Mike Stump11289f42009-09-09 15:08:12 +00001172
Chris Lattner1f551822009-04-27 06:20:01 +00001173 for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1174 ++NumStatements;
1175 Stmt *S = StmtsToEmit[I];
Mike Stump11289f42009-09-09 15:08:12 +00001176
Chris Lattner1f551822009-04-27 06:20:01 +00001177 if (!S) {
1178 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
1179 continue;
1180 }
Mike Stump11289f42009-09-09 15:08:12 +00001181
Chris Lattner1f551822009-04-27 06:20:01 +00001182 Writer.Code = pch::STMT_NULL_PTR;
1183 Writer.Visit(S);
Chris Lattnercba86142010-05-10 00:25:06 +00001184#ifndef NDEBUG
1185 if (Writer.Code == pch::STMT_NULL_PTR) {
1186 S->dump();
1187 assert(0 && "Unhandled expression writing PCH file");
1188 }
1189#endif
Mike Stump11289f42009-09-09 15:08:12 +00001190 Stream.EmitRecord(Writer.Code, Record);
1191
1192 assert(N == StmtsToEmit.size() &&
Chris Lattner1f551822009-04-27 06:20:01 +00001193 "Substatement writen via AddStmt rather than WriteSubStmt!");
Mike Stump11289f42009-09-09 15:08:12 +00001194
Chris Lattner1f551822009-04-27 06:20:01 +00001195 // Note that we are at the end of a full expression. Any
1196 // expression records that follow this one are part of a different
1197 // expression.
1198 Record.clear();
1199 Stream.EmitRecord(pch::STMT_STOP, Record);
1200 }
Mike Stump11289f42009-09-09 15:08:12 +00001201
Chris Lattner1f551822009-04-27 06:20:01 +00001202 StmtsToEmit.clear();
Chris Lattner1f551822009-04-27 06:20:01 +00001203}