blob: 10563bd0ca794e9763d8991c06de920b8ebda98e [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 Kremenek2bd6e652007-11-07 00:37:40 +000044 case BinaryOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000045 return BinaryOperator::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000046
Ted Kremenek249d7cd2007-11-07 05:25:31 +000047 case BreakStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000048 return BreakStmt::CreateImpl(D);
Ted Kremenek7a873332007-11-07 23:32:20 +000049
50 case CallExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000051 return CallExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000052
53 case CaseStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000054 return CaseStmt::CreateImpl(D);
Ted Kremenek705cb5d2007-11-07 22:42:34 +000055
56 case CastExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000057 return CastExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000058
Ted Kremenek42f440c2007-11-07 17:15:49 +000059 case CharacterLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000060 return CharacterLiteral::CreateImpl(D);
Ted Kremenek42f440c2007-11-07 17:15:49 +000061
Ted Kremenekdc4fc272007-11-08 00:41:37 +000062 case CompoundAssignOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000063 return CompoundAssignOperator::CreateImpl(D);
Ted Kremenekdc4fc272007-11-08 00:41:37 +000064
Ted Kremenek47281102007-11-07 00:17:35 +000065 case CompoundStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000066 return CompoundStmt::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +000067
68 case ConditionalOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000069 return ConditionalOperator::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000070
Ted Kremenek6c4dba72007-11-07 17:05:07 +000071 case ContinueStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000072 return ContinueStmt::CreateImpl(D);
Ted Kremenek6c4dba72007-11-07 17:05:07 +000073
Ted Kremenek47281102007-11-07 00:17:35 +000074 case DeclRefExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000075 return DeclRefExpr::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +000076
Ted Kremenek2bd6e652007-11-07 00:37:40 +000077 case DeclStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000078 return DeclStmt::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000079
80 case DefaultStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000081 return DefaultStmt::CreateImpl(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000082
83 case DoStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000084 return DoStmt::CreateImpl(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000085
86 case FloatingLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000087 return FloatingLiteral::CreateImpl(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000088
89 case ForStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000090 return ForStmt::CreateImpl(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000091
92 case GotoStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000093 return GotoStmt::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000094
Ted Kremenekca22d352007-11-07 07:19:30 +000095 case IfStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000096 return IfStmt::CreateImpl(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000097
98 case ImaginaryLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +000099 return ImaginaryLiteral::CreateImpl(D);
Ted Kremenekca22d352007-11-07 07:19:30 +0000100
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000101 case ImplicitCastExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000102 return ImplicitCastExpr::CreateImpl(D);
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000103
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000104 case IndirectGotoStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000105 return IndirectGotoStmt::CreateImpl(D);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000106
Ted Kremenek47281102007-11-07 00:17:35 +0000107 case IntegerLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000108 return IntegerLiteral::CreateImpl(D);
Ted Kremenek25aaa262007-11-07 00:40:53 +0000109
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000110 case LabelStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000111 return LabelStmt::CreateImpl(D);
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000112
Ted Kremenek24160d32007-11-13 22:16:23 +0000113 case MemberExprClass:
114 return MemberExpr::CreateImpl(D);
115
Ted Kremenek25aaa262007-11-07 00:40:53 +0000116 case NullStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000117 return NullStmt::CreateImpl(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000118
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000119 case ParenExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000120 return ParenExpr::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000121
Ted Kremenek539a4182007-11-07 17:11:58 +0000122 case PreDefinedExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000123 return PreDefinedExpr::CreateImpl(D);
Ted Kremenek539a4182007-11-07 17:11:58 +0000124
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000125 case ReturnStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000126 return ReturnStmt::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000127
Ted Kremenekdeac9c32007-11-13 22:30:29 +0000128 case SizeOfAlignOfTypeExprClass:
129 return SizeOfAlignOfTypeExpr::CreateImpl(D);
130
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000131 case StmtExprClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000132 return StmtExpr::CreateImpl(D);
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000133
Ted Kremenekefa540d2007-11-07 19:08:19 +0000134 case StringLiteralClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000135 return StringLiteral::CreateImpl(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000136
137 case SwitchStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000138 return SwitchStmt::CreateImpl(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000139
Ted Kremeneke21b5842007-11-08 00:26:24 +0000140 case UnaryOperatorClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000141 return UnaryOperator::CreateImpl(D);
Ted Kremeneke21b5842007-11-08 00:26:24 +0000142
Ted Kremenek55e559a2007-11-07 07:50:10 +0000143 case WhileStmtClass:
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000144 return WhileStmt::CreateImpl(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000145 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000146}
147
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000148void AddrLabelExpr::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000149 S.Emit(getType());
150 S.Emit(AmpAmpLoc);
151 S.Emit(LabelLoc);
152 S.EmitPtr(Label);
153}
154
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000155AddrLabelExpr* AddrLabelExpr::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000156 QualType t = QualType::ReadVal(D);
157 SourceLocation AALoc = SourceLocation::ReadVal(D);
158 SourceLocation LLoc = SourceLocation::ReadVal(D);
159 AddrLabelExpr* expr = new AddrLabelExpr(AALoc,LLoc,NULL,t);
160 D.ReadPtr(expr->Label); // Pointer may be backpatched.
161 return expr;
162}
163
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000164void ArraySubscriptExpr::EmitImpl(Serializer& S) const {
Ted Kremenekd7017492007-11-07 22:53:01 +0000165 S.Emit(getType());
166 S.Emit(RBracketLoc);
167 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
168}
169
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000170ArraySubscriptExpr* ArraySubscriptExpr::CreateImpl(Deserializer& D) {
Ted Kremenekd7017492007-11-07 22:53:01 +0000171 QualType t = QualType::ReadVal(D);
172 SourceLocation L = SourceLocation::ReadVal(D);
173 Expr *LHS, *RHS;
174 D.BatchReadOwnedPtrs(LHS,RHS);
175 return new ArraySubscriptExpr(LHS,RHS,t,L);
176}
177
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000178void BinaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000179 S.EmitInt(Opc);
180 S.Emit(OpLoc);;
181 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000182 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000183}
184
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000185BinaryOperator* BinaryOperator::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000186 Opcode Opc = static_cast<Opcode>(D.ReadInt());
187 SourceLocation OpLoc = SourceLocation::ReadVal(D);
188 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000189 Expr *LHS, *RHS;
190 D.BatchReadOwnedPtrs(LHS,RHS);
191
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000192 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
193}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000194
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000195void BreakStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000196 S.Emit(BreakLoc);
197}
198
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000199BreakStmt* BreakStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000200 SourceLocation Loc = SourceLocation::ReadVal(D);
201 return new BreakStmt(Loc);
202}
Ted Kremenek7a873332007-11-07 23:32:20 +0000203
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000204void CallExpr::EmitImpl(Serializer& S) const {
Ted Kremenek7a873332007-11-07 23:32:20 +0000205 S.Emit(getType());
206 S.Emit(RParenLoc);
207 S.EmitInt(NumArgs);
208 S.BatchEmitOwnedPtrs(NumArgs+1,SubExprs);
209}
210
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000211CallExpr* CallExpr::CreateImpl(Deserializer& D) {
Ted Kremenek7a873332007-11-07 23:32:20 +0000212 QualType t = QualType::ReadVal(D);
213 SourceLocation L = SourceLocation::ReadVal(D);
214 unsigned NumArgs = D.ReadInt();
215 Expr** SubExprs = new Expr*[NumArgs+1];
216 D.BatchReadOwnedPtrs(NumArgs+1,SubExprs);
217
218 return new CallExpr(SubExprs,NumArgs,t,L);
219}
220
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000221void CaseStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000222 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000223 S.EmitPtr(getNextSwitchCase());
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000224 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000225}
226
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000227CaseStmt* CaseStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000228 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenek6d4adb22007-11-08 00:56:26 +0000229 CaseStmt* stmt = new CaseStmt(NULL,NULL,NULL,CaseLoc);
230 D.ReadPtr(stmt->NextSwitchCase);
231 D.BatchReadOwnedPtrs((unsigned) END_EXPR,&stmt->SubExprs[0]);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000232 return stmt;
233}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000234
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000235void CastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000236 S.Emit(getType());
237 S.Emit(Loc);
238 S.EmitOwnedPtr(Op);
239}
240
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000241CastExpr* CastExpr::CreateImpl(Deserializer& D) {
Ted Kremenek705cb5d2007-11-07 22:42:34 +0000242 QualType t = QualType::ReadVal(D);
243 SourceLocation Loc = SourceLocation::ReadVal(D);
244 Expr* Op = D.ReadOwnedPtr<Expr>();
245 return new CastExpr(t,Op,Loc);
246}
247
248
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000249void CharacterLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000250 S.Emit(Value);
251 S.Emit(Loc);
252 S.Emit(getType());
253}
254
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000255CharacterLiteral* CharacterLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek42f440c2007-11-07 17:15:49 +0000256 unsigned value = D.ReadInt();
257 SourceLocation Loc = SourceLocation::ReadVal(D);
258 QualType T = QualType::ReadVal(D);
259 return new CharacterLiteral(value,T,Loc);
260}
261
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000262void CompoundAssignOperator::EmitImpl(Serializer& S) const {
Ted Kremenekdc4fc272007-11-08 00:41:37 +0000263 S.Emit(getType());
264 S.Emit(ComputationType);
265 S.Emit(getOperatorLoc());
266 S.EmitInt(getOpcode());
267 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
268}
269
270CompoundAssignOperator*
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000271CompoundAssignOperator::CreateImpl(Deserializer& D) {
Ted Kremenekdc4fc272007-11-08 00:41:37 +0000272 QualType t = QualType::ReadVal(D);
273 QualType c = QualType::ReadVal(D);
274 SourceLocation L = SourceLocation::ReadVal(D);
275 Opcode Opc = static_cast<Opcode>(D.ReadInt());
276 Expr* LHS, *RHS;
277 D.BatchReadOwnedPtrs(LHS,RHS);
278
279 return new CompoundAssignOperator(LHS,RHS,Opc,t,c,L);
280}
281
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000282void CompoundStmt::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000283 S.Emit(LBracLoc);
284 S.Emit(RBracLoc);
285 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000286
Ted Kremenek47281102007-11-07 00:17:35 +0000287 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000288 S.EmitOwnedPtr(*I);
289}
290
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000291CompoundStmt* CompoundStmt::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000292 SourceLocation LB = SourceLocation::ReadVal(D);
293 SourceLocation RB = SourceLocation::ReadVal(D);
294 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000295
Ted Kremenek47281102007-11-07 00:17:35 +0000296 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
297
298 stmt->Body.reserve(size);
299
300 for (unsigned i = 0; i < size; ++i)
301 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
302
303 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000304}
Ted Kremenek47281102007-11-07 00:17:35 +0000305
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000306void ConditionalOperator::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000307 S.Emit(getType());
308 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, SubExprs);
309}
310
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000311ConditionalOperator* ConditionalOperator::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000312 QualType t = QualType::ReadVal(D);
313 ConditionalOperator* c = new ConditionalOperator(NULL,NULL,NULL,t);
314 D.BatchReadOwnedPtrs((unsigned) END_EXPR, c->SubExprs);
315 return c;
316}
317
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000318void ContinueStmt::EmitImpl(Serializer& S) const {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000319 S.Emit(ContinueLoc);
320}
321
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000322ContinueStmt* ContinueStmt::CreateImpl(Deserializer& D) {
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000323 SourceLocation Loc = SourceLocation::ReadVal(D);
324 return new ContinueStmt(Loc);
325}
326
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000327void DeclStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000328 // FIXME: special handling for struct decls.
329 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000330}
331
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000332void DeclRefExpr::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000333 S.Emit(Loc);
334 S.Emit(getType());
335 S.EmitPtr(getDecl());
336}
337
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000338DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000339 SourceLocation Loc = SourceLocation::ReadVal(D);
340 QualType T = QualType::ReadVal(D);
341 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
342 D.ReadPtr(dr->D,false);
343 return dr;
344}
345
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000346void ObjCIvarRefExpr::EmitImpl(Serializer& S) const {
Steve Naroff5eb2a4a2007-11-12 14:29:37 +0000347 S.Emit(Loc);
348 S.Emit(getType());
349 S.EmitPtr(getDecl());
350}
351
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000352ObjCIvarRefExpr* ObjCIvarRefExpr::CreateImpl(Deserializer& D) {
Steve Naroff5eb2a4a2007-11-12 14:29:37 +0000353 SourceLocation Loc = SourceLocation::ReadVal(D);
354 QualType T = QualType::ReadVal(D);
355 ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
356 D.ReadPtr(dr->D,false);
357 return dr;
358}
359
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000360DeclStmt* DeclStmt::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000361 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
362 return new DeclStmt(decl);
363}
364
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000365void DefaultStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000366 S.Emit(DefaultLoc);
367 S.EmitOwnedPtr(getSubStmt());
368 S.EmitPtr(getNextSwitchCase());
369}
370
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000371DefaultStmt* DefaultStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000372 SourceLocation Loc = SourceLocation::ReadVal(D);
373 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
374
375 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
376 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
377
378 return stmt;
379}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000380
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000381void DoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000382 S.Emit(DoLoc);
383 S.EmitOwnedPtr(getCond());
384 S.EmitOwnedPtr(getBody());
385}
386
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000387DoStmt* DoStmt::CreateImpl(Deserializer& D) {
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000388 SourceLocation DoLoc = SourceLocation::ReadVal(D);
389 Expr* Cond = D.ReadOwnedPtr<Expr>();
390 Stmt* Body = D.ReadOwnedPtr<Stmt>();
391 return new DoStmt(Body,Cond,DoLoc);
392}
393
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000394void FloatingLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000395 S.Emit(Loc);
396 S.Emit(getType());
397 S.Emit(Value);
398}
399
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000400FloatingLiteral* FloatingLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000401 SourceLocation Loc = SourceLocation::ReadVal(D);
402 QualType t = QualType::ReadVal(D);
403 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
404 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
405 return expr;
406}
407
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000408void ForStmt::EmitImpl(Serializer& S) const {
Ted Kremenekf34da902007-11-07 08:02:55 +0000409 S.Emit(ForLoc);
410 S.EmitOwnedPtr(getInit());
411 S.EmitOwnedPtr(getCond());
412 S.EmitOwnedPtr(getInc());
413 S.EmitOwnedPtr(getBody());
414}
415
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000416ForStmt* ForStmt::CreateImpl(Deserializer& D) {
Ted Kremenekf34da902007-11-07 08:02:55 +0000417 SourceLocation ForLoc = SourceLocation::ReadVal(D);
418 Stmt* Init = D.ReadOwnedPtr<Stmt>();
419 Expr* Cond = D.ReadOwnedPtr<Expr>();
420 Expr* Inc = D.ReadOwnedPtr<Expr>();
421 Stmt* Body = D.ReadOwnedPtr<Stmt>();
422 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
423}
424
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000425void GotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000426 S.Emit(GotoLoc);
427 S.Emit(LabelLoc);
428 S.EmitPtr(Label);
429}
430
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000431GotoStmt* GotoStmt::CreateImpl(Deserializer& D) {
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000432 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
433 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
434 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
435 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
436 return stmt;
437}
438
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000439void IfStmt::EmitImpl(Serializer& S) const {
Ted Kremenekca22d352007-11-07 07:19:30 +0000440 S.Emit(IfLoc);
441 S.EmitOwnedPtr(getCond());
442 S.EmitOwnedPtr(getThen());
443 S.EmitOwnedPtr(getElse());
444}
445
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000446IfStmt* IfStmt::CreateImpl(Deserializer& D) {
Ted Kremenekca22d352007-11-07 07:19:30 +0000447 SourceLocation L = SourceLocation::ReadVal(D);
448 Expr* Cond = D.ReadOwnedPtr<Expr>();
449 Stmt* Then = D.ReadOwnedPtr<Stmt>();
450 Stmt* Else = D.ReadOwnedPtr<Stmt>();
451 return new IfStmt(L,Cond,Then,Else);
452}
453
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000454void ImaginaryLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000455 S.Emit(getType());
456 S.EmitOwnedPtr(Val);
457}
458
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000459ImaginaryLiteral* ImaginaryLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek105f21a2007-11-07 18:53:02 +0000460 QualType t = QualType::ReadVal(D);
461 Expr* expr = D.ReadOwnedPtr<Expr>();
462 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
463 return new ImaginaryLiteral(expr,t);
464}
465
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000466void ImplicitCastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000467 S.Emit(getType());
468 S.EmitOwnedPtr(Op);
469}
470
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000471ImplicitCastExpr* ImplicitCastExpr::CreateImpl(Deserializer& D) {
Ted Kremenek8c9833b2007-11-07 22:39:17 +0000472 QualType t = QualType::ReadVal(D);
473 Expr* Op = D.ReadOwnedPtr<Expr>();
474 return new ImplicitCastExpr(t,Op);
475}
476
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000477void IndirectGotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000478 S.EmitOwnedPtr(Target);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000479}
480
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000481IndirectGotoStmt* IndirectGotoStmt::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000482 Expr* Target = D.ReadOwnedPtr<Expr>();
483 return new IndirectGotoStmt(Target);
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000484}
485
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000486void IntegerLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek47281102007-11-07 00:17:35 +0000487 S.Emit(Loc);
488 S.Emit(getType());
489 S.Emit(getValue());
490}
491
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000492IntegerLiteral* IntegerLiteral::CreateImpl(Deserializer& D) {
Ted Kremenek47281102007-11-07 00:17:35 +0000493 SourceLocation Loc = SourceLocation::ReadVal(D);
494 QualType T = QualType::ReadVal(D);
495
496 // Create a dummy APInt because it is more efficient to deserialize
497 // it in place with the deserialized IntegerLiteral. (fewer copies)
498 llvm::APInt temp;
499 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
500 D.Read(expr->Value);
501
502 return expr;
503}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000504
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000505void LabelStmt::EmitImpl(Serializer& S) const {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000506 S.EmitPtr(Label);
507 S.Emit(IdentLoc);
508 S.EmitOwnedPtr(SubStmt);
509}
510
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000511LabelStmt* LabelStmt::CreateImpl(Deserializer& D) {
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000512 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
513 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
514 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
515 return new LabelStmt(IdentLoc,Label,SubStmt);
516}
517
Ted Kremenek24160d32007-11-13 22:16:23 +0000518void MemberExpr::EmitImpl(Serializer& S) const {
519 S.Emit(MemberLoc);
520 S.EmitPtr(MemberDecl);
521 S.EmitBool(IsArrow);
522 S.EmitOwnedPtr(Base);
523}
524
525MemberExpr* MemberExpr::CreateImpl(Deserializer& D) {
526 SourceLocation L = SourceLocation::ReadVal(D);
527 FieldDecl* MemberDecl = cast<FieldDecl>(D.ReadPtr<Decl>());
528 bool IsArrow = D.ReadBool();
529 Expr* base = D.ReadOwnedPtr<Expr>();
530
531 return new MemberExpr(base,IsArrow,MemberDecl,L);
532}
533
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000534void NullStmt::EmitImpl(Serializer& S) const {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000535 S.Emit(SemiLoc);
536}
537
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000538NullStmt* NullStmt::CreateImpl(Deserializer& D) {
Ted Kremenek25aaa262007-11-07 00:40:53 +0000539 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
540 return new NullStmt(SemiLoc);
541}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000542
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000543void ParenExpr::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000544 S.Emit(L);
545 S.Emit(R);
546 S.EmitOwnedPtr(Val);
547}
548
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000549ParenExpr* ParenExpr::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000550 SourceLocation L = SourceLocation::ReadVal(D);
551 SourceLocation R = SourceLocation::ReadVal(D);
552 Expr* val = D.ReadOwnedPtr<Expr>();
553 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000554}
555
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000556void PreDefinedExpr::EmitImpl(Serializer& S) const {
Ted Kremenek539a4182007-11-07 17:11:58 +0000557 S.Emit(Loc);
558 S.EmitInt(getIdentType());
559 S.Emit(getType());
560}
561
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000562PreDefinedExpr* PreDefinedExpr::CreateImpl(Deserializer& D) {
Ted Kremenek539a4182007-11-07 17:11:58 +0000563 SourceLocation Loc = SourceLocation::ReadVal(D);
564 IdentType it = static_cast<IdentType>(D.ReadInt());
565 QualType Q = QualType::ReadVal(D);
566 return new PreDefinedExpr(Loc,Q,it);
567}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000568
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000569void ReturnStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000570 S.Emit(RetLoc);
571 S.EmitOwnedPtr(RetExpr);
572}
573
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000574ReturnStmt* ReturnStmt::CreateImpl(Deserializer& D) {
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000575 SourceLocation RetLoc = SourceLocation::ReadVal(D);
576 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
577 return new ReturnStmt(RetLoc,RetExpr);
578}
579
Ted Kremenekdeac9c32007-11-13 22:30:29 +0000580void SizeOfAlignOfTypeExpr::EmitImpl(Serializer& S) const {
581 S.EmitBool(isSizeof);
582 S.Emit(Ty);
583 S.Emit(getType());
584 S.Emit(OpLoc);
585 S.Emit(RParenLoc);
586}
587
588SizeOfAlignOfTypeExpr* SizeOfAlignOfTypeExpr::CreateImpl(Deserializer& D) {
589 bool isSizeof = D.ReadBool();
590 QualType Ty = QualType::ReadVal(D);
591 QualType Res = QualType::ReadVal(D);
592 SourceLocation OpLoc = SourceLocation::ReadVal(D);
593 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
594
595 return new SizeOfAlignOfTypeExpr(isSizeof,Ty,Res,OpLoc,RParenLoc);
596}
597
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000598void StmtExpr::EmitImpl(Serializer& S) const {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000599 S.Emit(getType());
600 S.Emit(LParenLoc);
601 S.Emit(RParenLoc);
602 S.EmitOwnedPtr(SubStmt);
603}
604
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000605StmtExpr* StmtExpr::CreateImpl(Deserializer& D) {
Ted Kremenek3a4dfc12007-11-08 16:32:00 +0000606 QualType t = QualType::ReadVal(D);
607 SourceLocation L = SourceLocation::ReadVal(D);
608 SourceLocation R = SourceLocation::ReadVal(D);
609 CompoundStmt* SubStmt = cast<CompoundStmt>(D.ReadOwnedPtr<Stmt>());
610 return new StmtExpr(SubStmt,t,L,R);
611}
612
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000613void StringLiteral::EmitImpl(Serializer& S) const {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000614 S.Emit(getType());
615 S.Emit(firstTokLoc);
616 S.Emit(lastTokLoc);
617 S.EmitBool(isWide());
618 S.Emit(getByteLength());
619
620 for (unsigned i = 0 ; i < ByteLength; ++i)
621 S.EmitInt(StrData[i]);
622}
623
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000624StringLiteral* StringLiteral::CreateImpl(Deserializer& D) {
Ted Kremenekefa540d2007-11-07 19:08:19 +0000625 QualType t = QualType::ReadVal(D);
626 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
627 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
628 bool isWide = D.ReadBool();
629 unsigned ByteLength = D.ReadInt();
630
631 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
632
633 char* StrData = new char[ByteLength];
634 for (unsigned i = 0; i < ByteLength; ++i)
635 StrData[i] = (char) D.ReadInt();
636
637 sl->ByteLength = ByteLength;
638 sl->StrData = StrData;
639
640 return sl;
641}
642
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000643void SwitchStmt::EmitImpl(Serializer& S) const {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000644 S.Emit(SwitchLoc);
645 S.EmitOwnedPtr(getCond());
646 S.EmitOwnedPtr(getBody());
647 S.EmitPtr(FirstCase);
648}
649
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000650SwitchStmt* SwitchStmt::CreateImpl(Deserializer& D) {
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000651 SourceLocation Loc = SourceLocation::ReadVal(D);
652 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
653 Stmt* Body = D.ReadOwnedPtr<Stmt>();
654 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
655
656 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
657 stmt->setBody(Body,Loc);
658 stmt->FirstCase = FirstCase;
659
660 return stmt;
661}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000662
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000663void UnaryOperator::EmitImpl(Serializer& S) const {
Ted Kremeneke21b5842007-11-08 00:26:24 +0000664 S.Emit(getType());
665 S.Emit(Loc);
666 S.EmitInt(Opc);
667 S.EmitOwnedPtr(Val);
668}
669
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000670UnaryOperator* UnaryOperator::CreateImpl(Deserializer& D) {
Ted Kremeneke21b5842007-11-08 00:26:24 +0000671 QualType t = QualType::ReadVal(D);
672 SourceLocation L = SourceLocation::ReadVal(D);
673 Opcode Opc = static_cast<Opcode>(D.ReadInt());
674 Expr* Val = D.ReadOwnedPtr<Expr>();
675 return new UnaryOperator(Val,Opc,t,L);
676}
677
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000678void WhileStmt::EmitImpl(Serializer& S) const {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000679 S.Emit(WhileLoc);
680 S.EmitOwnedPtr(getCond());
681 S.EmitOwnedPtr(getBody());
682}
683
Ted Kremenekd732bbd2007-11-12 18:04:32 +0000684WhileStmt* WhileStmt::CreateImpl(Deserializer& D) {
Ted Kremenek55e559a2007-11-07 07:50:10 +0000685 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
686 Expr* Cond = D.ReadOwnedPtr<Expr>();
687 Stmt* Body = D.ReadOwnedPtr<Stmt>();
688 return new WhileStmt(Cond,Body,WhileLoc);
689}