blob: ffe4312e63e9240ed8bb1e0207beff5e9c322491 [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);
99
100 case SwitchStmtClass:
101 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000102
103 case WhileStmtClass:
104 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000105 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000106}
107
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000108void BinaryOperator::directEmit(llvm::Serializer& S) const {
109 S.EmitInt(Opc);
110 S.Emit(OpLoc);;
111 S.Emit(getType());
112 S.EmitOwnedPtr(getLHS());
113 S.EmitOwnedPtr(getRHS());
114}
115
116BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
117 Opcode Opc = static_cast<Opcode>(D.ReadInt());
118 SourceLocation OpLoc = SourceLocation::ReadVal(D);
119 QualType Result = QualType::ReadVal(D);
120 Expr* LHS = D.ReadOwnedPtr<Expr>();
121 Expr* RHS = D.ReadOwnedPtr<Expr>();
122 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
123}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000124
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000125void BreakStmt::directEmit(llvm::Serializer& S) const {
126 S.Emit(BreakLoc);
127}
128
129BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
130 SourceLocation Loc = SourceLocation::ReadVal(D);
131 return new BreakStmt(Loc);
132}
133
134void CaseStmt::directEmit(llvm::Serializer& S) const {
135 S.Emit(CaseLoc);
136 S.EmitOwnedPtr(getLHS());
137 S.EmitOwnedPtr(getRHS());
138 S.EmitOwnedPtr(getSubStmt());
139 S.EmitPtr(getNextSwitchCase());
140}
141
142CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
143 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
144 Expr* LHS = D.ReadOwnedPtr<Expr>();
145 Expr* RHS = D.ReadOwnedPtr<Expr>();
146 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
147
148 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
149 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
150
151 return stmt;
152}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000153
Ted Kremenek42f440c2007-11-07 17:15:49 +0000154void CharacterLiteral::directEmit(llvm::Serializer& S) const {
155 S.Emit(Value);
156 S.Emit(Loc);
157 S.Emit(getType());
158}
159
160CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
161 unsigned value = D.ReadInt();
162 SourceLocation Loc = SourceLocation::ReadVal(D);
163 QualType T = QualType::ReadVal(D);
164 return new CharacterLiteral(value,T,Loc);
165}
166
Ted Kremenek47281102007-11-07 00:17:35 +0000167void CompoundStmt::directEmit(llvm::Serializer& S) const {
168 S.Emit(LBracLoc);
169 S.Emit(RBracLoc);
170 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000171
Ted Kremenek47281102007-11-07 00:17:35 +0000172 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000173 S.EmitOwnedPtr(*I);
174}
175
Ted Kremenek47281102007-11-07 00:17:35 +0000176CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
177 SourceLocation LB = SourceLocation::ReadVal(D);
178 SourceLocation RB = SourceLocation::ReadVal(D);
179 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000180
Ted Kremenek47281102007-11-07 00:17:35 +0000181 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
182
183 stmt->Body.reserve(size);
184
185 for (unsigned i = 0; i < size; ++i)
186 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
187
188 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000189}
Ted Kremenek47281102007-11-07 00:17:35 +0000190
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000191void ContinueStmt::directEmit(llvm::Serializer& S) const {
192 S.Emit(ContinueLoc);
193}
194
195ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
196 SourceLocation Loc = SourceLocation::ReadVal(D);
197 return new ContinueStmt(Loc);
198}
199
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000200void DeclStmt::directEmit(llvm::Serializer& S) const {
201 // FIXME: special handling for struct decls.
202 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000203}
204
205void DeclRefExpr::directEmit(llvm::Serializer& S) const {
206 S.Emit(Loc);
207 S.Emit(getType());
208 S.EmitPtr(getDecl());
209}
210
211DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
212 SourceLocation Loc = SourceLocation::ReadVal(D);
213 QualType T = QualType::ReadVal(D);
214 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
215 D.ReadPtr(dr->D,false);
216 return dr;
217}
218
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000219DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
220 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
221 return new DeclStmt(decl);
222}
223
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000224void DefaultStmt::directEmit(llvm::Serializer& S) const {
225 S.Emit(DefaultLoc);
226 S.EmitOwnedPtr(getSubStmt());
227 S.EmitPtr(getNextSwitchCase());
228}
229
230DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
231 SourceLocation Loc = SourceLocation::ReadVal(D);
232 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
233
234 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
235 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
236
237 return stmt;
238}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000239
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000240void DoStmt::directEmit(llvm::Serializer& S) const {
241 S.Emit(DoLoc);
242 S.EmitOwnedPtr(getCond());
243 S.EmitOwnedPtr(getBody());
244}
245
246DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
247 SourceLocation DoLoc = SourceLocation::ReadVal(D);
248 Expr* Cond = D.ReadOwnedPtr<Expr>();
249 Stmt* Body = D.ReadOwnedPtr<Stmt>();
250 return new DoStmt(Body,Cond,DoLoc);
251}
252
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000253void FloatingLiteral::directEmit(llvm::Serializer& S) const {
254 S.Emit(Loc);
255 S.Emit(getType());
256 S.Emit(Value);
257}
258
259FloatingLiteral* FloatingLiteral::directMaterialize(llvm::Deserializer& D) {
260 SourceLocation Loc = SourceLocation::ReadVal(D);
261 QualType t = QualType::ReadVal(D);
262 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
263 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
264 return expr;
265}
266
Ted Kremenekf34da902007-11-07 08:02:55 +0000267void ForStmt::directEmit(llvm::Serializer& S) const {
268 S.Emit(ForLoc);
269 S.EmitOwnedPtr(getInit());
270 S.EmitOwnedPtr(getCond());
271 S.EmitOwnedPtr(getInc());
272 S.EmitOwnedPtr(getBody());
273}
274
275ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
276 SourceLocation ForLoc = SourceLocation::ReadVal(D);
277 Stmt* Init = D.ReadOwnedPtr<Stmt>();
278 Expr* Cond = D.ReadOwnedPtr<Expr>();
279 Expr* Inc = D.ReadOwnedPtr<Expr>();
280 Stmt* Body = D.ReadOwnedPtr<Stmt>();
281 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
282}
283
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000284void GotoStmt::directEmit(llvm::Serializer& S) const {
285 S.Emit(GotoLoc);
286 S.Emit(LabelLoc);
287 S.EmitPtr(Label);
288}
289
290GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
291 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
292 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
293 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
294 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
295 return stmt;
296}
297
Ted Kremenekca22d352007-11-07 07:19:30 +0000298void IfStmt::directEmit(llvm::Serializer& S) const {
299 S.Emit(IfLoc);
300 S.EmitOwnedPtr(getCond());
301 S.EmitOwnedPtr(getThen());
302 S.EmitOwnedPtr(getElse());
303}
304
305IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
306 SourceLocation L = SourceLocation::ReadVal(D);
307 Expr* Cond = D.ReadOwnedPtr<Expr>();
308 Stmt* Then = D.ReadOwnedPtr<Stmt>();
309 Stmt* Else = D.ReadOwnedPtr<Stmt>();
310 return new IfStmt(L,Cond,Then,Else);
311}
312
Ted Kremenek105f21a2007-11-07 18:53:02 +0000313void ImaginaryLiteral::directEmit(llvm::Serializer& S) const {
314 S.Emit(getType());
315 S.EmitOwnedPtr(Val);
316}
317
318ImaginaryLiteral* ImaginaryLiteral::directMaterialize(llvm::Deserializer& D) {
319 QualType t = QualType::ReadVal(D);
320 Expr* expr = D.ReadOwnedPtr<Expr>();
321 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
322 return new ImaginaryLiteral(expr,t);
323}
324
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000325void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
326 S.EmitPtr(Target);
327}
328
329IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
330 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
331 D.ReadPtr(stmt->Target); // The target may be backpatched.
332 return stmt;
333}
334
Ted Kremenek47281102007-11-07 00:17:35 +0000335void IntegerLiteral::directEmit(llvm::Serializer& S) const {
336 S.Emit(Loc);
337 S.Emit(getType());
338 S.Emit(getValue());
339}
340
341IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
342 SourceLocation Loc = SourceLocation::ReadVal(D);
343 QualType T = QualType::ReadVal(D);
344
345 // Create a dummy APInt because it is more efficient to deserialize
346 // it in place with the deserialized IntegerLiteral. (fewer copies)
347 llvm::APInt temp;
348 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
349 D.Read(expr->Value);
350
351 return expr;
352}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000353
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000354void LabelStmt::directEmit(llvm::Serializer& S) const {
355 S.EmitPtr(Label);
356 S.Emit(IdentLoc);
357 S.EmitOwnedPtr(SubStmt);
358}
359
360LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
361 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
362 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
363 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
364 return new LabelStmt(IdentLoc,Label,SubStmt);
365}
366
Ted Kremenek25aaa262007-11-07 00:40:53 +0000367void NullStmt::directEmit(llvm::Serializer& S) const {
368 S.Emit(SemiLoc);
369}
370
371NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
372 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
373 return new NullStmt(SemiLoc);
374}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000375
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000376void ParenExpr::directEmit(llvm::Serializer& S) const {
377 S.Emit(L);
378 S.Emit(R);
379 S.EmitOwnedPtr(Val);
380}
381
382ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
383 SourceLocation L = SourceLocation::ReadVal(D);
384 SourceLocation R = SourceLocation::ReadVal(D);
385 Expr* val = D.ReadOwnedPtr<Expr>();
386 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000387}
388
389void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
390 S.Emit(Loc);
391 S.EmitInt(getIdentType());
392 S.Emit(getType());
393}
394
395PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
396 SourceLocation Loc = SourceLocation::ReadVal(D);
397 IdentType it = static_cast<IdentType>(D.ReadInt());
398 QualType Q = QualType::ReadVal(D);
399 return new PreDefinedExpr(Loc,Q,it);
400}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000401
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000402void ReturnStmt::directEmit(llvm::Serializer& S) const {
403 S.Emit(RetLoc);
404 S.EmitOwnedPtr(RetExpr);
405}
406
407ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
408 SourceLocation RetLoc = SourceLocation::ReadVal(D);
409 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
410 return new ReturnStmt(RetLoc,RetExpr);
411}
412
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000413void SwitchStmt::directEmit(llvm::Serializer& S) const {
414 S.Emit(SwitchLoc);
415 S.EmitOwnedPtr(getCond());
416 S.EmitOwnedPtr(getBody());
417 S.EmitPtr(FirstCase);
418}
419
420SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
421 SourceLocation Loc = SourceLocation::ReadVal(D);
422 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
423 Stmt* Body = D.ReadOwnedPtr<Stmt>();
424 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
425
426 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
427 stmt->setBody(Body,Loc);
428 stmt->FirstCase = FirstCase;
429
430 return stmt;
431}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000432
433void WhileStmt::directEmit(llvm::Serializer& S) const {
434 S.Emit(WhileLoc);
435 S.EmitOwnedPtr(getCond());
436 S.EmitOwnedPtr(getBody());
437}
438
439WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
440 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
441 Expr* Cond = D.ReadOwnedPtr<Expr>();
442 Stmt* Body = D.ReadOwnedPtr<Stmt>();
443 return new WhileStmt(Cond,Body,WhileLoc);
444}