blob: 0cff7c5e6744527e5b016950e5db22fcc69ba053 [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 Kremenekf34da902007-11-07 08:02:55 +000063
64 case ForStmtClass:
65 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000066
67 case GotoStmtClass:
68 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000069
Ted Kremenekca22d352007-11-07 07:19:30 +000070 case IfStmtClass:
71 return IfStmt::directMaterialize(D);
72
Ted Kremeneke7d27d52007-11-07 17:02:32 +000073 case IndirectGotoStmtClass:
74 return IndirectGotoStmt::directMaterialize(D);
75
Ted Kremenek47281102007-11-07 00:17:35 +000076 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000077 return IntegerLiteral::directMaterialize(D);
78
Ted Kremenek56a74bb2007-11-07 00:48:04 +000079 case LabelStmtClass:
80 return LabelStmt::directMaterialize(D);
81
Ted Kremenek25aaa262007-11-07 00:40:53 +000082 case NullStmtClass:
83 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000084
Ted Kremenek249d7cd2007-11-07 05:25:31 +000085 case ParenExprClass:
86 return ParenExpr::directMaterialize(D);
87
Ted Kremenek539a4182007-11-07 17:11:58 +000088 case PreDefinedExprClass:
89 return PreDefinedExpr::directMaterialize(D);
90
Ted Kremenek2bd6e652007-11-07 00:37:40 +000091 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +000092 return ReturnStmt::directMaterialize(D);
93
94 case SwitchStmtClass:
95 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +000096
97 case WhileStmtClass:
98 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000099 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000100}
101
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000102void BinaryOperator::directEmit(llvm::Serializer& S) const {
103 S.EmitInt(Opc);
104 S.Emit(OpLoc);;
105 S.Emit(getType());
106 S.EmitOwnedPtr(getLHS());
107 S.EmitOwnedPtr(getRHS());
108}
109
110BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
111 Opcode Opc = static_cast<Opcode>(D.ReadInt());
112 SourceLocation OpLoc = SourceLocation::ReadVal(D);
113 QualType Result = QualType::ReadVal(D);
114 Expr* LHS = D.ReadOwnedPtr<Expr>();
115 Expr* RHS = D.ReadOwnedPtr<Expr>();
116 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
117}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000118
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000119void BreakStmt::directEmit(llvm::Serializer& S) const {
120 S.Emit(BreakLoc);
121}
122
123BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
124 SourceLocation Loc = SourceLocation::ReadVal(D);
125 return new BreakStmt(Loc);
126}
127
128void CaseStmt::directEmit(llvm::Serializer& S) const {
129 S.Emit(CaseLoc);
130 S.EmitOwnedPtr(getLHS());
131 S.EmitOwnedPtr(getRHS());
132 S.EmitOwnedPtr(getSubStmt());
133 S.EmitPtr(getNextSwitchCase());
134}
135
136CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
137 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
138 Expr* LHS = D.ReadOwnedPtr<Expr>();
139 Expr* RHS = D.ReadOwnedPtr<Expr>();
140 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
141
142 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
143 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
144
145 return stmt;
146}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000147
Ted Kremenek42f440c2007-11-07 17:15:49 +0000148void CharacterLiteral::directEmit(llvm::Serializer& S) const {
149 S.Emit(Value);
150 S.Emit(Loc);
151 S.Emit(getType());
152}
153
154CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
155 unsigned value = D.ReadInt();
156 SourceLocation Loc = SourceLocation::ReadVal(D);
157 QualType T = QualType::ReadVal(D);
158 return new CharacterLiteral(value,T,Loc);
159}
160
Ted Kremenek47281102007-11-07 00:17:35 +0000161void CompoundStmt::directEmit(llvm::Serializer& S) const {
162 S.Emit(LBracLoc);
163 S.Emit(RBracLoc);
164 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000165
Ted Kremenek47281102007-11-07 00:17:35 +0000166 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000167 S.EmitOwnedPtr(*I);
168}
169
Ted Kremenek47281102007-11-07 00:17:35 +0000170CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
171 SourceLocation LB = SourceLocation::ReadVal(D);
172 SourceLocation RB = SourceLocation::ReadVal(D);
173 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000174
Ted Kremenek47281102007-11-07 00:17:35 +0000175 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
176
177 stmt->Body.reserve(size);
178
179 for (unsigned i = 0; i < size; ++i)
180 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
181
182 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000183}
Ted Kremenek47281102007-11-07 00:17:35 +0000184
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000185void ContinueStmt::directEmit(llvm::Serializer& S) const {
186 S.Emit(ContinueLoc);
187}
188
189ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
190 SourceLocation Loc = SourceLocation::ReadVal(D);
191 return new ContinueStmt(Loc);
192}
193
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000194void DeclStmt::directEmit(llvm::Serializer& S) const {
195 // FIXME: special handling for struct decls.
196 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000197}
198
199void DeclRefExpr::directEmit(llvm::Serializer& S) const {
200 S.Emit(Loc);
201 S.Emit(getType());
202 S.EmitPtr(getDecl());
203}
204
205DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
206 SourceLocation Loc = SourceLocation::ReadVal(D);
207 QualType T = QualType::ReadVal(D);
208 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
209 D.ReadPtr(dr->D,false);
210 return dr;
211}
212
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000213DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
214 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
215 return new DeclStmt(decl);
216}
217
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000218void DefaultStmt::directEmit(llvm::Serializer& S) const {
219 S.Emit(DefaultLoc);
220 S.EmitOwnedPtr(getSubStmt());
221 S.EmitPtr(getNextSwitchCase());
222}
223
224DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
225 SourceLocation Loc = SourceLocation::ReadVal(D);
226 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
227
228 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
229 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
230
231 return stmt;
232}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000233
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000234void DoStmt::directEmit(llvm::Serializer& S) const {
235 S.Emit(DoLoc);
236 S.EmitOwnedPtr(getCond());
237 S.EmitOwnedPtr(getBody());
238}
239
240DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
241 SourceLocation DoLoc = SourceLocation::ReadVal(D);
242 Expr* Cond = D.ReadOwnedPtr<Expr>();
243 Stmt* Body = D.ReadOwnedPtr<Stmt>();
244 return new DoStmt(Body,Cond,DoLoc);
245}
246
Ted Kremenekf34da902007-11-07 08:02:55 +0000247void ForStmt::directEmit(llvm::Serializer& S) const {
248 S.Emit(ForLoc);
249 S.EmitOwnedPtr(getInit());
250 S.EmitOwnedPtr(getCond());
251 S.EmitOwnedPtr(getInc());
252 S.EmitOwnedPtr(getBody());
253}
254
255ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
256 SourceLocation ForLoc = SourceLocation::ReadVal(D);
257 Stmt* Init = D.ReadOwnedPtr<Stmt>();
258 Expr* Cond = D.ReadOwnedPtr<Expr>();
259 Expr* Inc = D.ReadOwnedPtr<Expr>();
260 Stmt* Body = D.ReadOwnedPtr<Stmt>();
261 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
262}
263
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000264void GotoStmt::directEmit(llvm::Serializer& S) const {
265 S.Emit(GotoLoc);
266 S.Emit(LabelLoc);
267 S.EmitPtr(Label);
268}
269
270GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
271 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
272 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
273 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
274 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
275 return stmt;
276}
277
Ted Kremenekca22d352007-11-07 07:19:30 +0000278void IfStmt::directEmit(llvm::Serializer& S) const {
279 S.Emit(IfLoc);
280 S.EmitOwnedPtr(getCond());
281 S.EmitOwnedPtr(getThen());
282 S.EmitOwnedPtr(getElse());
283}
284
285IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
286 SourceLocation L = SourceLocation::ReadVal(D);
287 Expr* Cond = D.ReadOwnedPtr<Expr>();
288 Stmt* Then = D.ReadOwnedPtr<Stmt>();
289 Stmt* Else = D.ReadOwnedPtr<Stmt>();
290 return new IfStmt(L,Cond,Then,Else);
291}
292
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000293void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
294 S.EmitPtr(Target);
295}
296
297IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
298 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
299 D.ReadPtr(stmt->Target); // The target may be backpatched.
300 return stmt;
301}
302
Ted Kremenek47281102007-11-07 00:17:35 +0000303void IntegerLiteral::directEmit(llvm::Serializer& S) const {
304 S.Emit(Loc);
305 S.Emit(getType());
306 S.Emit(getValue());
307}
308
309IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
310 SourceLocation Loc = SourceLocation::ReadVal(D);
311 QualType T = QualType::ReadVal(D);
312
313 // Create a dummy APInt because it is more efficient to deserialize
314 // it in place with the deserialized IntegerLiteral. (fewer copies)
315 llvm::APInt temp;
316 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
317 D.Read(expr->Value);
318
319 return expr;
320}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000321
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000322void LabelStmt::directEmit(llvm::Serializer& S) const {
323 S.EmitPtr(Label);
324 S.Emit(IdentLoc);
325 S.EmitOwnedPtr(SubStmt);
326}
327
328LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
329 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
330 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
331 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
332 return new LabelStmt(IdentLoc,Label,SubStmt);
333}
334
Ted Kremenek25aaa262007-11-07 00:40:53 +0000335void NullStmt::directEmit(llvm::Serializer& S) const {
336 S.Emit(SemiLoc);
337}
338
339NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
340 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
341 return new NullStmt(SemiLoc);
342}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000343
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000344void ParenExpr::directEmit(llvm::Serializer& S) const {
345 S.Emit(L);
346 S.Emit(R);
347 S.EmitOwnedPtr(Val);
348}
349
350ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
351 SourceLocation L = SourceLocation::ReadVal(D);
352 SourceLocation R = SourceLocation::ReadVal(D);
353 Expr* val = D.ReadOwnedPtr<Expr>();
354 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000355}
356
357void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
358 S.Emit(Loc);
359 S.EmitInt(getIdentType());
360 S.Emit(getType());
361}
362
363PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
364 SourceLocation Loc = SourceLocation::ReadVal(D);
365 IdentType it = static_cast<IdentType>(D.ReadInt());
366 QualType Q = QualType::ReadVal(D);
367 return new PreDefinedExpr(Loc,Q,it);
368}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000369
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000370void ReturnStmt::directEmit(llvm::Serializer& S) const {
371 S.Emit(RetLoc);
372 S.EmitOwnedPtr(RetExpr);
373}
374
375ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
376 SourceLocation RetLoc = SourceLocation::ReadVal(D);
377 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
378 return new ReturnStmt(RetLoc,RetExpr);
379}
380
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000381void SwitchStmt::directEmit(llvm::Serializer& S) const {
382 S.Emit(SwitchLoc);
383 S.EmitOwnedPtr(getCond());
384 S.EmitOwnedPtr(getBody());
385 S.EmitPtr(FirstCase);
386}
387
388SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
389 SourceLocation Loc = SourceLocation::ReadVal(D);
390 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
391 Stmt* Body = D.ReadOwnedPtr<Stmt>();
392 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
393
394 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
395 stmt->setBody(Body,Loc);
396 stmt->FirstCase = FirstCase;
397
398 return stmt;
399}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000400
401void WhileStmt::directEmit(llvm::Serializer& S) const {
402 S.Emit(WhileLoc);
403 S.EmitOwnedPtr(getCond());
404 S.EmitOwnedPtr(getBody());
405}
406
407WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
408 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
409 Expr* Cond = D.ReadOwnedPtr<Expr>();
410 Stmt* Body = D.ReadOwnedPtr<Stmt>();
411 return new WhileStmt(Cond,Body,WhileLoc);
412}