blob: ea812255c54808457717ddf3bd739d0968d4d43f [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;
20
Ted Kremenek47281102007-11-07 00:17:35 +000021void Stmt::Emit(llvm::Serializer& S) const {
Ted Kremenekb9b543d2007-11-07 22:32:23 +000022 S.FlushRecord();
Ted Kremenek47281102007-11-07 00:17:35 +000023 S.EmitInt(getStmtClass());
24 directEmit(S);
Ted Kremenek8c9833b2007-11-07 22:39:17 +000025 S.FlushRecord();
Ted Kremenek47281102007-11-07 00:17:35 +000026}
Ted Kremenek215c2c82007-10-31 18:41:19 +000027
Ted Kremenek47281102007-11-07 00:17:35 +000028Stmt* Stmt::Materialize(llvm::Deserializer& D) {
29 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremenek215c2c82007-10-31 18:41:19 +000030
Ted Kremenek47281102007-11-07 00:17:35 +000031 switch (SC) {
32 default:
33 assert (false && "Not implemented.");
34 return NULL;
Ted Kremenek2bd6e652007-11-07 00:37:40 +000035
36 case BinaryOperatorClass:
37 return BinaryOperator::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000038
Ted Kremenek249d7cd2007-11-07 05:25:31 +000039 case BreakStmtClass:
40 return BreakStmt::directMaterialize(D);
41
42 case CaseStmtClass:
43 return CaseStmt::directMaterialize(D);
Ted Kremenek705cb5d2007-11-07 22:42:34 +000044
45 case CastExprClass:
46 return CastExpr::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000047
Ted Kremenek42f440c2007-11-07 17:15:49 +000048 case CharacterLiteralClass:
49 return CharacterLiteral::directMaterialize(D);
50
Ted Kremenek47281102007-11-07 00:17:35 +000051 case CompoundStmtClass:
52 return CompoundStmt::directMaterialize(D);
53
Ted Kremenek6c4dba72007-11-07 17:05:07 +000054 case ContinueStmtClass:
55 return ContinueStmt::directMaterialize(D);
56
Ted Kremenek47281102007-11-07 00:17:35 +000057 case DeclRefExprClass:
58 return DeclRefExpr::directMaterialize(D);
59
Ted Kremenek2bd6e652007-11-07 00:37:40 +000060 case DeclStmtClass:
61 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000062
63 case DefaultStmtClass:
64 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000065
66 case DoStmtClass:
67 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000068
69 case FloatingLiteralClass:
70 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000071
72 case ForStmtClass:
73 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000074
75 case GotoStmtClass:
76 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000077
Ted Kremenekca22d352007-11-07 07:19:30 +000078 case IfStmtClass:
79 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000080
81 case ImaginaryLiteralClass:
82 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000083
Ted Kremenek8c9833b2007-11-07 22:39:17 +000084 case ImplicitCastExprClass:
85 return ImplicitCastExpr::directMaterialize(D);
86
Ted Kremeneke7d27d52007-11-07 17:02:32 +000087 case IndirectGotoStmtClass:
88 return IndirectGotoStmt::directMaterialize(D);
89
Ted Kremenek47281102007-11-07 00:17:35 +000090 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000091 return IntegerLiteral::directMaterialize(D);
92
Ted Kremenek56a74bb2007-11-07 00:48:04 +000093 case LabelStmtClass:
94 return LabelStmt::directMaterialize(D);
95
Ted Kremenek25aaa262007-11-07 00:40:53 +000096 case NullStmtClass:
97 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000098
Ted Kremenek249d7cd2007-11-07 05:25:31 +000099 case ParenExprClass:
100 return ParenExpr::directMaterialize(D);
101
Ted Kremenek539a4182007-11-07 17:11:58 +0000102 case PreDefinedExprClass:
103 return PreDefinedExpr::directMaterialize(D);
104
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000105 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000106 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +0000107
108 case StringLiteralClass:
109 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000110
111 case SwitchStmtClass:
112 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000113
114 case WhileStmtClass:
115 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000116 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000117}
118
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000119void BinaryOperator::directEmit(llvm::Serializer& S) const {
120 S.EmitInt(Opc);
121 S.Emit(OpLoc);;
122 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000123 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000124}
125
126BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
127 Opcode Opc = static_cast<Opcode>(D.ReadInt());
128 SourceLocation OpLoc = SourceLocation::ReadVal(D);
129 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000130 Expr *LHS, *RHS;
131 D.BatchReadOwnedPtrs(LHS,RHS);
132
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000133 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
134}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000135
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000136void BreakStmt::directEmit(llvm::Serializer& S) const {
137 S.Emit(BreakLoc);
138}
139
140BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
141 SourceLocation Loc = SourceLocation::ReadVal(D);
142 return new BreakStmt(Loc);
143}
144
145void CaseStmt::directEmit(llvm::Serializer& S) const {
146 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000147 S.EmitPtr(getNextSwitchCase());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000148 S.BatchEmitOwnedPtrs(getLHS(),getRHS(),getSubStmt());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000149}
150
151CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
152 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000153 Expr *LHS, *RHS;
154 Stmt* SubStmt;
155 D.BatchReadOwnedPtrs(LHS,RHS,SubStmt);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000156
157 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000158 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000159 return stmt;
160}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000161
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000162void CastExpr::directEmit(llvm::Serializer& S) const {
163 S.Emit(getType());
164 S.Emit(Loc);
165 S.EmitOwnedPtr(Op);
166}
167
168CastExpr* CastExpr::directMaterialize(llvm::Deserializer& D) {
169 QualType t = QualType::ReadVal(D);
170 SourceLocation Loc = SourceLocation::ReadVal(D);
171 Expr* Op = D.ReadOwnedPtr<Expr>();
172 return new CastExpr(t,Op,Loc);
173}
174
175
Ted Kremenek42f440c2007-11-07 17:15:49 +0000176void CharacterLiteral::directEmit(llvm::Serializer& S) const {
177 S.Emit(Value);
178 S.Emit(Loc);
179 S.Emit(getType());
180}
181
182CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
183 unsigned value = D.ReadInt();
184 SourceLocation Loc = SourceLocation::ReadVal(D);
185 QualType T = QualType::ReadVal(D);
186 return new CharacterLiteral(value,T,Loc);
187}
188
Ted Kremenek47281102007-11-07 00:17:35 +0000189void CompoundStmt::directEmit(llvm::Serializer& S) const {
190 S.Emit(LBracLoc);
191 S.Emit(RBracLoc);
192 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000193
Ted Kremenek47281102007-11-07 00:17:35 +0000194 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000195 S.EmitOwnedPtr(*I);
196}
197
Ted Kremenek47281102007-11-07 00:17:35 +0000198CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
199 SourceLocation LB = SourceLocation::ReadVal(D);
200 SourceLocation RB = SourceLocation::ReadVal(D);
201 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000202
Ted Kremenek47281102007-11-07 00:17:35 +0000203 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
204
205 stmt->Body.reserve(size);
206
207 for (unsigned i = 0; i < size; ++i)
208 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
209
210 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000211}
Ted Kremenek47281102007-11-07 00:17:35 +0000212
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000213void ContinueStmt::directEmit(llvm::Serializer& S) const {
214 S.Emit(ContinueLoc);
215}
216
217ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
218 SourceLocation Loc = SourceLocation::ReadVal(D);
219 return new ContinueStmt(Loc);
220}
221
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000222void DeclStmt::directEmit(llvm::Serializer& S) const {
223 // FIXME: special handling for struct decls.
224 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000225}
226
227void DeclRefExpr::directEmit(llvm::Serializer& S) const {
228 S.Emit(Loc);
229 S.Emit(getType());
230 S.EmitPtr(getDecl());
231}
232
233DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
234 SourceLocation Loc = SourceLocation::ReadVal(D);
235 QualType T = QualType::ReadVal(D);
236 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
237 D.ReadPtr(dr->D,false);
238 return dr;
239}
240
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000241DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
242 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
243 return new DeclStmt(decl);
244}
245
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000246void DefaultStmt::directEmit(llvm::Serializer& S) const {
247 S.Emit(DefaultLoc);
248 S.EmitOwnedPtr(getSubStmt());
249 S.EmitPtr(getNextSwitchCase());
250}
251
252DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
253 SourceLocation Loc = SourceLocation::ReadVal(D);
254 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
255
256 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
257 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
258
259 return stmt;
260}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000261
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000262void DoStmt::directEmit(llvm::Serializer& S) const {
263 S.Emit(DoLoc);
264 S.EmitOwnedPtr(getCond());
265 S.EmitOwnedPtr(getBody());
266}
267
268DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
269 SourceLocation DoLoc = SourceLocation::ReadVal(D);
270 Expr* Cond = D.ReadOwnedPtr<Expr>();
271 Stmt* Body = D.ReadOwnedPtr<Stmt>();
272 return new DoStmt(Body,Cond,DoLoc);
273}
274
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000275void FloatingLiteral::directEmit(llvm::Serializer& S) const {
276 S.Emit(Loc);
277 S.Emit(getType());
278 S.Emit(Value);
279}
280
281FloatingLiteral* FloatingLiteral::directMaterialize(llvm::Deserializer& D) {
282 SourceLocation Loc = SourceLocation::ReadVal(D);
283 QualType t = QualType::ReadVal(D);
284 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
285 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
286 return expr;
287}
288
Ted Kremenekf34da902007-11-07 08:02:55 +0000289void ForStmt::directEmit(llvm::Serializer& S) const {
290 S.Emit(ForLoc);
291 S.EmitOwnedPtr(getInit());
292 S.EmitOwnedPtr(getCond());
293 S.EmitOwnedPtr(getInc());
294 S.EmitOwnedPtr(getBody());
295}
296
297ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
298 SourceLocation ForLoc = SourceLocation::ReadVal(D);
299 Stmt* Init = D.ReadOwnedPtr<Stmt>();
300 Expr* Cond = D.ReadOwnedPtr<Expr>();
301 Expr* Inc = D.ReadOwnedPtr<Expr>();
302 Stmt* Body = D.ReadOwnedPtr<Stmt>();
303 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
304}
305
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000306void GotoStmt::directEmit(llvm::Serializer& S) const {
307 S.Emit(GotoLoc);
308 S.Emit(LabelLoc);
309 S.EmitPtr(Label);
310}
311
312GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
313 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
314 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
315 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
316 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
317 return stmt;
318}
319
Ted Kremenekca22d352007-11-07 07:19:30 +0000320void IfStmt::directEmit(llvm::Serializer& S) const {
321 S.Emit(IfLoc);
322 S.EmitOwnedPtr(getCond());
323 S.EmitOwnedPtr(getThen());
324 S.EmitOwnedPtr(getElse());
325}
326
327IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
328 SourceLocation L = SourceLocation::ReadVal(D);
329 Expr* Cond = D.ReadOwnedPtr<Expr>();
330 Stmt* Then = D.ReadOwnedPtr<Stmt>();
331 Stmt* Else = D.ReadOwnedPtr<Stmt>();
332 return new IfStmt(L,Cond,Then,Else);
333}
334
Ted Kremenek105f21a2007-11-07 18:53:02 +0000335void ImaginaryLiteral::directEmit(llvm::Serializer& S) const {
336 S.Emit(getType());
337 S.EmitOwnedPtr(Val);
338}
339
340ImaginaryLiteral* ImaginaryLiteral::directMaterialize(llvm::Deserializer& D) {
341 QualType t = QualType::ReadVal(D);
342 Expr* expr = D.ReadOwnedPtr<Expr>();
343 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
344 return new ImaginaryLiteral(expr,t);
345}
346
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000347void ImplicitCastExpr::directEmit(llvm::Serializer& S) const {
348 S.Emit(getType());
349 S.EmitOwnedPtr(Op);
350}
351
352ImplicitCastExpr* ImplicitCastExpr::directMaterialize(llvm::Deserializer& D) {
353 QualType t = QualType::ReadVal(D);
354 Expr* Op = D.ReadOwnedPtr<Expr>();
355 return new ImplicitCastExpr(t,Op);
356}
357
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000358void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
359 S.EmitPtr(Target);
360}
361
362IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
363 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
364 D.ReadPtr(stmt->Target); // The target may be backpatched.
365 return stmt;
366}
367
Ted Kremenek47281102007-11-07 00:17:35 +0000368void IntegerLiteral::directEmit(llvm::Serializer& S) const {
369 S.Emit(Loc);
370 S.Emit(getType());
371 S.Emit(getValue());
372}
373
374IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
375 SourceLocation Loc = SourceLocation::ReadVal(D);
376 QualType T = QualType::ReadVal(D);
377
378 // Create a dummy APInt because it is more efficient to deserialize
379 // it in place with the deserialized IntegerLiteral. (fewer copies)
380 llvm::APInt temp;
381 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
382 D.Read(expr->Value);
383
384 return expr;
385}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000386
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000387void LabelStmt::directEmit(llvm::Serializer& S) const {
388 S.EmitPtr(Label);
389 S.Emit(IdentLoc);
390 S.EmitOwnedPtr(SubStmt);
391}
392
393LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
394 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
395 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
396 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
397 return new LabelStmt(IdentLoc,Label,SubStmt);
398}
399
Ted Kremenek25aaa262007-11-07 00:40:53 +0000400void NullStmt::directEmit(llvm::Serializer& S) const {
401 S.Emit(SemiLoc);
402}
403
404NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
405 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
406 return new NullStmt(SemiLoc);
407}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000408
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000409void ParenExpr::directEmit(llvm::Serializer& S) const {
410 S.Emit(L);
411 S.Emit(R);
412 S.EmitOwnedPtr(Val);
413}
414
415ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
416 SourceLocation L = SourceLocation::ReadVal(D);
417 SourceLocation R = SourceLocation::ReadVal(D);
418 Expr* val = D.ReadOwnedPtr<Expr>();
419 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000420}
421
422void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
423 S.Emit(Loc);
424 S.EmitInt(getIdentType());
425 S.Emit(getType());
426}
427
428PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
429 SourceLocation Loc = SourceLocation::ReadVal(D);
430 IdentType it = static_cast<IdentType>(D.ReadInt());
431 QualType Q = QualType::ReadVal(D);
432 return new PreDefinedExpr(Loc,Q,it);
433}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000434
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000435void ReturnStmt::directEmit(llvm::Serializer& S) const {
436 S.Emit(RetLoc);
437 S.EmitOwnedPtr(RetExpr);
438}
439
440ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
441 SourceLocation RetLoc = SourceLocation::ReadVal(D);
442 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
443 return new ReturnStmt(RetLoc,RetExpr);
444}
445
Ted Kremenekefa540d2007-11-07 19:08:19 +0000446void StringLiteral::directEmit(llvm::Serializer& S) const {
447 S.Emit(getType());
448 S.Emit(firstTokLoc);
449 S.Emit(lastTokLoc);
450 S.EmitBool(isWide());
451 S.Emit(getByteLength());
452
453 for (unsigned i = 0 ; i < ByteLength; ++i)
454 S.EmitInt(StrData[i]);
455}
456
457StringLiteral* StringLiteral::directMaterialize(llvm::Deserializer& D) {
458 QualType t = QualType::ReadVal(D);
459 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
460 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
461 bool isWide = D.ReadBool();
462 unsigned ByteLength = D.ReadInt();
463
464 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
465
466 char* StrData = new char[ByteLength];
467 for (unsigned i = 0; i < ByteLength; ++i)
468 StrData[i] = (char) D.ReadInt();
469
470 sl->ByteLength = ByteLength;
471 sl->StrData = StrData;
472
473 return sl;
474}
475
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000476void SwitchStmt::directEmit(llvm::Serializer& S) const {
477 S.Emit(SwitchLoc);
478 S.EmitOwnedPtr(getCond());
479 S.EmitOwnedPtr(getBody());
480 S.EmitPtr(FirstCase);
481}
482
483SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
484 SourceLocation Loc = SourceLocation::ReadVal(D);
485 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
486 Stmt* Body = D.ReadOwnedPtr<Stmt>();
487 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
488
489 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
490 stmt->setBody(Body,Loc);
491 stmt->FirstCase = FirstCase;
492
493 return stmt;
494}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000495
496void WhileStmt::directEmit(llvm::Serializer& S) const {
497 S.Emit(WhileLoc);
498 S.EmitOwnedPtr(getCond());
499 S.EmitOwnedPtr(getBody());
500}
501
502WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
503 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
504 Expr* Cond = D.ReadOwnedPtr<Expr>();
505 Stmt* Body = D.ReadOwnedPtr<Stmt>();
506 return new WhileStmt(Cond,Body,WhileLoc);
507}