blob: 7c671c6a31c9bbcdd3b25b0b463d7d220c07b828 [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 {
22 S.EmitInt(getStmtClass());
23 directEmit(S);
24}
Ted Kremenek215c2c82007-10-31 18:41:19 +000025
Ted Kremenek47281102007-11-07 00:17:35 +000026Stmt* Stmt::Materialize(llvm::Deserializer& D) {
27 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremenek215c2c82007-10-31 18:41:19 +000028
Ted Kremenek47281102007-11-07 00:17:35 +000029 switch (SC) {
30 default:
31 assert (false && "Not implemented.");
32 return NULL;
Ted Kremenek2bd6e652007-11-07 00:37:40 +000033
34 case BinaryOperatorClass:
35 return BinaryOperator::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000036
Ted Kremenek249d7cd2007-11-07 05:25:31 +000037 case BreakStmtClass:
38 return BreakStmt::directMaterialize(D);
39
40 case CaseStmtClass:
41 return CaseStmt::directMaterialize(D);
42
Ted Kremenek42f440c2007-11-07 17:15:49 +000043 case CharacterLiteralClass:
44 return CharacterLiteral::directMaterialize(D);
45
Ted Kremenek47281102007-11-07 00:17:35 +000046 case CompoundStmtClass:
47 return CompoundStmt::directMaterialize(D);
48
Ted Kremenek6c4dba72007-11-07 17:05:07 +000049 case ContinueStmtClass:
50 return ContinueStmt::directMaterialize(D);
51
Ted Kremenek47281102007-11-07 00:17:35 +000052 case DeclRefExprClass:
53 return DeclRefExpr::directMaterialize(D);
54
Ted Kremenek2bd6e652007-11-07 00:37:40 +000055 case DeclStmtClass:
56 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000057
58 case DefaultStmtClass:
59 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000060
61 case DoStmtClass:
62 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000063
64 case FloatingLiteralClass:
65 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000066
67 case ForStmtClass:
68 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000069
70 case GotoStmtClass:
71 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000072
Ted Kremenekca22d352007-11-07 07:19:30 +000073 case IfStmtClass:
74 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000075
76 case ImaginaryLiteralClass:
77 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000078
Ted Kremeneke7d27d52007-11-07 17:02:32 +000079 case IndirectGotoStmtClass:
80 return IndirectGotoStmt::directMaterialize(D);
81
Ted Kremenek47281102007-11-07 00:17:35 +000082 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000083 return IntegerLiteral::directMaterialize(D);
84
Ted Kremenek56a74bb2007-11-07 00:48:04 +000085 case LabelStmtClass:
86 return LabelStmt::directMaterialize(D);
87
Ted Kremenek25aaa262007-11-07 00:40:53 +000088 case NullStmtClass:
89 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000090
Ted Kremenek249d7cd2007-11-07 05:25:31 +000091 case ParenExprClass:
92 return ParenExpr::directMaterialize(D);
93
Ted Kremenek539a4182007-11-07 17:11:58 +000094 case PreDefinedExprClass:
95 return PreDefinedExpr::directMaterialize(D);
96
Ted Kremenek2bd6e652007-11-07 00:37:40 +000097 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +000098 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +000099
100 case StringLiteralClass:
101 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000102
103 case SwitchStmtClass:
104 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000105
106 case WhileStmtClass:
107 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000108 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000109}
110
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000111void BinaryOperator::directEmit(llvm::Serializer& S) const {
112 S.EmitInt(Opc);
113 S.Emit(OpLoc);;
114 S.Emit(getType());
115 S.EmitOwnedPtr(getLHS());
116 S.EmitOwnedPtr(getRHS());
117}
118
119BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
120 Opcode Opc = static_cast<Opcode>(D.ReadInt());
121 SourceLocation OpLoc = SourceLocation::ReadVal(D);
122 QualType Result = QualType::ReadVal(D);
123 Expr* LHS = D.ReadOwnedPtr<Expr>();
124 Expr* RHS = D.ReadOwnedPtr<Expr>();
125 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
126}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000127
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000128void BreakStmt::directEmit(llvm::Serializer& S) const {
129 S.Emit(BreakLoc);
130}
131
132BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
133 SourceLocation Loc = SourceLocation::ReadVal(D);
134 return new BreakStmt(Loc);
135}
136
137void CaseStmt::directEmit(llvm::Serializer& S) const {
138 S.Emit(CaseLoc);
139 S.EmitOwnedPtr(getLHS());
140 S.EmitOwnedPtr(getRHS());
141 S.EmitOwnedPtr(getSubStmt());
142 S.EmitPtr(getNextSwitchCase());
143}
144
145CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
146 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
147 Expr* LHS = D.ReadOwnedPtr<Expr>();
148 Expr* RHS = D.ReadOwnedPtr<Expr>();
149 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
150
151 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
152 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
153
154 return stmt;
155}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000156
Ted Kremenek42f440c2007-11-07 17:15:49 +0000157void CharacterLiteral::directEmit(llvm::Serializer& S) const {
158 S.Emit(Value);
159 S.Emit(Loc);
160 S.Emit(getType());
161}
162
163CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
164 unsigned value = D.ReadInt();
165 SourceLocation Loc = SourceLocation::ReadVal(D);
166 QualType T = QualType::ReadVal(D);
167 return new CharacterLiteral(value,T,Loc);
168}
169
Ted Kremenek47281102007-11-07 00:17:35 +0000170void CompoundStmt::directEmit(llvm::Serializer& S) const {
171 S.Emit(LBracLoc);
172 S.Emit(RBracLoc);
173 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000174
Ted Kremenek47281102007-11-07 00:17:35 +0000175 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000176 S.EmitOwnedPtr(*I);
177}
178
Ted Kremenek47281102007-11-07 00:17:35 +0000179CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
180 SourceLocation LB = SourceLocation::ReadVal(D);
181 SourceLocation RB = SourceLocation::ReadVal(D);
182 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000183
Ted Kremenek47281102007-11-07 00:17:35 +0000184 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
185
186 stmt->Body.reserve(size);
187
188 for (unsigned i = 0; i < size; ++i)
189 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
190
191 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000192}
Ted Kremenek47281102007-11-07 00:17:35 +0000193
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000194void ContinueStmt::directEmit(llvm::Serializer& S) const {
195 S.Emit(ContinueLoc);
196}
197
198ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
199 SourceLocation Loc = SourceLocation::ReadVal(D);
200 return new ContinueStmt(Loc);
201}
202
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000203void DeclStmt::directEmit(llvm::Serializer& S) const {
204 // FIXME: special handling for struct decls.
205 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000206}
207
208void DeclRefExpr::directEmit(llvm::Serializer& S) const {
209 S.Emit(Loc);
210 S.Emit(getType());
211 S.EmitPtr(getDecl());
212}
213
214DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
215 SourceLocation Loc = SourceLocation::ReadVal(D);
216 QualType T = QualType::ReadVal(D);
217 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
218 D.ReadPtr(dr->D,false);
219 return dr;
220}
221
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000222DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
223 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
224 return new DeclStmt(decl);
225}
226
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000227void DefaultStmt::directEmit(llvm::Serializer& S) const {
228 S.Emit(DefaultLoc);
229 S.EmitOwnedPtr(getSubStmt());
230 S.EmitPtr(getNextSwitchCase());
231}
232
233DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
234 SourceLocation Loc = SourceLocation::ReadVal(D);
235 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
236
237 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
238 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
239
240 return stmt;
241}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000242
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000243void DoStmt::directEmit(llvm::Serializer& S) const {
244 S.Emit(DoLoc);
245 S.EmitOwnedPtr(getCond());
246 S.EmitOwnedPtr(getBody());
247}
248
249DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
250 SourceLocation DoLoc = SourceLocation::ReadVal(D);
251 Expr* Cond = D.ReadOwnedPtr<Expr>();
252 Stmt* Body = D.ReadOwnedPtr<Stmt>();
253 return new DoStmt(Body,Cond,DoLoc);
254}
255
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000256void FloatingLiteral::directEmit(llvm::Serializer& S) const {
257 S.Emit(Loc);
258 S.Emit(getType());
259 S.Emit(Value);
260}
261
262FloatingLiteral* FloatingLiteral::directMaterialize(llvm::Deserializer& D) {
263 SourceLocation Loc = SourceLocation::ReadVal(D);
264 QualType t = QualType::ReadVal(D);
265 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
266 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
267 return expr;
268}
269
Ted Kremenekf34da902007-11-07 08:02:55 +0000270void ForStmt::directEmit(llvm::Serializer& S) const {
271 S.Emit(ForLoc);
272 S.EmitOwnedPtr(getInit());
273 S.EmitOwnedPtr(getCond());
274 S.EmitOwnedPtr(getInc());
275 S.EmitOwnedPtr(getBody());
276}
277
278ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
279 SourceLocation ForLoc = SourceLocation::ReadVal(D);
280 Stmt* Init = D.ReadOwnedPtr<Stmt>();
281 Expr* Cond = D.ReadOwnedPtr<Expr>();
282 Expr* Inc = D.ReadOwnedPtr<Expr>();
283 Stmt* Body = D.ReadOwnedPtr<Stmt>();
284 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
285}
286
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000287void GotoStmt::directEmit(llvm::Serializer& S) const {
288 S.Emit(GotoLoc);
289 S.Emit(LabelLoc);
290 S.EmitPtr(Label);
291}
292
293GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
294 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
295 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
296 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
297 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
298 return stmt;
299}
300
Ted Kremenekca22d352007-11-07 07:19:30 +0000301void IfStmt::directEmit(llvm::Serializer& S) const {
302 S.Emit(IfLoc);
303 S.EmitOwnedPtr(getCond());
304 S.EmitOwnedPtr(getThen());
305 S.EmitOwnedPtr(getElse());
306}
307
308IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
309 SourceLocation L = SourceLocation::ReadVal(D);
310 Expr* Cond = D.ReadOwnedPtr<Expr>();
311 Stmt* Then = D.ReadOwnedPtr<Stmt>();
312 Stmt* Else = D.ReadOwnedPtr<Stmt>();
313 return new IfStmt(L,Cond,Then,Else);
314}
315
Ted Kremenek105f21a2007-11-07 18:53:02 +0000316void ImaginaryLiteral::directEmit(llvm::Serializer& S) const {
317 S.Emit(getType());
318 S.EmitOwnedPtr(Val);
319}
320
321ImaginaryLiteral* ImaginaryLiteral::directMaterialize(llvm::Deserializer& D) {
322 QualType t = QualType::ReadVal(D);
323 Expr* expr = D.ReadOwnedPtr<Expr>();
324 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
325 return new ImaginaryLiteral(expr,t);
326}
327
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000328void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
329 S.EmitPtr(Target);
330}
331
332IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
333 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
334 D.ReadPtr(stmt->Target); // The target may be backpatched.
335 return stmt;
336}
337
Ted Kremenek47281102007-11-07 00:17:35 +0000338void IntegerLiteral::directEmit(llvm::Serializer& S) const {
339 S.Emit(Loc);
340 S.Emit(getType());
341 S.Emit(getValue());
342}
343
344IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
345 SourceLocation Loc = SourceLocation::ReadVal(D);
346 QualType T = QualType::ReadVal(D);
347
348 // Create a dummy APInt because it is more efficient to deserialize
349 // it in place with the deserialized IntegerLiteral. (fewer copies)
350 llvm::APInt temp;
351 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
352 D.Read(expr->Value);
353
354 return expr;
355}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000356
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000357void LabelStmt::directEmit(llvm::Serializer& S) const {
358 S.EmitPtr(Label);
359 S.Emit(IdentLoc);
360 S.EmitOwnedPtr(SubStmt);
361}
362
363LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
364 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
365 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
366 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
367 return new LabelStmt(IdentLoc,Label,SubStmt);
368}
369
Ted Kremenek25aaa262007-11-07 00:40:53 +0000370void NullStmt::directEmit(llvm::Serializer& S) const {
371 S.Emit(SemiLoc);
372}
373
374NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
375 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
376 return new NullStmt(SemiLoc);
377}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000378
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000379void ParenExpr::directEmit(llvm::Serializer& S) const {
380 S.Emit(L);
381 S.Emit(R);
382 S.EmitOwnedPtr(Val);
383}
384
385ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
386 SourceLocation L = SourceLocation::ReadVal(D);
387 SourceLocation R = SourceLocation::ReadVal(D);
388 Expr* val = D.ReadOwnedPtr<Expr>();
389 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000390}
391
392void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
393 S.Emit(Loc);
394 S.EmitInt(getIdentType());
395 S.Emit(getType());
396}
397
398PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
399 SourceLocation Loc = SourceLocation::ReadVal(D);
400 IdentType it = static_cast<IdentType>(D.ReadInt());
401 QualType Q = QualType::ReadVal(D);
402 return new PreDefinedExpr(Loc,Q,it);
403}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000404
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000405void ReturnStmt::directEmit(llvm::Serializer& S) const {
406 S.Emit(RetLoc);
407 S.EmitOwnedPtr(RetExpr);
408}
409
410ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
411 SourceLocation RetLoc = SourceLocation::ReadVal(D);
412 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
413 return new ReturnStmt(RetLoc,RetExpr);
414}
415
Ted Kremenekefa540d2007-11-07 19:08:19 +0000416void StringLiteral::directEmit(llvm::Serializer& S) const {
417 S.Emit(getType());
418 S.Emit(firstTokLoc);
419 S.Emit(lastTokLoc);
420 S.EmitBool(isWide());
421 S.Emit(getByteLength());
422
423 for (unsigned i = 0 ; i < ByteLength; ++i)
424 S.EmitInt(StrData[i]);
425}
426
427StringLiteral* StringLiteral::directMaterialize(llvm::Deserializer& D) {
428 QualType t = QualType::ReadVal(D);
429 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
430 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
431 bool isWide = D.ReadBool();
432 unsigned ByteLength = D.ReadInt();
433
434 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
435
436 char* StrData = new char[ByteLength];
437 for (unsigned i = 0; i < ByteLength; ++i)
438 StrData[i] = (char) D.ReadInt();
439
440 sl->ByteLength = ByteLength;
441 sl->StrData = StrData;
442
443 return sl;
444}
445
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000446void SwitchStmt::directEmit(llvm::Serializer& S) const {
447 S.Emit(SwitchLoc);
448 S.EmitOwnedPtr(getCond());
449 S.EmitOwnedPtr(getBody());
450 S.EmitPtr(FirstCase);
451}
452
453SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
454 SourceLocation Loc = SourceLocation::ReadVal(D);
455 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
456 Stmt* Body = D.ReadOwnedPtr<Stmt>();
457 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
458
459 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
460 stmt->setBody(Body,Loc);
461 stmt->FirstCase = FirstCase;
462
463 return stmt;
464}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000465
466void WhileStmt::directEmit(llvm::Serializer& S) const {
467 S.Emit(WhileLoc);
468 S.EmitOwnedPtr(getCond());
469 S.EmitOwnedPtr(getBody());
470}
471
472WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
473 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
474 Expr* Cond = D.ReadOwnedPtr<Expr>();
475 Stmt* Body = D.ReadOwnedPtr<Stmt>();
476 return new WhileStmt(Cond,Body,WhileLoc);
477}