blob: 40f5b3ffc5b685c027b27f11f9f34d612fbaf1b1 [file] [log] [blame]
Ted Kremeneke522d852007-10-31 18:41:19 +00001//===--- StmtSerialization.cpp - Serialization of Statements --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremeneke522d852007-10-31 18:41:19 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the type-specific methods for serializing statements
11// and expressions.
12//
13//===----------------------------------------------------------------------===//
14
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000015#include "clang/AST/Expr.h"
Chris Lattner04421082008-04-08 04:40:51 +000016#include "clang/AST/ExprCXX.h"
Steve Narofff494b572008-05-29 21:12:08 +000017#include "clang/AST/ExprObjC.h"
Ted Kremeneke522d852007-10-31 18:41:19 +000018#include "llvm/Bitcode/Serialize.h"
19#include "llvm/Bitcode/Deserialize.h"
20
Ted Kremeneke522d852007-10-31 18:41:19 +000021using namespace clang;
Ted Kremenek96fa54f2007-11-07 22:53:01 +000022using llvm::Serializer;
23using llvm::Deserializer;
Ted Kremeneke522d852007-10-31 18:41:19 +000024
Ted Kremenek96fa54f2007-11-07 22:53:01 +000025void Stmt::Emit(Serializer& S) const {
Ted Kremenek28f3d802007-11-07 22:32:23 +000026 S.FlushRecord();
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000027 S.EmitInt(getStmtClass());
Ted Kremenekec0aa782007-11-12 18:04:32 +000028 EmitImpl(S);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +000029 S.FlushRecord();
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000030}
Ted Kremeneke522d852007-10-31 18:41:19 +000031
Sam Bishope2563ca2008-04-07 21:55:54 +000032Stmt* Stmt::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000033 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremeneke522d852007-10-31 18:41:19 +000034
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000035 switch (SC) {
36 default:
37 assert (false && "Not implemented.");
38 return NULL;
Ted Kremenek0965f442007-11-07 00:37:40 +000039
Ted Kremenekaa337632007-11-08 16:32:00 +000040 case AddrLabelExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000041 return AddrLabelExpr::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +000042
Ted Kremenek96fa54f2007-11-07 22:53:01 +000043 case ArraySubscriptExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000044 return ArraySubscriptExpr::CreateImpl(D, C);
Ted Kremenek96fa54f2007-11-07 22:53:01 +000045
Ted Kremenek1f85acd2007-11-13 22:55:51 +000046 case AsmStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000047 return AsmStmt::CreateImpl(D, C);
Ted Kremenek1f85acd2007-11-13 22:55:51 +000048
Ted Kremenek0965f442007-11-07 00:37:40 +000049 case BinaryOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000050 return BinaryOperator::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000051
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000052 case BreakStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000053 return BreakStmt::CreateImpl(D, C);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +000054
55 case CallExprClass:
Douglas Gregorb4609802008-11-14 16:09:21 +000056 return CallExpr::CreateImpl(D, C, CallExprClass);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000057
58 case CaseStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000059 return CaseStmt::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000060
Ted Kremenek7338a822007-11-07 17:15:49 +000061 case CharacterLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000062 return CharacterLiteral::CreateImpl(D, C);
Ted Kremenek7338a822007-11-07 17:15:49 +000063
Douglas Gregor2d8b2732008-11-29 04:51:27 +000064 case ChooseExprClass:
65 return ChooseExpr::CreateImpl(D, C);
66
Ted Kremenek83efb152007-11-08 00:41:37 +000067 case CompoundAssignOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000068 return CompoundAssignOperator::CreateImpl(D, C);
Ted Kremenek83efb152007-11-08 00:41:37 +000069
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +000070 case CompoundLiteralExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000071 return CompoundLiteralExpr::CreateImpl(D, C);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +000072
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000073 case CompoundStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000074 return CompoundStmt::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +000075
76 case ConditionalOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000077 return ConditionalOperator::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000078
Ted Kremenek96f22422007-11-07 17:05:07 +000079 case ContinueStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000080 return ContinueStmt::CreateImpl(D, C);
Ted Kremenek96f22422007-11-07 17:05:07 +000081
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000082 case DeclRefExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000083 return DeclRefExpr::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000084
Ted Kremenek0965f442007-11-07 00:37:40 +000085 case DeclStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000086 return DeclStmt::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000087
88 case DefaultStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000089 return DefaultStmt::CreateImpl(D, C);
Ted Kremeneke3299ef2007-11-07 07:53:55 +000090
91 case DoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000092 return DoStmt::CreateImpl(D, C);
Ted Kremenek612c9b92007-11-07 18:45:55 +000093
94 case FloatingLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000095 return FloatingLiteral::CreateImpl(D, C);
Ted Kremenek07ba0462007-11-07 08:02:55 +000096
97 case ForStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000098 return ForStmt::CreateImpl(D, C);
Ted Kremenek3f0767b2007-11-07 08:07:46 +000099
Douglas Gregor2d8b2732008-11-29 04:51:27 +0000100 case GNUNullExprClass:
101 return GNUNullExpr::CreateImpl(D, C);
102
Ted Kremenek3f0767b2007-11-07 08:07:46 +0000103 case GotoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000104 return GotoStmt::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000105
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000106 case IfStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000107 return IfStmt::CreateImpl(D, C);
Ted Kremenek1c72de12007-11-07 18:53:02 +0000108
109 case ImaginaryLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000110 return ImaginaryLiteral::CreateImpl(D, C);
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000111
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000112 case ImplicitCastExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000113 return ImplicitCastExpr::CreateImpl(D, C);
Argyrios Kyrtzidis0835a3c2008-08-18 23:01:59 +0000114
Douglas Gregor6eec8e82008-10-28 15:36:24 +0000115 case CStyleCastExprClass:
116 return CStyleCastExpr::CreateImpl(D, C);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000117
Ted Kremenek225a2d92007-11-07 17:02:32 +0000118 case IndirectGotoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000119 return IndirectGotoStmt::CreateImpl(D, C);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000120
121 case InitListExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000122 return InitListExpr::CreateImpl(D, C);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000123
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000124 case IntegerLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000125 return IntegerLiteral::CreateImpl(D, C);
Ted Kremenek4927be62007-11-07 00:40:53 +0000126
Ted Kremenekb15132f2007-11-07 00:48:04 +0000127 case LabelStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000128 return LabelStmt::CreateImpl(D, C);
Ted Kremenekb15132f2007-11-07 00:48:04 +0000129
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000130 case MemberExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000131 return MemberExpr::CreateImpl(D, C);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000132
Ted Kremenek4927be62007-11-07 00:40:53 +0000133 case NullStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000134 return NullStmt::CreateImpl(D, C);
Ted Kremenek0965f442007-11-07 00:37:40 +0000135
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000136 case ParenExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000137 return ParenExpr::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000138
Chris Lattnerd9f69102008-08-10 01:53:14 +0000139 case PredefinedExprClass:
140 return PredefinedExpr::CreateImpl(D, C);
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000141
Ted Kremenek0965f442007-11-07 00:37:40 +0000142 case ReturnStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000143 return ReturnStmt::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000144
Sebastian Redl05189992008-11-11 17:56:53 +0000145 case SizeOfAlignOfExprClass:
146 return SizeOfAlignOfExpr::CreateImpl(D, C);
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000147
Ted Kremenekaa337632007-11-08 16:32:00 +0000148 case StmtExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000149 return StmtExpr::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000150
Ted Kremenek7febad72007-11-07 19:08:19 +0000151 case StringLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000152 return StringLiteral::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000153
154 case SwitchStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000155 return SwitchStmt::CreateImpl(D, C);
Ted Kremenek5572b942007-11-07 07:50:10 +0000156
Ted Kremenek10494362007-11-08 00:26:24 +0000157 case UnaryOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000158 return UnaryOperator::CreateImpl(D, C);
Ted Kremenek10494362007-11-08 00:26:24 +0000159
Ted Kremenek5572b942007-11-07 07:50:10 +0000160 case WhileStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000161 return WhileStmt::CreateImpl(D, C);
Ted Kremenek378c1512007-11-15 18:10:29 +0000162
163 //==--------------------------------------==//
164 // Objective C
165 //==--------------------------------------==//
Ted Kremenekaf526772007-12-04 00:28:54 +0000166
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000167 case ObjCAtCatchStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000168 return ObjCAtCatchStmt::CreateImpl(D, C);
Ted Kremenek378c1512007-11-15 18:10:29 +0000169
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000170 case ObjCAtFinallyStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000171 return ObjCAtFinallyStmt::CreateImpl(D, C);
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000172
173 case ObjCAtSynchronizedStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000174 return ObjCAtSynchronizedStmt::CreateImpl(D, C);
Ted Kremenek04be5aa2007-12-04 00:32:22 +0000175
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000176 case ObjCAtThrowStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000177 return ObjCAtThrowStmt::CreateImpl(D, C);
Ted Kremenek5bdd4e32007-12-04 00:40:49 +0000178
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000179 case ObjCAtTryStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000180 return ObjCAtTryStmt::CreateImpl(D, C);
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000181
182 case ObjCEncodeExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000183 return ObjCEncodeExpr::CreateImpl(D, C);
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000184
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000185 case ObjCForCollectionStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000186 return ObjCForCollectionStmt::CreateImpl(D, C);
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000187
Ted Kremenek378c1512007-11-15 18:10:29 +0000188 case ObjCIvarRefExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000189 return ObjCIvarRefExpr::CreateImpl(D, C);
Ted Kremenek46dc0a52007-12-04 00:51:11 +0000190
Ted Kremenekea958e572008-05-01 17:26:20 +0000191 case ObjCMessageExprClass:
192 return ObjCMessageExpr::CreateImpl(D, C);
193
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000194 case ObjCSelectorExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000195 return ObjCSelectorExpr::CreateImpl(D, C);
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000196
Ted Kremenek46dc0a52007-12-04 00:51:11 +0000197 case ObjCStringLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000198 return ObjCStringLiteral::CreateImpl(D, C);
Chris Lattner04421082008-04-08 04:40:51 +0000199
Douglas Gregorcd9b46e2008-11-04 14:56:14 +0000200 case ObjCSuperExprClass:
201 return ObjCSuperExpr::CreateImpl(D, C);
202
Chris Lattner04421082008-04-08 04:40:51 +0000203 //==--------------------------------------==//
204 // C++
205 //==--------------------------------------==//
Chris Lattner04421082008-04-08 04:40:51 +0000206
Douglas Gregorb4609802008-11-14 16:09:21 +0000207 case CXXOperatorCallExprClass:
208 return CXXOperatorCallExpr::CreateImpl(D, C, CXXOperatorCallExprClass);
209
Ted Kremenekea958e572008-05-01 17:26:20 +0000210 case CXXDefaultArgExprClass:
211 return CXXDefaultArgExpr::CreateImpl(D, C);
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000212
213 case CXXFunctionalCastExprClass:
214 return CXXFunctionalCastExpr::CreateImpl(D, C);
215
Douglas Gregor49badde2008-10-27 19:41:14 +0000216 case CXXStaticCastExprClass:
217 return CXXStaticCastExpr::CreateImpl(D, C, SC);
218
219 case CXXDynamicCastExprClass:
220 return CXXDynamicCastExpr::CreateImpl(D, C, SC);
221
222 case CXXReinterpretCastExprClass:
223 return CXXReinterpretCastExpr::CreateImpl(D, C, SC);
224
225 case CXXConstCastExprClass:
226 return CXXConstCastExpr::CreateImpl(D, C, SC);
Douglas Gregor796da182008-11-04 14:32:21 +0000227
Sebastian Redlc42e1182008-11-11 11:37:55 +0000228 case CXXTypeidExprClass:
229 return CXXTypeidExpr::CreateImpl(D, C);
230
Douglas Gregor796da182008-11-04 14:32:21 +0000231 case CXXThisExprClass:
232 return CXXThisExpr::CreateImpl(D, C);
233
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000234 case CXXZeroInitValueExprClass:
235 return CXXZeroInitValueExpr::CreateImpl(D, C);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000236
237 case CXXNewExprClass:
238 return CXXNewExpr::CreateImpl(D, C);
239
240 case CXXDeleteExprClass:
241 return CXXDeleteExpr::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000242 }
Ted Kremeneke522d852007-10-31 18:41:19 +0000243}
244
Ted Kremenek378c1512007-11-15 18:10:29 +0000245//===----------------------------------------------------------------------===//
246// C Serialization
247//===----------------------------------------------------------------------===//
248
Ted Kremenekec0aa782007-11-12 18:04:32 +0000249void AddrLabelExpr::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000250 S.Emit(getType());
251 S.Emit(AmpAmpLoc);
252 S.Emit(LabelLoc);
253 S.EmitPtr(Label);
254}
255
Sam Bishope2563ca2008-04-07 21:55:54 +0000256AddrLabelExpr* AddrLabelExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaa337632007-11-08 16:32:00 +0000257 QualType t = QualType::ReadVal(D);
258 SourceLocation AALoc = SourceLocation::ReadVal(D);
259 SourceLocation LLoc = SourceLocation::ReadVal(D);
260 AddrLabelExpr* expr = new AddrLabelExpr(AALoc,LLoc,NULL,t);
261 D.ReadPtr(expr->Label); // Pointer may be backpatched.
262 return expr;
263}
264
Ted Kremenekec0aa782007-11-12 18:04:32 +0000265void ArraySubscriptExpr::EmitImpl(Serializer& S) const {
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000266 S.Emit(getType());
267 S.Emit(RBracketLoc);
268 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
269}
270
Sam Bishope2563ca2008-04-07 21:55:54 +0000271ArraySubscriptExpr* ArraySubscriptExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000272 QualType t = QualType::ReadVal(D);
273 SourceLocation L = SourceLocation::ReadVal(D);
274 Expr *LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000275 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000276 return new ArraySubscriptExpr(LHS,RHS,t,L);
277}
278
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000279void AsmStmt::EmitImpl(Serializer& S) const {
280 S.Emit(AsmLoc);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000281
Anders Carlsson6a0ef4b2007-11-20 19:21:03 +0000282 getAsmString()->EmitImpl(S);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000283 S.Emit(RParenLoc);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000284
Anders Carlsson39c47b52007-11-23 23:12:25 +0000285 S.EmitBool(IsVolatile);
Anders Carlssondfab34a2008-02-05 23:03:50 +0000286 S.EmitBool(IsSimple);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000287 S.EmitInt(NumOutputs);
288 S.EmitInt(NumInputs);
289
290 unsigned size = NumOutputs + NumInputs;
291
292 for (unsigned i = 0; i < size; ++i)
293 S.EmitCStr(Names[i].c_str());
294
295 for (unsigned i = 0; i < size; ++i)
296 Constraints[i]->EmitImpl(S);
297
298 for (unsigned i = 0; i < size; ++i)
299 S.EmitOwnedPtr(Exprs[i]);
300
301 S.EmitInt(Clobbers.size());
302 for (unsigned i = 0, e = Clobbers.size(); i != e; ++i)
303 Clobbers[i]->EmitImpl(S);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000304}
305
Sam Bishope2563ca2008-04-07 21:55:54 +0000306AsmStmt* AsmStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000307 SourceLocation ALoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000308 StringLiteral *AsmStr = StringLiteral::CreateImpl(D, C);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000309 SourceLocation PLoc = SourceLocation::ReadVal(D);
310
Anders Carlsson39c47b52007-11-23 23:12:25 +0000311 bool IsVolatile = D.ReadBool();
Anders Carlssondfab34a2008-02-05 23:03:50 +0000312 bool IsSimple = D.ReadBool();
313 AsmStmt *Stmt = new AsmStmt(ALoc, IsSimple, IsVolatile, 0, 0, 0, 0, 0,
Anders Carlssonb235fc22007-11-22 01:36:19 +0000314 AsmStr,
315 0, 0, PLoc);
316
317 Stmt->NumOutputs = D.ReadInt();
318 Stmt->NumInputs = D.ReadInt();
319
320 unsigned size = Stmt->NumOutputs + Stmt->NumInputs;
321
322 Stmt->Names.reserve(size);
323 for (unsigned i = 0; i < size; ++i) {
324 std::vector<char> data;
325 D.ReadCStr(data, false);
Eli Friedman10c5fa32008-02-23 07:32:49 +0000326
327 Stmt->Names.push_back(std::string(data.begin(), data.end()));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000328 }
329
330 Stmt->Constraints.reserve(size);
331 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000332 Stmt->Constraints.push_back(StringLiteral::CreateImpl(D, C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000333
334 Stmt->Exprs.reserve(size);
335 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000336 Stmt->Exprs.push_back(D.ReadOwnedPtr<Expr>(C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000337
338 unsigned NumClobbers = D.ReadInt();
339 Stmt->Clobbers.reserve(NumClobbers);
340 for (unsigned i = 0; i < NumClobbers; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000341 Stmt->Clobbers.push_back(StringLiteral::CreateImpl(D, C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000342
343 return Stmt;
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000344}
345
Ted Kremenekec0aa782007-11-12 18:04:32 +0000346void BinaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek0965f442007-11-07 00:37:40 +0000347 S.EmitInt(Opc);
348 S.Emit(OpLoc);;
349 S.Emit(getType());
Ted Kremenek28f3d802007-11-07 22:32:23 +0000350 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek0965f442007-11-07 00:37:40 +0000351}
352
Sam Bishope2563ca2008-04-07 21:55:54 +0000353BinaryOperator* BinaryOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek0965f442007-11-07 00:37:40 +0000354 Opcode Opc = static_cast<Opcode>(D.ReadInt());
355 SourceLocation OpLoc = SourceLocation::ReadVal(D);
356 QualType Result = QualType::ReadVal(D);
Ted Kremenek28f3d802007-11-07 22:32:23 +0000357 Expr *LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000358 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek28f3d802007-11-07 22:32:23 +0000359
Ted Kremenek0965f442007-11-07 00:37:40 +0000360 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
361}
Ted Kremeneke522d852007-10-31 18:41:19 +0000362
Ted Kremenekec0aa782007-11-12 18:04:32 +0000363void BreakStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000364 S.Emit(BreakLoc);
365}
366
Sam Bishope2563ca2008-04-07 21:55:54 +0000367BreakStmt* BreakStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000368 SourceLocation Loc = SourceLocation::ReadVal(D);
369 return new BreakStmt(Loc);
370}
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000371
Ted Kremenekec0aa782007-11-12 18:04:32 +0000372void CallExpr::EmitImpl(Serializer& S) const {
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000373 S.Emit(getType());
374 S.Emit(RParenLoc);
375 S.EmitInt(NumArgs);
Ted Kremenekea958e572008-05-01 17:26:20 +0000376 S.BatchEmitOwnedPtrs(NumArgs+1, SubExprs);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000377}
378
Douglas Gregorb4609802008-11-14 16:09:21 +0000379CallExpr* CallExpr::CreateImpl(Deserializer& D, ASTContext& C, StmtClass SC) {
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000380 QualType t = QualType::ReadVal(D);
381 SourceLocation L = SourceLocation::ReadVal(D);
382 unsigned NumArgs = D.ReadInt();
Ted Kremenek55499762008-06-17 02:43:46 +0000383 Stmt** SubExprs = new Stmt*[NumArgs+1];
Sam Bishope2563ca2008-04-07 21:55:54 +0000384 D.BatchReadOwnedPtrs(NumArgs+1, SubExprs, C);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000385
Douglas Gregorb4609802008-11-14 16:09:21 +0000386 return new CallExpr(SC, SubExprs,NumArgs,t,L);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000387}
388
Ted Kremenekec0aa782007-11-12 18:04:32 +0000389void CaseStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000390 S.Emit(CaseLoc);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000391 S.EmitPtr(getNextSwitchCase());
Ted Kremenek103fc812007-11-08 00:56:26 +0000392 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000393}
394
Sam Bishope2563ca2008-04-07 21:55:54 +0000395CaseStmt* CaseStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000396 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenek103fc812007-11-08 00:56:26 +0000397 CaseStmt* stmt = new CaseStmt(NULL,NULL,NULL,CaseLoc);
398 D.ReadPtr(stmt->NextSwitchCase);
Sam Bishope2563ca2008-04-07 21:55:54 +0000399 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubExprs[0], C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000400 return stmt;
401}
Ted Kremeneke522d852007-10-31 18:41:19 +0000402
Douglas Gregor6eec8e82008-10-28 15:36:24 +0000403void CStyleCastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000404 S.Emit(getType());
Douglas Gregor49badde2008-10-27 19:41:14 +0000405 S.Emit(getTypeAsWritten());
Steve Naroffb2f9e512008-11-03 23:29:32 +0000406 S.Emit(LPLoc);
407 S.Emit(RPLoc);
Argyrios Kyrtzidis0835a3c2008-08-18 23:01:59 +0000408 S.EmitOwnedPtr(getSubExpr());
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000409}
410
Douglas Gregor6eec8e82008-10-28 15:36:24 +0000411CStyleCastExpr* CStyleCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000412 QualType t = QualType::ReadVal(D);
Douglas Gregor49badde2008-10-27 19:41:14 +0000413 QualType writtenTy = QualType::ReadVal(D);
Steve Naroffb2f9e512008-11-03 23:29:32 +0000414 SourceLocation LPLoc = SourceLocation::ReadVal(D);
415 SourceLocation RPLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000416 Expr* Op = D.ReadOwnedPtr<Expr>(C);
Steve Naroffb2f9e512008-11-03 23:29:32 +0000417 return new CStyleCastExpr(t,Op,writtenTy,LPLoc,RPLoc);
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000418}
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000419
Ted Kremenekec0aa782007-11-12 18:04:32 +0000420void CharacterLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek7338a822007-11-07 17:15:49 +0000421 S.Emit(Value);
422 S.Emit(Loc);
Chris Lattnerc250aae2008-06-07 22:35:38 +0000423 S.EmitBool(IsWide);
Ted Kremenek7338a822007-11-07 17:15:49 +0000424 S.Emit(getType());
425}
426
Sam Bishope2563ca2008-04-07 21:55:54 +0000427CharacterLiteral* CharacterLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek7338a822007-11-07 17:15:49 +0000428 unsigned value = D.ReadInt();
429 SourceLocation Loc = SourceLocation::ReadVal(D);
Chris Lattnerc250aae2008-06-07 22:35:38 +0000430 bool iswide = D.ReadBool();
Ted Kremenek7338a822007-11-07 17:15:49 +0000431 QualType T = QualType::ReadVal(D);
Chris Lattnerc250aae2008-06-07 22:35:38 +0000432 return new CharacterLiteral(value,iswide,T,Loc);
Ted Kremenek7338a822007-11-07 17:15:49 +0000433}
434
Ted Kremenekec0aa782007-11-12 18:04:32 +0000435void CompoundAssignOperator::EmitImpl(Serializer& S) const {
Ted Kremenek83efb152007-11-08 00:41:37 +0000436 S.Emit(getType());
437 S.Emit(ComputationType);
438 S.Emit(getOperatorLoc());
439 S.EmitInt(getOpcode());
440 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
441}
442
443CompoundAssignOperator*
Sam Bishope2563ca2008-04-07 21:55:54 +0000444CompoundAssignOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek83efb152007-11-08 00:41:37 +0000445 QualType t = QualType::ReadVal(D);
446 QualType c = QualType::ReadVal(D);
447 SourceLocation L = SourceLocation::ReadVal(D);
448 Opcode Opc = static_cast<Opcode>(D.ReadInt());
449 Expr* LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000450 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek83efb152007-11-08 00:41:37 +0000451
452 return new CompoundAssignOperator(LHS,RHS,Opc,t,c,L);
453}
454
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000455void CompoundLiteralExpr::EmitImpl(Serializer& S) const {
456 S.Emit(getType());
Chris Lattner0fc53df2008-01-02 21:46:24 +0000457 S.Emit(getLParenLoc());
Steve Naroffe9b12192008-01-14 18:19:28 +0000458 S.EmitBool(isFileScope());
Ted Kremenek34bc18b2008-01-14 18:29:39 +0000459 S.EmitOwnedPtr(Init);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000460}
461
Sam Bishope2563ca2008-04-07 21:55:54 +0000462CompoundLiteralExpr* CompoundLiteralExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000463 QualType Q = QualType::ReadVal(D);
Chris Lattner0fc53df2008-01-02 21:46:24 +0000464 SourceLocation L = SourceLocation::ReadVal(D);
Steve Naroffe9b12192008-01-14 18:19:28 +0000465 bool fileScope = D.ReadBool();
Sam Bishope2563ca2008-04-07 21:55:54 +0000466 Expr* Init = D.ReadOwnedPtr<Expr>(C);
Steve Naroffe9b12192008-01-14 18:19:28 +0000467 return new CompoundLiteralExpr(L, Q, Init, fileScope);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000468}
469
Ted Kremenekec0aa782007-11-12 18:04:32 +0000470void CompoundStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000471 S.Emit(LBracLoc);
472 S.Emit(RBracLoc);
473 S.Emit(Body.size());
Ted Kremeneke522d852007-10-31 18:41:19 +0000474
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000475 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremeneke522d852007-10-31 18:41:19 +0000476 S.EmitOwnedPtr(*I);
477}
478
Sam Bishope2563ca2008-04-07 21:55:54 +0000479CompoundStmt* CompoundStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000480 SourceLocation LB = SourceLocation::ReadVal(D);
481 SourceLocation RB = SourceLocation::ReadVal(D);
482 unsigned size = D.ReadInt();
Ted Kremeneke522d852007-10-31 18:41:19 +0000483
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000484 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
485
486 stmt->Body.reserve(size);
487
488 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000489 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000490
491 return stmt;
Ted Kremeneke522d852007-10-31 18:41:19 +0000492}
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000493
Ted Kremenekec0aa782007-11-12 18:04:32 +0000494void ConditionalOperator::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000495 S.Emit(getType());
496 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, SubExprs);
497}
498
Sam Bishope2563ca2008-04-07 21:55:54 +0000499ConditionalOperator* ConditionalOperator::CreateImpl(Deserializer& D,
500 ASTContext& C) {
501
Ted Kremenekaa337632007-11-08 16:32:00 +0000502 QualType t = QualType::ReadVal(D);
503 ConditionalOperator* c = new ConditionalOperator(NULL,NULL,NULL,t);
Sam Bishope2563ca2008-04-07 21:55:54 +0000504 D.BatchReadOwnedPtrs((unsigned) END_EXPR, c->SubExprs, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000505 return c;
506}
507
Ted Kremenekec0aa782007-11-12 18:04:32 +0000508void ContinueStmt::EmitImpl(Serializer& S) const {
Ted Kremenek96f22422007-11-07 17:05:07 +0000509 S.Emit(ContinueLoc);
510}
511
Sam Bishope2563ca2008-04-07 21:55:54 +0000512ContinueStmt* ContinueStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek96f22422007-11-07 17:05:07 +0000513 SourceLocation Loc = SourceLocation::ReadVal(D);
514 return new ContinueStmt(Loc);
515}
516
Ted Kremenekec0aa782007-11-12 18:04:32 +0000517void DeclStmt::EmitImpl(Serializer& S) const {
Chris Lattner81c018d2008-03-13 06:29:04 +0000518 S.Emit(StartLoc);
519 S.Emit(EndLoc);
Ted Kremenek8ffb1592008-10-07 23:09:49 +0000520 S.Emit(DG);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000521}
Ted Kremeneka1a78242008-08-06 15:50:59 +0000522
523DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
524 SourceLocation StartLoc = SourceLocation::ReadVal(D);
Ted Kremenek8ffb1592008-10-07 23:09:49 +0000525 SourceLocation EndLoc = SourceLocation::ReadVal(D);
526 DeclGroupOwningRef DG;
527 return new DeclStmt(DG.Read(D, C), StartLoc, EndLoc);
Ted Kremeneka1a78242008-08-06 15:50:59 +0000528}
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000529
Ted Kremenekec0aa782007-11-12 18:04:32 +0000530void DeclRefExpr::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000531 S.Emit(Loc);
532 S.Emit(getType());
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000533
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000534 // Some DeclRefExprs can actually hold the owning reference to a FunctionDecl.
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000535 // This occurs when an implicitly defined function is called, and
536 // the decl does not appear in the source file. We thus check if the
537 // decl pointer has been registered, and if not, emit an owned pointer.
538
539 // FIXME: While this will work for serialization, it won't work for
540 // memory management. The only reason this works for serialization is
541 // because we are tracking all serialized pointers. Either DeclRefExpr
542 // needs an explicit bit indicating that it owns the the object,
543 // or we need a different ownership model.
544
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000545 const Decl* d = getDecl();
546
547 if (!S.isRegistered(d)) {
548 assert (isa<FunctionDecl>(d)
549 && "DeclRefExpr can only own FunctionDecls for implicitly def. funcs.");
550
551 S.EmitBool(true);
552 S.EmitOwnedPtr(d);
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000553 }
554 else {
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000555 S.EmitBool(false);
556 S.EmitPtr(d);
557 }
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000558}
559
Sam Bishope2563ca2008-04-07 21:55:54 +0000560DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000561 SourceLocation Loc = SourceLocation::ReadVal(D);
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000562 QualType T = QualType::ReadVal(D);
563 bool OwnsDecl = D.ReadBool();
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000564 NamedDecl* decl;
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000565
566 if (!OwnsDecl)
567 D.ReadPtr(decl,false); // No backpatching.
568 else
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000569 decl = cast<NamedDecl>(D.ReadOwnedPtr<Decl>(C));
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000570
571 return new DeclRefExpr(decl,T,Loc);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000572}
573
Ted Kremenekec0aa782007-11-12 18:04:32 +0000574void DefaultStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000575 S.Emit(DefaultLoc);
576 S.EmitOwnedPtr(getSubStmt());
577 S.EmitPtr(getNextSwitchCase());
578}
579
Sam Bishope2563ca2008-04-07 21:55:54 +0000580DefaultStmt* DefaultStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000581 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000582 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000583
584 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
585 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
586
587 return stmt;
588}
Ted Kremenek0965f442007-11-07 00:37:40 +0000589
Ted Kremenekec0aa782007-11-12 18:04:32 +0000590void DoStmt::EmitImpl(Serializer& S) const {
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000591 S.Emit(DoLoc);
592 S.EmitOwnedPtr(getCond());
593 S.EmitOwnedPtr(getBody());
594}
595
Sam Bishope2563ca2008-04-07 21:55:54 +0000596DoStmt* DoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000597 SourceLocation DoLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000598 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
599 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000600 return new DoStmt(Body,Cond,DoLoc);
601}
602
Ted Kremenekec0aa782007-11-12 18:04:32 +0000603void FloatingLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek612c9b92007-11-07 18:45:55 +0000604 S.Emit(Loc);
605 S.Emit(getType());
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000606 S.EmitBool(isExact());
Ted Kremenek612c9b92007-11-07 18:45:55 +0000607 S.Emit(Value);
608}
609
Sam Bishope2563ca2008-04-07 21:55:54 +0000610FloatingLiteral* FloatingLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek612c9b92007-11-07 18:45:55 +0000611 SourceLocation Loc = SourceLocation::ReadVal(D);
612 QualType t = QualType::ReadVal(D);
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000613 bool isExact = D.ReadBool();
Ted Kremenek612c9b92007-11-07 18:45:55 +0000614 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000615 FloatingLiteral* expr = new FloatingLiteral(Val,&isExact,t,Loc);
Ted Kremenek612c9b92007-11-07 18:45:55 +0000616 return expr;
617}
618
Ted Kremenekec0aa782007-11-12 18:04:32 +0000619void ForStmt::EmitImpl(Serializer& S) const {
Ted Kremenek07ba0462007-11-07 08:02:55 +0000620 S.Emit(ForLoc);
621 S.EmitOwnedPtr(getInit());
622 S.EmitOwnedPtr(getCond());
623 S.EmitOwnedPtr(getInc());
624 S.EmitOwnedPtr(getBody());
625}
626
Sam Bishope2563ca2008-04-07 21:55:54 +0000627ForStmt* ForStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek07ba0462007-11-07 08:02:55 +0000628 SourceLocation ForLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000629 Stmt* Init = D.ReadOwnedPtr<Stmt>(C);
630 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
631 Expr* Inc = D.ReadOwnedPtr<Expr>(C);
632 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek07ba0462007-11-07 08:02:55 +0000633 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
634}
635
Ted Kremenekec0aa782007-11-12 18:04:32 +0000636void GotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenek3f0767b2007-11-07 08:07:46 +0000637 S.Emit(GotoLoc);
638 S.Emit(LabelLoc);
639 S.EmitPtr(Label);
640}
641
Sam Bishope2563ca2008-04-07 21:55:54 +0000642GotoStmt* GotoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek3f0767b2007-11-07 08:07:46 +0000643 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
644 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
645 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
646 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
647 return stmt;
648}
649
Ted Kremenekec0aa782007-11-12 18:04:32 +0000650void IfStmt::EmitImpl(Serializer& S) const {
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000651 S.Emit(IfLoc);
652 S.EmitOwnedPtr(getCond());
653 S.EmitOwnedPtr(getThen());
654 S.EmitOwnedPtr(getElse());
655}
656
Sam Bishope2563ca2008-04-07 21:55:54 +0000657IfStmt* IfStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000658 SourceLocation L = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000659 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
660 Stmt* Then = D.ReadOwnedPtr<Stmt>(C);
661 Stmt* Else = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000662 return new IfStmt(L,Cond,Then,Else);
663}
664
Ted Kremenekec0aa782007-11-12 18:04:32 +0000665void ImaginaryLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek1c72de12007-11-07 18:53:02 +0000666 S.Emit(getType());
667 S.EmitOwnedPtr(Val);
668}
669
Sam Bishope2563ca2008-04-07 21:55:54 +0000670ImaginaryLiteral* ImaginaryLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1c72de12007-11-07 18:53:02 +0000671 QualType t = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000672 Expr* expr = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek1c72de12007-11-07 18:53:02 +0000673 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
674 return new ImaginaryLiteral(expr,t);
675}
676
Ted Kremenekec0aa782007-11-12 18:04:32 +0000677void ImplicitCastExpr::EmitImpl(Serializer& S) const {
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000678 S.Emit(getType());
Argyrios Kyrtzidis0835a3c2008-08-18 23:01:59 +0000679 S.EmitOwnedPtr(getSubExpr());
Douglas Gregoreb8f3062008-11-12 17:17:38 +0000680 S.Emit(LvalueCast);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000681}
682
Sam Bishope2563ca2008-04-07 21:55:54 +0000683ImplicitCastExpr* ImplicitCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000684 QualType t = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000685 Expr* Op = D.ReadOwnedPtr<Expr>(C);
Douglas Gregoreb8f3062008-11-12 17:17:38 +0000686 bool isLvalue = D.ReadBool();
687 return new ImplicitCastExpr(t,Op,isLvalue);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000688}
689
Ted Kremenekec0aa782007-11-12 18:04:32 +0000690void IndirectGotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000691 S.EmitOwnedPtr(Target);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000692}
693
Sam Bishope2563ca2008-04-07 21:55:54 +0000694IndirectGotoStmt* IndirectGotoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
695 Expr* Target = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000696 return new IndirectGotoStmt(Target);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000697}
698
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000699void InitListExpr::EmitImpl(Serializer& S) const {
700 S.Emit(LBraceLoc);
701 S.Emit(RBraceLoc);
Steve Naroffc5ae8992008-05-01 02:04:18 +0000702 S.EmitInt(InitExprs.size());
703 if (!InitExprs.empty()) S.BatchEmitOwnedPtrs(InitExprs.size(), &InitExprs[0]);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000704}
705
Sam Bishope2563ca2008-04-07 21:55:54 +0000706InitListExpr* InitListExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000707 InitListExpr* expr = new InitListExpr();
708 expr->LBraceLoc = SourceLocation::ReadVal(D);
709 expr->RBraceLoc = SourceLocation::ReadVal(D);
Steve Naroffc5ae8992008-05-01 02:04:18 +0000710 unsigned size = D.ReadInt();
711 assert(size);
712 expr->InitExprs.reserve(size);
713 for (unsigned i = 0 ; i < size; ++i) expr->InitExprs.push_back(0);
714
715 D.BatchReadOwnedPtrs(size, &expr->InitExprs[0], C);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000716 return expr;
717}
718
Ted Kremenekec0aa782007-11-12 18:04:32 +0000719void IntegerLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000720 S.Emit(Loc);
721 S.Emit(getType());
722 S.Emit(getValue());
723}
724
Sam Bishope2563ca2008-04-07 21:55:54 +0000725IntegerLiteral* IntegerLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000726 SourceLocation Loc = SourceLocation::ReadVal(D);
727 QualType T = QualType::ReadVal(D);
728
729 // Create a dummy APInt because it is more efficient to deserialize
730 // it in place with the deserialized IntegerLiteral. (fewer copies)
731 llvm::APInt temp;
732 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
733 D.Read(expr->Value);
734
735 return expr;
736}
Ted Kremenek0965f442007-11-07 00:37:40 +0000737
Ted Kremenekec0aa782007-11-12 18:04:32 +0000738void LabelStmt::EmitImpl(Serializer& S) const {
Ted Kremenekb15132f2007-11-07 00:48:04 +0000739 S.EmitPtr(Label);
740 S.Emit(IdentLoc);
741 S.EmitOwnedPtr(SubStmt);
742}
743
Sam Bishope2563ca2008-04-07 21:55:54 +0000744LabelStmt* LabelStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekb15132f2007-11-07 00:48:04 +0000745 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
746 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000747 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenekb15132f2007-11-07 00:48:04 +0000748 return new LabelStmt(IdentLoc,Label,SubStmt);
749}
750
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000751void MemberExpr::EmitImpl(Serializer& S) const {
752 S.Emit(MemberLoc);
753 S.EmitPtr(MemberDecl);
754 S.EmitBool(IsArrow);
Eli Friedman51019072008-02-06 22:48:16 +0000755 S.Emit(getType());
Ted Kremenekd0739872008-02-06 23:03:14 +0000756 S.EmitOwnedPtr(Base);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000757}
758
Sam Bishope2563ca2008-04-07 21:55:54 +0000759MemberExpr* MemberExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000760 SourceLocation L = SourceLocation::ReadVal(D);
761 FieldDecl* MemberDecl = cast<FieldDecl>(D.ReadPtr<Decl>());
762 bool IsArrow = D.ReadBool();
Eli Friedman51019072008-02-06 22:48:16 +0000763 QualType T = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000764 Expr* base = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000765
Eli Friedman51019072008-02-06 22:48:16 +0000766 return new MemberExpr(base,IsArrow,MemberDecl,L,T);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000767}
768
Ted Kremenekec0aa782007-11-12 18:04:32 +0000769void NullStmt::EmitImpl(Serializer& S) const {
Ted Kremenek4927be62007-11-07 00:40:53 +0000770 S.Emit(SemiLoc);
771}
772
Sam Bishope2563ca2008-04-07 21:55:54 +0000773NullStmt* NullStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4927be62007-11-07 00:40:53 +0000774 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
775 return new NullStmt(SemiLoc);
776}
Ted Kremenek0965f442007-11-07 00:37:40 +0000777
Ted Kremenekec0aa782007-11-12 18:04:32 +0000778void ParenExpr::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000779 S.Emit(L);
780 S.Emit(R);
781 S.EmitOwnedPtr(Val);
782}
783
Sam Bishope2563ca2008-04-07 21:55:54 +0000784ParenExpr* ParenExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000785 SourceLocation L = SourceLocation::ReadVal(D);
786 SourceLocation R = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000787 Expr* val = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000788 return new ParenExpr(L,R,val);
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000789}
790
Chris Lattnerd9f69102008-08-10 01:53:14 +0000791void PredefinedExpr::EmitImpl(Serializer& S) const {
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000792 S.Emit(Loc);
793 S.EmitInt(getIdentType());
794 S.Emit(getType());
795}
796
Chris Lattnerd9f69102008-08-10 01:53:14 +0000797PredefinedExpr* PredefinedExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000798 SourceLocation Loc = SourceLocation::ReadVal(D);
799 IdentType it = static_cast<IdentType>(D.ReadInt());
800 QualType Q = QualType::ReadVal(D);
Chris Lattnerd9f69102008-08-10 01:53:14 +0000801 return new PredefinedExpr(Loc,Q,it);
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000802}
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000803
Ted Kremenekec0aa782007-11-12 18:04:32 +0000804void ReturnStmt::EmitImpl(Serializer& S) const {
Ted Kremenek0965f442007-11-07 00:37:40 +0000805 S.Emit(RetLoc);
806 S.EmitOwnedPtr(RetExpr);
807}
808
Sam Bishope2563ca2008-04-07 21:55:54 +0000809ReturnStmt* ReturnStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek0965f442007-11-07 00:37:40 +0000810 SourceLocation RetLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000811 Expr* RetExpr = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek0965f442007-11-07 00:37:40 +0000812 return new ReturnStmt(RetLoc,RetExpr);
813}
814
Sebastian Redl05189992008-11-11 17:56:53 +0000815void SizeOfAlignOfExpr::EmitImpl(Serializer& S) const {
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000816 S.EmitBool(isSizeof);
Sebastian Redl05189992008-11-11 17:56:53 +0000817 S.EmitBool(isType);
818 if (isType)
819 S.Emit(getArgumentType());
820 else
821 S.EmitOwnedPtr(getArgumentExpr());
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000822 S.Emit(getType());
823 S.Emit(OpLoc);
824 S.Emit(RParenLoc);
825}
826
Sebastian Redl05189992008-11-11 17:56:53 +0000827SizeOfAlignOfExpr*
828SizeOfAlignOfExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000829 bool isSizeof = D.ReadBool();
Sebastian Redl05189992008-11-11 17:56:53 +0000830 bool isType = D.ReadBool();
831 void *Argument;
832 if (isType)
833 Argument = QualType::ReadVal(D).getAsOpaquePtr();
834 else
835 Argument = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000836 QualType Res = QualType::ReadVal(D);
837 SourceLocation OpLoc = SourceLocation::ReadVal(D);
838 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
839
Sebastian Redl05189992008-11-11 17:56:53 +0000840 return new SizeOfAlignOfExpr(isSizeof, isType, Argument, Res,
841 OpLoc, RParenLoc);
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000842}
843
Ted Kremenekec0aa782007-11-12 18:04:32 +0000844void StmtExpr::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000845 S.Emit(getType());
846 S.Emit(LParenLoc);
847 S.Emit(RParenLoc);
848 S.EmitOwnedPtr(SubStmt);
849}
850
Sam Bishope2563ca2008-04-07 21:55:54 +0000851StmtExpr* StmtExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaa337632007-11-08 16:32:00 +0000852 QualType t = QualType::ReadVal(D);
853 SourceLocation L = SourceLocation::ReadVal(D);
854 SourceLocation R = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000855 CompoundStmt* SubStmt = cast<CompoundStmt>(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenekaa337632007-11-08 16:32:00 +0000856 return new StmtExpr(SubStmt,t,L,R);
857}
858
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000859void TypesCompatibleExpr::EmitImpl(llvm::Serializer& S) const {
860 S.Emit(getType());
861 S.Emit(BuiltinLoc);
862 S.Emit(RParenLoc);
863 S.Emit(Type1);
864 S.Emit(Type2);
865}
866
867TypesCompatibleExpr* TypesCompatibleExpr::CreateImpl(llvm::Deserializer& D,
868 ASTContext& C) {
869 QualType RT = QualType::ReadVal(D);
870 SourceLocation BL = SourceLocation::ReadVal(D);
871 SourceLocation RP = SourceLocation::ReadVal(D);
872 QualType T1 = QualType::ReadVal(D);
873 QualType T2 = QualType::ReadVal(D);
874 return new TypesCompatibleExpr(RT, BL, T1, T2, RP);
875}
876
877void ShuffleVectorExpr::EmitImpl(llvm::Serializer& S) const {
878 S.Emit(getType());
879 S.Emit(BuiltinLoc);
880 S.Emit(RParenLoc);
881 S.EmitInt(NumExprs);
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000882 S.BatchEmitOwnedPtrs(NumExprs, &SubExprs[0]);
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000883}
884
885ShuffleVectorExpr* ShuffleVectorExpr::CreateImpl(llvm::Deserializer& D,
886 ASTContext& C) {
887 QualType T = QualType::ReadVal(D);
888 SourceLocation BL = SourceLocation::ReadVal(D);
889 SourceLocation RP = SourceLocation::ReadVal(D);
890 unsigned NumExprs = D.ReadInt();
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000891 // FIXME: Avoid extra allocation.
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000892 llvm::SmallVector<Expr*, 4> Exprs(NumExprs);
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000893 D.BatchReadOwnedPtrs(NumExprs, Exprs.begin(), C);
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000894 return new ShuffleVectorExpr(Exprs.begin(), NumExprs, T, BL, RP);
895}
896
897void ChooseExpr::EmitImpl(llvm::Serializer& S) const {
898 S.Emit(getType());
899 S.Emit(BuiltinLoc);
900 S.Emit(RParenLoc);
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000901 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, &SubExprs[0]);
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000902}
903
904ChooseExpr* ChooseExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) {
905 QualType T = QualType::ReadVal(D);
906 SourceLocation BL = SourceLocation::ReadVal(D);
907 SourceLocation RP = SourceLocation::ReadVal(D);
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000908 ChooseExpr *CE = new ChooseExpr(BL, 0, 0, 0, T, RP);
909 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &CE->SubExprs[0], C);
910 return CE;
911}
912
Douglas Gregor2d8b2732008-11-29 04:51:27 +0000913void GNUNullExpr::EmitImpl(llvm::Serializer &S) const {
914 S.Emit(getType());
915 S.Emit(TokenLoc);
916}
917
918GNUNullExpr *GNUNullExpr::CreateImpl(llvm::Deserializer &D, ASTContext &C) {
919 QualType T = QualType::ReadVal(D);
920 SourceLocation TL = SourceLocation::ReadVal(D);
921 return new GNUNullExpr(T, TL);
922}
923
Daniel Dunbar20c77e92008-10-15 17:52:29 +0000924void OverloadExpr::EmitImpl(llvm::Serializer& S) const {
925 S.Emit(getType());
926 S.Emit(BuiltinLoc);
927 S.Emit(RParenLoc);
928 S.EmitInt(FnIndex);
929 S.EmitInt(NumExprs);
930 S.BatchEmitOwnedPtrs(NumExprs, &SubExprs[0]);
931}
932
933OverloadExpr* OverloadExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) {
934 QualType T = QualType::ReadVal(D);
935 SourceLocation BL = SourceLocation::ReadVal(D);
936 SourceLocation RP = SourceLocation::ReadVal(D);
937 unsigned FnIndex = D.ReadInt();
938 unsigned NumExprs = D.ReadInt();
939 // FIXME: Avoid extra allocation.
940 llvm::SmallVector<Expr*, 4> Exprs(NumExprs);
941 D.BatchReadOwnedPtrs(NumExprs, Exprs.begin(), C);
942 return new OverloadExpr(Exprs.begin(), NumExprs, FnIndex, T, BL, RP);
Daniel Dunbard17c24f2008-10-14 16:57:09 +0000943}
944
945void VAArgExpr::EmitImpl(llvm::Serializer& S) const {
946 S.Emit(getType());
947 S.Emit(BuiltinLoc);
948 S.Emit(RParenLoc);
949 S.EmitOwnedPtr(getSubExpr());
950}
951
952VAArgExpr* VAArgExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) {
953 QualType T = QualType::ReadVal(D);
954 SourceLocation BL = SourceLocation::ReadVal(D);
955 SourceLocation RP = SourceLocation::ReadVal(D);
956 Expr *E = D.ReadOwnedPtr<Expr>(C);
957 return new VAArgExpr(BL, E, T, RP);
958}
959
Ted Kremenekec0aa782007-11-12 18:04:32 +0000960void StringLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek7febad72007-11-07 19:08:19 +0000961 S.Emit(getType());
962 S.Emit(firstTokLoc);
963 S.Emit(lastTokLoc);
964 S.EmitBool(isWide());
965 S.Emit(getByteLength());
966
967 for (unsigned i = 0 ; i < ByteLength; ++i)
968 S.EmitInt(StrData[i]);
969}
970
Sam Bishope2563ca2008-04-07 21:55:54 +0000971StringLiteral* StringLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek7febad72007-11-07 19:08:19 +0000972 QualType t = QualType::ReadVal(D);
973 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
974 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
975 bool isWide = D.ReadBool();
976 unsigned ByteLength = D.ReadInt();
977
978 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
979
980 char* StrData = new char[ByteLength];
981 for (unsigned i = 0; i < ByteLength; ++i)
982 StrData[i] = (char) D.ReadInt();
983
984 sl->ByteLength = ByteLength;
985 sl->StrData = StrData;
986
987 return sl;
988}
989
Ted Kremenekec0aa782007-11-12 18:04:32 +0000990void SwitchStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000991 S.Emit(SwitchLoc);
992 S.EmitOwnedPtr(getCond());
993 S.EmitOwnedPtr(getBody());
994 S.EmitPtr(FirstCase);
995}
996
Sam Bishope2563ca2008-04-07 21:55:54 +0000997SwitchStmt* SwitchStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000998 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000999 Stmt* Cond = D.ReadOwnedPtr<Stmt>(C);
1000 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +00001001 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
1002
1003 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
1004 stmt->setBody(Body,Loc);
1005 stmt->FirstCase = FirstCase;
1006
1007 return stmt;
1008}
Ted Kremenek5572b942007-11-07 07:50:10 +00001009
Ted Kremenekec0aa782007-11-12 18:04:32 +00001010void UnaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek10494362007-11-08 00:26:24 +00001011 S.Emit(getType());
1012 S.Emit(Loc);
1013 S.EmitInt(Opc);
1014 S.EmitOwnedPtr(Val);
1015}
1016
Sam Bishope2563ca2008-04-07 21:55:54 +00001017UnaryOperator* UnaryOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek10494362007-11-08 00:26:24 +00001018 QualType t = QualType::ReadVal(D);
1019 SourceLocation L = SourceLocation::ReadVal(D);
1020 Opcode Opc = static_cast<Opcode>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +00001021 Expr* Val = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek10494362007-11-08 00:26:24 +00001022 return new UnaryOperator(Val,Opc,t,L);
1023}
1024
Ted Kremenekec0aa782007-11-12 18:04:32 +00001025void WhileStmt::EmitImpl(Serializer& S) const {
Ted Kremenek5572b942007-11-07 07:50:10 +00001026 S.Emit(WhileLoc);
1027 S.EmitOwnedPtr(getCond());
1028 S.EmitOwnedPtr(getBody());
1029}
1030
Sam Bishope2563ca2008-04-07 21:55:54 +00001031WhileStmt* WhileStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek5572b942007-11-07 07:50:10 +00001032 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +00001033 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
1034 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek5572b942007-11-07 07:50:10 +00001035 return new WhileStmt(Cond,Body,WhileLoc);
1036}
Ted Kremenek378c1512007-11-15 18:10:29 +00001037
1038//===----------------------------------------------------------------------===//
1039// Objective C Serialization
1040//===----------------------------------------------------------------------===//
1041
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001042void ObjCAtCatchStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaf526772007-12-04 00:28:54 +00001043 S.Emit(AtCatchLoc);
1044 S.Emit(RParenLoc);
Ted Kremenekff981022008-02-01 21:28:59 +00001045 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, &SubExprs[0]);
Ted Kremenekaf526772007-12-04 00:28:54 +00001046}
1047
Sam Bishope2563ca2008-04-07 21:55:54 +00001048ObjCAtCatchStmt* ObjCAtCatchStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaf526772007-12-04 00:28:54 +00001049 SourceLocation AtCatchLoc = SourceLocation::ReadVal(D);
1050 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1051
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001052 ObjCAtCatchStmt* stmt = new ObjCAtCatchStmt(AtCatchLoc,RParenLoc);
Sam Bishope2563ca2008-04-07 21:55:54 +00001053 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubExprs[0], C);
Ted Kremenekaf526772007-12-04 00:28:54 +00001054
1055 return stmt;
1056}
1057
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001058void ObjCAtFinallyStmt::EmitImpl(Serializer& S) const {
Ted Kremenek04be5aa2007-12-04 00:32:22 +00001059 S.Emit(AtFinallyLoc);
1060 S.EmitOwnedPtr(AtFinallyStmt);
1061}
1062
Sam Bishope2563ca2008-04-07 21:55:54 +00001063ObjCAtFinallyStmt* ObjCAtFinallyStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04be5aa2007-12-04 00:32:22 +00001064 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +00001065 Stmt* AtFinallyStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001066 return new ObjCAtFinallyStmt(Loc,AtFinallyStmt);
Ted Kremenek04be5aa2007-12-04 00:32:22 +00001067}
1068
Ted Kremenekb7e6bd72008-01-29 21:21:30 +00001069void ObjCAtSynchronizedStmt::EmitImpl(Serializer& S) const {
1070 S.Emit(AtSynchronizedLoc);
Fariborz Jahaniana0f55792008-01-29 22:59:37 +00001071 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubStmts[0]);
1072 }
Ted Kremenekb7e6bd72008-01-29 21:21:30 +00001073
Sam Bishope2563ca2008-04-07 21:55:54 +00001074ObjCAtSynchronizedStmt* ObjCAtSynchronizedStmt::CreateImpl(Deserializer& D,
1075 ASTContext& C) {
1076
Ted Kremenekb7e6bd72008-01-29 21:21:30 +00001077 SourceLocation L = SourceLocation::ReadVal(D);
Fariborz Jahaniana0f55792008-01-29 22:59:37 +00001078 ObjCAtSynchronizedStmt* stmt = new ObjCAtSynchronizedStmt(L,0,0);
Sam Bishope2563ca2008-04-07 21:55:54 +00001079 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubStmts[0], C);
Ted Kremenekb7e6bd72008-01-29 21:21:30 +00001080 return stmt;
1081}
1082
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001083void ObjCAtThrowStmt::EmitImpl(Serializer& S) const {
Ted Kremenek5bdd4e32007-12-04 00:40:49 +00001084 S.Emit(AtThrowLoc);
1085 S.EmitOwnedPtr(Throw);
1086}
1087
Sam Bishope2563ca2008-04-07 21:55:54 +00001088ObjCAtThrowStmt* ObjCAtThrowStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek5bdd4e32007-12-04 00:40:49 +00001089 SourceLocation L = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +00001090 Stmt* Throw = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001091 return new ObjCAtThrowStmt(L,Throw);
Ted Kremenek5bdd4e32007-12-04 00:40:49 +00001092}
1093
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001094void ObjCAtTryStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9c1efff2007-12-04 00:38:30 +00001095 S.Emit(AtTryLoc);
1096 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, &SubStmts[0]);
1097}
1098
Sam Bishope2563ca2008-04-07 21:55:54 +00001099ObjCAtTryStmt* ObjCAtTryStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9c1efff2007-12-04 00:38:30 +00001100 SourceLocation L = SourceLocation::ReadVal(D);
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001101 ObjCAtTryStmt* stmt = new ObjCAtTryStmt(L,NULL,NULL,NULL);
Sam Bishope2563ca2008-04-07 21:55:54 +00001102 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubStmts[0], C);
Ted Kremenek9c1efff2007-12-04 00:38:30 +00001103 return stmt;
1104}
1105
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001106void ObjCEncodeExpr::EmitImpl(Serializer& S) const {
1107 S.Emit(AtLoc);
1108 S.Emit(RParenLoc);
1109 S.Emit(getType());
1110 S.Emit(EncType);
1111}
1112
Sam Bishope2563ca2008-04-07 21:55:54 +00001113ObjCEncodeExpr* ObjCEncodeExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001114 SourceLocation AtLoc = SourceLocation::ReadVal(D);
1115 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1116 QualType T = QualType::ReadVal(D);
1117 QualType ET = QualType::ReadVal(D);
1118 return new ObjCEncodeExpr(T,ET,AtLoc,RParenLoc);
1119}
1120
Ted Kremeneka526c5c2008-01-07 19:49:32 +00001121void ObjCForCollectionStmt::EmitImpl(Serializer& S) const {
Ted Kremenekc3b59d32008-01-05 00:57:49 +00001122 S.Emit(ForLoc);
Fariborz Jahanian75712282008-01-10 00:24:29 +00001123 S.Emit(RParenLoc);
Ted Kremenek205712a2008-01-07 18:35:04 +00001124 S.BatchEmitOwnedPtrs(getElement(),getCollection(),getBody());
Ted Kremenekc3b59d32008-01-05 00:57:49 +00001125}
1126
Sam Bishope2563ca2008-04-07 21:55:54 +00001127ObjCForCollectionStmt* ObjCForCollectionStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekc3b59d32008-01-05 00:57:49 +00001128 SourceLocation ForLoc = SourceLocation::ReadVal(D);
Fariborz Jahanian75712282008-01-10 00:24:29 +00001129 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
Ted Kremenek205712a2008-01-07 18:35:04 +00001130 Stmt* Element;
1131 Expr* Collection;
1132 Stmt* Body;
Sam Bishope2563ca2008-04-07 21:55:54 +00001133 D.BatchReadOwnedPtrs(Element, Collection, Body, C);
Fariborz Jahanian75712282008-01-10 00:24:29 +00001134 return new ObjCForCollectionStmt(Element,Collection,Body,ForLoc, RParenLoc);
Ted Kremenekc3b59d32008-01-05 00:57:49 +00001135}
1136
Daniel Dunbard17c24f2008-10-14 16:57:09 +00001137void ObjCProtocolExpr::EmitImpl(llvm::Serializer& S) const {
1138 S.Emit(getType());
1139 S.EmitPtr(Protocol);
1140 S.Emit(AtLoc);
1141 S.Emit(RParenLoc);
1142}
1143
1144ObjCProtocolExpr* ObjCProtocolExpr::CreateImpl(llvm::Deserializer& D,
1145 ASTContext& C) {
1146 QualType T = QualType::ReadVal(D);
1147 ObjCProtocolDecl *PD = D.ReadPtr<ObjCProtocolDecl>();
1148 SourceLocation AL = SourceLocation::ReadVal(D);
1149 SourceLocation RP = SourceLocation::ReadVal(D);
1150 return new ObjCProtocolExpr(T, PD, AL, RP);
1151}
1152
Ted Kremenek378c1512007-11-15 18:10:29 +00001153void ObjCIvarRefExpr::EmitImpl(Serializer& S) const {
1154 S.Emit(Loc);
1155 S.Emit(getType());
1156 S.EmitPtr(getDecl());
1157}
Ted Kremenek9c1efff2007-12-04 00:38:30 +00001158
Sam Bishope2563ca2008-04-07 21:55:54 +00001159ObjCIvarRefExpr* ObjCIvarRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek378c1512007-11-15 18:10:29 +00001160 SourceLocation Loc = SourceLocation::ReadVal(D);
1161 QualType T = QualType::ReadVal(D);
1162 ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
1163 D.ReadPtr(dr->D,false);
1164 return dr;
1165}
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001166
Steve Naroffae784072008-05-30 00:40:33 +00001167void ObjCPropertyRefExpr::EmitImpl(Serializer& S) const {
1168 S.Emit(Loc);
1169 S.Emit(getType());
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001170 S.EmitPtr(getProperty());
1171}
1172
1173void ObjCKVCRefExpr::EmitImpl(Serializer& S) const {
1174 S.Emit(Loc);
1175 S.Emit(getType());
1176 S.EmitPtr(getGetterMethod());
1177 S.EmitPtr(getSetterMethod());
Steve Naroffae784072008-05-30 00:40:33 +00001178}
1179
1180ObjCPropertyRefExpr* ObjCPropertyRefExpr::CreateImpl(Deserializer& D,
1181 ASTContext& C) {
1182 SourceLocation Loc = SourceLocation::ReadVal(D);
1183 QualType T = QualType::ReadVal(D);
1184 ObjCPropertyRefExpr* dr = new ObjCPropertyRefExpr(NULL,T,Loc,0);
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001185 D.ReadPtr(dr->AsProperty,false);
1186 return dr;
1187}
1188
1189ObjCKVCRefExpr* ObjCKVCRefExpr::CreateImpl(Deserializer& D,
1190 ASTContext& C) {
1191 SourceLocation Loc = SourceLocation::ReadVal(D);
1192 QualType T = QualType::ReadVal(D);
Fariborz Jahanianba8d2d62008-11-22 20:25:50 +00001193 ObjCKVCRefExpr* dr = new ObjCKVCRefExpr(NULL,T,NULL,Loc,0);
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001194 D.ReadPtr(dr->Setter,false);
1195 D.ReadPtr(dr->Getter,false);
Steve Naroffae784072008-05-30 00:40:33 +00001196 return dr;
1197}
1198
Ted Kremenekea958e572008-05-01 17:26:20 +00001199void ObjCMessageExpr::EmitImpl(Serializer& S) const {
Ted Kremenekbe784242008-06-24 17:00:08 +00001200 S.EmitInt(getFlag());
Ted Kremenekea958e572008-05-01 17:26:20 +00001201 S.Emit(getType());
1202 S.Emit(SelName);
1203 S.Emit(LBracloc);
1204 S.Emit(RBracloc);
1205 S.EmitInt(NumArgs);
1206 S.EmitPtr(MethodProto);
1207
1208 if (getReceiver())
1209 S.BatchEmitOwnedPtrs(NumArgs+1, SubExprs);
Ted Kremenekbe784242008-06-24 17:00:08 +00001210 else {
1211 ClassInfo Info = getClassInfo();
1212
1213 if (Info.first) S.EmitPtr(Info.first);
1214 else S.EmitPtr(Info.second);
1215
Ted Kremenekea958e572008-05-01 17:26:20 +00001216 S.BatchEmitOwnedPtrs(NumArgs, &SubExprs[ARGS_START]);
1217 }
1218}
1219
1220ObjCMessageExpr* ObjCMessageExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekbe784242008-06-24 17:00:08 +00001221 unsigned flags = D.ReadInt();
Ted Kremenekea958e572008-05-01 17:26:20 +00001222 QualType t = QualType::ReadVal(D);
1223 Selector S = Selector::ReadVal(D);
1224 SourceLocation L = SourceLocation::ReadVal(D);
1225 SourceLocation R = SourceLocation::ReadVal(D);
1226
1227 // Construct an array for the subexpressions.
1228 unsigned NumArgs = D.ReadInt();
Ted Kremenekbe784242008-06-24 17:00:08 +00001229 Stmt** SubExprs = new Stmt*[NumArgs+1];
Ted Kremenekea958e572008-05-01 17:26:20 +00001230
1231 // Construct the ObjCMessageExpr object using the special ctor.
1232 ObjCMessageExpr* ME = new ObjCMessageExpr(S, t, L, R, SubExprs, NumArgs);
1233
1234 // Read in the MethodProto. Read the instance variable directly
1235 // allows it to be backpatched.
1236 D.ReadPtr(ME->MethodProto);
1237
1238 // Now read in the arguments.
1239
Ted Kremenekbe784242008-06-24 17:00:08 +00001240 if (flags & Flags == IsInstMeth)
Ted Kremenekea958e572008-05-01 17:26:20 +00001241 D.BatchReadOwnedPtrs(NumArgs+1, SubExprs, C);
1242 else {
Ted Kremenekbe784242008-06-24 17:00:08 +00001243 // Read the pointer for Cls/ClassName. The Deserializer will handle the
Ted Kremenekea958e572008-05-01 17:26:20 +00001244 // bit-mangling automatically.
Ted Kremenekbe784242008-06-24 17:00:08 +00001245 SubExprs[RECEIVER] = (Stmt*) ((uintptr_t) flags);
Ted Kremenekea958e572008-05-01 17:26:20 +00001246 D.ReadUIntPtr((uintptr_t&) SubExprs[RECEIVER]);
1247
1248 // Read the arguments.
1249 D.BatchReadOwnedPtrs(NumArgs, &SubExprs[ARGS_START], C);
1250 }
1251
1252 return ME;
1253}
1254
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001255void ObjCSelectorExpr::EmitImpl(Serializer& S) const {
1256 S.Emit(AtLoc);
1257 S.Emit(RParenLoc);
1258 S.Emit(getType());
1259 S.Emit(SelName);
1260}
1261
Sam Bishope2563ca2008-04-07 21:55:54 +00001262ObjCSelectorExpr* ObjCSelectorExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001263 SourceLocation AtLoc = SourceLocation::ReadVal(D);
1264 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1265 QualType T = QualType::ReadVal(D);
1266 Selector SelName = Selector::ReadVal(D);
1267
1268 return new ObjCSelectorExpr(T,SelName,AtLoc,RParenLoc);
1269}
1270
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001271void ObjCStringLiteral::EmitImpl(Serializer& S) const {
1272 S.Emit(AtLoc);
1273 S.Emit(getType());
1274 S.EmitOwnedPtr(String);
1275}
1276
Sam Bishope2563ca2008-04-07 21:55:54 +00001277ObjCStringLiteral* ObjCStringLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001278 SourceLocation L = SourceLocation::ReadVal(D);
1279 QualType T = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +00001280 StringLiteral* String = cast<StringLiteral>(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001281 return new ObjCStringLiteral(String,T,L);
1282}
Chris Lattner04421082008-04-08 04:40:51 +00001283
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001284void ObjCSuperExpr::EmitImpl(llvm::Serializer& S) const {
1285 S.Emit(getType());
1286 S.Emit(Loc);
1287}
1288
1289ObjCSuperExpr* ObjCSuperExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) {
1290 QualType Ty = QualType::ReadVal(D);
1291 SourceLocation Loc = SourceLocation::ReadVal(D);
1292 return new ObjCSuperExpr(Loc, Ty);
1293}
1294
Chris Lattner04421082008-04-08 04:40:51 +00001295//===----------------------------------------------------------------------===//
Steve Naroff4eb206b2008-09-03 18:15:37 +00001296// Serialization for Clang Extensions.
1297//===----------------------------------------------------------------------===//
1298
Daniel Dunbard17c24f2008-10-14 16:57:09 +00001299void ExtVectorElementExpr::EmitImpl(llvm::Serializer& S) const {
1300 S.Emit(getType());
1301 S.EmitOwnedPtr(getBase());
1302 S.EmitPtr(&Accessor);
1303 S.Emit(AccessorLoc);
1304}
1305
1306ExtVectorElementExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C) {
1307 QualType T = QualType::ReadVal(D);
1308 Expr *B = D.ReadOwnedPtr<Expr>(C);
1309 IdentifierInfo *A = D.ReadPtr<IdentifierInfo>();
1310 SourceLocation AL = SourceLocation::ReadVal(D);
1311 return new ExtVectorElementExpr(T, B, *A, AL);
1312}
1313
Steve Naroff9c3c9022008-09-17 18:37:59 +00001314void BlockExpr::EmitImpl(Serializer& S) const {
Steve Naroff4eb206b2008-09-03 18:15:37 +00001315 S.Emit(getType());
Steve Naroff56ee6892008-10-08 17:01:13 +00001316 S.EmitOwnedPtr(TheBlock);
Steve Naroff4eb206b2008-09-03 18:15:37 +00001317}
1318
Steve Naroff9c3c9022008-09-17 18:37:59 +00001319BlockExpr* BlockExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Steve Naroff56ee6892008-10-08 17:01:13 +00001320 QualType T = QualType::ReadVal(D);
1321 return new BlockExpr(cast<BlockDecl>(D.ReadOwnedPtr<Decl>(C)),T);
Steve Naroff4eb206b2008-09-03 18:15:37 +00001322}
1323
1324void BlockDeclRefExpr::EmitImpl(Serializer& S) const {
1325 S.Emit(Loc);
1326 S.Emit(getType());
1327 S.EmitBool(false);
1328 S.EmitPtr(getDecl());
1329}
1330
1331BlockDeclRefExpr* BlockDeclRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1332 assert(0 && "Cannot deserialize BlockDeclRefExpr yet");
1333 return 0;
1334}
1335
1336//===----------------------------------------------------------------------===//
Chris Lattner04421082008-04-08 04:40:51 +00001337// C++ Serialization
1338//===----------------------------------------------------------------------===//
1339void CXXDefaultArgExpr::EmitImpl(Serializer& S) const {
1340 S.EmitPtr(Param);
1341}
1342
1343CXXDefaultArgExpr *CXXDefaultArgExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1344 ParmVarDecl* Param = 0;
1345 D.ReadPtr(Param, false);
1346 return new CXXDefaultArgExpr(Param);
1347}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +00001348
1349void CXXFunctionalCastExpr::EmitImpl(Serializer& S) const {
1350 S.Emit(getType());
Douglas Gregor49badde2008-10-27 19:41:14 +00001351 S.Emit(getTypeAsWritten());
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +00001352 S.Emit(TyBeginLoc);
1353 S.Emit(RParenLoc);
1354 S.EmitOwnedPtr(getSubExpr());
1355}
1356
1357CXXFunctionalCastExpr *
1358CXXFunctionalCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1359 QualType Ty = QualType::ReadVal(D);
Douglas Gregor49badde2008-10-27 19:41:14 +00001360 QualType WrittenTy = QualType::ReadVal(D);
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +00001361 SourceLocation TyBeginLoc = SourceLocation::ReadVal(D);
1362 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1363 Expr* SubExpr = D.ReadOwnedPtr<Expr>(C);
Douglas Gregor49badde2008-10-27 19:41:14 +00001364 return new CXXFunctionalCastExpr(Ty, WrittenTy, TyBeginLoc, SubExpr, RParenLoc);
1365}
1366
1367void CXXNamedCastExpr::EmitImpl(Serializer& S) const {
1368 S.Emit(getType());
1369 S.Emit(getTypeAsWritten());
1370 S.Emit(Loc);
1371 S.EmitOwnedPtr(getSubExpr());
1372}
1373
1374CXXNamedCastExpr *
1375CXXNamedCastExpr::CreateImpl(Deserializer& D, ASTContext& C, StmtClass SC) {
1376 QualType Ty = QualType::ReadVal(D);
1377 QualType WrittenTy = QualType::ReadVal(D);
1378 SourceLocation Loc = SourceLocation::ReadVal(D);
1379 Expr* SubExpr = D.ReadOwnedPtr<Expr>(C);
1380 switch (SC) {
1381 case CXXStaticCastExprClass:
1382 return new CXXStaticCastExpr(Ty, SubExpr, WrittenTy, Loc);
1383 case CXXDynamicCastExprClass:
1384 return new CXXDynamicCastExpr(Ty, SubExpr, WrittenTy, Loc);
1385 case CXXReinterpretCastExprClass:
1386 return new CXXReinterpretCastExpr(Ty, SubExpr, WrittenTy, Loc);
1387 case CXXConstCastExprClass:
1388 return new CXXConstCastExpr(Ty, SubExpr, WrittenTy, Loc);
1389 default:
1390 assert(false && "Unknown cast type!");
1391 return 0;
1392 }
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +00001393}
1394
Sebastian Redlc42e1182008-11-11 11:37:55 +00001395void CXXTypeidExpr::EmitImpl(llvm::Serializer& S) const {
1396 S.Emit(getType());
1397 S.Emit(isTypeOperand());
1398 if (isTypeOperand()) {
1399 S.Emit(getTypeOperand());
1400 } else {
1401 S.EmitOwnedPtr(getExprOperand());
1402 }
1403 S.Emit(Range);
1404}
1405
1406CXXTypeidExpr*
1407CXXTypeidExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) {
1408 QualType Ty = QualType::ReadVal(D);
1409 bool isTypeOp = D.ReadBool();
1410 void *Operand;
1411 if (isTypeOp) {
1412 Operand = QualType::ReadVal(D).getAsOpaquePtr();
1413 } else {
1414 Operand = D.ReadOwnedPtr<Expr>(C);
1415 }
1416 SourceRange Range = SourceRange::ReadVal(D);
1417 return new CXXTypeidExpr(isTypeOp, Operand, Ty, Range);
1418}
1419
Douglas Gregor796da182008-11-04 14:32:21 +00001420void CXXThisExpr::EmitImpl(llvm::Serializer& S) const {
1421 S.Emit(getType());
1422 S.Emit(Loc);
1423}
1424
1425CXXThisExpr* CXXThisExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) {
1426 QualType Ty = QualType::ReadVal(D);
1427 SourceLocation Loc = SourceLocation::ReadVal(D);
1428 return new CXXThisExpr(Loc, Ty);
1429}
1430
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +00001431void CXXZeroInitValueExpr::EmitImpl(Serializer& S) const {
1432 S.Emit(getType());
1433 S.Emit(TyBeginLoc);
1434 S.Emit(RParenLoc);
1435}
1436
1437CXXZeroInitValueExpr *
1438CXXZeroInitValueExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1439 QualType Ty = QualType::ReadVal(D);
1440 SourceLocation TyBeginLoc = SourceLocation::ReadVal(D);
1441 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1442 return new CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc);
1443}
Sebastian Redl4c5d3202008-11-21 19:14:01 +00001444
1445void CXXNewExpr::EmitImpl(Serializer& S) const {
1446 S.Emit(getType());
1447 S.Emit(Initializer);
Douglas Gregor19ac6ff2008-12-01 19:45:16 +00001448 S.EmitInt(NumPlacementArgs);
1449 S.EmitInt(NumConstructorArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +00001450 S.BatchEmitOwnedPtrs(NumPlacementArgs + NumConstructorArgs, SubExprs);
1451 assert((OperatorNew == 0 || S.isRegistered(OperatorNew)) &&
1452 (OperatorDelete == 0 || S.isRegistered(OperatorDelete)) &&
1453 (Constructor == 0 || S.isRegistered(Constructor)) &&
1454 "CXXNewExpr cannot own declarations");
1455 S.EmitPtr(OperatorNew);
1456 S.EmitPtr(OperatorDelete);
1457 S.EmitPtr(Constructor);
1458 S.Emit(AllocType);
1459 S.Emit(StartLoc);
1460 S.Emit(EndLoc);
1461}
1462
1463CXXNewExpr *
1464CXXNewExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1465 QualType T = QualType::ReadVal(D);
1466 bool GlobalNew = D.ReadBool();
1467 bool ParenTypeId = D.ReadBool();
1468 bool Initializer = D.ReadBool();
1469 unsigned NumPlacementArgs = D.ReadInt();
1470 unsigned NumConstructorArgs = D.ReadInt();
1471 unsigned TotalExprs = NumPlacementArgs + NumConstructorArgs;
1472 Stmt** SubExprs = new Stmt*[TotalExprs];
1473 D.BatchReadOwnedPtrs(TotalExprs, SubExprs, C);
1474 FunctionDecl *OperatorNew = D.ReadPtr<FunctionDecl>();
1475 FunctionDecl *OperatorDelete = D.ReadPtr<FunctionDecl>();
1476 CXXConstructorDecl *Constructor = D.ReadPtr<CXXConstructorDecl>();
1477 QualType AllocType = QualType::ReadVal(D);
1478 SourceLocation StartLoc = SourceLocation::ReadVal(D);
1479 SourceLocation EndLoc = SourceLocation::ReadVal(D);
1480
1481 return new CXXNewExpr(T, AllocType, GlobalNew, ParenTypeId, Initializer,
1482 NumPlacementArgs, NumConstructorArgs, SubExprs,
1483 OperatorNew, OperatorDelete, Constructor, StartLoc,
1484 EndLoc);
1485}
1486
1487void CXXDeleteExpr::EmitImpl(Serializer& S) const {
1488 S.Emit(getType());
1489 S.Emit(GlobalDelete);
1490 S.Emit(ArrayForm);
1491 S.EmitPtr(OperatorDelete);
1492 S.EmitOwnedPtr(Argument);
1493 S.Emit(Loc);
1494}
1495
1496CXXDeleteExpr *
1497CXXDeleteExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1498 QualType Ty = QualType::ReadVal(D);
1499 bool GlobalDelete = D.ReadBool();
1500 bool ArrayForm = D.ReadBool();
1501 FunctionDecl *OperatorDelete = D.ReadPtr<FunctionDecl>();
1502 Stmt *Argument = D.ReadOwnedPtr<Stmt>(C);
1503 SourceLocation Loc = SourceLocation::ReadVal(D);
1504 return new CXXDeleteExpr(Ty, GlobalDelete, ArrayForm, OperatorDelete,
1505 cast<Expr>(Argument), Loc);
1506}