blob: a928c88c3a12de02cde4f3306f9e7d7b9126f07c [file] [log] [blame]
Ted Kremenek215c2c82007-10-31 18:41:19 +00001//===--- StmtSerialization.cpp - Serialization of Statements --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Ted Kremenek and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the type-specific methods for serializing statements
11// and expressions.
12//
13//===----------------------------------------------------------------------===//
14
Ted Kremenek47281102007-11-07 00:17:35 +000015#include "clang/AST/Expr.h"
Ted Kremenek215c2c82007-10-31 18:41:19 +000016#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremenek215c2c82007-10-31 18:41:19 +000019using namespace clang;
Ted Kremenekd7017492007-11-07 22:53:01 +000020using llvm::Serializer;
21using llvm::Deserializer;
Ted Kremenek215c2c82007-10-31 18:41:19 +000022
Ted Kremenekd7017492007-11-07 22:53:01 +000023void Stmt::Emit(Serializer& S) const {
Ted Kremenekb9b543d2007-11-07 22:32:23 +000024 S.FlushRecord();
Ted Kremenek47281102007-11-07 00:17:35 +000025 S.EmitInt(getStmtClass());
26 directEmit(S);
Ted Kremenek8c9833b2007-11-07 22:39:17 +000027 S.FlushRecord();
Ted Kremenek47281102007-11-07 00:17:35 +000028}
Ted Kremenek215c2c82007-10-31 18:41:19 +000029
Ted Kremenekd7017492007-11-07 22:53:01 +000030Stmt* Stmt::Materialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +000031 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremenek215c2c82007-10-31 18:41:19 +000032
Ted Kremenek47281102007-11-07 00:17:35 +000033 switch (SC) {
34 default:
35 assert (false && "Not implemented.");
36 return NULL;
Ted Kremenek2bd6e652007-11-07 00:37:40 +000037
Ted Kremenekd7017492007-11-07 22:53:01 +000038 case ArraySubscriptExprClass:
39 return ArraySubscriptExpr::directMaterialize(D);
40
Ted Kremenek2bd6e652007-11-07 00:37:40 +000041 case BinaryOperatorClass:
42 return BinaryOperator::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000043
Ted Kremenek249d7cd2007-11-07 05:25:31 +000044 case BreakStmtClass:
45 return BreakStmt::directMaterialize(D);
46
47 case CaseStmtClass:
48 return CaseStmt::directMaterialize(D);
Ted Kremenek705cb5d2007-11-07 22:42:34 +000049
50 case CastExprClass:
51 return CastExpr::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000052
Ted Kremenek42f440c2007-11-07 17:15:49 +000053 case CharacterLiteralClass:
54 return CharacterLiteral::directMaterialize(D);
55
Ted Kremenek47281102007-11-07 00:17:35 +000056 case CompoundStmtClass:
57 return CompoundStmt::directMaterialize(D);
58
Ted Kremenek6c4dba72007-11-07 17:05:07 +000059 case ContinueStmtClass:
60 return ContinueStmt::directMaterialize(D);
61
Ted Kremenek47281102007-11-07 00:17:35 +000062 case DeclRefExprClass:
63 return DeclRefExpr::directMaterialize(D);
64
Ted Kremenek2bd6e652007-11-07 00:37:40 +000065 case DeclStmtClass:
66 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000067
68 case DefaultStmtClass:
69 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000070
71 case DoStmtClass:
72 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000073
74 case FloatingLiteralClass:
75 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000076
77 case ForStmtClass:
78 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000079
80 case GotoStmtClass:
81 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000082
Ted Kremenekca22d352007-11-07 07:19:30 +000083 case IfStmtClass:
84 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000085
86 case ImaginaryLiteralClass:
87 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000088
Ted Kremenek8c9833b2007-11-07 22:39:17 +000089 case ImplicitCastExprClass:
90 return ImplicitCastExpr::directMaterialize(D);
91
Ted Kremeneke7d27d52007-11-07 17:02:32 +000092 case IndirectGotoStmtClass:
93 return IndirectGotoStmt::directMaterialize(D);
94
Ted Kremenek47281102007-11-07 00:17:35 +000095 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000096 return IntegerLiteral::directMaterialize(D);
97
Ted Kremenek56a74bb2007-11-07 00:48:04 +000098 case LabelStmtClass:
99 return LabelStmt::directMaterialize(D);
100
Ted Kremenek25aaa262007-11-07 00:40:53 +0000101 case NullStmtClass:
102 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000103
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000104 case ParenExprClass:
105 return ParenExpr::directMaterialize(D);
106
Ted Kremenek539a4182007-11-07 17:11:58 +0000107 case PreDefinedExprClass:
108 return PreDefinedExpr::directMaterialize(D);
109
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000110 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000111 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +0000112
113 case StringLiteralClass:
114 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000115
116 case SwitchStmtClass:
117 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000118
119 case WhileStmtClass:
120 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000121 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000122}
123
Ted Kremenekd7017492007-11-07 22:53:01 +0000124void ArraySubscriptExpr::directEmit(Serializer& S) const {
125 S.Emit(getType());
126 S.Emit(RBracketLoc);
127 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
128}
129
130ArraySubscriptExpr* ArraySubscriptExpr::directMaterialize(Deserializer& D) {
131 QualType t = QualType::ReadVal(D);
132 SourceLocation L = SourceLocation::ReadVal(D);
133 Expr *LHS, *RHS;
134 D.BatchReadOwnedPtrs(LHS,RHS);
135 return new ArraySubscriptExpr(LHS,RHS,t,L);
136}
137
138void BinaryOperator::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000139 S.EmitInt(Opc);
140 S.Emit(OpLoc);;
141 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000142 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000143}
144
Ted Kremenekd7017492007-11-07 22:53:01 +0000145BinaryOperator* BinaryOperator::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000146 Opcode Opc = static_cast<Opcode>(D.ReadInt());
147 SourceLocation OpLoc = SourceLocation::ReadVal(D);
148 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000149 Expr *LHS, *RHS;
150 D.BatchReadOwnedPtrs(LHS,RHS);
151
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000152 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
153}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000154
Ted Kremenekd7017492007-11-07 22:53:01 +0000155void BreakStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000156 S.Emit(BreakLoc);
157}
158
Ted Kremenekd7017492007-11-07 22:53:01 +0000159BreakStmt* BreakStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000160 SourceLocation Loc = SourceLocation::ReadVal(D);
161 return new BreakStmt(Loc);
162}
163
Ted Kremenekd7017492007-11-07 22:53:01 +0000164void CaseStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000165 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000166 S.EmitPtr(getNextSwitchCase());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000167 S.BatchEmitOwnedPtrs(getLHS(),getRHS(),getSubStmt());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000168}
169
Ted Kremenekd7017492007-11-07 22:53:01 +0000170CaseStmt* CaseStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000171 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000172 Expr *LHS, *RHS;
173 Stmt* SubStmt;
174 D.BatchReadOwnedPtrs(LHS,RHS,SubStmt);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000175
176 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000177 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000178 return stmt;
179}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000180
Ted Kremenekd7017492007-11-07 22:53:01 +0000181void CastExpr::directEmit(Serializer& S) const {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000182 S.Emit(getType());
183 S.Emit(Loc);
184 S.EmitOwnedPtr(Op);
185}
186
Ted Kremenekd7017492007-11-07 22:53:01 +0000187CastExpr* CastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000188 QualType t = QualType::ReadVal(D);
189 SourceLocation Loc = SourceLocation::ReadVal(D);
190 Expr* Op = D.ReadOwnedPtr<Expr>();
191 return new CastExpr(t,Op,Loc);
192}
193
194
Ted Kremenekd7017492007-11-07 22:53:01 +0000195void CharacterLiteral::directEmit(Serializer& S) const {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000196 S.Emit(Value);
197 S.Emit(Loc);
198 S.Emit(getType());
199}
200
Ted Kremenekd7017492007-11-07 22:53:01 +0000201CharacterLiteral* CharacterLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000202 unsigned value = D.ReadInt();
203 SourceLocation Loc = SourceLocation::ReadVal(D);
204 QualType T = QualType::ReadVal(D);
205 return new CharacterLiteral(value,T,Loc);
206}
207
Ted Kremenekd7017492007-11-07 22:53:01 +0000208void CompoundStmt::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000209 S.Emit(LBracLoc);
210 S.Emit(RBracLoc);
211 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000212
Ted Kremenek47281102007-11-07 00:17:35 +0000213 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000214 S.EmitOwnedPtr(*I);
215}
216
Ted Kremenekd7017492007-11-07 22:53:01 +0000217CompoundStmt* CompoundStmt::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000218 SourceLocation LB = SourceLocation::ReadVal(D);
219 SourceLocation RB = SourceLocation::ReadVal(D);
220 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000221
Ted Kremenek47281102007-11-07 00:17:35 +0000222 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
223
224 stmt->Body.reserve(size);
225
226 for (unsigned i = 0; i < size; ++i)
227 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
228
229 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000230}
Ted Kremenek47281102007-11-07 00:17:35 +0000231
Ted Kremenekd7017492007-11-07 22:53:01 +0000232void ContinueStmt::directEmit(Serializer& S) const {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000233 S.Emit(ContinueLoc);
234}
235
Ted Kremenekd7017492007-11-07 22:53:01 +0000236ContinueStmt* ContinueStmt::directMaterialize(Deserializer& D) {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000237 SourceLocation Loc = SourceLocation::ReadVal(D);
238 return new ContinueStmt(Loc);
239}
240
Ted Kremenekd7017492007-11-07 22:53:01 +0000241void DeclStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000242 // FIXME: special handling for struct decls.
243 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000244}
245
Ted Kremenekd7017492007-11-07 22:53:01 +0000246void DeclRefExpr::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000247 S.Emit(Loc);
248 S.Emit(getType());
249 S.EmitPtr(getDecl());
250}
251
Ted Kremenekd7017492007-11-07 22:53:01 +0000252DeclRefExpr* DeclRefExpr::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000253 SourceLocation Loc = SourceLocation::ReadVal(D);
254 QualType T = QualType::ReadVal(D);
255 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
256 D.ReadPtr(dr->D,false);
257 return dr;
258}
259
Ted Kremenekd7017492007-11-07 22:53:01 +0000260DeclStmt* DeclStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000261 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
262 return new DeclStmt(decl);
263}
264
Ted Kremenekd7017492007-11-07 22:53:01 +0000265void DefaultStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000266 S.Emit(DefaultLoc);
267 S.EmitOwnedPtr(getSubStmt());
268 S.EmitPtr(getNextSwitchCase());
269}
270
Ted Kremenekd7017492007-11-07 22:53:01 +0000271DefaultStmt* DefaultStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000272 SourceLocation Loc = SourceLocation::ReadVal(D);
273 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
274
275 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
276 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
277
278 return stmt;
279}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000280
Ted Kremenekd7017492007-11-07 22:53:01 +0000281void DoStmt::directEmit(Serializer& S) const {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000282 S.Emit(DoLoc);
283 S.EmitOwnedPtr(getCond());
284 S.EmitOwnedPtr(getBody());
285}
286
Ted Kremenekd7017492007-11-07 22:53:01 +0000287DoStmt* DoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000288 SourceLocation DoLoc = SourceLocation::ReadVal(D);
289 Expr* Cond = D.ReadOwnedPtr<Expr>();
290 Stmt* Body = D.ReadOwnedPtr<Stmt>();
291 return new DoStmt(Body,Cond,DoLoc);
292}
293
Ted Kremenekd7017492007-11-07 22:53:01 +0000294void FloatingLiteral::directEmit(Serializer& S) const {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000295 S.Emit(Loc);
296 S.Emit(getType());
297 S.Emit(Value);
298}
299
Ted Kremenekd7017492007-11-07 22:53:01 +0000300FloatingLiteral* FloatingLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000301 SourceLocation Loc = SourceLocation::ReadVal(D);
302 QualType t = QualType::ReadVal(D);
303 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
304 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
305 return expr;
306}
307
Ted Kremenekd7017492007-11-07 22:53:01 +0000308void ForStmt::directEmit(Serializer& S) const {
Ted Kremenekf34da902007-11-07 08:02:55 +0000309 S.Emit(ForLoc);
310 S.EmitOwnedPtr(getInit());
311 S.EmitOwnedPtr(getCond());
312 S.EmitOwnedPtr(getInc());
313 S.EmitOwnedPtr(getBody());
314}
315
Ted Kremenekd7017492007-11-07 22:53:01 +0000316ForStmt* ForStmt::directMaterialize(Deserializer& D) {
Ted Kremenekf34da902007-11-07 08:02:55 +0000317 SourceLocation ForLoc = SourceLocation::ReadVal(D);
318 Stmt* Init = D.ReadOwnedPtr<Stmt>();
319 Expr* Cond = D.ReadOwnedPtr<Expr>();
320 Expr* Inc = D.ReadOwnedPtr<Expr>();
321 Stmt* Body = D.ReadOwnedPtr<Stmt>();
322 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
323}
324
Ted Kremenekd7017492007-11-07 22:53:01 +0000325void GotoStmt::directEmit(Serializer& S) const {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000326 S.Emit(GotoLoc);
327 S.Emit(LabelLoc);
328 S.EmitPtr(Label);
329}
330
Ted Kremenekd7017492007-11-07 22:53:01 +0000331GotoStmt* GotoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000332 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
333 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
334 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
335 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
336 return stmt;
337}
338
Ted Kremenekd7017492007-11-07 22:53:01 +0000339void IfStmt::directEmit(Serializer& S) const {
Ted Kremenekca22d352007-11-07 07:19:30 +0000340 S.Emit(IfLoc);
341 S.EmitOwnedPtr(getCond());
342 S.EmitOwnedPtr(getThen());
343 S.EmitOwnedPtr(getElse());
344}
345
Ted Kremenekd7017492007-11-07 22:53:01 +0000346IfStmt* IfStmt::directMaterialize(Deserializer& D) {
Ted Kremenekca22d352007-11-07 07:19:30 +0000347 SourceLocation L = SourceLocation::ReadVal(D);
348 Expr* Cond = D.ReadOwnedPtr<Expr>();
349 Stmt* Then = D.ReadOwnedPtr<Stmt>();
350 Stmt* Else = D.ReadOwnedPtr<Stmt>();
351 return new IfStmt(L,Cond,Then,Else);
352}
353
Ted Kremenekd7017492007-11-07 22:53:01 +0000354void ImaginaryLiteral::directEmit(Serializer& S) const {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000355 S.Emit(getType());
356 S.EmitOwnedPtr(Val);
357}
358
Ted Kremenekd7017492007-11-07 22:53:01 +0000359ImaginaryLiteral* ImaginaryLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000360 QualType t = QualType::ReadVal(D);
361 Expr* expr = D.ReadOwnedPtr<Expr>();
362 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
363 return new ImaginaryLiteral(expr,t);
364}
365
Ted Kremenekd7017492007-11-07 22:53:01 +0000366void ImplicitCastExpr::directEmit(Serializer& S) const {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000367 S.Emit(getType());
368 S.EmitOwnedPtr(Op);
369}
370
Ted Kremenekd7017492007-11-07 22:53:01 +0000371ImplicitCastExpr* ImplicitCastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000372 QualType t = QualType::ReadVal(D);
373 Expr* Op = D.ReadOwnedPtr<Expr>();
374 return new ImplicitCastExpr(t,Op);
375}
376
Ted Kremenekd7017492007-11-07 22:53:01 +0000377void IndirectGotoStmt::directEmit(Serializer& S) const {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000378 S.EmitPtr(Target);
379}
380
Ted Kremenekd7017492007-11-07 22:53:01 +0000381IndirectGotoStmt* IndirectGotoStmt::directMaterialize(Deserializer& D) {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000382 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
383 D.ReadPtr(stmt->Target); // The target may be backpatched.
384 return stmt;
385}
386
Ted Kremenekd7017492007-11-07 22:53:01 +0000387void IntegerLiteral::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000388 S.Emit(Loc);
389 S.Emit(getType());
390 S.Emit(getValue());
391}
392
Ted Kremenekd7017492007-11-07 22:53:01 +0000393IntegerLiteral* IntegerLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000394 SourceLocation Loc = SourceLocation::ReadVal(D);
395 QualType T = QualType::ReadVal(D);
396
397 // Create a dummy APInt because it is more efficient to deserialize
398 // it in place with the deserialized IntegerLiteral. (fewer copies)
399 llvm::APInt temp;
400 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
401 D.Read(expr->Value);
402
403 return expr;
404}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000405
Ted Kremenekd7017492007-11-07 22:53:01 +0000406void LabelStmt::directEmit(Serializer& S) const {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000407 S.EmitPtr(Label);
408 S.Emit(IdentLoc);
409 S.EmitOwnedPtr(SubStmt);
410}
411
Ted Kremenekd7017492007-11-07 22:53:01 +0000412LabelStmt* LabelStmt::directMaterialize(Deserializer& D) {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000413 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
414 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
415 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
416 return new LabelStmt(IdentLoc,Label,SubStmt);
417}
418
Ted Kremenekd7017492007-11-07 22:53:01 +0000419void NullStmt::directEmit(Serializer& S) const {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000420 S.Emit(SemiLoc);
421}
422
Ted Kremenekd7017492007-11-07 22:53:01 +0000423NullStmt* NullStmt::directMaterialize(Deserializer& D) {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000424 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
425 return new NullStmt(SemiLoc);
426}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000427
Ted Kremenekd7017492007-11-07 22:53:01 +0000428void ParenExpr::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000429 S.Emit(L);
430 S.Emit(R);
431 S.EmitOwnedPtr(Val);
432}
433
Ted Kremenekd7017492007-11-07 22:53:01 +0000434ParenExpr* ParenExpr::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000435 SourceLocation L = SourceLocation::ReadVal(D);
436 SourceLocation R = SourceLocation::ReadVal(D);
437 Expr* val = D.ReadOwnedPtr<Expr>();
438 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000439}
440
Ted Kremenekd7017492007-11-07 22:53:01 +0000441void PreDefinedExpr::directEmit(Serializer& S) const {
Ted Kremenek539a4182007-11-07 17:11:58 +0000442 S.Emit(Loc);
443 S.EmitInt(getIdentType());
444 S.Emit(getType());
445}
446
Ted Kremenekd7017492007-11-07 22:53:01 +0000447PreDefinedExpr* PreDefinedExpr::directMaterialize(Deserializer& D) {
Ted Kremenek539a4182007-11-07 17:11:58 +0000448 SourceLocation Loc = SourceLocation::ReadVal(D);
449 IdentType it = static_cast<IdentType>(D.ReadInt());
450 QualType Q = QualType::ReadVal(D);
451 return new PreDefinedExpr(Loc,Q,it);
452}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000453
Ted Kremenekd7017492007-11-07 22:53:01 +0000454void ReturnStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000455 S.Emit(RetLoc);
456 S.EmitOwnedPtr(RetExpr);
457}
458
Ted Kremenekd7017492007-11-07 22:53:01 +0000459ReturnStmt* ReturnStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000460 SourceLocation RetLoc = SourceLocation::ReadVal(D);
461 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
462 return new ReturnStmt(RetLoc,RetExpr);
463}
464
Ted Kremenekd7017492007-11-07 22:53:01 +0000465void StringLiteral::directEmit(Serializer& S) const {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000466 S.Emit(getType());
467 S.Emit(firstTokLoc);
468 S.Emit(lastTokLoc);
469 S.EmitBool(isWide());
470 S.Emit(getByteLength());
471
472 for (unsigned i = 0 ; i < ByteLength; ++i)
473 S.EmitInt(StrData[i]);
474}
475
Ted Kremenekd7017492007-11-07 22:53:01 +0000476StringLiteral* StringLiteral::directMaterialize(Deserializer& D) {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000477 QualType t = QualType::ReadVal(D);
478 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
479 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
480 bool isWide = D.ReadBool();
481 unsigned ByteLength = D.ReadInt();
482
483 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
484
485 char* StrData = new char[ByteLength];
486 for (unsigned i = 0; i < ByteLength; ++i)
487 StrData[i] = (char) D.ReadInt();
488
489 sl->ByteLength = ByteLength;
490 sl->StrData = StrData;
491
492 return sl;
493}
494
Ted Kremenekd7017492007-11-07 22:53:01 +0000495void SwitchStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000496 S.Emit(SwitchLoc);
497 S.EmitOwnedPtr(getCond());
498 S.EmitOwnedPtr(getBody());
499 S.EmitPtr(FirstCase);
500}
501
Ted Kremenekd7017492007-11-07 22:53:01 +0000502SwitchStmt* SwitchStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000503 SourceLocation Loc = SourceLocation::ReadVal(D);
504 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
505 Stmt* Body = D.ReadOwnedPtr<Stmt>();
506 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
507
508 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
509 stmt->setBody(Body,Loc);
510 stmt->FirstCase = FirstCase;
511
512 return stmt;
513}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000514
Ted Kremenekd7017492007-11-07 22:53:01 +0000515void WhileStmt::directEmit(Serializer& S) const {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000516 S.Emit(WhileLoc);
517 S.EmitOwnedPtr(getCond());
518 S.EmitOwnedPtr(getBody());
519}
520
Ted Kremenekd7017492007-11-07 22:53:01 +0000521WhileStmt* WhileStmt::directMaterialize(Deserializer& D) {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000522 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
523 Expr* Cond = D.ReadOwnedPtr<Expr>();
524 Stmt* Body = D.ReadOwnedPtr<Stmt>();
525 return new WhileStmt(Cond,Body,WhileLoc);
526}