blob: 99a14f2a30fbb949845ce2f980cf38d9f0adba0e [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 Kremenekdc4fc272007-11-08 00:41:37 +000059 case CompoundAssignOperatorClass:
60 return CompoundAssignOperator::directMaterialize(D);
61
Ted Kremenek47281102007-11-07 00:17:35 +000062 case CompoundStmtClass:
63 return CompoundStmt::directMaterialize(D);
64
Ted Kremenek6c4dba72007-11-07 17:05:07 +000065 case ContinueStmtClass:
66 return ContinueStmt::directMaterialize(D);
67
Ted Kremenek47281102007-11-07 00:17:35 +000068 case DeclRefExprClass:
69 return DeclRefExpr::directMaterialize(D);
70
Ted Kremenek2bd6e652007-11-07 00:37:40 +000071 case DeclStmtClass:
72 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000073
74 case DefaultStmtClass:
75 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000076
77 case DoStmtClass:
78 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000079
80 case FloatingLiteralClass:
81 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000082
83 case ForStmtClass:
84 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000085
86 case GotoStmtClass:
87 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000088
Ted Kremenekca22d352007-11-07 07:19:30 +000089 case IfStmtClass:
90 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000091
92 case ImaginaryLiteralClass:
93 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000094
Ted Kremenek8c9833b2007-11-07 22:39:17 +000095 case ImplicitCastExprClass:
96 return ImplicitCastExpr::directMaterialize(D);
97
Ted Kremeneke7d27d52007-11-07 17:02:32 +000098 case IndirectGotoStmtClass:
99 return IndirectGotoStmt::directMaterialize(D);
100
Ted Kremenek47281102007-11-07 00:17:35 +0000101 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +0000102 return IntegerLiteral::directMaterialize(D);
103
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000104 case LabelStmtClass:
105 return LabelStmt::directMaterialize(D);
106
Ted Kremenek25aaa262007-11-07 00:40:53 +0000107 case NullStmtClass:
108 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000109
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000110 case ParenExprClass:
111 return ParenExpr::directMaterialize(D);
112
Ted Kremenek539a4182007-11-07 17:11:58 +0000113 case PreDefinedExprClass:
114 return PreDefinedExpr::directMaterialize(D);
115
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000116 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000117 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +0000118
119 case StringLiteralClass:
120 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000121
122 case SwitchStmtClass:
123 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000124
Ted Kremeneke21b5842007-11-08 00:26:24 +0000125 case UnaryOperatorClass:
126 return UnaryOperator::directMaterialize(D);
127
Ted Kremenek55e559a2007-11-07 07:50:10 +0000128 case WhileStmtClass:
129 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000130 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000131}
132
Ted Kremenekd7017492007-11-07 22:53:01 +0000133void ArraySubscriptExpr::directEmit(Serializer& S) const {
134 S.Emit(getType());
135 S.Emit(RBracketLoc);
136 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
137}
138
139ArraySubscriptExpr* ArraySubscriptExpr::directMaterialize(Deserializer& D) {
140 QualType t = QualType::ReadVal(D);
141 SourceLocation L = SourceLocation::ReadVal(D);
142 Expr *LHS, *RHS;
143 D.BatchReadOwnedPtrs(LHS,RHS);
144 return new ArraySubscriptExpr(LHS,RHS,t,L);
145}
146
147void BinaryOperator::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000148 S.EmitInt(Opc);
149 S.Emit(OpLoc);;
150 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000151 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000152}
153
Ted Kremenekd7017492007-11-07 22:53:01 +0000154BinaryOperator* BinaryOperator::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000155 Opcode Opc = static_cast<Opcode>(D.ReadInt());
156 SourceLocation OpLoc = SourceLocation::ReadVal(D);
157 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000158 Expr *LHS, *RHS;
159 D.BatchReadOwnedPtrs(LHS,RHS);
160
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000161 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
162}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000163
Ted Kremenekd7017492007-11-07 22:53:01 +0000164void BreakStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000165 S.Emit(BreakLoc);
166}
167
Ted Kremenekd7017492007-11-07 22:53:01 +0000168BreakStmt* BreakStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000169 SourceLocation Loc = SourceLocation::ReadVal(D);
170 return new BreakStmt(Loc);
171}
Ted Kremenek7a873332007-11-07 23:32:20 +0000172
173void CallExpr::directEmit(Serializer& S) const {
174 S.Emit(getType());
175 S.Emit(RParenLoc);
176 S.EmitInt(NumArgs);
177 S.BatchEmitOwnedPtrs(NumArgs+1,SubExprs);
178}
179
180CallExpr* CallExpr::directMaterialize(Deserializer& D) {
181 QualType t = QualType::ReadVal(D);
182 SourceLocation L = SourceLocation::ReadVal(D);
183 unsigned NumArgs = D.ReadInt();
184 Expr** SubExprs = new Expr*[NumArgs+1];
185 D.BatchReadOwnedPtrs(NumArgs+1,SubExprs);
186
187 return new CallExpr(SubExprs,NumArgs,t,L);
188}
189
Ted Kremenekd7017492007-11-07 22:53:01 +0000190void CaseStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000191 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000192 S.EmitPtr(getNextSwitchCase());
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000193 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000194}
195
Ted Kremenekd7017492007-11-07 22:53:01 +0000196CaseStmt* CaseStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000197 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000198 CaseStmt* stmt = new CaseStmt(NULL,NULL,NULL,CaseLoc);
199 D.ReadPtr(stmt->NextSwitchCase);
200 D.BatchReadOwnedPtrs((unsigned) END_EXPR,&stmt->SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000201 return stmt;
202}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000203
Ted Kremenekd7017492007-11-07 22:53:01 +0000204void CastExpr::directEmit(Serializer& S) const {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000205 S.Emit(getType());
206 S.Emit(Loc);
207 S.EmitOwnedPtr(Op);
208}
209
Ted Kremenekd7017492007-11-07 22:53:01 +0000210CastExpr* CastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000211 QualType t = QualType::ReadVal(D);
212 SourceLocation Loc = SourceLocation::ReadVal(D);
213 Expr* Op = D.ReadOwnedPtr<Expr>();
214 return new CastExpr(t,Op,Loc);
215}
216
217
Ted Kremenekd7017492007-11-07 22:53:01 +0000218void CharacterLiteral::directEmit(Serializer& S) const {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000219 S.Emit(Value);
220 S.Emit(Loc);
221 S.Emit(getType());
222}
223
Ted Kremenekd7017492007-11-07 22:53:01 +0000224CharacterLiteral* CharacterLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000225 unsigned value = D.ReadInt();
226 SourceLocation Loc = SourceLocation::ReadVal(D);
227 QualType T = QualType::ReadVal(D);
228 return new CharacterLiteral(value,T,Loc);
229}
230
Ted Kremenekdc4fc272007-11-08 00:41:37 +0000231void CompoundAssignOperator::directEmit(Serializer& S) const {
232 S.Emit(getType());
233 S.Emit(ComputationType);
234 S.Emit(getOperatorLoc());
235 S.EmitInt(getOpcode());
236 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
237}
238
239CompoundAssignOperator*
240CompoundAssignOperator::directMaterialize(Deserializer& D) {
241 QualType t = QualType::ReadVal(D);
242 QualType c = QualType::ReadVal(D);
243 SourceLocation L = SourceLocation::ReadVal(D);
244 Opcode Opc = static_cast<Opcode>(D.ReadInt());
245 Expr* LHS, *RHS;
246 D.BatchReadOwnedPtrs(LHS,RHS);
247
248 return new CompoundAssignOperator(LHS,RHS,Opc,t,c,L);
249}
250
Ted Kremenekd7017492007-11-07 22:53:01 +0000251void CompoundStmt::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000252 S.Emit(LBracLoc);
253 S.Emit(RBracLoc);
254 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000255
Ted Kremenek47281102007-11-07 00:17:35 +0000256 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000257 S.EmitOwnedPtr(*I);
258}
259
Ted Kremenekd7017492007-11-07 22:53:01 +0000260CompoundStmt* CompoundStmt::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000261 SourceLocation LB = SourceLocation::ReadVal(D);
262 SourceLocation RB = SourceLocation::ReadVal(D);
263 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000264
Ted Kremenek47281102007-11-07 00:17:35 +0000265 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
266
267 stmt->Body.reserve(size);
268
269 for (unsigned i = 0; i < size; ++i)
270 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
271
272 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000273}
Ted Kremenek47281102007-11-07 00:17:35 +0000274
Ted Kremenekd7017492007-11-07 22:53:01 +0000275void ContinueStmt::directEmit(Serializer& S) const {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000276 S.Emit(ContinueLoc);
277}
278
Ted Kremenekd7017492007-11-07 22:53:01 +0000279ContinueStmt* ContinueStmt::directMaterialize(Deserializer& D) {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000280 SourceLocation Loc = SourceLocation::ReadVal(D);
281 return new ContinueStmt(Loc);
282}
283
Ted Kremenekd7017492007-11-07 22:53:01 +0000284void DeclStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000285 // FIXME: special handling for struct decls.
286 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000287}
288
Ted Kremenekd7017492007-11-07 22:53:01 +0000289void DeclRefExpr::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000290 S.Emit(Loc);
291 S.Emit(getType());
292 S.EmitPtr(getDecl());
293}
294
Ted Kremenekd7017492007-11-07 22:53:01 +0000295DeclRefExpr* DeclRefExpr::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000296 SourceLocation Loc = SourceLocation::ReadVal(D);
297 QualType T = QualType::ReadVal(D);
298 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
299 D.ReadPtr(dr->D,false);
300 return dr;
301}
302
Ted Kremenekd7017492007-11-07 22:53:01 +0000303DeclStmt* DeclStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000304 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
305 return new DeclStmt(decl);
306}
307
Ted Kremenekd7017492007-11-07 22:53:01 +0000308void DefaultStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000309 S.Emit(DefaultLoc);
310 S.EmitOwnedPtr(getSubStmt());
311 S.EmitPtr(getNextSwitchCase());
312}
313
Ted Kremenekd7017492007-11-07 22:53:01 +0000314DefaultStmt* DefaultStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000315 SourceLocation Loc = SourceLocation::ReadVal(D);
316 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
317
318 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
319 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
320
321 return stmt;
322}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000323
Ted Kremenekd7017492007-11-07 22:53:01 +0000324void DoStmt::directEmit(Serializer& S) const {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000325 S.Emit(DoLoc);
326 S.EmitOwnedPtr(getCond());
327 S.EmitOwnedPtr(getBody());
328}
329
Ted Kremenekd7017492007-11-07 22:53:01 +0000330DoStmt* DoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000331 SourceLocation DoLoc = SourceLocation::ReadVal(D);
332 Expr* Cond = D.ReadOwnedPtr<Expr>();
333 Stmt* Body = D.ReadOwnedPtr<Stmt>();
334 return new DoStmt(Body,Cond,DoLoc);
335}
336
Ted Kremenekd7017492007-11-07 22:53:01 +0000337void FloatingLiteral::directEmit(Serializer& S) const {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000338 S.Emit(Loc);
339 S.Emit(getType());
340 S.Emit(Value);
341}
342
Ted Kremenekd7017492007-11-07 22:53:01 +0000343FloatingLiteral* FloatingLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000344 SourceLocation Loc = SourceLocation::ReadVal(D);
345 QualType t = QualType::ReadVal(D);
346 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
347 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
348 return expr;
349}
350
Ted Kremenekd7017492007-11-07 22:53:01 +0000351void ForStmt::directEmit(Serializer& S) const {
Ted Kremenekf34da902007-11-07 08:02:55 +0000352 S.Emit(ForLoc);
353 S.EmitOwnedPtr(getInit());
354 S.EmitOwnedPtr(getCond());
355 S.EmitOwnedPtr(getInc());
356 S.EmitOwnedPtr(getBody());
357}
358
Ted Kremenekd7017492007-11-07 22:53:01 +0000359ForStmt* ForStmt::directMaterialize(Deserializer& D) {
Ted Kremenekf34da902007-11-07 08:02:55 +0000360 SourceLocation ForLoc = SourceLocation::ReadVal(D);
361 Stmt* Init = D.ReadOwnedPtr<Stmt>();
362 Expr* Cond = D.ReadOwnedPtr<Expr>();
363 Expr* Inc = D.ReadOwnedPtr<Expr>();
364 Stmt* Body = D.ReadOwnedPtr<Stmt>();
365 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
366}
367
Ted Kremenekd7017492007-11-07 22:53:01 +0000368void GotoStmt::directEmit(Serializer& S) const {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000369 S.Emit(GotoLoc);
370 S.Emit(LabelLoc);
371 S.EmitPtr(Label);
372}
373
Ted Kremenekd7017492007-11-07 22:53:01 +0000374GotoStmt* GotoStmt::directMaterialize(Deserializer& D) {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000375 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
376 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
377 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
378 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
379 return stmt;
380}
381
Ted Kremenekd7017492007-11-07 22:53:01 +0000382void IfStmt::directEmit(Serializer& S) const {
Ted Kremenekca22d352007-11-07 07:19:30 +0000383 S.Emit(IfLoc);
384 S.EmitOwnedPtr(getCond());
385 S.EmitOwnedPtr(getThen());
386 S.EmitOwnedPtr(getElse());
387}
388
Ted Kremenekd7017492007-11-07 22:53:01 +0000389IfStmt* IfStmt::directMaterialize(Deserializer& D) {
Ted Kremenekca22d352007-11-07 07:19:30 +0000390 SourceLocation L = SourceLocation::ReadVal(D);
391 Expr* Cond = D.ReadOwnedPtr<Expr>();
392 Stmt* Then = D.ReadOwnedPtr<Stmt>();
393 Stmt* Else = D.ReadOwnedPtr<Stmt>();
394 return new IfStmt(L,Cond,Then,Else);
395}
396
Ted Kremenekd7017492007-11-07 22:53:01 +0000397void ImaginaryLiteral::directEmit(Serializer& S) const {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000398 S.Emit(getType());
399 S.EmitOwnedPtr(Val);
400}
401
Ted Kremenekd7017492007-11-07 22:53:01 +0000402ImaginaryLiteral* ImaginaryLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000403 QualType t = QualType::ReadVal(D);
404 Expr* expr = D.ReadOwnedPtr<Expr>();
405 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
406 return new ImaginaryLiteral(expr,t);
407}
408
Ted Kremenekd7017492007-11-07 22:53:01 +0000409void ImplicitCastExpr::directEmit(Serializer& S) const {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000410 S.Emit(getType());
411 S.EmitOwnedPtr(Op);
412}
413
Ted Kremenekd7017492007-11-07 22:53:01 +0000414ImplicitCastExpr* ImplicitCastExpr::directMaterialize(Deserializer& D) {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000415 QualType t = QualType::ReadVal(D);
416 Expr* Op = D.ReadOwnedPtr<Expr>();
417 return new ImplicitCastExpr(t,Op);
418}
419
Ted Kremenekd7017492007-11-07 22:53:01 +0000420void IndirectGotoStmt::directEmit(Serializer& S) const {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000421 S.EmitPtr(Target);
422}
423
Ted Kremenekd7017492007-11-07 22:53:01 +0000424IndirectGotoStmt* IndirectGotoStmt::directMaterialize(Deserializer& D) {
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000425 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
426 D.ReadPtr(stmt->Target); // The target may be backpatched.
427 return stmt;
428}
429
Ted Kremenekd7017492007-11-07 22:53:01 +0000430void IntegerLiteral::directEmit(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000431 S.Emit(Loc);
432 S.Emit(getType());
433 S.Emit(getValue());
434}
435
Ted Kremenekd7017492007-11-07 22:53:01 +0000436IntegerLiteral* IntegerLiteral::directMaterialize(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000437 SourceLocation Loc = SourceLocation::ReadVal(D);
438 QualType T = QualType::ReadVal(D);
439
440 // Create a dummy APInt because it is more efficient to deserialize
441 // it in place with the deserialized IntegerLiteral. (fewer copies)
442 llvm::APInt temp;
443 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
444 D.Read(expr->Value);
445
446 return expr;
447}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000448
Ted Kremenekd7017492007-11-07 22:53:01 +0000449void LabelStmt::directEmit(Serializer& S) const {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000450 S.EmitPtr(Label);
451 S.Emit(IdentLoc);
452 S.EmitOwnedPtr(SubStmt);
453}
454
Ted Kremenekd7017492007-11-07 22:53:01 +0000455LabelStmt* LabelStmt::directMaterialize(Deserializer& D) {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000456 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
457 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
458 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
459 return new LabelStmt(IdentLoc,Label,SubStmt);
460}
461
Ted Kremenekd7017492007-11-07 22:53:01 +0000462void NullStmt::directEmit(Serializer& S) const {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000463 S.Emit(SemiLoc);
464}
465
Ted Kremenekd7017492007-11-07 22:53:01 +0000466NullStmt* NullStmt::directMaterialize(Deserializer& D) {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000467 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
468 return new NullStmt(SemiLoc);
469}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000470
Ted Kremenekd7017492007-11-07 22:53:01 +0000471void ParenExpr::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000472 S.Emit(L);
473 S.Emit(R);
474 S.EmitOwnedPtr(Val);
475}
476
Ted Kremenekd7017492007-11-07 22:53:01 +0000477ParenExpr* ParenExpr::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000478 SourceLocation L = SourceLocation::ReadVal(D);
479 SourceLocation R = SourceLocation::ReadVal(D);
480 Expr* val = D.ReadOwnedPtr<Expr>();
481 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000482}
483
Ted Kremenekd7017492007-11-07 22:53:01 +0000484void PreDefinedExpr::directEmit(Serializer& S) const {
Ted Kremenek539a4182007-11-07 17:11:58 +0000485 S.Emit(Loc);
486 S.EmitInt(getIdentType());
487 S.Emit(getType());
488}
489
Ted Kremenekd7017492007-11-07 22:53:01 +0000490PreDefinedExpr* PreDefinedExpr::directMaterialize(Deserializer& D) {
Ted Kremenek539a4182007-11-07 17:11:58 +0000491 SourceLocation Loc = SourceLocation::ReadVal(D);
492 IdentType it = static_cast<IdentType>(D.ReadInt());
493 QualType Q = QualType::ReadVal(D);
494 return new PreDefinedExpr(Loc,Q,it);
495}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000496
Ted Kremenekd7017492007-11-07 22:53:01 +0000497void ReturnStmt::directEmit(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000498 S.Emit(RetLoc);
499 S.EmitOwnedPtr(RetExpr);
500}
501
Ted Kremenekd7017492007-11-07 22:53:01 +0000502ReturnStmt* ReturnStmt::directMaterialize(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000503 SourceLocation RetLoc = SourceLocation::ReadVal(D);
504 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
505 return new ReturnStmt(RetLoc,RetExpr);
506}
507
Ted Kremenekd7017492007-11-07 22:53:01 +0000508void StringLiteral::directEmit(Serializer& S) const {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000509 S.Emit(getType());
510 S.Emit(firstTokLoc);
511 S.Emit(lastTokLoc);
512 S.EmitBool(isWide());
513 S.Emit(getByteLength());
514
515 for (unsigned i = 0 ; i < ByteLength; ++i)
516 S.EmitInt(StrData[i]);
517}
518
Ted Kremenekd7017492007-11-07 22:53:01 +0000519StringLiteral* StringLiteral::directMaterialize(Deserializer& D) {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000520 QualType t = QualType::ReadVal(D);
521 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
522 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
523 bool isWide = D.ReadBool();
524 unsigned ByteLength = D.ReadInt();
525
526 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
527
528 char* StrData = new char[ByteLength];
529 for (unsigned i = 0; i < ByteLength; ++i)
530 StrData[i] = (char) D.ReadInt();
531
532 sl->ByteLength = ByteLength;
533 sl->StrData = StrData;
534
535 return sl;
536}
537
Ted Kremenekd7017492007-11-07 22:53:01 +0000538void SwitchStmt::directEmit(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000539 S.Emit(SwitchLoc);
540 S.EmitOwnedPtr(getCond());
541 S.EmitOwnedPtr(getBody());
542 S.EmitPtr(FirstCase);
543}
544
Ted Kremenekd7017492007-11-07 22:53:01 +0000545SwitchStmt* SwitchStmt::directMaterialize(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000546 SourceLocation Loc = SourceLocation::ReadVal(D);
547 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
548 Stmt* Body = D.ReadOwnedPtr<Stmt>();
549 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
550
551 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
552 stmt->setBody(Body,Loc);
553 stmt->FirstCase = FirstCase;
554
555 return stmt;
556}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000557
Ted Kremeneke21b5842007-11-08 00:26:24 +0000558void UnaryOperator::directEmit(Serializer& S) const {
559 S.Emit(getType());
560 S.Emit(Loc);
561 S.EmitInt(Opc);
562 S.EmitOwnedPtr(Val);
563}
564
565UnaryOperator* UnaryOperator::directMaterialize(Deserializer& D) {
566 QualType t = QualType::ReadVal(D);
567 SourceLocation L = SourceLocation::ReadVal(D);
568 Opcode Opc = static_cast<Opcode>(D.ReadInt());
569 Expr* Val = D.ReadOwnedPtr<Expr>();
570 return new UnaryOperator(Val,Opc,t,L);
571}
572
Ted Kremenekd7017492007-11-07 22:53:01 +0000573void WhileStmt::directEmit(Serializer& S) const {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000574 S.Emit(WhileLoc);
575 S.EmitOwnedPtr(getCond());
576 S.EmitOwnedPtr(getBody());
577}
578
Ted Kremenekd7017492007-11-07 22:53:01 +0000579WhileStmt* WhileStmt::directMaterialize(Deserializer& D) {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000580 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
581 Expr* Cond = D.ReadOwnedPtr<Expr>();
582 Stmt* Body = D.ReadOwnedPtr<Stmt>();
583 return new WhileStmt(Cond,Body,WhileLoc);
584}