blob: 4e13b98a691f1f9d004c540bcd39f59630885441 [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);
75
Ted Kremeneke7d27d52007-11-07 17:02:32 +000076 case IndirectGotoStmtClass:
77 return IndirectGotoStmt::directMaterialize(D);
78
Ted Kremenek47281102007-11-07 00:17:35 +000079 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000080 return IntegerLiteral::directMaterialize(D);
81
Ted Kremenek56a74bb2007-11-07 00:48:04 +000082 case LabelStmtClass:
83 return LabelStmt::directMaterialize(D);
84
Ted Kremenek25aaa262007-11-07 00:40:53 +000085 case NullStmtClass:
86 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000087
Ted Kremenek249d7cd2007-11-07 05:25:31 +000088 case ParenExprClass:
89 return ParenExpr::directMaterialize(D);
90
Ted Kremenek539a4182007-11-07 17:11:58 +000091 case PreDefinedExprClass:
92 return PreDefinedExpr::directMaterialize(D);
93
Ted Kremenek2bd6e652007-11-07 00:37:40 +000094 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +000095 return ReturnStmt::directMaterialize(D);
96
97 case SwitchStmtClass:
98 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +000099
100 case WhileStmtClass:
101 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000102 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000103}
104
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000105void BinaryOperator::directEmit(llvm::Serializer& S) const {
106 S.EmitInt(Opc);
107 S.Emit(OpLoc);;
108 S.Emit(getType());
109 S.EmitOwnedPtr(getLHS());
110 S.EmitOwnedPtr(getRHS());
111}
112
113BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
114 Opcode Opc = static_cast<Opcode>(D.ReadInt());
115 SourceLocation OpLoc = SourceLocation::ReadVal(D);
116 QualType Result = QualType::ReadVal(D);
117 Expr* LHS = D.ReadOwnedPtr<Expr>();
118 Expr* RHS = D.ReadOwnedPtr<Expr>();
119 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
120}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000121
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000122void BreakStmt::directEmit(llvm::Serializer& S) const {
123 S.Emit(BreakLoc);
124}
125
126BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
127 SourceLocation Loc = SourceLocation::ReadVal(D);
128 return new BreakStmt(Loc);
129}
130
131void CaseStmt::directEmit(llvm::Serializer& S) const {
132 S.Emit(CaseLoc);
133 S.EmitOwnedPtr(getLHS());
134 S.EmitOwnedPtr(getRHS());
135 S.EmitOwnedPtr(getSubStmt());
136 S.EmitPtr(getNextSwitchCase());
137}
138
139CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
140 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
141 Expr* LHS = D.ReadOwnedPtr<Expr>();
142 Expr* RHS = D.ReadOwnedPtr<Expr>();
143 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
144
145 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
146 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
147
148 return stmt;
149}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000150
Ted Kremenek42f440c2007-11-07 17:15:49 +0000151void CharacterLiteral::directEmit(llvm::Serializer& S) const {
152 S.Emit(Value);
153 S.Emit(Loc);
154 S.Emit(getType());
155}
156
157CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
158 unsigned value = D.ReadInt();
159 SourceLocation Loc = SourceLocation::ReadVal(D);
160 QualType T = QualType::ReadVal(D);
161 return new CharacterLiteral(value,T,Loc);
162}
163
Ted Kremenek47281102007-11-07 00:17:35 +0000164void CompoundStmt::directEmit(llvm::Serializer& S) const {
165 S.Emit(LBracLoc);
166 S.Emit(RBracLoc);
167 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000168
Ted Kremenek47281102007-11-07 00:17:35 +0000169 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000170 S.EmitOwnedPtr(*I);
171}
172
Ted Kremenek47281102007-11-07 00:17:35 +0000173CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
174 SourceLocation LB = SourceLocation::ReadVal(D);
175 SourceLocation RB = SourceLocation::ReadVal(D);
176 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000177
Ted Kremenek47281102007-11-07 00:17:35 +0000178 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
179
180 stmt->Body.reserve(size);
181
182 for (unsigned i = 0; i < size; ++i)
183 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
184
185 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000186}
Ted Kremenek47281102007-11-07 00:17:35 +0000187
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000188void ContinueStmt::directEmit(llvm::Serializer& S) const {
189 S.Emit(ContinueLoc);
190}
191
192ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
193 SourceLocation Loc = SourceLocation::ReadVal(D);
194 return new ContinueStmt(Loc);
195}
196
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000197void DeclStmt::directEmit(llvm::Serializer& S) const {
198 // FIXME: special handling for struct decls.
199 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000200}
201
202void DeclRefExpr::directEmit(llvm::Serializer& S) const {
203 S.Emit(Loc);
204 S.Emit(getType());
205 S.EmitPtr(getDecl());
206}
207
208DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
209 SourceLocation Loc = SourceLocation::ReadVal(D);
210 QualType T = QualType::ReadVal(D);
211 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
212 D.ReadPtr(dr->D,false);
213 return dr;
214}
215
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000216DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
217 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
218 return new DeclStmt(decl);
219}
220
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000221void DefaultStmt::directEmit(llvm::Serializer& S) const {
222 S.Emit(DefaultLoc);
223 S.EmitOwnedPtr(getSubStmt());
224 S.EmitPtr(getNextSwitchCase());
225}
226
227DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
228 SourceLocation Loc = SourceLocation::ReadVal(D);
229 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
230
231 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
232 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
233
234 return stmt;
235}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000236
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000237void DoStmt::directEmit(llvm::Serializer& S) const {
238 S.Emit(DoLoc);
239 S.EmitOwnedPtr(getCond());
240 S.EmitOwnedPtr(getBody());
241}
242
243DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
244 SourceLocation DoLoc = SourceLocation::ReadVal(D);
245 Expr* Cond = D.ReadOwnedPtr<Expr>();
246 Stmt* Body = D.ReadOwnedPtr<Stmt>();
247 return new DoStmt(Body,Cond,DoLoc);
248}
249
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000250void FloatingLiteral::directEmit(llvm::Serializer& S) const {
251 S.Emit(Loc);
252 S.Emit(getType());
253 S.Emit(Value);
254}
255
256FloatingLiteral* FloatingLiteral::directMaterialize(llvm::Deserializer& D) {
257 SourceLocation Loc = SourceLocation::ReadVal(D);
258 QualType t = QualType::ReadVal(D);
259 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
260 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
261 return expr;
262}
263
Ted Kremenekf34da902007-11-07 08:02:55 +0000264void ForStmt::directEmit(llvm::Serializer& S) const {
265 S.Emit(ForLoc);
266 S.EmitOwnedPtr(getInit());
267 S.EmitOwnedPtr(getCond());
268 S.EmitOwnedPtr(getInc());
269 S.EmitOwnedPtr(getBody());
270}
271
272ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
273 SourceLocation ForLoc = SourceLocation::ReadVal(D);
274 Stmt* Init = D.ReadOwnedPtr<Stmt>();
275 Expr* Cond = D.ReadOwnedPtr<Expr>();
276 Expr* Inc = D.ReadOwnedPtr<Expr>();
277 Stmt* Body = D.ReadOwnedPtr<Stmt>();
278 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
279}
280
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000281void GotoStmt::directEmit(llvm::Serializer& S) const {
282 S.Emit(GotoLoc);
283 S.Emit(LabelLoc);
284 S.EmitPtr(Label);
285}
286
287GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
288 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
289 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
290 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
291 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
292 return stmt;
293}
294
Ted Kremenekca22d352007-11-07 07:19:30 +0000295void IfStmt::directEmit(llvm::Serializer& S) const {
296 S.Emit(IfLoc);
297 S.EmitOwnedPtr(getCond());
298 S.EmitOwnedPtr(getThen());
299 S.EmitOwnedPtr(getElse());
300}
301
302IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
303 SourceLocation L = SourceLocation::ReadVal(D);
304 Expr* Cond = D.ReadOwnedPtr<Expr>();
305 Stmt* Then = D.ReadOwnedPtr<Stmt>();
306 Stmt* Else = D.ReadOwnedPtr<Stmt>();
307 return new IfStmt(L,Cond,Then,Else);
308}
309
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000310void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
311 S.EmitPtr(Target);
312}
313
314IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
315 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
316 D.ReadPtr(stmt->Target); // The target may be backpatched.
317 return stmt;
318}
319
Ted Kremenek47281102007-11-07 00:17:35 +0000320void IntegerLiteral::directEmit(llvm::Serializer& S) const {
321 S.Emit(Loc);
322 S.Emit(getType());
323 S.Emit(getValue());
324}
325
326IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
327 SourceLocation Loc = SourceLocation::ReadVal(D);
328 QualType T = QualType::ReadVal(D);
329
330 // Create a dummy APInt because it is more efficient to deserialize
331 // it in place with the deserialized IntegerLiteral. (fewer copies)
332 llvm::APInt temp;
333 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
334 D.Read(expr->Value);
335
336 return expr;
337}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000338
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000339void LabelStmt::directEmit(llvm::Serializer& S) const {
340 S.EmitPtr(Label);
341 S.Emit(IdentLoc);
342 S.EmitOwnedPtr(SubStmt);
343}
344
345LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
346 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
347 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
348 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
349 return new LabelStmt(IdentLoc,Label,SubStmt);
350}
351
Ted Kremenek25aaa262007-11-07 00:40:53 +0000352void NullStmt::directEmit(llvm::Serializer& S) const {
353 S.Emit(SemiLoc);
354}
355
356NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
357 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
358 return new NullStmt(SemiLoc);
359}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000360
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000361void ParenExpr::directEmit(llvm::Serializer& S) const {
362 S.Emit(L);
363 S.Emit(R);
364 S.EmitOwnedPtr(Val);
365}
366
367ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
368 SourceLocation L = SourceLocation::ReadVal(D);
369 SourceLocation R = SourceLocation::ReadVal(D);
370 Expr* val = D.ReadOwnedPtr<Expr>();
371 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000372}
373
374void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
375 S.Emit(Loc);
376 S.EmitInt(getIdentType());
377 S.Emit(getType());
378}
379
380PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
381 SourceLocation Loc = SourceLocation::ReadVal(D);
382 IdentType it = static_cast<IdentType>(D.ReadInt());
383 QualType Q = QualType::ReadVal(D);
384 return new PreDefinedExpr(Loc,Q,it);
385}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000386
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000387void ReturnStmt::directEmit(llvm::Serializer& S) const {
388 S.Emit(RetLoc);
389 S.EmitOwnedPtr(RetExpr);
390}
391
392ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
393 SourceLocation RetLoc = SourceLocation::ReadVal(D);
394 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
395 return new ReturnStmt(RetLoc,RetExpr);
396}
397
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000398void SwitchStmt::directEmit(llvm::Serializer& S) const {
399 S.Emit(SwitchLoc);
400 S.EmitOwnedPtr(getCond());
401 S.EmitOwnedPtr(getBody());
402 S.EmitPtr(FirstCase);
403}
404
405SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
406 SourceLocation Loc = SourceLocation::ReadVal(D);
407 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
408 Stmt* Body = D.ReadOwnedPtr<Stmt>();
409 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
410
411 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
412 stmt->setBody(Body,Loc);
413 stmt->FirstCase = FirstCase;
414
415 return stmt;
416}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000417
418void WhileStmt::directEmit(llvm::Serializer& S) const {
419 S.Emit(WhileLoc);
420 S.EmitOwnedPtr(getCond());
421 S.EmitOwnedPtr(getBody());
422}
423
424WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
425 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
426 Expr* Cond = D.ReadOwnedPtr<Expr>();
427 Stmt* Body = D.ReadOwnedPtr<Stmt>();
428 return new WhileStmt(Cond,Body,WhileLoc);
429}