blob: 91caff8e2d4fad1facb16619c901bc8db4c539d7 [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);
Ted Kremenek7a873332007-11-07 23:32:20 +000046
47 case CallExprClass:
48 return CallExpr::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000049
50 case CaseStmtClass:
51 return CaseStmt::directMaterialize(D);
Ted Kremenek705cb5d2007-11-07 22:42:34 +000052
53 case CastExprClass:
54 return CastExpr::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000055
Ted Kremenek42f440c2007-11-07 17:15:49 +000056 case CharacterLiteralClass:
57 return CharacterLiteral::directMaterialize(D);
58
Ted Kremenek47281102007-11-07 00:17:35 +000059 case CompoundStmtClass:
60 return CompoundStmt::directMaterialize(D);
61
Ted Kremenek6c4dba72007-11-07 17:05:07 +000062 case ContinueStmtClass:
63 return ContinueStmt::directMaterialize(D);
64
Ted Kremenek47281102007-11-07 00:17:35 +000065 case DeclRefExprClass:
66 return DeclRefExpr::directMaterialize(D);
67
Ted Kremenek2bd6e652007-11-07 00:37:40 +000068 case DeclStmtClass:
69 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000070
71 case DefaultStmtClass:
72 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000073
74 case DoStmtClass:
75 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000076
77 case FloatingLiteralClass:
78 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000079
80 case ForStmtClass:
81 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000082
83 case GotoStmtClass:
84 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000085
Ted Kremenekca22d352007-11-07 07:19:30 +000086 case IfStmtClass:
87 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000088
89 case ImaginaryLiteralClass:
90 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000091
Ted Kremenek8c9833b2007-11-07 22:39:17 +000092 case ImplicitCastExprClass:
93 return ImplicitCastExpr::directMaterialize(D);
94
Ted Kremeneke7d27d52007-11-07 17:02:32 +000095 case IndirectGotoStmtClass:
96 return IndirectGotoStmt::directMaterialize(D);
97
Ted Kremenek47281102007-11-07 00:17:35 +000098 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000099 return IntegerLiteral::directMaterialize(D);
100
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000101 case LabelStmtClass:
102 return LabelStmt::directMaterialize(D);
103
Ted Kremenek25aaa262007-11-07 00:40:53 +0000104 case NullStmtClass:
105 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000106
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000107 case ParenExprClass:
108 return ParenExpr::directMaterialize(D);
109
Ted Kremenek539a4182007-11-07 17:11:58 +0000110 case PreDefinedExprClass:
111 return PreDefinedExpr::directMaterialize(D);
112
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000113 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000114 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +0000115
116 case StringLiteralClass:
117 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000118
119 case SwitchStmtClass:
120 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000121
122 case WhileStmtClass:
123 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000124 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000125}
126
Ted Kremenekd7017492007-11-07 22:53:01 +0000127void ArraySubscriptExpr::directEmit(Serializer& S) const {
128 S.Emit(getType());
129 S.Emit(RBracketLoc);
130 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
131}
132
133ArraySubscriptExpr* ArraySubscriptExpr::directMaterialize(Deserializer& D) {
134 QualType t = QualType::ReadVal(D);
135 SourceLocation L = SourceLocation::ReadVal(D);
136 Expr *LHS, *RHS;
137 D.BatchReadOwnedPtrs(LHS,RHS);
138 return new ArraySubscriptExpr(LHS,RHS,t,L);
139}
140
141void BinaryOperator::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000142 S.EmitInt(Opc);
143 S.Emit(OpLoc);;
144 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000145 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000146}
147
Ted Kremenekd7017492007-11-07 22:53:01 +0000148BinaryOperator* BinaryOperator::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000149 Opcode Opc = static_cast<Opcode>(D.ReadInt());
150 SourceLocation OpLoc = SourceLocation::ReadVal(D);
151 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000152 Expr *LHS, *RHS;
153 D.BatchReadOwnedPtrs(LHS,RHS);
154
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000155 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
156}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000157
Ted Kremenekd7017492007-11-07 22:53:01 +0000158void BreakStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000159 S.Emit(BreakLoc);
160}
161
Ted Kremenekd7017492007-11-07 22:53:01 +0000162BreakStmt* BreakStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000163 SourceLocation Loc = SourceLocation::ReadVal(D);
164 return new BreakStmt(Loc);
165}
Ted Kremenek7a873332007-11-07 23:32:20 +0000166
167void CallExpr::directEmit(Serializer& S) const {
168 S.Emit(getType());
169 S.Emit(RParenLoc);
170 S.EmitInt(NumArgs);
171 S.BatchEmitOwnedPtrs(NumArgs+1,SubExprs);
172}
173
174CallExpr* CallExpr::directMaterialize(Deserializer& D) {
175 QualType t = QualType::ReadVal(D);
176 SourceLocation L = SourceLocation::ReadVal(D);
177 unsigned NumArgs = D.ReadInt();
178 Expr** SubExprs = new Expr*[NumArgs+1];
179 D.BatchReadOwnedPtrs(NumArgs+1,SubExprs);
180
181 return new CallExpr(SubExprs,NumArgs,t,L);
182}
183
Ted Kremenekd7017492007-11-07 22:53:01 +0000184void CaseStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000185 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000186 S.EmitPtr(getNextSwitchCase());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000187 S.BatchEmitOwnedPtrs(getLHS(),getRHS(),getSubStmt());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000188}
189
Ted Kremenekd7017492007-11-07 22:53:01 +0000190CaseStmt* CaseStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000191 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000192 Expr *LHS, *RHS;
193 Stmt* SubStmt;
194 D.BatchReadOwnedPtrs(LHS,RHS,SubStmt);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000195
196 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000197 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000198 return stmt;
199}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000200
Ted Kremenekd7017492007-11-07 22:53:01 +0000201void CastExpr::directEmit(Serializer& S) const {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000202 S.Emit(getType());
203 S.Emit(Loc);
204 S.EmitOwnedPtr(Op);
205}
206
Ted Kremenekd7017492007-11-07 22:53:01 +0000207CastExpr* CastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000208 QualType t = QualType::ReadVal(D);
209 SourceLocation Loc = SourceLocation::ReadVal(D);
210 Expr* Op = D.ReadOwnedPtr<Expr>();
211 return new CastExpr(t,Op,Loc);
212}
213
214
Ted Kremenekd7017492007-11-07 22:53:01 +0000215void CharacterLiteral::directEmit(Serializer& S) const {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000216 S.Emit(Value);
217 S.Emit(Loc);
218 S.Emit(getType());
219}
220
Ted Kremenekd7017492007-11-07 22:53:01 +0000221CharacterLiteral* CharacterLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000222 unsigned value = D.ReadInt();
223 SourceLocation Loc = SourceLocation::ReadVal(D);
224 QualType T = QualType::ReadVal(D);
225 return new CharacterLiteral(value,T,Loc);
226}
227
Ted Kremenekd7017492007-11-07 22:53:01 +0000228void CompoundStmt::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000229 S.Emit(LBracLoc);
230 S.Emit(RBracLoc);
231 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000232
Ted Kremenek47281102007-11-07 00:17:35 +0000233 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000234 S.EmitOwnedPtr(*I);
235}
236
Ted Kremenekd7017492007-11-07 22:53:01 +0000237CompoundStmt* CompoundStmt::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000238 SourceLocation LB = SourceLocation::ReadVal(D);
239 SourceLocation RB = SourceLocation::ReadVal(D);
240 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000241
Ted Kremenek47281102007-11-07 00:17:35 +0000242 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
243
244 stmt->Body.reserve(size);
245
246 for (unsigned i = 0; i < size; ++i)
247 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
248
249 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000250}
Ted Kremenek47281102007-11-07 00:17:35 +0000251
Ted Kremenekd7017492007-11-07 22:53:01 +0000252void ContinueStmt::directEmit(Serializer& S) const {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000253 S.Emit(ContinueLoc);
254}
255
Ted Kremenekd7017492007-11-07 22:53:01 +0000256ContinueStmt* ContinueStmt::directMaterialize(Deserializer& D) {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000257 SourceLocation Loc = SourceLocation::ReadVal(D);
258 return new ContinueStmt(Loc);
259}
260
Ted Kremenekd7017492007-11-07 22:53:01 +0000261void DeclStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000262 // FIXME: special handling for struct decls.
263 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000264}
265
Ted Kremenekd7017492007-11-07 22:53:01 +0000266void DeclRefExpr::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000267 S.Emit(Loc);
268 S.Emit(getType());
269 S.EmitPtr(getDecl());
270}
271
Ted Kremenekd7017492007-11-07 22:53:01 +0000272DeclRefExpr* DeclRefExpr::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000273 SourceLocation Loc = SourceLocation::ReadVal(D);
274 QualType T = QualType::ReadVal(D);
275 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
276 D.ReadPtr(dr->D,false);
277 return dr;
278}
279
Ted Kremenekd7017492007-11-07 22:53:01 +0000280DeclStmt* DeclStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000281 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
282 return new DeclStmt(decl);
283}
284
Ted Kremenekd7017492007-11-07 22:53:01 +0000285void DefaultStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000286 S.Emit(DefaultLoc);
287 S.EmitOwnedPtr(getSubStmt());
288 S.EmitPtr(getNextSwitchCase());
289}
290
Ted Kremenekd7017492007-11-07 22:53:01 +0000291DefaultStmt* DefaultStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000292 SourceLocation Loc = SourceLocation::ReadVal(D);
293 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
294
295 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
296 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
297
298 return stmt;
299}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000300
Ted Kremenekd7017492007-11-07 22:53:01 +0000301void DoStmt::directEmit(Serializer& S) const {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000302 S.Emit(DoLoc);
303 S.EmitOwnedPtr(getCond());
304 S.EmitOwnedPtr(getBody());
305}
306
Ted Kremenekd7017492007-11-07 22:53:01 +0000307DoStmt* DoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000308 SourceLocation DoLoc = SourceLocation::ReadVal(D);
309 Expr* Cond = D.ReadOwnedPtr<Expr>();
310 Stmt* Body = D.ReadOwnedPtr<Stmt>();
311 return new DoStmt(Body,Cond,DoLoc);
312}
313
Ted Kremenekd7017492007-11-07 22:53:01 +0000314void FloatingLiteral::directEmit(Serializer& S) const {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000315 S.Emit(Loc);
316 S.Emit(getType());
317 S.Emit(Value);
318}
319
Ted Kremenekd7017492007-11-07 22:53:01 +0000320FloatingLiteral* FloatingLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000321 SourceLocation Loc = SourceLocation::ReadVal(D);
322 QualType t = QualType::ReadVal(D);
323 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
324 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
325 return expr;
326}
327
Ted Kremenekd7017492007-11-07 22:53:01 +0000328void ForStmt::directEmit(Serializer& S) const {
Ted Kremenekf34da902007-11-07 08:02:55 +0000329 S.Emit(ForLoc);
330 S.EmitOwnedPtr(getInit());
331 S.EmitOwnedPtr(getCond());
332 S.EmitOwnedPtr(getInc());
333 S.EmitOwnedPtr(getBody());
334}
335
Ted Kremenekd7017492007-11-07 22:53:01 +0000336ForStmt* ForStmt::directMaterialize(Deserializer& D) {
Ted Kremenekf34da902007-11-07 08:02:55 +0000337 SourceLocation ForLoc = SourceLocation::ReadVal(D);
338 Stmt* Init = D.ReadOwnedPtr<Stmt>();
339 Expr* Cond = D.ReadOwnedPtr<Expr>();
340 Expr* Inc = D.ReadOwnedPtr<Expr>();
341 Stmt* Body = D.ReadOwnedPtr<Stmt>();
342 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
343}
344
Ted Kremenekd7017492007-11-07 22:53:01 +0000345void GotoStmt::directEmit(Serializer& S) const {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000346 S.Emit(GotoLoc);
347 S.Emit(LabelLoc);
348 S.EmitPtr(Label);
349}
350
Ted Kremenekd7017492007-11-07 22:53:01 +0000351GotoStmt* GotoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000352 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
353 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
354 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
355 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
356 return stmt;
357}
358
Ted Kremenekd7017492007-11-07 22:53:01 +0000359void IfStmt::directEmit(Serializer& S) const {
Ted Kremenekca22d352007-11-07 07:19:30 +0000360 S.Emit(IfLoc);
361 S.EmitOwnedPtr(getCond());
362 S.EmitOwnedPtr(getThen());
363 S.EmitOwnedPtr(getElse());
364}
365
Ted Kremenekd7017492007-11-07 22:53:01 +0000366IfStmt* IfStmt::directMaterialize(Deserializer& D) {
Ted Kremenekca22d352007-11-07 07:19:30 +0000367 SourceLocation L = SourceLocation::ReadVal(D);
368 Expr* Cond = D.ReadOwnedPtr<Expr>();
369 Stmt* Then = D.ReadOwnedPtr<Stmt>();
370 Stmt* Else = D.ReadOwnedPtr<Stmt>();
371 return new IfStmt(L,Cond,Then,Else);
372}
373
Ted Kremenekd7017492007-11-07 22:53:01 +0000374void ImaginaryLiteral::directEmit(Serializer& S) const {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000375 S.Emit(getType());
376 S.EmitOwnedPtr(Val);
377}
378
Ted Kremenekd7017492007-11-07 22:53:01 +0000379ImaginaryLiteral* ImaginaryLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000380 QualType t = QualType::ReadVal(D);
381 Expr* expr = D.ReadOwnedPtr<Expr>();
382 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
383 return new ImaginaryLiteral(expr,t);
384}
385
Ted Kremenekd7017492007-11-07 22:53:01 +0000386void ImplicitCastExpr::directEmit(Serializer& S) const {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000387 S.Emit(getType());
388 S.EmitOwnedPtr(Op);
389}
390
Ted Kremenekd7017492007-11-07 22:53:01 +0000391ImplicitCastExpr* ImplicitCastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000392 QualType t = QualType::ReadVal(D);
393 Expr* Op = D.ReadOwnedPtr<Expr>();
394 return new ImplicitCastExpr(t,Op);
395}
396
Ted Kremenekd7017492007-11-07 22:53:01 +0000397void IndirectGotoStmt::directEmit(Serializer& S) const {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000398 S.EmitPtr(Target);
399}
400
Ted Kremenekd7017492007-11-07 22:53:01 +0000401IndirectGotoStmt* IndirectGotoStmt::directMaterialize(Deserializer& D) {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000402 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
403 D.ReadPtr(stmt->Target); // The target may be backpatched.
404 return stmt;
405}
406
Ted Kremenekd7017492007-11-07 22:53:01 +0000407void IntegerLiteral::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000408 S.Emit(Loc);
409 S.Emit(getType());
410 S.Emit(getValue());
411}
412
Ted Kremenekd7017492007-11-07 22:53:01 +0000413IntegerLiteral* IntegerLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000414 SourceLocation Loc = SourceLocation::ReadVal(D);
415 QualType T = QualType::ReadVal(D);
416
417 // Create a dummy APInt because it is more efficient to deserialize
418 // it in place with the deserialized IntegerLiteral. (fewer copies)
419 llvm::APInt temp;
420 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
421 D.Read(expr->Value);
422
423 return expr;
424}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000425
Ted Kremenekd7017492007-11-07 22:53:01 +0000426void LabelStmt::directEmit(Serializer& S) const {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000427 S.EmitPtr(Label);
428 S.Emit(IdentLoc);
429 S.EmitOwnedPtr(SubStmt);
430}
431
Ted Kremenekd7017492007-11-07 22:53:01 +0000432LabelStmt* LabelStmt::directMaterialize(Deserializer& D) {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000433 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
434 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
435 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
436 return new LabelStmt(IdentLoc,Label,SubStmt);
437}
438
Ted Kremenekd7017492007-11-07 22:53:01 +0000439void NullStmt::directEmit(Serializer& S) const {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000440 S.Emit(SemiLoc);
441}
442
Ted Kremenekd7017492007-11-07 22:53:01 +0000443NullStmt* NullStmt::directMaterialize(Deserializer& D) {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000444 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
445 return new NullStmt(SemiLoc);
446}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000447
Ted Kremenekd7017492007-11-07 22:53:01 +0000448void ParenExpr::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000449 S.Emit(L);
450 S.Emit(R);
451 S.EmitOwnedPtr(Val);
452}
453
Ted Kremenekd7017492007-11-07 22:53:01 +0000454ParenExpr* ParenExpr::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000455 SourceLocation L = SourceLocation::ReadVal(D);
456 SourceLocation R = SourceLocation::ReadVal(D);
457 Expr* val = D.ReadOwnedPtr<Expr>();
458 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000459}
460
Ted Kremenekd7017492007-11-07 22:53:01 +0000461void PreDefinedExpr::directEmit(Serializer& S) const {
Ted Kremenek539a4182007-11-07 17:11:58 +0000462 S.Emit(Loc);
463 S.EmitInt(getIdentType());
464 S.Emit(getType());
465}
466
Ted Kremenekd7017492007-11-07 22:53:01 +0000467PreDefinedExpr* PreDefinedExpr::directMaterialize(Deserializer& D) {
Ted Kremenek539a4182007-11-07 17:11:58 +0000468 SourceLocation Loc = SourceLocation::ReadVal(D);
469 IdentType it = static_cast<IdentType>(D.ReadInt());
470 QualType Q = QualType::ReadVal(D);
471 return new PreDefinedExpr(Loc,Q,it);
472}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000473
Ted Kremenekd7017492007-11-07 22:53:01 +0000474void ReturnStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000475 S.Emit(RetLoc);
476 S.EmitOwnedPtr(RetExpr);
477}
478
Ted Kremenekd7017492007-11-07 22:53:01 +0000479ReturnStmt* ReturnStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000480 SourceLocation RetLoc = SourceLocation::ReadVal(D);
481 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
482 return new ReturnStmt(RetLoc,RetExpr);
483}
484
Ted Kremenekd7017492007-11-07 22:53:01 +0000485void StringLiteral::directEmit(Serializer& S) const {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000486 S.Emit(getType());
487 S.Emit(firstTokLoc);
488 S.Emit(lastTokLoc);
489 S.EmitBool(isWide());
490 S.Emit(getByteLength());
491
492 for (unsigned i = 0 ; i < ByteLength; ++i)
493 S.EmitInt(StrData[i]);
494}
495
Ted Kremenekd7017492007-11-07 22:53:01 +0000496StringLiteral* StringLiteral::directMaterialize(Deserializer& D) {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000497 QualType t = QualType::ReadVal(D);
498 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
499 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
500 bool isWide = D.ReadBool();
501 unsigned ByteLength = D.ReadInt();
502
503 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
504
505 char* StrData = new char[ByteLength];
506 for (unsigned i = 0; i < ByteLength; ++i)
507 StrData[i] = (char) D.ReadInt();
508
509 sl->ByteLength = ByteLength;
510 sl->StrData = StrData;
511
512 return sl;
513}
514
Ted Kremenekd7017492007-11-07 22:53:01 +0000515void SwitchStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000516 S.Emit(SwitchLoc);
517 S.EmitOwnedPtr(getCond());
518 S.EmitOwnedPtr(getBody());
519 S.EmitPtr(FirstCase);
520}
521
Ted Kremenekd7017492007-11-07 22:53:01 +0000522SwitchStmt* SwitchStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000523 SourceLocation Loc = SourceLocation::ReadVal(D);
524 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
525 Stmt* Body = D.ReadOwnedPtr<Stmt>();
526 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
527
528 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
529 stmt->setBody(Body,Loc);
530 stmt->FirstCase = FirstCase;
531
532 return stmt;
533}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000534
Ted Kremenekd7017492007-11-07 22:53:01 +0000535void WhileStmt::directEmit(Serializer& S) const {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000536 S.Emit(WhileLoc);
537 S.EmitOwnedPtr(getCond());
538 S.EmitOwnedPtr(getBody());
539}
540
Ted Kremenekd7017492007-11-07 22:53:01 +0000541WhileStmt* WhileStmt::directMaterialize(Deserializer& D) {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000542 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
543 Expr* Cond = D.ReadOwnedPtr<Expr>();
544 Stmt* Body = D.ReadOwnedPtr<Stmt>();
545 return new WhileStmt(Cond,Body,WhileLoc);
546}