blob: ea136bf9ca0c895f311715d23a1867882601ce10 [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());
Ted Kremenekd732bbd2007-11-12 18:04:32 +000026 EmitImpl(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 Kremenekacba3612007-11-13 00:25:37 +000030Stmt* Stmt::Create(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 Kremenek3a4dfc12007-11-08 16:32:00 +000038 case AddrLabelExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000039 return AddrLabelExpr::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +000040
Ted Kremenekd7017492007-11-07 22:53:01 +000041 case ArraySubscriptExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000042 return ArraySubscriptExpr::CreateImpl(D);
Ted Kremenekd7017492007-11-07 22:53:01 +000043
Ted Kremenek1dfb01c2007-11-13 22:55:51 +000044 case AsmStmtClass:
45 return AsmStmt::CreateImpl(D);
46
Ted Kremenek2bd6e652007-11-07 00:37:40 +000047 case BinaryOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000048 return BinaryOperator::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000049
Ted Kremenek249d7cd2007-11-07 05:25:31 +000050 case BreakStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000051 return BreakStmt::CreateImpl(D);
Ted Kremenek7a873332007-11-07 23:32:20 +000052
53 case CallExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000054 return CallExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000055
56 case CaseStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000057 return CaseStmt::CreateImpl(D);
Ted Kremenek705cb5d2007-11-07 22:42:34 +000058
59 case CastExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000060 return CastExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000061
Ted Kremenek42f440c2007-11-07 17:15:49 +000062 case CharacterLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000063 return CharacterLiteral::CreateImpl(D);
Ted Kremenek42f440c2007-11-07 17:15:49 +000064
Ted Kremenekdc4fc272007-11-08 00:41:37 +000065 case CompoundAssignOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000066 return CompoundAssignOperator::CreateImpl(D);
Ted Kremenekdc4fc272007-11-08 00:41:37 +000067
Ted Kremenek2d857102007-11-14 21:18:36 +000068 case CompoundLiteralExprClass:
69 return CompoundLiteralExpr::CreateImpl(D);
70
Ted Kremenek47281102007-11-07 00:17:35 +000071 case CompoundStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000072 return CompoundStmt::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +000073
74 case ConditionalOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000075 return ConditionalOperator::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000076
Ted Kremenek6c4dba72007-11-07 17:05:07 +000077 case ContinueStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000078 return ContinueStmt::CreateImpl(D);
Ted Kremenek6c4dba72007-11-07 17:05:07 +000079
Ted Kremenek47281102007-11-07 00:17:35 +000080 case DeclRefExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000081 return DeclRefExpr::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000082
Ted Kremenek2bd6e652007-11-07 00:37:40 +000083 case DeclStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000084 return DeclStmt::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000085
86 case DefaultStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000087 return DefaultStmt::CreateImpl(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000088
89 case DoStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000090 return DoStmt::CreateImpl(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000091
92 case FloatingLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000093 return FloatingLiteral::CreateImpl(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000094
95 case ForStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000096 return ForStmt::CreateImpl(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000097
98 case GotoStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000099 return GotoStmt::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000100
Ted Kremenekca22d352007-11-07 07:19:30 +0000101 case IfStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000102 return IfStmt::CreateImpl(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +0000103
104 case ImaginaryLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000105 return ImaginaryLiteral::CreateImpl(D);
Ted Kremenekca22d352007-11-07 07:19:30 +0000106
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000107 case ImplicitCastExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000108 return ImplicitCastExpr::CreateImpl(D);
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000109
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000110 case IndirectGotoStmtClass:
Ted Kremenek387539f2007-11-14 21:31:46 +0000111 return IndirectGotoStmt::CreateImpl(D);
112
113 case InitListExprClass:
114 return InitListExpr::CreateImpl(D);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000115
Ted Kremenek47281102007-11-07 00:17:35 +0000116 case IntegerLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000117 return IntegerLiteral::CreateImpl(D);
Ted Kremenek25aaa262007-11-07 00:40:53 +0000118
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000119 case LabelStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000120 return LabelStmt::CreateImpl(D);
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000121
Ted Kremenek24160d32007-11-13 22:16:23 +0000122 case MemberExprClass:
123 return MemberExpr::CreateImpl(D);
124
Ted Kremenek25aaa262007-11-07 00:40:53 +0000125 case NullStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000126 return NullStmt::CreateImpl(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000127
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000128 case ParenExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000129 return ParenExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000130
Ted Kremenek539a4182007-11-07 17:11:58 +0000131 case PreDefinedExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000132 return PreDefinedExpr::CreateImpl(D);
Ted Kremenek539a4182007-11-07 17:11:58 +0000133
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000134 case ReturnStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000135 return ReturnStmt::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000136
Ted Kremenekdeac9c32007-11-13 22:30:29 +0000137 case SizeOfAlignOfTypeExprClass:
138 return SizeOfAlignOfTypeExpr::CreateImpl(D);
139
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000140 case StmtExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000141 return StmtExpr::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000142
Ted Kremenekefa540d2007-11-07 19:08:19 +0000143 case StringLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000144 return StringLiteral::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000145
146 case SwitchStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000147 return SwitchStmt::CreateImpl(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000148
Ted Kremeneke21b5842007-11-08 00:26:24 +0000149 case UnaryOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000150 return UnaryOperator::CreateImpl(D);
Ted Kremeneke21b5842007-11-08 00:26:24 +0000151
Ted Kremenek55e559a2007-11-07 07:50:10 +0000152 case WhileStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000153 return WhileStmt::CreateImpl(D);
Ted Kremeneka7fb3a52007-11-15 18:10:29 +0000154
155 //==--------------------------------------==//
156 // Objective C
157 //==--------------------------------------==//
Ted Kremeneka0c7df32007-12-04 00:28:54 +0000158
159 case ObjcAtCatchStmtClass:
160 return ObjcAtCatchStmt::CreateImpl(D);
Ted Kremeneka7fb3a52007-11-15 18:10:29 +0000161
162 case ObjCIvarRefExprClass:
163 return ObjCIvarRefExpr::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000164 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000165}
166
Ted Kremeneka7fb3a52007-11-15 18:10:29 +0000167//===----------------------------------------------------------------------===//
168// C Serialization
169//===----------------------------------------------------------------------===//
170
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000171void AddrLabelExpr::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000172 S.Emit(getType());
173 S.Emit(AmpAmpLoc);
174 S.Emit(LabelLoc);
175 S.EmitPtr(Label);
176}
177
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000178AddrLabelExpr* AddrLabelExpr::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000179 QualType t = QualType::ReadVal(D);
180 SourceLocation AALoc = SourceLocation::ReadVal(D);
181 SourceLocation LLoc = SourceLocation::ReadVal(D);
182 AddrLabelExpr* expr = new AddrLabelExpr(AALoc,LLoc,NULL,t);
183 D.ReadPtr(expr->Label); // Pointer may be backpatched.
184 return expr;
185}
186
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000187void ArraySubscriptExpr::EmitImpl(Serializer& S) const {
Ted Kremenekd7017492007-11-07 22:53:01 +0000188 S.Emit(getType());
189 S.Emit(RBracketLoc);
190 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
191}
192
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000193ArraySubscriptExpr* ArraySubscriptExpr::CreateImpl(Deserializer& D) {
Ted Kremenekd7017492007-11-07 22:53:01 +0000194 QualType t = QualType::ReadVal(D);
195 SourceLocation L = SourceLocation::ReadVal(D);
196 Expr *LHS, *RHS;
197 D.BatchReadOwnedPtrs(LHS,RHS);
198 return new ArraySubscriptExpr(LHS,RHS,t,L);
199}
200
Ted Kremenek1dfb01c2007-11-13 22:55:51 +0000201void AsmStmt::EmitImpl(Serializer& S) const {
202 S.Emit(AsmLoc);
Anders Carlsson965d5202007-11-22 01:36:19 +0000203
Anders Carlsson076c1112007-11-20 19:21:03 +0000204 getAsmString()->EmitImpl(S);
Ted Kremenek1dfb01c2007-11-13 22:55:51 +0000205 S.Emit(RParenLoc);
Anders Carlsson965d5202007-11-22 01:36:19 +0000206
Anders Carlsson759f45d2007-11-23 23:12:25 +0000207 S.EmitBool(IsVolatile);
Anders Carlsson965d5202007-11-22 01:36:19 +0000208 S.EmitInt(NumOutputs);
209 S.EmitInt(NumInputs);
210
211 unsigned size = NumOutputs + NumInputs;
212
213 for (unsigned i = 0; i < size; ++i)
214 S.EmitCStr(Names[i].c_str());
215
216 for (unsigned i = 0; i < size; ++i)
217 Constraints[i]->EmitImpl(S);
218
219 for (unsigned i = 0; i < size; ++i)
220 S.EmitOwnedPtr(Exprs[i]);
221
222 S.EmitInt(Clobbers.size());
223 for (unsigned i = 0, e = Clobbers.size(); i != e; ++i)
224 Clobbers[i]->EmitImpl(S);
Ted Kremenek1dfb01c2007-11-13 22:55:51 +0000225}
226
227AsmStmt* AsmStmt::CreateImpl(Deserializer& D) {
228 SourceLocation ALoc = SourceLocation::ReadVal(D);
Anders Carlsson076c1112007-11-20 19:21:03 +0000229 StringLiteral *AsmStr = StringLiteral::CreateImpl(D);
Ted Kremenek1dfb01c2007-11-13 22:55:51 +0000230 SourceLocation PLoc = SourceLocation::ReadVal(D);
231
Anders Carlsson759f45d2007-11-23 23:12:25 +0000232 bool IsVolatile = D.ReadBool();
233 AsmStmt *Stmt = new AsmStmt(ALoc, IsVolatile, 0, 0, 0, 0, 0,
Anders Carlsson965d5202007-11-22 01:36:19 +0000234 AsmStr,
235 0, 0, PLoc);
236
237 Stmt->NumOutputs = D.ReadInt();
238 Stmt->NumInputs = D.ReadInt();
239
240 unsigned size = Stmt->NumOutputs + Stmt->NumInputs;
241
242 Stmt->Names.reserve(size);
243 for (unsigned i = 0; i < size; ++i) {
244 std::vector<char> data;
245 D.ReadCStr(data, false);
246
247 Stmt->Names.push_back(std::string(&data[0], data.size()));
248 }
249
250 Stmt->Constraints.reserve(size);
251 for (unsigned i = 0; i < size; ++i)
252 Stmt->Constraints.push_back(StringLiteral::CreateImpl(D));
253
254 Stmt->Exprs.reserve(size);
255 for (unsigned i = 0; i < size; ++i)
256 Stmt->Exprs.push_back(D.ReadOwnedPtr<Expr>());
257
258 unsigned NumClobbers = D.ReadInt();
259 Stmt->Clobbers.reserve(NumClobbers);
260 for (unsigned i = 0; i < NumClobbers; ++i)
261 Stmt->Clobbers.push_back(StringLiteral::CreateImpl(D));
262
263 return Stmt;
Ted Kremenek1dfb01c2007-11-13 22:55:51 +0000264}
265
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000266void BinaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000267 S.EmitInt(Opc);
268 S.Emit(OpLoc);;
269 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000270 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000271}
272
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000273BinaryOperator* BinaryOperator::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000274 Opcode Opc = static_cast<Opcode>(D.ReadInt());
275 SourceLocation OpLoc = SourceLocation::ReadVal(D);
276 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000277 Expr *LHS, *RHS;
278 D.BatchReadOwnedPtrs(LHS,RHS);
279
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000280 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
281}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000282
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000283void BreakStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000284 S.Emit(BreakLoc);
285}
286
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000287BreakStmt* BreakStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000288 SourceLocation Loc = SourceLocation::ReadVal(D);
289 return new BreakStmt(Loc);
290}
Ted Kremenek7a873332007-11-07 23:32:20 +0000291
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000292void CallExpr::EmitImpl(Serializer& S) const {
Ted Kremenek7a873332007-11-07 23:32:20 +0000293 S.Emit(getType());
294 S.Emit(RParenLoc);
295 S.EmitInt(NumArgs);
296 S.BatchEmitOwnedPtrs(NumArgs+1,SubExprs);
297}
298
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000299CallExpr* CallExpr::CreateImpl(Deserializer& D) {
Ted Kremenek7a873332007-11-07 23:32:20 +0000300 QualType t = QualType::ReadVal(D);
301 SourceLocation L = SourceLocation::ReadVal(D);
302 unsigned NumArgs = D.ReadInt();
303 Expr** SubExprs = new Expr*[NumArgs+1];
304 D.BatchReadOwnedPtrs(NumArgs+1,SubExprs);
305
306 return new CallExpr(SubExprs,NumArgs,t,L);
307}
308
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000309void CaseStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000310 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000311 S.EmitPtr(getNextSwitchCase());
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000312 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000313}
314
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000315CaseStmt* CaseStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000316 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000317 CaseStmt* stmt = new CaseStmt(NULL,NULL,NULL,CaseLoc);
318 D.ReadPtr(stmt->NextSwitchCase);
319 D.BatchReadOwnedPtrs((unsigned) END_EXPR,&stmt->SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000320 return stmt;
321}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000322
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000323void CastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000324 S.Emit(getType());
325 S.Emit(Loc);
326 S.EmitOwnedPtr(Op);
327}
328
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000329CastExpr* CastExpr::CreateImpl(Deserializer& D) {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000330 QualType t = QualType::ReadVal(D);
331 SourceLocation Loc = SourceLocation::ReadVal(D);
332 Expr* Op = D.ReadOwnedPtr<Expr>();
333 return new CastExpr(t,Op,Loc);
334}
335
336
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000337void CharacterLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000338 S.Emit(Value);
339 S.Emit(Loc);
340 S.Emit(getType());
341}
342
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000343CharacterLiteral* CharacterLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000344 unsigned value = D.ReadInt();
345 SourceLocation Loc = SourceLocation::ReadVal(D);
346 QualType T = QualType::ReadVal(D);
347 return new CharacterLiteral(value,T,Loc);
348}
349
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000350void CompoundAssignOperator::EmitImpl(Serializer& S) const {
Ted Kremenekdc4fc272007-11-08 00:41:37 +0000351 S.Emit(getType());
352 S.Emit(ComputationType);
353 S.Emit(getOperatorLoc());
354 S.EmitInt(getOpcode());
355 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
356}
357
358CompoundAssignOperator*
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000359CompoundAssignOperator::CreateImpl(Deserializer& D) {
Ted Kremenekdc4fc272007-11-08 00:41:37 +0000360 QualType t = QualType::ReadVal(D);
361 QualType c = QualType::ReadVal(D);
362 SourceLocation L = SourceLocation::ReadVal(D);
363 Opcode Opc = static_cast<Opcode>(D.ReadInt());
364 Expr* LHS, *RHS;
365 D.BatchReadOwnedPtrs(LHS,RHS);
366
367 return new CompoundAssignOperator(LHS,RHS,Opc,t,c,L);
368}
369
Ted Kremenek2d857102007-11-14 21:18:36 +0000370void CompoundLiteralExpr::EmitImpl(Serializer& S) const {
371 S.Emit(getType());
372 S.EmitOwnedPtr(Init);
373}
374
375CompoundLiteralExpr* CompoundLiteralExpr::CreateImpl(Deserializer& D) {
376 QualType Q = QualType::ReadVal(D);
377 Expr* Init = D.ReadOwnedPtr<Expr>();
378 return new CompoundLiteralExpr(Q,Init);
379}
380
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000381void CompoundStmt::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000382 S.Emit(LBracLoc);
383 S.Emit(RBracLoc);
384 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000385
Ted Kremenek47281102007-11-07 00:17:35 +0000386 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000387 S.EmitOwnedPtr(*I);
388}
389
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000390CompoundStmt* CompoundStmt::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000391 SourceLocation LB = SourceLocation::ReadVal(D);
392 SourceLocation RB = SourceLocation::ReadVal(D);
393 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000394
Ted Kremenek47281102007-11-07 00:17:35 +0000395 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
396
397 stmt->Body.reserve(size);
398
399 for (unsigned i = 0; i < size; ++i)
400 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
401
402 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000403}
Ted Kremenek47281102007-11-07 00:17:35 +0000404
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000405void ConditionalOperator::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000406 S.Emit(getType());
407 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, SubExprs);
408}
409
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000410ConditionalOperator* ConditionalOperator::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000411 QualType t = QualType::ReadVal(D);
412 ConditionalOperator* c = new ConditionalOperator(NULL,NULL,NULL,t);
413 D.BatchReadOwnedPtrs((unsigned) END_EXPR, c->SubExprs);
414 return c;
415}
416
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000417void ContinueStmt::EmitImpl(Serializer& S) const {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000418 S.Emit(ContinueLoc);
419}
420
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000421ContinueStmt* ContinueStmt::CreateImpl(Deserializer& D) {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000422 SourceLocation Loc = SourceLocation::ReadVal(D);
423 return new ContinueStmt(Loc);
424}
425
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000426void DeclStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000427 // FIXME: special handling for struct decls.
428 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000429}
430
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000431void DeclRefExpr::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000432 S.Emit(Loc);
433 S.Emit(getType());
Ted Kremenekeaf33862007-11-15 18:26:39 +0000434
Ted Kremenek9e304302007-11-16 19:00:35 +0000435 // Some DeclRefExprs can actually hold the owning reference to a FunctionDecl.
Ted Kremenekeaf33862007-11-15 18:26:39 +0000436 // This occurs when an implicitly defined function is called, and
437 // the decl does not appear in the source file. We thus check if the
438 // decl pointer has been registered, and if not, emit an owned pointer.
439
440 // FIXME: While this will work for serialization, it won't work for
441 // memory management. The only reason this works for serialization is
442 // because we are tracking all serialized pointers. Either DeclRefExpr
443 // needs an explicit bit indicating that it owns the the object,
444 // or we need a different ownership model.
445
Ted Kremenek9e304302007-11-16 19:00:35 +0000446 const Decl* d = getDecl();
447
448 if (!S.isRegistered(d)) {
449 assert (isa<FunctionDecl>(d)
450 && "DeclRefExpr can only own FunctionDecls for implicitly def. funcs.");
451
452 S.EmitBool(true);
453 S.EmitOwnedPtr(d);
Ted Kremenekeaf33862007-11-15 18:26:39 +0000454 }
455 else {
Ted Kremenek9e304302007-11-16 19:00:35 +0000456 S.EmitBool(false);
457 S.EmitPtr(d);
458 }
Ted Kremenek47281102007-11-07 00:17:35 +0000459}
460
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000461DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000462 SourceLocation Loc = SourceLocation::ReadVal(D);
Ted Kremenekeaf33862007-11-15 18:26:39 +0000463 QualType T = QualType::ReadVal(D);
464 bool OwnsDecl = D.ReadBool();
465 ValueDecl* decl;
466
467 if (!OwnsDecl)
468 D.ReadPtr(decl,false); // No backpatching.
469 else
470 decl = cast<ValueDecl>(D.ReadOwnedPtr<Decl>());
471
472 return new DeclRefExpr(decl,T,Loc);
Ted Kremenek47281102007-11-07 00:17:35 +0000473}
474
Steve Naroff5eb2a4a2007-11-12 14:29:37 +0000475
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000476DeclStmt* DeclStmt::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000477 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
478 return new DeclStmt(decl);
479}
480
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000481void DefaultStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000482 S.Emit(DefaultLoc);
483 S.EmitOwnedPtr(getSubStmt());
484 S.EmitPtr(getNextSwitchCase());
485}
486
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000487DefaultStmt* DefaultStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000488 SourceLocation Loc = SourceLocation::ReadVal(D);
489 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
490
491 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
492 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
493
494 return stmt;
495}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000496
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000497void DoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000498 S.Emit(DoLoc);
499 S.EmitOwnedPtr(getCond());
500 S.EmitOwnedPtr(getBody());
501}
502
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000503DoStmt* DoStmt::CreateImpl(Deserializer& D) {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000504 SourceLocation DoLoc = SourceLocation::ReadVal(D);
505 Expr* Cond = D.ReadOwnedPtr<Expr>();
506 Stmt* Body = D.ReadOwnedPtr<Stmt>();
507 return new DoStmt(Body,Cond,DoLoc);
508}
509
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000510void FloatingLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000511 S.Emit(Loc);
512 S.Emit(getType());
Ted Kremenekddedbe22007-11-29 00:56:49 +0000513 S.EmitBool(isExact());
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000514 S.Emit(Value);
515}
516
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000517FloatingLiteral* FloatingLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000518 SourceLocation Loc = SourceLocation::ReadVal(D);
519 QualType t = QualType::ReadVal(D);
Ted Kremenekddedbe22007-11-29 00:56:49 +0000520 bool isExact = D.ReadBool();
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000521 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
Ted Kremenekddedbe22007-11-29 00:56:49 +0000522 FloatingLiteral* expr = new FloatingLiteral(Val,&isExact,t,Loc);
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000523 return expr;
524}
525
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000526void ForStmt::EmitImpl(Serializer& S) const {
Ted Kremenekf34da902007-11-07 08:02:55 +0000527 S.Emit(ForLoc);
528 S.EmitOwnedPtr(getInit());
529 S.EmitOwnedPtr(getCond());
530 S.EmitOwnedPtr(getInc());
531 S.EmitOwnedPtr(getBody());
532}
533
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000534ForStmt* ForStmt::CreateImpl(Deserializer& D) {
Ted Kremenekf34da902007-11-07 08:02:55 +0000535 SourceLocation ForLoc = SourceLocation::ReadVal(D);
536 Stmt* Init = D.ReadOwnedPtr<Stmt>();
537 Expr* Cond = D.ReadOwnedPtr<Expr>();
538 Expr* Inc = D.ReadOwnedPtr<Expr>();
539 Stmt* Body = D.ReadOwnedPtr<Stmt>();
540 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
541}
542
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000543void GotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000544 S.Emit(GotoLoc);
545 S.Emit(LabelLoc);
546 S.EmitPtr(Label);
547}
548
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000549GotoStmt* GotoStmt::CreateImpl(Deserializer& D) {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000550 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
551 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
552 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
553 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
554 return stmt;
555}
556
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000557void IfStmt::EmitImpl(Serializer& S) const {
Ted Kremenekca22d352007-11-07 07:19:30 +0000558 S.Emit(IfLoc);
559 S.EmitOwnedPtr(getCond());
560 S.EmitOwnedPtr(getThen());
561 S.EmitOwnedPtr(getElse());
562}
563
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000564IfStmt* IfStmt::CreateImpl(Deserializer& D) {
Ted Kremenekca22d352007-11-07 07:19:30 +0000565 SourceLocation L = SourceLocation::ReadVal(D);
566 Expr* Cond = D.ReadOwnedPtr<Expr>();
567 Stmt* Then = D.ReadOwnedPtr<Stmt>();
568 Stmt* Else = D.ReadOwnedPtr<Stmt>();
569 return new IfStmt(L,Cond,Then,Else);
570}
571
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000572void ImaginaryLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000573 S.Emit(getType());
574 S.EmitOwnedPtr(Val);
575}
576
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000577ImaginaryLiteral* ImaginaryLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000578 QualType t = QualType::ReadVal(D);
579 Expr* expr = D.ReadOwnedPtr<Expr>();
580 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
581 return new ImaginaryLiteral(expr,t);
582}
583
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000584void ImplicitCastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000585 S.Emit(getType());
586 S.EmitOwnedPtr(Op);
587}
588
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000589ImplicitCastExpr* ImplicitCastExpr::CreateImpl(Deserializer& D) {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000590 QualType t = QualType::ReadVal(D);
591 Expr* Op = D.ReadOwnedPtr<Expr>();
592 return new ImplicitCastExpr(t,Op);
593}
594
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000595void IndirectGotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000596 S.EmitOwnedPtr(Target);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000597}
598
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000599IndirectGotoStmt* IndirectGotoStmt::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000600 Expr* Target = D.ReadOwnedPtr<Expr>();
601 return new IndirectGotoStmt(Target);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000602}
603
Ted Kremenek387539f2007-11-14 21:31:46 +0000604void InitListExpr::EmitImpl(Serializer& S) const {
605 S.Emit(LBraceLoc);
606 S.Emit(RBraceLoc);
607 S.EmitInt(NumInits);
608 S.BatchEmitOwnedPtrs(NumInits,InitExprs);
609}
610
611InitListExpr* InitListExpr::CreateImpl(Deserializer& D) {
612 InitListExpr* expr = new InitListExpr();
613 expr->LBraceLoc = SourceLocation::ReadVal(D);
614 expr->RBraceLoc = SourceLocation::ReadVal(D);
615 expr->NumInits = D.ReadInt();
616 assert(expr->NumInits);
617 expr->InitExprs = new Expr*[expr->NumInits];
618 D.BatchReadOwnedPtrs(expr->NumInits,expr->InitExprs);
619 return expr;
620}
621
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000622void IntegerLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000623 S.Emit(Loc);
624 S.Emit(getType());
625 S.Emit(getValue());
626}
627
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000628IntegerLiteral* IntegerLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000629 SourceLocation Loc = SourceLocation::ReadVal(D);
630 QualType T = QualType::ReadVal(D);
631
632 // Create a dummy APInt because it is more efficient to deserialize
633 // it in place with the deserialized IntegerLiteral. (fewer copies)
634 llvm::APInt temp;
635 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
636 D.Read(expr->Value);
637
638 return expr;
639}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000640
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000641void LabelStmt::EmitImpl(Serializer& S) const {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000642 S.EmitPtr(Label);
643 S.Emit(IdentLoc);
644 S.EmitOwnedPtr(SubStmt);
645}
646
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000647LabelStmt* LabelStmt::CreateImpl(Deserializer& D) {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000648 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
649 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
650 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
651 return new LabelStmt(IdentLoc,Label,SubStmt);
652}
653
Ted Kremenek24160d32007-11-13 22:16:23 +0000654void MemberExpr::EmitImpl(Serializer& S) const {
655 S.Emit(MemberLoc);
656 S.EmitPtr(MemberDecl);
657 S.EmitBool(IsArrow);
658 S.EmitOwnedPtr(Base);
659}
660
661MemberExpr* MemberExpr::CreateImpl(Deserializer& D) {
662 SourceLocation L = SourceLocation::ReadVal(D);
663 FieldDecl* MemberDecl = cast<FieldDecl>(D.ReadPtr<Decl>());
664 bool IsArrow = D.ReadBool();
665 Expr* base = D.ReadOwnedPtr<Expr>();
666
667 return new MemberExpr(base,IsArrow,MemberDecl,L);
668}
669
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000670void NullStmt::EmitImpl(Serializer& S) const {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000671 S.Emit(SemiLoc);
672}
673
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000674NullStmt* NullStmt::CreateImpl(Deserializer& D) {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000675 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
676 return new NullStmt(SemiLoc);
677}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000678
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000679void ParenExpr::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000680 S.Emit(L);
681 S.Emit(R);
682 S.EmitOwnedPtr(Val);
683}
684
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000685ParenExpr* ParenExpr::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000686 SourceLocation L = SourceLocation::ReadVal(D);
687 SourceLocation R = SourceLocation::ReadVal(D);
688 Expr* val = D.ReadOwnedPtr<Expr>();
689 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000690}
691
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000692void PreDefinedExpr::EmitImpl(Serializer& S) const {
Ted Kremenek539a4182007-11-07 17:11:58 +0000693 S.Emit(Loc);
694 S.EmitInt(getIdentType());
695 S.Emit(getType());
696}
697
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000698PreDefinedExpr* PreDefinedExpr::CreateImpl(Deserializer& D) {
Ted Kremenek539a4182007-11-07 17:11:58 +0000699 SourceLocation Loc = SourceLocation::ReadVal(D);
700 IdentType it = static_cast<IdentType>(D.ReadInt());
701 QualType Q = QualType::ReadVal(D);
702 return new PreDefinedExpr(Loc,Q,it);
703}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000704
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000705void ReturnStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000706 S.Emit(RetLoc);
707 S.EmitOwnedPtr(RetExpr);
708}
709
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000710ReturnStmt* ReturnStmt::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000711 SourceLocation RetLoc = SourceLocation::ReadVal(D);
712 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
713 return new ReturnStmt(RetLoc,RetExpr);
714}
715
Ted Kremenekdeac9c32007-11-13 22:30:29 +0000716void SizeOfAlignOfTypeExpr::EmitImpl(Serializer& S) const {
717 S.EmitBool(isSizeof);
718 S.Emit(Ty);
719 S.Emit(getType());
720 S.Emit(OpLoc);
721 S.Emit(RParenLoc);
722}
723
724SizeOfAlignOfTypeExpr* SizeOfAlignOfTypeExpr::CreateImpl(Deserializer& D) {
725 bool isSizeof = D.ReadBool();
726 QualType Ty = QualType::ReadVal(D);
727 QualType Res = QualType::ReadVal(D);
728 SourceLocation OpLoc = SourceLocation::ReadVal(D);
729 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
730
731 return new SizeOfAlignOfTypeExpr(isSizeof,Ty,Res,OpLoc,RParenLoc);
732}
733
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000734void StmtExpr::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000735 S.Emit(getType());
736 S.Emit(LParenLoc);
737 S.Emit(RParenLoc);
738 S.EmitOwnedPtr(SubStmt);
739}
740
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000741StmtExpr* StmtExpr::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000742 QualType t = QualType::ReadVal(D);
743 SourceLocation L = SourceLocation::ReadVal(D);
744 SourceLocation R = SourceLocation::ReadVal(D);
745 CompoundStmt* SubStmt = cast<CompoundStmt>(D.ReadOwnedPtr<Stmt>());
746 return new StmtExpr(SubStmt,t,L,R);
747}
748
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000749void StringLiteral::EmitImpl(Serializer& S) const {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000750 S.Emit(getType());
751 S.Emit(firstTokLoc);
752 S.Emit(lastTokLoc);
753 S.EmitBool(isWide());
754 S.Emit(getByteLength());
755
756 for (unsigned i = 0 ; i < ByteLength; ++i)
757 S.EmitInt(StrData[i]);
758}
759
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000760StringLiteral* StringLiteral::CreateImpl(Deserializer& D) {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000761 QualType t = QualType::ReadVal(D);
762 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
763 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
764 bool isWide = D.ReadBool();
765 unsigned ByteLength = D.ReadInt();
766
767 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
768
769 char* StrData = new char[ByteLength];
770 for (unsigned i = 0; i < ByteLength; ++i)
771 StrData[i] = (char) D.ReadInt();
772
773 sl->ByteLength = ByteLength;
774 sl->StrData = StrData;
775
776 return sl;
777}
778
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000779void SwitchStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000780 S.Emit(SwitchLoc);
781 S.EmitOwnedPtr(getCond());
782 S.EmitOwnedPtr(getBody());
783 S.EmitPtr(FirstCase);
784}
785
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000786SwitchStmt* SwitchStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000787 SourceLocation Loc = SourceLocation::ReadVal(D);
788 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
789 Stmt* Body = D.ReadOwnedPtr<Stmt>();
790 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
791
792 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
793 stmt->setBody(Body,Loc);
794 stmt->FirstCase = FirstCase;
795
796 return stmt;
797}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000798
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000799void UnaryOperator::EmitImpl(Serializer& S) const {
Ted Kremeneke21b5842007-11-08 00:26:24 +0000800 S.Emit(getType());
801 S.Emit(Loc);
802 S.EmitInt(Opc);
803 S.EmitOwnedPtr(Val);
804}
805
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000806UnaryOperator* UnaryOperator::CreateImpl(Deserializer& D) {
Ted Kremeneke21b5842007-11-08 00:26:24 +0000807 QualType t = QualType::ReadVal(D);
808 SourceLocation L = SourceLocation::ReadVal(D);
809 Opcode Opc = static_cast<Opcode>(D.ReadInt());
810 Expr* Val = D.ReadOwnedPtr<Expr>();
811 return new UnaryOperator(Val,Opc,t,L);
812}
813
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000814void WhileStmt::EmitImpl(Serializer& S) const {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000815 S.Emit(WhileLoc);
816 S.EmitOwnedPtr(getCond());
817 S.EmitOwnedPtr(getBody());
818}
819
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000820WhileStmt* WhileStmt::CreateImpl(Deserializer& D) {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000821 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
822 Expr* Cond = D.ReadOwnedPtr<Expr>();
823 Stmt* Body = D.ReadOwnedPtr<Stmt>();
824 return new WhileStmt(Cond,Body,WhileLoc);
825}
Ted Kremeneka7fb3a52007-11-15 18:10:29 +0000826
827//===----------------------------------------------------------------------===//
828// Objective C Serialization
829//===----------------------------------------------------------------------===//
830
Ted Kremeneka0c7df32007-12-04 00:28:54 +0000831void ObjcAtCatchStmt::EmitImpl(Serializer& S) const {
832 S.Emit(AtCatchLoc);
833 S.Emit(RParenLoc);
834 S.EmitPtr(NextAtCatchStmt);
835 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
836}
837
838ObjcAtCatchStmt* ObjcAtCatchStmt::CreateImpl(Deserializer& D) {
839 SourceLocation AtCatchLoc = SourceLocation::ReadVal(D);
840 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
841
842 ObjcAtCatchStmt* stmt = new ObjcAtCatchStmt(AtCatchLoc,RParenLoc);
843
844 D.ReadPtr(stmt->NextAtCatchStmt); // Allows backpatching.
845 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubExprs[0]);
846
847 return stmt;
848}
849
Ted Kremeneka7fb3a52007-11-15 18:10:29 +0000850void ObjCIvarRefExpr::EmitImpl(Serializer& S) const {
851 S.Emit(Loc);
852 S.Emit(getType());
853 S.EmitPtr(getDecl());
854}
855
856ObjCIvarRefExpr* ObjCIvarRefExpr::CreateImpl(Deserializer& D) {
857 SourceLocation Loc = SourceLocation::ReadVal(D);
858 QualType T = QualType::ReadVal(D);
859 ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
860 D.ReadPtr(dr->D,false);
861 return dr;
862}