blob: 80ee6a2ff89cfc5a4c10afa3a0aab28e701a0cb4 [file] [log] [blame]
Chris Lattner63377d52009-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 Gregor39da0b82009-09-09 23:08:42 +000015#include "clang/AST/DeclCXX.h"
Chris Lattner63377d52009-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 Lattner63377d52009-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 Gregor8ecdb652010-04-28 22:16:22 +000065 void VisitOffsetOfExpr(OffsetOfExpr *E);
Chris Lattner63377d52009-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 Stump1eb44332009-09-09 15:08:12 +000091
Chris Lattner63377d52009-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 Jahanian09105f52009-08-20 17:02:02 +000099 void VisitObjCImplicitSetterGetterRefExpr(
100 ObjCImplicitSetterGetterRefExpr *E);
Chris Lattner63377d52009-04-27 06:20:01 +0000101 void VisitObjCMessageExpr(ObjCMessageExpr *E);
102 void VisitObjCSuperExpr(ObjCSuperExpr *E);
Steve Narofff242b1b2009-07-24 17:54:45 +0000103 void VisitObjCIsaExpr(ObjCIsaExpr *E);
Mike Stump1eb44332009-09-09 15:08:12 +0000104
105 // Objective-C Statements
Chris Lattner63377d52009-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 Kyrtzidisba0a9002009-07-14 03:19:21 +0000112
Mike Stump1eb44332009-09-09 15:08:12 +0000113 // C++ Statements
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000114 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Chris Lattner1817bd42010-05-09 05:36:05 +0000115 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
Douglas Gregor39da0b82009-09-09 23:08:42 +0000116 void VisitCXXConstructExpr(CXXConstructExpr *E);
Sam Weinigce757a72010-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 Weinigeb7f9612010-02-07 06:32:43 +0000123 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
124 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Chris Lattner14ab24f2010-05-09 06:03:39 +0000125 void VisitCXXTypeidExpr(CXXTypeidExpr *E);
Chris Lattner2fbdfcd2010-05-09 06:15:05 +0000126 void VisitCXXThisExpr(CXXThisExpr *E);
127 void VisitCXXThrowExpr(CXXThrowExpr *E);
Chris Lattner030854b2010-05-09 06:40:08 +0000128 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
Chris Lattnerd2598362010-05-10 00:25:06 +0000129 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
130
Chris Lattner59218632010-05-10 01:22:27 +0000131 void VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
132 void VisitCXXNewExpr(CXXNewExpr *E);
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +0000133 void VisitCXXDeleteExpr(CXXDeleteExpr *E);
Chris Lattner59218632010-05-10 01:22:27 +0000134
Chris Lattnerd2598362010-05-10 00:25:06 +0000135 void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Chris Lattner63377d52009-04-27 06:20:01 +0000136 };
137}
138
Mike Stump1eb44332009-09-09 15:08:12 +0000139void PCHStmtWriter::VisitStmt(Stmt *S) {
Chris Lattner63377d52009-04-27 06:20:01 +0000140}
141
142void PCHStmtWriter::VisitNullStmt(NullStmt *S) {
143 VisitStmt(S);
144 Writer.AddSourceLocation(S->getSemiLoc(), Record);
145 Code = pch::STMT_NULL;
146}
147
148void PCHStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
149 VisitStmt(S);
150 Record.push_back(S->size());
151 for (CompoundStmt::body_iterator CS = S->body_begin(), CSEnd = S->body_end();
152 CS != CSEnd; ++CS)
153 Writer.WriteSubStmt(*CS);
154 Writer.AddSourceLocation(S->getLBracLoc(), Record);
155 Writer.AddSourceLocation(S->getRBracLoc(), Record);
156 Code = pch::STMT_COMPOUND;
157}
158
159void PCHStmtWriter::VisitSwitchCase(SwitchCase *S) {
160 VisitStmt(S);
161 Record.push_back(Writer.RecordSwitchCaseID(S));
162}
163
164void PCHStmtWriter::VisitCaseStmt(CaseStmt *S) {
165 VisitSwitchCase(S);
166 Writer.WriteSubStmt(S->getLHS());
167 Writer.WriteSubStmt(S->getRHS());
168 Writer.WriteSubStmt(S->getSubStmt());
169 Writer.AddSourceLocation(S->getCaseLoc(), Record);
Douglas Gregordbb26db2009-05-15 23:57:33 +0000170 Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
171 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000172 Code = pch::STMT_CASE;
173}
174
175void PCHStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
176 VisitSwitchCase(S);
177 Writer.WriteSubStmt(S->getSubStmt());
178 Writer.AddSourceLocation(S->getDefaultLoc(), Record);
Douglas Gregordbb26db2009-05-15 23:57:33 +0000179 Writer.AddSourceLocation(S->getColonLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000180 Code = pch::STMT_DEFAULT;
181}
182
183void PCHStmtWriter::VisitLabelStmt(LabelStmt *S) {
184 VisitStmt(S);
185 Writer.AddIdentifierRef(S->getID(), Record);
186 Writer.WriteSubStmt(S->getSubStmt());
187 Writer.AddSourceLocation(S->getIdentLoc(), Record);
188 Record.push_back(Writer.GetLabelID(S));
189 Code = pch::STMT_LABEL;
190}
191
192void PCHStmtWriter::VisitIfStmt(IfStmt *S) {
193 VisitStmt(S);
Douglas Gregor8cfe5a72009-11-23 23:44:04 +0000194 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000195 Writer.WriteSubStmt(S->getCond());
196 Writer.WriteSubStmt(S->getThen());
197 Writer.WriteSubStmt(S->getElse());
198 Writer.AddSourceLocation(S->getIfLoc(), Record);
Douglas Gregord06f6ca2009-05-15 18:53:42 +0000199 Writer.AddSourceLocation(S->getElseLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000200 Code = pch::STMT_IF;
201}
202
203void PCHStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
204 VisitStmt(S);
Douglas Gregord3d53012009-11-24 17:07:59 +0000205 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000206 Writer.WriteSubStmt(S->getCond());
207 Writer.WriteSubStmt(S->getBody());
208 Writer.AddSourceLocation(S->getSwitchLoc(), Record);
Mike Stump1eb44332009-09-09 15:08:12 +0000209 for (SwitchCase *SC = S->getSwitchCaseList(); SC;
Chris Lattner63377d52009-04-27 06:20:01 +0000210 SC = SC->getNextSwitchCase())
211 Record.push_back(Writer.getSwitchCaseID(SC));
212 Code = pch::STMT_SWITCH;
213}
214
215void PCHStmtWriter::VisitWhileStmt(WhileStmt *S) {
216 VisitStmt(S);
Douglas Gregor5656e142009-11-24 21:15:44 +0000217 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000218 Writer.WriteSubStmt(S->getCond());
219 Writer.WriteSubStmt(S->getBody());
220 Writer.AddSourceLocation(S->getWhileLoc(), Record);
221 Code = pch::STMT_WHILE;
222}
223
224void PCHStmtWriter::VisitDoStmt(DoStmt *S) {
225 VisitStmt(S);
226 Writer.WriteSubStmt(S->getCond());
227 Writer.WriteSubStmt(S->getBody());
228 Writer.AddSourceLocation(S->getDoLoc(), Record);
Douglas Gregor9f3ca2a2009-05-15 21:56:04 +0000229 Writer.AddSourceLocation(S->getWhileLoc(), Record);
Chris Lattner98913592009-06-12 23:04:47 +0000230 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000231 Code = pch::STMT_DO;
232}
233
234void PCHStmtWriter::VisitForStmt(ForStmt *S) {
235 VisitStmt(S);
236 Writer.WriteSubStmt(S->getInit());
237 Writer.WriteSubStmt(S->getCond());
Douglas Gregor99e9b4d2009-11-25 00:27:52 +0000238 Writer.AddDeclRef(S->getConditionVariable(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000239 Writer.WriteSubStmt(S->getInc());
240 Writer.WriteSubStmt(S->getBody());
241 Writer.AddSourceLocation(S->getForLoc(), Record);
Douglas Gregor5831c6a2009-05-15 22:12:32 +0000242 Writer.AddSourceLocation(S->getLParenLoc(), Record);
243 Writer.AddSourceLocation(S->getRParenLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000244 Code = pch::STMT_FOR;
245}
246
247void PCHStmtWriter::VisitGotoStmt(GotoStmt *S) {
248 VisitStmt(S);
249 Record.push_back(Writer.GetLabelID(S->getLabel()));
250 Writer.AddSourceLocation(S->getGotoLoc(), Record);
251 Writer.AddSourceLocation(S->getLabelLoc(), Record);
252 Code = pch::STMT_GOTO;
253}
254
255void PCHStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
256 VisitStmt(S);
257 Writer.AddSourceLocation(S->getGotoLoc(), Record);
Douglas Gregor5f1b9e62009-05-16 00:20:29 +0000258 Writer.AddSourceLocation(S->getStarLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000259 Writer.WriteSubStmt(S->getTarget());
260 Code = pch::STMT_INDIRECT_GOTO;
261}
262
263void PCHStmtWriter::VisitContinueStmt(ContinueStmt *S) {
264 VisitStmt(S);
265 Writer.AddSourceLocation(S->getContinueLoc(), Record);
266 Code = pch::STMT_CONTINUE;
267}
268
269void PCHStmtWriter::VisitBreakStmt(BreakStmt *S) {
270 VisitStmt(S);
271 Writer.AddSourceLocation(S->getBreakLoc(), Record);
272 Code = pch::STMT_BREAK;
273}
274
275void PCHStmtWriter::VisitReturnStmt(ReturnStmt *S) {
276 VisitStmt(S);
277 Writer.WriteSubStmt(S->getRetValue());
278 Writer.AddSourceLocation(S->getReturnLoc(), Record);
Douglas Gregor5077c382010-05-15 06:01:05 +0000279 Writer.AddDeclRef(S->getNRVOCandidate(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000280 Code = pch::STMT_RETURN;
281}
282
283void PCHStmtWriter::VisitDeclStmt(DeclStmt *S) {
284 VisitStmt(S);
285 Writer.AddSourceLocation(S->getStartLoc(), Record);
286 Writer.AddSourceLocation(S->getEndLoc(), Record);
287 DeclGroupRef DG = S->getDeclGroup();
288 for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
289 Writer.AddDeclRef(*D, Record);
290 Code = pch::STMT_DECL;
291}
292
293void PCHStmtWriter::VisitAsmStmt(AsmStmt *S) {
294 VisitStmt(S);
295 Record.push_back(S->getNumOutputs());
296 Record.push_back(S->getNumInputs());
297 Record.push_back(S->getNumClobbers());
298 Writer.AddSourceLocation(S->getAsmLoc(), Record);
299 Writer.AddSourceLocation(S->getRParenLoc(), Record);
300 Record.push_back(S->isVolatile());
301 Record.push_back(S->isSimple());
Mike Stump3b11fd32010-01-04 22:37:17 +0000302 Record.push_back(S->isMSAsm());
Chris Lattner63377d52009-04-27 06:20:01 +0000303 Writer.WriteSubStmt(S->getAsmString());
304
305 // Outputs
Anders Carlssonff93dbd2010-01-30 22:25:16 +0000306 for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
307 Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000308 Writer.WriteSubStmt(S->getOutputConstraintLiteral(I));
309 Writer.WriteSubStmt(S->getOutputExpr(I));
310 }
311
312 // Inputs
313 for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
Anders Carlssonff93dbd2010-01-30 22:25:16 +0000314 Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000315 Writer.WriteSubStmt(S->getInputConstraintLiteral(I));
316 Writer.WriteSubStmt(S->getInputExpr(I));
317 }
318
319 // Clobbers
320 for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
321 Writer.WriteSubStmt(S->getClobber(I));
322
323 Code = pch::STMT_ASM;
324}
325
326void PCHStmtWriter::VisitExpr(Expr *E) {
327 VisitStmt(E);
328 Writer.AddTypeRef(E->getType(), Record);
329 Record.push_back(E->isTypeDependent());
330 Record.push_back(E->isValueDependent());
331}
332
333void PCHStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
334 VisitExpr(E);
335 Writer.AddSourceLocation(E->getLocation(), Record);
336 Record.push_back(E->getIdentType()); // FIXME: stable encoding
337 Code = pch::EXPR_PREDEFINED;
338}
339
340void PCHStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
341 VisitExpr(E);
342 Writer.AddDeclRef(E->getDecl(), Record);
343 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregora2813ce2009-10-23 18:54:35 +0000344 // FIXME: write qualifier
345 // FIXME: write explicit template arguments
Chris Lattner63377d52009-04-27 06:20:01 +0000346 Code = pch::EXPR_DECL_REF;
347}
348
349void PCHStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
350 VisitExpr(E);
351 Writer.AddSourceLocation(E->getLocation(), Record);
352 Writer.AddAPInt(E->getValue(), Record);
353 Code = pch::EXPR_INTEGER_LITERAL;
354}
355
356void PCHStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
357 VisitExpr(E);
358 Writer.AddAPFloat(E->getValue(), Record);
359 Record.push_back(E->isExact());
360 Writer.AddSourceLocation(E->getLocation(), Record);
361 Code = pch::EXPR_FLOATING_LITERAL;
362}
363
364void PCHStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
365 VisitExpr(E);
366 Writer.WriteSubStmt(E->getSubExpr());
367 Code = pch::EXPR_IMAGINARY_LITERAL;
368}
369
370void PCHStmtWriter::VisitStringLiteral(StringLiteral *E) {
371 VisitExpr(E);
372 Record.push_back(E->getByteLength());
373 Record.push_back(E->getNumConcatenated());
374 Record.push_back(E->isWide());
375 // FIXME: String data should be stored as a blob at the end of the
376 // StringLiteral. However, we can't do so now because we have no
377 // provision for coping with abbreviations when we're jumping around
378 // the PCH file during deserialization.
Mike Stump1eb44332009-09-09 15:08:12 +0000379 Record.insert(Record.end(),
Chris Lattner63377d52009-04-27 06:20:01 +0000380 E->getStrData(), E->getStrData() + E->getByteLength());
381 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
382 Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
383 Code = pch::EXPR_STRING_LITERAL;
384}
385
386void PCHStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
387 VisitExpr(E);
388 Record.push_back(E->getValue());
Chris Lattner018d8e02009-08-24 17:39:36 +0000389 Writer.AddSourceLocation(E->getLocation(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000390 Record.push_back(E->isWide());
391 Code = pch::EXPR_CHARACTER_LITERAL;
392}
393
394void PCHStmtWriter::VisitParenExpr(ParenExpr *E) {
395 VisitExpr(E);
396 Writer.AddSourceLocation(E->getLParen(), Record);
397 Writer.AddSourceLocation(E->getRParen(), Record);
398 Writer.WriteSubStmt(E->getSubExpr());
399 Code = pch::EXPR_PAREN;
400}
401
402void PCHStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
403 VisitExpr(E);
404 Writer.WriteSubStmt(E->getSubExpr());
405 Record.push_back(E->getOpcode()); // FIXME: stable encoding
406 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
407 Code = pch::EXPR_UNARY_OPERATOR;
408}
409
Douglas Gregor8ecdb652010-04-28 22:16:22 +0000410void PCHStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
411 VisitExpr(E);
412 Record.push_back(E->getNumComponents());
413 Record.push_back(E->getNumExpressions());
414 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
415 Writer.AddSourceLocation(E->getRParenLoc(), Record);
416 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
417 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
418 const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
419 Record.push_back(ON.getKind()); // FIXME: Stable encoding
420 Writer.AddSourceLocation(ON.getRange().getBegin(), Record);
421 Writer.AddSourceLocation(ON.getRange().getEnd(), Record);
422 switch (ON.getKind()) {
423 case OffsetOfExpr::OffsetOfNode::Array:
424 Record.push_back(ON.getArrayExprIndex());
425 break;
426
427 case OffsetOfExpr::OffsetOfNode::Field:
428 Writer.AddDeclRef(ON.getField(), Record);
429 break;
430
431 case OffsetOfExpr::OffsetOfNode::Identifier:
432 Writer.AddIdentifierRef(ON.getFieldName(), Record);
433 break;
Douglas Gregorcc8a5d52010-04-29 00:18:15 +0000434
435 case OffsetOfExpr::OffsetOfNode::Base:
436 // FIXME: Implement this!
437 llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
438 break;
Douglas Gregor8ecdb652010-04-28 22:16:22 +0000439 }
440 }
441 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
442 Writer.WriteSubStmt(E->getIndexExpr(I));
443 Code = pch::EXPR_OFFSETOF;
444}
445
Mike Stump1eb44332009-09-09 15:08:12 +0000446void PCHStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Chris Lattner63377d52009-04-27 06:20:01 +0000447 VisitExpr(E);
448 Record.push_back(E->isSizeOf());
449 if (E->isArgumentType())
John McCalla93c9342009-12-07 02:54:59 +0000450 Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000451 else {
452 Record.push_back(0);
453 Writer.WriteSubStmt(E->getArgumentExpr());
454 }
455 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
456 Writer.AddSourceLocation(E->getRParenLoc(), Record);
457 Code = pch::EXPR_SIZEOF_ALIGN_OF;
458}
459
460void PCHStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
461 VisitExpr(E);
462 Writer.WriteSubStmt(E->getLHS());
463 Writer.WriteSubStmt(E->getRHS());
464 Writer.AddSourceLocation(E->getRBracketLoc(), Record);
465 Code = pch::EXPR_ARRAY_SUBSCRIPT;
466}
467
468void PCHStmtWriter::VisitCallExpr(CallExpr *E) {
469 VisitExpr(E);
470 Record.push_back(E->getNumArgs());
471 Writer.AddSourceLocation(E->getRParenLoc(), Record);
472 Writer.WriteSubStmt(E->getCallee());
473 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
474 Arg != ArgEnd; ++Arg)
475 Writer.WriteSubStmt(*Arg);
476 Code = pch::EXPR_CALL;
477}
478
479void PCHStmtWriter::VisitMemberExpr(MemberExpr *E) {
480 VisitExpr(E);
481 Writer.WriteSubStmt(E->getBase());
482 Writer.AddDeclRef(E->getMemberDecl(), Record);
483 Writer.AddSourceLocation(E->getMemberLoc(), Record);
484 Record.push_back(E->isArrow());
Douglas Gregor303e6d72009-08-31 23:44:04 +0000485 // FIXME: C++ nested-name-specifier
Douglas Gregorc4bf26f2009-09-01 00:37:14 +0000486 // FIXME: C++ template argument list
Chris Lattner63377d52009-04-27 06:20:01 +0000487 Code = pch::EXPR_MEMBER;
488}
489
Steve Narofff242b1b2009-07-24 17:54:45 +0000490void PCHStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
491 VisitExpr(E);
492 Writer.WriteSubStmt(E->getBase());
493 Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
494 Record.push_back(E->isArrow());
495 Code = pch::EXPR_OBJC_ISA;
496}
497
Chris Lattner63377d52009-04-27 06:20:01 +0000498void PCHStmtWriter::VisitCastExpr(CastExpr *E) {
499 VisitExpr(E);
500 Writer.WriteSubStmt(E->getSubExpr());
Anders Carlssoncdef2b72009-07-31 00:48:10 +0000501 Record.push_back(E->getCastKind()); // FIXME: stable encoding
Chris Lattner63377d52009-04-27 06:20:01 +0000502}
503
504void PCHStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
505 VisitExpr(E);
506 Writer.WriteSubStmt(E->getLHS());
507 Writer.WriteSubStmt(E->getRHS());
508 Record.push_back(E->getOpcode()); // FIXME: stable encoding
509 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
510 Code = pch::EXPR_BINARY_OPERATOR;
511}
512
513void PCHStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
514 VisitBinaryOperator(E);
515 Writer.AddTypeRef(E->getComputationLHSType(), Record);
516 Writer.AddTypeRef(E->getComputationResultType(), Record);
517 Code = pch::EXPR_COMPOUND_ASSIGN_OPERATOR;
518}
519
520void PCHStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
521 VisitExpr(E);
522 Writer.WriteSubStmt(E->getCond());
523 Writer.WriteSubStmt(E->getLHS());
524 Writer.WriteSubStmt(E->getRHS());
Douglas Gregor47e1f7c2009-08-26 14:37:04 +0000525 Writer.AddSourceLocation(E->getQuestionLoc(), Record);
526 Writer.AddSourceLocation(E->getColonLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000527 Code = pch::EXPR_CONDITIONAL_OPERATOR;
528}
529
530void PCHStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
531 VisitCastExpr(E);
532 Record.push_back(E->isLvalueCast());
533 Code = pch::EXPR_IMPLICIT_CAST;
534}
535
536void PCHStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
537 VisitCastExpr(E);
John McCall9d125032010-01-15 18:39:57 +0000538 Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000539}
540
541void PCHStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
542 VisitExplicitCastExpr(E);
543 Writer.AddSourceLocation(E->getLParenLoc(), Record);
544 Writer.AddSourceLocation(E->getRParenLoc(), Record);
545 Code = pch::EXPR_CSTYLE_CAST;
546}
547
548void PCHStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
549 VisitExpr(E);
550 Writer.AddSourceLocation(E->getLParenLoc(), Record);
John McCall42f56b52010-01-18 19:35:47 +0000551 Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000552 Writer.WriteSubStmt(E->getInitializer());
553 Record.push_back(E->isFileScope());
554 Code = pch::EXPR_COMPOUND_LITERAL;
555}
556
557void PCHStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
558 VisitExpr(E);
559 Writer.WriteSubStmt(E->getBase());
560 Writer.AddIdentifierRef(&E->getAccessor(), Record);
561 Writer.AddSourceLocation(E->getAccessorLoc(), Record);
562 Code = pch::EXPR_EXT_VECTOR_ELEMENT;
563}
564
565void PCHStmtWriter::VisitInitListExpr(InitListExpr *E) {
566 VisitExpr(E);
567 Record.push_back(E->getNumInits());
568 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
569 Writer.WriteSubStmt(E->getInit(I));
570 Writer.WriteSubStmt(E->getSyntacticForm());
571 Writer.AddSourceLocation(E->getLBraceLoc(), Record);
572 Writer.AddSourceLocation(E->getRBraceLoc(), Record);
573 Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
574 Record.push_back(E->hadArrayRangeDesignator());
575 Code = pch::EXPR_INIT_LIST;
576}
577
578void PCHStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
579 VisitExpr(E);
580 Record.push_back(E->getNumSubExprs());
581 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
582 Writer.WriteSubStmt(E->getSubExpr(I));
583 Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
584 Record.push_back(E->usesGNUSyntax());
585 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
586 DEnd = E->designators_end();
587 D != DEnd; ++D) {
588 if (D->isFieldDesignator()) {
589 if (FieldDecl *Field = D->getField()) {
590 Record.push_back(pch::DESIG_FIELD_DECL);
591 Writer.AddDeclRef(Field, Record);
592 } else {
593 Record.push_back(pch::DESIG_FIELD_NAME);
594 Writer.AddIdentifierRef(D->getFieldName(), Record);
595 }
596 Writer.AddSourceLocation(D->getDotLoc(), Record);
597 Writer.AddSourceLocation(D->getFieldLoc(), Record);
598 } else if (D->isArrayDesignator()) {
599 Record.push_back(pch::DESIG_ARRAY);
600 Record.push_back(D->getFirstExprIndex());
601 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
602 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
603 } else {
604 assert(D->isArrayRangeDesignator() && "Unknown designator");
605 Record.push_back(pch::DESIG_ARRAY_RANGE);
606 Record.push_back(D->getFirstExprIndex());
607 Writer.AddSourceLocation(D->getLBracketLoc(), Record);
608 Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
609 Writer.AddSourceLocation(D->getRBracketLoc(), Record);
610 }
611 }
612 Code = pch::EXPR_DESIGNATED_INIT;
613}
614
615void PCHStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
616 VisitExpr(E);
617 Code = pch::EXPR_IMPLICIT_VALUE_INIT;
618}
619
620void PCHStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
621 VisitExpr(E);
622 Writer.WriteSubStmt(E->getSubExpr());
623 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
624 Writer.AddSourceLocation(E->getRParenLoc(), Record);
625 Code = pch::EXPR_VA_ARG;
626}
627
628void PCHStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
629 VisitExpr(E);
630 Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
631 Writer.AddSourceLocation(E->getLabelLoc(), Record);
632 Record.push_back(Writer.GetLabelID(E->getLabel()));
633 Code = pch::EXPR_ADDR_LABEL;
634}
635
636void PCHStmtWriter::VisitStmtExpr(StmtExpr *E) {
637 VisitExpr(E);
638 Writer.WriteSubStmt(E->getSubStmt());
639 Writer.AddSourceLocation(E->getLParenLoc(), Record);
640 Writer.AddSourceLocation(E->getRParenLoc(), Record);
641 Code = pch::EXPR_STMT;
642}
643
644void PCHStmtWriter::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
645 VisitExpr(E);
646 Writer.AddTypeRef(E->getArgType1(), Record);
647 Writer.AddTypeRef(E->getArgType2(), Record);
648 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
649 Writer.AddSourceLocation(E->getRParenLoc(), Record);
650 Code = pch::EXPR_TYPES_COMPATIBLE;
651}
652
653void PCHStmtWriter::VisitChooseExpr(ChooseExpr *E) {
654 VisitExpr(E);
655 Writer.WriteSubStmt(E->getCond());
656 Writer.WriteSubStmt(E->getLHS());
657 Writer.WriteSubStmt(E->getRHS());
658 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
659 Writer.AddSourceLocation(E->getRParenLoc(), Record);
660 Code = pch::EXPR_CHOOSE;
661}
662
663void PCHStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
664 VisitExpr(E);
665 Writer.AddSourceLocation(E->getTokenLocation(), Record);
666 Code = pch::EXPR_GNU_NULL;
667}
668
669void PCHStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
670 VisitExpr(E);
671 Record.push_back(E->getNumSubExprs());
672 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
673 Writer.WriteSubStmt(E->getExpr(I));
674 Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
675 Writer.AddSourceLocation(E->getRParenLoc(), Record);
676 Code = pch::EXPR_SHUFFLE_VECTOR;
677}
678
679void PCHStmtWriter::VisitBlockExpr(BlockExpr *E) {
680 VisitExpr(E);
681 Writer.AddDeclRef(E->getBlockDecl(), Record);
682 Record.push_back(E->hasBlockDeclRefExprs());
683 Code = pch::EXPR_BLOCK;
684}
685
686void PCHStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
687 VisitExpr(E);
688 Writer.AddDeclRef(E->getDecl(), Record);
689 Writer.AddSourceLocation(E->getLocation(), Record);
690 Record.push_back(E->isByRef());
Fariborz Jahanian9b0b57c2009-06-20 00:02:26 +0000691 Record.push_back(E->isConstQualAdded());
Fariborz Jahanian89f9d3a2010-06-04 19:06:53 +0000692 Writer.WriteSubStmt(E->getCopyConstructorExpr());
Chris Lattner63377d52009-04-27 06:20:01 +0000693 Code = pch::EXPR_BLOCK_DECL_REF;
694}
695
696//===----------------------------------------------------------------------===//
697// Objective-C Expressions and Statements.
698//===----------------------------------------------------------------------===//
699
700void PCHStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
701 VisitExpr(E);
702 Writer.WriteSubStmt(E->getString());
703 Writer.AddSourceLocation(E->getAtLoc(), Record);
704 Code = pch::EXPR_OBJC_STRING_LITERAL;
705}
706
Mike Stump1eb44332009-09-09 15:08:12 +0000707void PCHStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
Chris Lattner63377d52009-04-27 06:20:01 +0000708 VisitExpr(E);
Douglas Gregor81d34662010-04-20 15:39:42 +0000709 Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000710 Writer.AddSourceLocation(E->getAtLoc(), Record);
711 Writer.AddSourceLocation(E->getRParenLoc(), Record);
712 Code = pch::EXPR_OBJC_ENCODE;
713}
714
715void PCHStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
716 VisitExpr(E);
717 Writer.AddSelectorRef(E->getSelector(), Record);
718 Writer.AddSourceLocation(E->getAtLoc(), Record);
719 Writer.AddSourceLocation(E->getRParenLoc(), Record);
720 Code = pch::EXPR_OBJC_SELECTOR_EXPR;
721}
722
723void PCHStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
724 VisitExpr(E);
725 Writer.AddDeclRef(E->getProtocol(), Record);
726 Writer.AddSourceLocation(E->getAtLoc(), Record);
727 Writer.AddSourceLocation(E->getRParenLoc(), Record);
728 Code = pch::EXPR_OBJC_PROTOCOL_EXPR;
729}
730
731void PCHStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
732 VisitExpr(E);
733 Writer.AddDeclRef(E->getDecl(), Record);
734 Writer.AddSourceLocation(E->getLocation(), Record);
735 Writer.WriteSubStmt(E->getBase());
736 Record.push_back(E->isArrow());
737 Record.push_back(E->isFreeIvar());
738 Code = pch::EXPR_OBJC_IVAR_REF_EXPR;
739}
740
741void PCHStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
742 VisitExpr(E);
743 Writer.AddDeclRef(E->getProperty(), Record);
744 Writer.AddSourceLocation(E->getLocation(), Record);
745 Writer.WriteSubStmt(E->getBase());
746 Code = pch::EXPR_OBJC_PROPERTY_REF_EXPR;
747}
748
Fariborz Jahanian09105f52009-08-20 17:02:02 +0000749void PCHStmtWriter::VisitObjCImplicitSetterGetterRefExpr(
750 ObjCImplicitSetterGetterRefExpr *E) {
Chris Lattner63377d52009-04-27 06:20:01 +0000751 VisitExpr(E);
752 Writer.AddDeclRef(E->getGetterMethod(), Record);
753 Writer.AddDeclRef(E->getSetterMethod(), Record);
Mike Stump1eb44332009-09-09 15:08:12 +0000754
Fariborz Jahaniand2ae5aa2009-08-18 21:37:33 +0000755 // NOTE: InterfaceDecl and Base are mutually exclusive.
756 Writer.AddDeclRef(E->getInterfaceDecl(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000757 Writer.WriteSubStmt(E->getBase());
758 Writer.AddSourceLocation(E->getLocation(), Record);
759 Writer.AddSourceLocation(E->getClassLoc(), Record);
760 Code = pch::EXPR_OBJC_KVC_REF_EXPR;
761}
762
763void PCHStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
764 VisitExpr(E);
765 Record.push_back(E->getNumArgs());
Douglas Gregor04badcf2010-04-21 00:45:42 +0000766 Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
767 switch (E->getReceiverKind()) {
768 case ObjCMessageExpr::Instance:
769 Writer.WriteSubStmt(E->getInstanceReceiver());
770 break;
771
772 case ObjCMessageExpr::Class:
773 Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
774 break;
775
776 case ObjCMessageExpr::SuperClass:
777 case ObjCMessageExpr::SuperInstance:
778 Writer.AddTypeRef(E->getSuperType(), Record);
779 Writer.AddSourceLocation(E->getSuperLoc(), Record);
780 break;
781 }
782
783 if (E->getMethodDecl()) {
784 Record.push_back(1);
785 Writer.AddDeclRef(E->getMethodDecl(), Record);
786 } else {
787 Record.push_back(0);
788 Writer.AddSelectorRef(E->getSelector(), Record);
789 }
790
Chris Lattner63377d52009-04-27 06:20:01 +0000791 Writer.AddSourceLocation(E->getLeftLoc(), Record);
792 Writer.AddSourceLocation(E->getRightLoc(), Record);
Chris Lattner63377d52009-04-27 06:20:01 +0000793
794 for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
795 Arg != ArgEnd; ++Arg)
796 Writer.WriteSubStmt(*Arg);
797 Code = pch::EXPR_OBJC_MESSAGE_EXPR;
798}
799
800void PCHStmtWriter::VisitObjCSuperExpr(ObjCSuperExpr *E) {
801 VisitExpr(E);
802 Writer.AddSourceLocation(E->getLoc(), Record);
803 Code = pch::EXPR_OBJC_SUPER_EXPR;
804}
805
806void PCHStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
807 VisitStmt(S);
808 Writer.WriteSubStmt(S->getElement());
809 Writer.WriteSubStmt(S->getCollection());
810 Writer.WriteSubStmt(S->getBody());
811 Writer.AddSourceLocation(S->getForLoc(), Record);
812 Writer.AddSourceLocation(S->getRParenLoc(), Record);
813 Code = pch::STMT_OBJC_FOR_COLLECTION;
814}
815
816void PCHStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
817 Writer.WriteSubStmt(S->getCatchBody());
Chris Lattner63377d52009-04-27 06:20:01 +0000818 Writer.AddDeclRef(S->getCatchParamDecl(), Record);
819 Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
820 Writer.AddSourceLocation(S->getRParenLoc(), Record);
821 Code = pch::STMT_OBJC_CATCH;
822}
823
824void PCHStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
825 Writer.WriteSubStmt(S->getFinallyBody());
826 Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
827 Code = pch::STMT_OBJC_FINALLY;
828}
829
830void PCHStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000831 Record.push_back(S->getNumCatchStmts());
832 Record.push_back(S->getFinallyStmt() != 0);
Chris Lattner63377d52009-04-27 06:20:01 +0000833 Writer.WriteSubStmt(S->getTryBody());
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000834 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
835 Writer.WriteSubStmt(S->getCatchStmt(I));
836 if (S->getFinallyStmt())
837 Writer.WriteSubStmt(S->getFinallyStmt());
Chris Lattner63377d52009-04-27 06:20:01 +0000838 Writer.AddSourceLocation(S->getAtTryLoc(), Record);
839 Code = pch::STMT_OBJC_AT_TRY;
840}
841
842void PCHStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
843 Writer.WriteSubStmt(S->getSynchExpr());
844 Writer.WriteSubStmt(S->getSynchBody());
845 Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
846 Code = pch::STMT_OBJC_AT_SYNCHRONIZED;
847}
848
849void PCHStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
850 Writer.WriteSubStmt(S->getThrowExpr());
851 Writer.AddSourceLocation(S->getThrowLoc(), Record);
852 Code = pch::STMT_OBJC_AT_THROW;
853}
854
855//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000856// C++ Expressions and Statements.
857//===----------------------------------------------------------------------===//
858
859void PCHStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
860 VisitCallExpr(E);
861 Record.push_back(E->getOperator());
862 Code = pch::EXPR_CXX_OPERATOR_CALL;
863}
864
Chris Lattner1817bd42010-05-09 05:36:05 +0000865void PCHStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
866 VisitCallExpr(E);
867 Code = pch::EXPR_CXX_MEMBER_CALL;
868}
869
Douglas Gregor39da0b82009-09-09 23:08:42 +0000870void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
871 VisitExpr(E);
Argyrios Kyrtzidis5e1b7c22010-06-24 08:57:09 +0000872 Record.push_back(E->getNumArgs());
873 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
874 Writer.WriteSubStmt(E->getArg(I));
Douglas Gregor39da0b82009-09-09 23:08:42 +0000875 Writer.AddDeclRef(E->getConstructor(), Record);
Douglas Gregor99a2e602009-12-16 01:38:02 +0000876 Writer.AddSourceLocation(E->getLocation(), Record);
Douglas Gregor39da0b82009-09-09 23:08:42 +0000877 Record.push_back(E->isElidable());
Douglas Gregor16006c92009-12-16 18:50:27 +0000878 Record.push_back(E->requiresZeroInitialization());
Douglas Gregor3c9034c2010-05-15 00:13:29 +0000879 Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
Douglas Gregor39da0b82009-09-09 23:08:42 +0000880 Code = pch::EXPR_CXX_CONSTRUCT;
881}
882
Sam Weinigce757a72010-01-16 21:21:01 +0000883void PCHStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
884 VisitExplicitCastExpr(E);
885 Writer.AddSourceLocation(E->getOperatorLoc(), Record);
886}
887
888void PCHStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
889 VisitCXXNamedCastExpr(E);
890 Code = pch::EXPR_CXX_STATIC_CAST;
891}
892
893void PCHStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
894 VisitCXXNamedCastExpr(E);
895 Code = pch::EXPR_CXX_DYNAMIC_CAST;
896}
897
898void PCHStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
899 VisitCXXNamedCastExpr(E);
900 Code = pch::EXPR_CXX_REINTERPRET_CAST;
901}
902
903void PCHStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
904 VisitCXXNamedCastExpr(E);
905 Code = pch::EXPR_CXX_CONST_CAST;
906}
907
908void PCHStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
909 VisitExplicitCastExpr(E);
910 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
911 Writer.AddSourceLocation(E->getRParenLoc(), Record);
912 Code = pch::EXPR_CXX_FUNCTIONAL_CAST;
913}
914
Sam Weinigeb7f9612010-02-07 06:32:43 +0000915void PCHStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
916 VisitExpr(E);
917 Record.push_back(E->getValue());
918 Writer.AddSourceLocation(E->getLocation(), Record);
919 Code = pch::EXPR_CXX_BOOL_LITERAL;
920}
921
922void PCHStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
923 VisitExpr(E);
924 Writer.AddSourceLocation(E->getLocation(), Record);
925 Code = pch::EXPR_CXX_NULL_PTR_LITERAL;
926}
927
Chris Lattner14ab24f2010-05-09 06:03:39 +0000928void PCHStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
929 VisitExpr(E);
930 Writer.AddSourceRange(E->getSourceRange(), Record);
931 if (E->isTypeOperand()) {
932 Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
933 Code = pch::EXPR_CXX_TYPEID_TYPE;
934 } else {
935 Writer.WriteSubStmt(E->getExprOperand());
936 Code = pch::EXPR_CXX_TYPEID_EXPR;
937 }
938}
939
Chris Lattner2fbdfcd2010-05-09 06:15:05 +0000940void PCHStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
941 VisitExpr(E);
942 Writer.AddSourceLocation(E->getLocation(), Record);
943 Record.push_back(E->isImplicit());
944 Code = pch::EXPR_CXX_THIS;
945}
946
947void PCHStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
Chris Lattner030854b2010-05-09 06:40:08 +0000948 VisitExpr(E);
Chris Lattner2fbdfcd2010-05-09 06:15:05 +0000949 Writer.AddSourceLocation(E->getThrowLoc(), Record);
950 Writer.WriteSubStmt(E->getSubExpr());
951 Code = pch::EXPR_CXX_THROW;
952}
953
Chris Lattner030854b2010-05-09 06:40:08 +0000954void PCHStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
955 VisitExpr(E);
956 Writer.AddSourceLocation(E->getUsedLocation(), Record);
957 if (E->isExprStored()) {
958 Record.push_back(1);
959 Writer.WriteSubStmt(E->getExpr());
960 } else {
961 Record.push_back(0);
962 }
963
964 Code = pch::EXPR_CXX_DEFAULT_ARG;
965}
966
Chris Lattnerd2598362010-05-10 00:25:06 +0000967void PCHStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
968 VisitExpr(E);
969 Writer.AddCXXTemporary(E->getTemporary(), Record);
970 Writer.WriteSubStmt(E->getSubExpr());
971 Code = pch::EXPR_CXX_BIND_TEMPORARY;
972}
973
Chris Lattner59218632010-05-10 01:22:27 +0000974void PCHStmtWriter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
975 VisitExpr(E);
976 Writer.AddSourceLocation(E->getTypeBeginLoc(), Record);
977 Writer.AddSourceLocation(E->getRParenLoc(), Record);
978 Code = pch::EXPR_CXX_ZERO_INIT_VALUE;
979}
980
981void PCHStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
982 VisitExpr(E);
983 Record.push_back(E->isGlobalNew());
984 Record.push_back(E->isParenTypeId());
985 Record.push_back(E->hasInitializer());
986 Record.push_back(E->isArray());
987 Record.push_back(E->getNumPlacementArgs());
988 Record.push_back(E->getNumConstructorArgs());
989 Writer.AddDeclRef(E->getOperatorNew(), Record);
990 Writer.AddDeclRef(E->getOperatorDelete(), Record);
991 Writer.AddDeclRef(E->getConstructor(), Record);
992 Writer.AddSourceLocation(E->getStartLoc(), Record);
993 Writer.AddSourceLocation(E->getEndLoc(), Record);
994 for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
995 I != e; ++I)
996 Writer.WriteSubStmt(*I);
997
998 Code = pch::EXPR_CXX_NEW;
999}
1000
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001001void PCHStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1002 VisitExpr(E);
1003 Record.push_back(E->isGlobalDelete());
1004 Record.push_back(E->isArrayForm());
1005 Writer.AddDeclRef(E->getOperatorDelete(), Record);
1006 Writer.WriteSubStmt(E->getArgument());
1007 Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
1008
1009 Code = pch::EXPR_CXX_DELETE;
1010}
Chris Lattner59218632010-05-10 01:22:27 +00001011
Chris Lattnerd2598362010-05-10 00:25:06 +00001012void PCHStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1013 VisitExpr(E);
1014 Record.push_back(E->getNumTemporaries());
1015 for (unsigned i = 0, e = E->getNumTemporaries(); i != e; ++i)
1016 Writer.AddCXXTemporary(E->getTemporary(i), Record);
1017
1018 Writer.WriteSubStmt(E->getSubExpr());
1019 Code = pch::EXPR_CXX_EXPR_WITH_TEMPORARIES;
1020}
1021
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001022
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +00001023//===----------------------------------------------------------------------===//
Chris Lattner63377d52009-04-27 06:20:01 +00001024// PCHWriter Implementation
1025//===----------------------------------------------------------------------===//
1026
1027unsigned PCHWriter::RecordSwitchCaseID(SwitchCase *S) {
Mike Stump1eb44332009-09-09 15:08:12 +00001028 assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
Chris Lattner63377d52009-04-27 06:20:01 +00001029 "SwitchCase recorded twice");
1030 unsigned NextID = SwitchCaseIDs.size();
1031 SwitchCaseIDs[S] = NextID;
1032 return NextID;
1033}
1034
1035unsigned PCHWriter::getSwitchCaseID(SwitchCase *S) {
Mike Stump1eb44332009-09-09 15:08:12 +00001036 assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
Chris Lattner63377d52009-04-27 06:20:01 +00001037 "SwitchCase hasn't been seen yet");
1038 return SwitchCaseIDs[S];
1039}
1040
1041/// \brief Retrieve the ID for the given label statement, which may
1042/// or may not have been emitted yet.
1043unsigned PCHWriter::GetLabelID(LabelStmt *S) {
1044 std::map<LabelStmt *, unsigned>::iterator Pos = LabelIDs.find(S);
1045 if (Pos != LabelIDs.end())
1046 return Pos->second;
Mike Stump1eb44332009-09-09 15:08:12 +00001047
Chris Lattner63377d52009-04-27 06:20:01 +00001048 unsigned NextID = LabelIDs.size();
1049 LabelIDs[S] = NextID;
1050 return NextID;
1051}
1052
1053/// \brief Write the given substatement or subexpression to the
1054/// bitstream.
1055void PCHWriter::WriteSubStmt(Stmt *S) {
1056 RecordData Record;
1057 PCHStmtWriter Writer(*this, Record);
1058 ++NumStatements;
Mike Stump1eb44332009-09-09 15:08:12 +00001059
Chris Lattner63377d52009-04-27 06:20:01 +00001060 if (!S) {
1061 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
1062 return;
1063 }
Mike Stump1eb44332009-09-09 15:08:12 +00001064
Chris Lattner63377d52009-04-27 06:20:01 +00001065 Writer.Code = pch::STMT_NULL_PTR;
1066 Writer.Visit(S);
Chris Lattner59218632010-05-10 01:22:27 +00001067
1068#ifndef NDEBUG
1069 if (Writer.Code == pch::STMT_NULL_PTR) {
1070 S->dump();
1071 assert(0 && "Unhandled sub statement writing PCH file");
1072 }
1073#endif
Mike Stump1eb44332009-09-09 15:08:12 +00001074 Stream.EmitRecord(Writer.Code, Record);
Chris Lattner63377d52009-04-27 06:20:01 +00001075}
1076
1077/// \brief Flush all of the statements that have been added to the
1078/// queue via AddStmt().
1079void PCHWriter::FlushStmts() {
1080 RecordData Record;
1081 PCHStmtWriter Writer(*this, Record);
Mike Stump1eb44332009-09-09 15:08:12 +00001082
Chris Lattner63377d52009-04-27 06:20:01 +00001083 for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
1084 ++NumStatements;
1085 Stmt *S = StmtsToEmit[I];
Mike Stump1eb44332009-09-09 15:08:12 +00001086
Chris Lattner63377d52009-04-27 06:20:01 +00001087 if (!S) {
1088 Stream.EmitRecord(pch::STMT_NULL_PTR, Record);
1089 continue;
1090 }
Mike Stump1eb44332009-09-09 15:08:12 +00001091
Chris Lattner63377d52009-04-27 06:20:01 +00001092 Writer.Code = pch::STMT_NULL_PTR;
1093 Writer.Visit(S);
Chris Lattnerd2598362010-05-10 00:25:06 +00001094#ifndef NDEBUG
1095 if (Writer.Code == pch::STMT_NULL_PTR) {
1096 S->dump();
1097 assert(0 && "Unhandled expression writing PCH file");
1098 }
1099#endif
Mike Stump1eb44332009-09-09 15:08:12 +00001100 Stream.EmitRecord(Writer.Code, Record);
1101
1102 assert(N == StmtsToEmit.size() &&
Chris Lattner63377d52009-04-27 06:20:01 +00001103 "Substatement writen via AddStmt rather than WriteSubStmt!");
Mike Stump1eb44332009-09-09 15:08:12 +00001104
Chris Lattner63377d52009-04-27 06:20:01 +00001105 // Note that we are at the end of a full expression. Any
1106 // expression records that follow this one are part of a different
1107 // expression.
1108 Record.clear();
1109 Stream.EmitRecord(pch::STMT_STOP, Record);
1110 }
Mike Stump1eb44332009-09-09 15:08:12 +00001111
Chris Lattner63377d52009-04-27 06:20:01 +00001112 StmtsToEmit.clear();
Chris Lattner63377d52009-04-27 06:20:01 +00001113}