blob: adaa559b06fe4395c66d5810fe4d33036a18e7f5 [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"
Ted Kremeneke522d852007-10-31 18:41:19 +000017#include "llvm/Bitcode/Serialize.h"
18#include "llvm/Bitcode/Deserialize.h"
19
Ted Kremeneke522d852007-10-31 18:41:19 +000020using namespace clang;
Ted Kremenek96fa54f2007-11-07 22:53:01 +000021using llvm::Serializer;
22using llvm::Deserializer;
Ted Kremeneke522d852007-10-31 18:41:19 +000023
Ted Kremenek96fa54f2007-11-07 22:53:01 +000024void Stmt::Emit(Serializer& S) const {
Ted Kremenek28f3d802007-11-07 22:32:23 +000025 S.FlushRecord();
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000026 S.EmitInt(getStmtClass());
Ted Kremenekec0aa782007-11-12 18:04:32 +000027 EmitImpl(S);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +000028 S.FlushRecord();
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000029}
Ted Kremeneke522d852007-10-31 18:41:19 +000030
Sam Bishope2563ca2008-04-07 21:55:54 +000031Stmt* Stmt::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000032 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremeneke522d852007-10-31 18:41:19 +000033
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000034 switch (SC) {
35 default:
36 assert (false && "Not implemented.");
37 return NULL;
Ted Kremenek0965f442007-11-07 00:37:40 +000038
Ted Kremenekaa337632007-11-08 16:32:00 +000039 case AddrLabelExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000040 return AddrLabelExpr::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +000041
Ted Kremenek96fa54f2007-11-07 22:53:01 +000042 case ArraySubscriptExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000043 return ArraySubscriptExpr::CreateImpl(D, C);
Ted Kremenek96fa54f2007-11-07 22:53:01 +000044
Ted Kremenek1f85acd2007-11-13 22:55:51 +000045 case AsmStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000046 return AsmStmt::CreateImpl(D, C);
Ted Kremenek1f85acd2007-11-13 22:55:51 +000047
Ted Kremenek0965f442007-11-07 00:37:40 +000048 case BinaryOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000049 return BinaryOperator::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000050
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000051 case BreakStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000052 return BreakStmt::CreateImpl(D, C);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +000053
54 case CallExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000055 return CallExpr::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000056
57 case CaseStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000058 return CaseStmt::CreateImpl(D, C);
Ted Kremenek9971c9a2007-11-07 22:42:34 +000059
60 case CastExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000061 return CastExpr::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000062
Ted Kremenek7338a822007-11-07 17:15:49 +000063 case CharacterLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000064 return CharacterLiteral::CreateImpl(D, C);
Ted Kremenek7338a822007-11-07 17:15:49 +000065
Ted Kremenek83efb152007-11-08 00:41:37 +000066 case CompoundAssignOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000067 return CompoundAssignOperator::CreateImpl(D, C);
Ted Kremenek83efb152007-11-08 00:41:37 +000068
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +000069 case CompoundLiteralExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000070 return CompoundLiteralExpr::CreateImpl(D, C);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +000071
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000072 case CompoundStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000073 return CompoundStmt::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +000074
75 case ConditionalOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000076 return ConditionalOperator::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000077
Ted Kremenek96f22422007-11-07 17:05:07 +000078 case ContinueStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000079 return ContinueStmt::CreateImpl(D, C);
Ted Kremenek96f22422007-11-07 17:05:07 +000080
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000081 case DeclRefExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000082 return DeclRefExpr::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +000083
Ted Kremenek0965f442007-11-07 00:37:40 +000084 case DeclStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000085 return DeclStmt::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +000086
87 case DefaultStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000088 return DefaultStmt::CreateImpl(D, C);
Ted Kremeneke3299ef2007-11-07 07:53:55 +000089
90 case DoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000091 return DoStmt::CreateImpl(D, C);
Ted Kremenek612c9b92007-11-07 18:45:55 +000092
93 case FloatingLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000094 return FloatingLiteral::CreateImpl(D, C);
Ted Kremenek07ba0462007-11-07 08:02:55 +000095
96 case ForStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +000097 return ForStmt::CreateImpl(D, C);
Ted Kremenek3f0767b2007-11-07 08:07:46 +000098
99 case GotoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000100 return GotoStmt::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000101
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000102 case IfStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000103 return IfStmt::CreateImpl(D, C);
Ted Kremenek1c72de12007-11-07 18:53:02 +0000104
105 case ImaginaryLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000106 return ImaginaryLiteral::CreateImpl(D, C);
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000107
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000108 case ImplicitCastExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000109 return ImplicitCastExpr::CreateImpl(D, C);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000110
Ted Kremenek225a2d92007-11-07 17:02:32 +0000111 case IndirectGotoStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000112 return IndirectGotoStmt::CreateImpl(D, C);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000113
114 case InitListExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000115 return InitListExpr::CreateImpl(D, C);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000116
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000117 case IntegerLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000118 return IntegerLiteral::CreateImpl(D, C);
Ted Kremenek4927be62007-11-07 00:40:53 +0000119
Ted Kremenekb15132f2007-11-07 00:48:04 +0000120 case LabelStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000121 return LabelStmt::CreateImpl(D, C);
Ted Kremenekb15132f2007-11-07 00:48:04 +0000122
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000123 case MemberExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000124 return MemberExpr::CreateImpl(D, C);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000125
Ted Kremenek4927be62007-11-07 00:40:53 +0000126 case NullStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000127 return NullStmt::CreateImpl(D, C);
Ted Kremenek0965f442007-11-07 00:37:40 +0000128
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000129 case ParenExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000130 return ParenExpr::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000131
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000132 case PreDefinedExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000133 return PreDefinedExpr::CreateImpl(D, C);
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000134
Ted Kremenek0965f442007-11-07 00:37:40 +0000135 case ReturnStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000136 return ReturnStmt::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000137
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000138 case SizeOfAlignOfTypeExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000139 return SizeOfAlignOfTypeExpr::CreateImpl(D, C);
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000140
Ted Kremenekaa337632007-11-08 16:32:00 +0000141 case StmtExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000142 return StmtExpr::CreateImpl(D, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000143
Ted Kremenek7febad72007-11-07 19:08:19 +0000144 case StringLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000145 return StringLiteral::CreateImpl(D, C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000146
147 case SwitchStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000148 return SwitchStmt::CreateImpl(D, C);
Ted Kremenek5572b942007-11-07 07:50:10 +0000149
Ted Kremenek10494362007-11-08 00:26:24 +0000150 case UnaryOperatorClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000151 return UnaryOperator::CreateImpl(D, C);
Ted Kremenek10494362007-11-08 00:26:24 +0000152
Ted Kremenek5572b942007-11-07 07:50:10 +0000153 case WhileStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000154 return WhileStmt::CreateImpl(D, C);
Ted Kremenek378c1512007-11-15 18:10:29 +0000155
156 //==--------------------------------------==//
157 // Objective C
158 //==--------------------------------------==//
Ted Kremenekaf526772007-12-04 00:28:54 +0000159
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000160 case ObjCAtCatchStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000161 return ObjCAtCatchStmt::CreateImpl(D, C);
Ted Kremenek378c1512007-11-15 18:10:29 +0000162
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000163 case ObjCAtFinallyStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000164 return ObjCAtFinallyStmt::CreateImpl(D, C);
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000165
166 case ObjCAtSynchronizedStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000167 return ObjCAtSynchronizedStmt::CreateImpl(D, C);
Ted Kremenek04be5aa2007-12-04 00:32:22 +0000168
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000169 case ObjCAtThrowStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000170 return ObjCAtThrowStmt::CreateImpl(D, C);
Ted Kremenek5bdd4e32007-12-04 00:40:49 +0000171
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000172 case ObjCAtTryStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000173 return ObjCAtTryStmt::CreateImpl(D, C);
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000174
175 case ObjCEncodeExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000176 return ObjCEncodeExpr::CreateImpl(D, C);
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000177
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000178 case ObjCForCollectionStmtClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000179 return ObjCForCollectionStmt::CreateImpl(D, C);
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000180
Ted Kremenek378c1512007-11-15 18:10:29 +0000181 case ObjCIvarRefExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000182 return ObjCIvarRefExpr::CreateImpl(D, C);
Ted Kremenek46dc0a52007-12-04 00:51:11 +0000183
Ted Kremenekea958e572008-05-01 17:26:20 +0000184 case ObjCMessageExprClass:
185 return ObjCMessageExpr::CreateImpl(D, C);
186
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000187 case ObjCSelectorExprClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000188 return ObjCSelectorExpr::CreateImpl(D, C);
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000189
Ted Kremenek46dc0a52007-12-04 00:51:11 +0000190 case ObjCStringLiteralClass:
Sam Bishope2563ca2008-04-07 21:55:54 +0000191 return ObjCStringLiteral::CreateImpl(D, C);
Chris Lattner04421082008-04-08 04:40:51 +0000192
193 //==--------------------------------------==//
194 // C++
195 //==--------------------------------------==//
Chris Lattner04421082008-04-08 04:40:51 +0000196
Ted Kremenekea958e572008-05-01 17:26:20 +0000197 case CXXDefaultArgExprClass:
198 return CXXDefaultArgExpr::CreateImpl(D, C);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000199 }
Ted Kremeneke522d852007-10-31 18:41:19 +0000200}
201
Ted Kremenek378c1512007-11-15 18:10:29 +0000202//===----------------------------------------------------------------------===//
203// C Serialization
204//===----------------------------------------------------------------------===//
205
Ted Kremenekec0aa782007-11-12 18:04:32 +0000206void AddrLabelExpr::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000207 S.Emit(getType());
208 S.Emit(AmpAmpLoc);
209 S.Emit(LabelLoc);
210 S.EmitPtr(Label);
211}
212
Sam Bishope2563ca2008-04-07 21:55:54 +0000213AddrLabelExpr* AddrLabelExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaa337632007-11-08 16:32:00 +0000214 QualType t = QualType::ReadVal(D);
215 SourceLocation AALoc = SourceLocation::ReadVal(D);
216 SourceLocation LLoc = SourceLocation::ReadVal(D);
217 AddrLabelExpr* expr = new AddrLabelExpr(AALoc,LLoc,NULL,t);
218 D.ReadPtr(expr->Label); // Pointer may be backpatched.
219 return expr;
220}
221
Ted Kremenekec0aa782007-11-12 18:04:32 +0000222void ArraySubscriptExpr::EmitImpl(Serializer& S) const {
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000223 S.Emit(getType());
224 S.Emit(RBracketLoc);
225 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
226}
227
Sam Bishope2563ca2008-04-07 21:55:54 +0000228ArraySubscriptExpr* ArraySubscriptExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000229 QualType t = QualType::ReadVal(D);
230 SourceLocation L = SourceLocation::ReadVal(D);
231 Expr *LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000232 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek96fa54f2007-11-07 22:53:01 +0000233 return new ArraySubscriptExpr(LHS,RHS,t,L);
234}
235
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000236void AsmStmt::EmitImpl(Serializer& S) const {
237 S.Emit(AsmLoc);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000238
Anders Carlsson6a0ef4b2007-11-20 19:21:03 +0000239 getAsmString()->EmitImpl(S);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000240 S.Emit(RParenLoc);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000241
Anders Carlsson39c47b52007-11-23 23:12:25 +0000242 S.EmitBool(IsVolatile);
Anders Carlssondfab34a2008-02-05 23:03:50 +0000243 S.EmitBool(IsSimple);
Anders Carlssonb235fc22007-11-22 01:36:19 +0000244 S.EmitInt(NumOutputs);
245 S.EmitInt(NumInputs);
246
247 unsigned size = NumOutputs + NumInputs;
248
249 for (unsigned i = 0; i < size; ++i)
250 S.EmitCStr(Names[i].c_str());
251
252 for (unsigned i = 0; i < size; ++i)
253 Constraints[i]->EmitImpl(S);
254
255 for (unsigned i = 0; i < size; ++i)
256 S.EmitOwnedPtr(Exprs[i]);
257
258 S.EmitInt(Clobbers.size());
259 for (unsigned i = 0, e = Clobbers.size(); i != e; ++i)
260 Clobbers[i]->EmitImpl(S);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000261}
262
Sam Bishope2563ca2008-04-07 21:55:54 +0000263AsmStmt* AsmStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000264 SourceLocation ALoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000265 StringLiteral *AsmStr = StringLiteral::CreateImpl(D, C);
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000266 SourceLocation PLoc = SourceLocation::ReadVal(D);
267
Anders Carlsson39c47b52007-11-23 23:12:25 +0000268 bool IsVolatile = D.ReadBool();
Anders Carlssondfab34a2008-02-05 23:03:50 +0000269 bool IsSimple = D.ReadBool();
270 AsmStmt *Stmt = new AsmStmt(ALoc, IsSimple, IsVolatile, 0, 0, 0, 0, 0,
Anders Carlssonb235fc22007-11-22 01:36:19 +0000271 AsmStr,
272 0, 0, PLoc);
273
274 Stmt->NumOutputs = D.ReadInt();
275 Stmt->NumInputs = D.ReadInt();
276
277 unsigned size = Stmt->NumOutputs + Stmt->NumInputs;
278
279 Stmt->Names.reserve(size);
280 for (unsigned i = 0; i < size; ++i) {
281 std::vector<char> data;
282 D.ReadCStr(data, false);
Eli Friedman10c5fa32008-02-23 07:32:49 +0000283
284 Stmt->Names.push_back(std::string(data.begin(), data.end()));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000285 }
286
287 Stmt->Constraints.reserve(size);
288 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000289 Stmt->Constraints.push_back(StringLiteral::CreateImpl(D, C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000290
291 Stmt->Exprs.reserve(size);
292 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000293 Stmt->Exprs.push_back(D.ReadOwnedPtr<Expr>(C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000294
295 unsigned NumClobbers = D.ReadInt();
296 Stmt->Clobbers.reserve(NumClobbers);
297 for (unsigned i = 0; i < NumClobbers; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000298 Stmt->Clobbers.push_back(StringLiteral::CreateImpl(D, C));
Anders Carlssonb235fc22007-11-22 01:36:19 +0000299
300 return Stmt;
Ted Kremenek1f85acd2007-11-13 22:55:51 +0000301}
302
Ted Kremenekec0aa782007-11-12 18:04:32 +0000303void BinaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek0965f442007-11-07 00:37:40 +0000304 S.EmitInt(Opc);
305 S.Emit(OpLoc);;
306 S.Emit(getType());
Ted Kremenek28f3d802007-11-07 22:32:23 +0000307 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek0965f442007-11-07 00:37:40 +0000308}
309
Sam Bishope2563ca2008-04-07 21:55:54 +0000310BinaryOperator* BinaryOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek0965f442007-11-07 00:37:40 +0000311 Opcode Opc = static_cast<Opcode>(D.ReadInt());
312 SourceLocation OpLoc = SourceLocation::ReadVal(D);
313 QualType Result = QualType::ReadVal(D);
Ted Kremenek28f3d802007-11-07 22:32:23 +0000314 Expr *LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000315 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek28f3d802007-11-07 22:32:23 +0000316
Ted Kremenek0965f442007-11-07 00:37:40 +0000317 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
318}
Ted Kremeneke522d852007-10-31 18:41:19 +0000319
Ted Kremenekec0aa782007-11-12 18:04:32 +0000320void BreakStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000321 S.Emit(BreakLoc);
322}
323
Sam Bishope2563ca2008-04-07 21:55:54 +0000324BreakStmt* BreakStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000325 SourceLocation Loc = SourceLocation::ReadVal(D);
326 return new BreakStmt(Loc);
327}
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000328
Ted Kremenekec0aa782007-11-12 18:04:32 +0000329void CallExpr::EmitImpl(Serializer& S) const {
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000330 S.Emit(getType());
331 S.Emit(RParenLoc);
332 S.EmitInt(NumArgs);
Ted Kremenekea958e572008-05-01 17:26:20 +0000333 S.BatchEmitOwnedPtrs(NumArgs+1, SubExprs);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000334}
335
Sam Bishope2563ca2008-04-07 21:55:54 +0000336CallExpr* CallExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000337 QualType t = QualType::ReadVal(D);
338 SourceLocation L = SourceLocation::ReadVal(D);
339 unsigned NumArgs = D.ReadInt();
340 Expr** SubExprs = new Expr*[NumArgs+1];
Sam Bishope2563ca2008-04-07 21:55:54 +0000341 D.BatchReadOwnedPtrs(NumArgs+1, SubExprs, C);
Ted Kremenekd7fe4ea2007-11-07 23:32:20 +0000342
343 return new CallExpr(SubExprs,NumArgs,t,L);
344}
345
Ted Kremenekec0aa782007-11-12 18:04:32 +0000346void CaseStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000347 S.Emit(CaseLoc);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000348 S.EmitPtr(getNextSwitchCase());
Ted Kremenek103fc812007-11-08 00:56:26 +0000349 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubExprs[0]);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000350}
351
Sam Bishope2563ca2008-04-07 21:55:54 +0000352CaseStmt* CaseStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000353 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenek103fc812007-11-08 00:56:26 +0000354 CaseStmt* stmt = new CaseStmt(NULL,NULL,NULL,CaseLoc);
355 D.ReadPtr(stmt->NextSwitchCase);
Sam Bishope2563ca2008-04-07 21:55:54 +0000356 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubExprs[0], C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000357 return stmt;
358}
Ted Kremeneke522d852007-10-31 18:41:19 +0000359
Ted Kremenekec0aa782007-11-12 18:04:32 +0000360void CastExpr::EmitImpl(Serializer& S) const {
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000361 S.Emit(getType());
362 S.Emit(Loc);
363 S.EmitOwnedPtr(Op);
364}
365
Sam Bishope2563ca2008-04-07 21:55:54 +0000366CastExpr* CastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000367 QualType t = QualType::ReadVal(D);
368 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000369 Expr* Op = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek9971c9a2007-11-07 22:42:34 +0000370 return new CastExpr(t,Op,Loc);
371}
372
373
Ted Kremenekec0aa782007-11-12 18:04:32 +0000374void CharacterLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek7338a822007-11-07 17:15:49 +0000375 S.Emit(Value);
376 S.Emit(Loc);
377 S.Emit(getType());
378}
379
Sam Bishope2563ca2008-04-07 21:55:54 +0000380CharacterLiteral* CharacterLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek7338a822007-11-07 17:15:49 +0000381 unsigned value = D.ReadInt();
382 SourceLocation Loc = SourceLocation::ReadVal(D);
383 QualType T = QualType::ReadVal(D);
384 return new CharacterLiteral(value,T,Loc);
385}
386
Ted Kremenekec0aa782007-11-12 18:04:32 +0000387void CompoundAssignOperator::EmitImpl(Serializer& S) const {
Ted Kremenek83efb152007-11-08 00:41:37 +0000388 S.Emit(getType());
389 S.Emit(ComputationType);
390 S.Emit(getOperatorLoc());
391 S.EmitInt(getOpcode());
392 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
393}
394
395CompoundAssignOperator*
Sam Bishope2563ca2008-04-07 21:55:54 +0000396CompoundAssignOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek83efb152007-11-08 00:41:37 +0000397 QualType t = QualType::ReadVal(D);
398 QualType c = QualType::ReadVal(D);
399 SourceLocation L = SourceLocation::ReadVal(D);
400 Opcode Opc = static_cast<Opcode>(D.ReadInt());
401 Expr* LHS, *RHS;
Sam Bishope2563ca2008-04-07 21:55:54 +0000402 D.BatchReadOwnedPtrs(LHS, RHS, C);
Ted Kremenek83efb152007-11-08 00:41:37 +0000403
404 return new CompoundAssignOperator(LHS,RHS,Opc,t,c,L);
405}
406
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000407void CompoundLiteralExpr::EmitImpl(Serializer& S) const {
408 S.Emit(getType());
Chris Lattner0fc53df2008-01-02 21:46:24 +0000409 S.Emit(getLParenLoc());
Steve Naroffe9b12192008-01-14 18:19:28 +0000410 S.EmitBool(isFileScope());
Ted Kremenek34bc18b2008-01-14 18:29:39 +0000411 S.EmitOwnedPtr(Init);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000412}
413
Sam Bishope2563ca2008-04-07 21:55:54 +0000414CompoundLiteralExpr* CompoundLiteralExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000415 QualType Q = QualType::ReadVal(D);
Chris Lattner0fc53df2008-01-02 21:46:24 +0000416 SourceLocation L = SourceLocation::ReadVal(D);
Steve Naroffe9b12192008-01-14 18:19:28 +0000417 bool fileScope = D.ReadBool();
Sam Bishope2563ca2008-04-07 21:55:54 +0000418 Expr* Init = D.ReadOwnedPtr<Expr>(C);
Steve Naroffe9b12192008-01-14 18:19:28 +0000419 return new CompoundLiteralExpr(L, Q, Init, fileScope);
Ted Kremenek4b7d9ca2007-11-14 21:18:36 +0000420}
421
Ted Kremenekec0aa782007-11-12 18:04:32 +0000422void CompoundStmt::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000423 S.Emit(LBracLoc);
424 S.Emit(RBracLoc);
425 S.Emit(Body.size());
Ted Kremeneke522d852007-10-31 18:41:19 +0000426
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000427 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremeneke522d852007-10-31 18:41:19 +0000428 S.EmitOwnedPtr(*I);
429}
430
Sam Bishope2563ca2008-04-07 21:55:54 +0000431CompoundStmt* CompoundStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000432 SourceLocation LB = SourceLocation::ReadVal(D);
433 SourceLocation RB = SourceLocation::ReadVal(D);
434 unsigned size = D.ReadInt();
Ted Kremeneke522d852007-10-31 18:41:19 +0000435
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000436 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
437
438 stmt->Body.reserve(size);
439
440 for (unsigned i = 0; i < size; ++i)
Sam Bishope2563ca2008-04-07 21:55:54 +0000441 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000442
443 return stmt;
Ted Kremeneke522d852007-10-31 18:41:19 +0000444}
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000445
Ted Kremenekec0aa782007-11-12 18:04:32 +0000446void ConditionalOperator::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000447 S.Emit(getType());
448 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, SubExprs);
449}
450
Sam Bishope2563ca2008-04-07 21:55:54 +0000451ConditionalOperator* ConditionalOperator::CreateImpl(Deserializer& D,
452 ASTContext& C) {
453
Ted Kremenekaa337632007-11-08 16:32:00 +0000454 QualType t = QualType::ReadVal(D);
455 ConditionalOperator* c = new ConditionalOperator(NULL,NULL,NULL,t);
Sam Bishope2563ca2008-04-07 21:55:54 +0000456 D.BatchReadOwnedPtrs((unsigned) END_EXPR, c->SubExprs, C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000457 return c;
458}
459
Ted Kremenekec0aa782007-11-12 18:04:32 +0000460void ContinueStmt::EmitImpl(Serializer& S) const {
Ted Kremenek96f22422007-11-07 17:05:07 +0000461 S.Emit(ContinueLoc);
462}
463
Sam Bishope2563ca2008-04-07 21:55:54 +0000464ContinueStmt* ContinueStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek96f22422007-11-07 17:05:07 +0000465 SourceLocation Loc = SourceLocation::ReadVal(D);
466 return new ContinueStmt(Loc);
467}
468
Ted Kremenekec0aa782007-11-12 18:04:32 +0000469void DeclStmt::EmitImpl(Serializer& S) const {
Ted Kremenek0965f442007-11-07 00:37:40 +0000470 // FIXME: special handling for struct decls.
471 S.EmitOwnedPtr(getDecl());
Chris Lattner81c018d2008-03-13 06:29:04 +0000472 S.Emit(StartLoc);
473 S.Emit(EndLoc);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000474}
475
Ted Kremenekec0aa782007-11-12 18:04:32 +0000476void DeclRefExpr::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000477 S.Emit(Loc);
478 S.Emit(getType());
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000479
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000480 // Some DeclRefExprs can actually hold the owning reference to a FunctionDecl.
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000481 // This occurs when an implicitly defined function is called, and
482 // the decl does not appear in the source file. We thus check if the
483 // decl pointer has been registered, and if not, emit an owned pointer.
484
485 // FIXME: While this will work for serialization, it won't work for
486 // memory management. The only reason this works for serialization is
487 // because we are tracking all serialized pointers. Either DeclRefExpr
488 // needs an explicit bit indicating that it owns the the object,
489 // or we need a different ownership model.
490
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000491 const Decl* d = getDecl();
492
493 if (!S.isRegistered(d)) {
494 assert (isa<FunctionDecl>(d)
495 && "DeclRefExpr can only own FunctionDecls for implicitly def. funcs.");
496
497 S.EmitBool(true);
498 S.EmitOwnedPtr(d);
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000499 }
500 else {
Ted Kremenekc37bdf02007-11-16 19:00:35 +0000501 S.EmitBool(false);
502 S.EmitPtr(d);
503 }
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000504}
505
Sam Bishope2563ca2008-04-07 21:55:54 +0000506DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000507 SourceLocation Loc = SourceLocation::ReadVal(D);
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000508 QualType T = QualType::ReadVal(D);
509 bool OwnsDecl = D.ReadBool();
510 ValueDecl* decl;
511
512 if (!OwnsDecl)
513 D.ReadPtr(decl,false); // No backpatching.
514 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000515 decl = cast<ValueDecl>(D.ReadOwnedPtr<Decl>(C));
Ted Kremenek767dd4b2007-11-15 18:26:39 +0000516
517 return new DeclRefExpr(decl,T,Loc);
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000518}
519
Sam Bishope2563ca2008-04-07 21:55:54 +0000520DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
521 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>(C));
Chris Lattner81c018d2008-03-13 06:29:04 +0000522 SourceLocation StartLoc = SourceLocation::ReadVal(D);
523 SourceLocation EndLoc = SourceLocation::ReadVal(D);
524 return new DeclStmt(decl, StartLoc, EndLoc);
Ted Kremenek0965f442007-11-07 00:37:40 +0000525}
526
Ted Kremenekec0aa782007-11-12 18:04:32 +0000527void DefaultStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000528 S.Emit(DefaultLoc);
529 S.EmitOwnedPtr(getSubStmt());
530 S.EmitPtr(getNextSwitchCase());
531}
532
Sam Bishope2563ca2008-04-07 21:55:54 +0000533DefaultStmt* DefaultStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000534 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000535 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000536
537 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
538 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
539
540 return stmt;
541}
Ted Kremenek0965f442007-11-07 00:37:40 +0000542
Ted Kremenekec0aa782007-11-12 18:04:32 +0000543void DoStmt::EmitImpl(Serializer& S) const {
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000544 S.Emit(DoLoc);
545 S.EmitOwnedPtr(getCond());
546 S.EmitOwnedPtr(getBody());
547}
548
Sam Bishope2563ca2008-04-07 21:55:54 +0000549DoStmt* DoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000550 SourceLocation DoLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000551 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
552 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneke3299ef2007-11-07 07:53:55 +0000553 return new DoStmt(Body,Cond,DoLoc);
554}
555
Ted Kremenekec0aa782007-11-12 18:04:32 +0000556void FloatingLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek612c9b92007-11-07 18:45:55 +0000557 S.Emit(Loc);
558 S.Emit(getType());
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000559 S.EmitBool(isExact());
Ted Kremenek612c9b92007-11-07 18:45:55 +0000560 S.Emit(Value);
561}
562
Sam Bishope2563ca2008-04-07 21:55:54 +0000563FloatingLiteral* FloatingLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek612c9b92007-11-07 18:45:55 +0000564 SourceLocation Loc = SourceLocation::ReadVal(D);
565 QualType t = QualType::ReadVal(D);
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000566 bool isExact = D.ReadBool();
Ted Kremenek612c9b92007-11-07 18:45:55 +0000567 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
Ted Kremenek720c4ec2007-11-29 00:56:49 +0000568 FloatingLiteral* expr = new FloatingLiteral(Val,&isExact,t,Loc);
Ted Kremenek612c9b92007-11-07 18:45:55 +0000569 return expr;
570}
571
Ted Kremenekec0aa782007-11-12 18:04:32 +0000572void ForStmt::EmitImpl(Serializer& S) const {
Ted Kremenek07ba0462007-11-07 08:02:55 +0000573 S.Emit(ForLoc);
574 S.EmitOwnedPtr(getInit());
575 S.EmitOwnedPtr(getCond());
576 S.EmitOwnedPtr(getInc());
577 S.EmitOwnedPtr(getBody());
578}
579
Sam Bishope2563ca2008-04-07 21:55:54 +0000580ForStmt* ForStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek07ba0462007-11-07 08:02:55 +0000581 SourceLocation ForLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000582 Stmt* Init = D.ReadOwnedPtr<Stmt>(C);
583 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
584 Expr* Inc = D.ReadOwnedPtr<Expr>(C);
585 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek07ba0462007-11-07 08:02:55 +0000586 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
587}
588
Ted Kremenekec0aa782007-11-12 18:04:32 +0000589void GotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenek3f0767b2007-11-07 08:07:46 +0000590 S.Emit(GotoLoc);
591 S.Emit(LabelLoc);
592 S.EmitPtr(Label);
593}
594
Sam Bishope2563ca2008-04-07 21:55:54 +0000595GotoStmt* GotoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek3f0767b2007-11-07 08:07:46 +0000596 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
597 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
598 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
599 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
600 return stmt;
601}
602
Ted Kremenekec0aa782007-11-12 18:04:32 +0000603void IfStmt::EmitImpl(Serializer& S) const {
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000604 S.Emit(IfLoc);
605 S.EmitOwnedPtr(getCond());
606 S.EmitOwnedPtr(getThen());
607 S.EmitOwnedPtr(getElse());
608}
609
Sam Bishope2563ca2008-04-07 21:55:54 +0000610IfStmt* IfStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000611 SourceLocation L = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000612 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
613 Stmt* Then = D.ReadOwnedPtr<Stmt>(C);
614 Stmt* Else = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek4210f3d2007-11-07 07:19:30 +0000615 return new IfStmt(L,Cond,Then,Else);
616}
617
Ted Kremenekec0aa782007-11-12 18:04:32 +0000618void ImaginaryLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek1c72de12007-11-07 18:53:02 +0000619 S.Emit(getType());
620 S.EmitOwnedPtr(Val);
621}
622
Sam Bishope2563ca2008-04-07 21:55:54 +0000623ImaginaryLiteral* ImaginaryLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1c72de12007-11-07 18:53:02 +0000624 QualType t = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000625 Expr* expr = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek1c72de12007-11-07 18:53:02 +0000626 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
627 return new ImaginaryLiteral(expr,t);
628}
629
Ted Kremenekec0aa782007-11-12 18:04:32 +0000630void ImplicitCastExpr::EmitImpl(Serializer& S) const {
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000631 S.Emit(getType());
632 S.EmitOwnedPtr(Op);
633}
634
Sam Bishope2563ca2008-04-07 21:55:54 +0000635ImplicitCastExpr* ImplicitCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000636 QualType t = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000637 Expr* Op = D.ReadOwnedPtr<Expr>(C);
Ted Kremeneka7c20dd2007-11-07 22:39:17 +0000638 return new ImplicitCastExpr(t,Op);
639}
640
Ted Kremenekec0aa782007-11-12 18:04:32 +0000641void IndirectGotoStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000642 S.EmitOwnedPtr(Target);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000643}
644
Sam Bishope2563ca2008-04-07 21:55:54 +0000645IndirectGotoStmt* IndirectGotoStmt::CreateImpl(Deserializer& D, ASTContext& C) {
646 Expr* Target = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekaa337632007-11-08 16:32:00 +0000647 return new IndirectGotoStmt(Target);
Ted Kremenek225a2d92007-11-07 17:02:32 +0000648}
649
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000650void InitListExpr::EmitImpl(Serializer& S) const {
651 S.Emit(LBraceLoc);
652 S.Emit(RBraceLoc);
Steve Naroffc5ae8992008-05-01 02:04:18 +0000653 S.EmitInt(InitExprs.size());
654 if (!InitExprs.empty()) S.BatchEmitOwnedPtrs(InitExprs.size(), &InitExprs[0]);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000655}
656
Sam Bishope2563ca2008-04-07 21:55:54 +0000657InitListExpr* InitListExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000658 InitListExpr* expr = new InitListExpr();
659 expr->LBraceLoc = SourceLocation::ReadVal(D);
660 expr->RBraceLoc = SourceLocation::ReadVal(D);
Steve Naroffc5ae8992008-05-01 02:04:18 +0000661 unsigned size = D.ReadInt();
662 assert(size);
663 expr->InitExprs.reserve(size);
664 for (unsigned i = 0 ; i < size; ++i) expr->InitExprs.push_back(0);
665
666 D.BatchReadOwnedPtrs(size, &expr->InitExprs[0], C);
Ted Kremenek6336f8d2007-11-14 21:31:46 +0000667 return expr;
668}
669
Ted Kremenekec0aa782007-11-12 18:04:32 +0000670void IntegerLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000671 S.Emit(Loc);
672 S.Emit(getType());
673 S.Emit(getValue());
674}
675
Sam Bishope2563ca2008-04-07 21:55:54 +0000676IntegerLiteral* IntegerLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek2dc9ac72007-11-07 00:17:35 +0000677 SourceLocation Loc = SourceLocation::ReadVal(D);
678 QualType T = QualType::ReadVal(D);
679
680 // Create a dummy APInt because it is more efficient to deserialize
681 // it in place with the deserialized IntegerLiteral. (fewer copies)
682 llvm::APInt temp;
683 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
684 D.Read(expr->Value);
685
686 return expr;
687}
Ted Kremenek0965f442007-11-07 00:37:40 +0000688
Ted Kremenekec0aa782007-11-12 18:04:32 +0000689void LabelStmt::EmitImpl(Serializer& S) const {
Ted Kremenekb15132f2007-11-07 00:48:04 +0000690 S.EmitPtr(Label);
691 S.Emit(IdentLoc);
692 S.EmitOwnedPtr(SubStmt);
693}
694
Sam Bishope2563ca2008-04-07 21:55:54 +0000695LabelStmt* LabelStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekb15132f2007-11-07 00:48:04 +0000696 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
697 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000698 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenekb15132f2007-11-07 00:48:04 +0000699 return new LabelStmt(IdentLoc,Label,SubStmt);
700}
701
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000702void MemberExpr::EmitImpl(Serializer& S) const {
703 S.Emit(MemberLoc);
704 S.EmitPtr(MemberDecl);
705 S.EmitBool(IsArrow);
Eli Friedman51019072008-02-06 22:48:16 +0000706 S.Emit(getType());
Ted Kremenekd0739872008-02-06 23:03:14 +0000707 S.EmitOwnedPtr(Base);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000708}
709
Sam Bishope2563ca2008-04-07 21:55:54 +0000710MemberExpr* MemberExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000711 SourceLocation L = SourceLocation::ReadVal(D);
712 FieldDecl* MemberDecl = cast<FieldDecl>(D.ReadPtr<Decl>());
713 bool IsArrow = D.ReadBool();
Eli Friedman51019072008-02-06 22:48:16 +0000714 QualType T = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000715 Expr* base = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000716
Eli Friedman51019072008-02-06 22:48:16 +0000717 return new MemberExpr(base,IsArrow,MemberDecl,L,T);
Ted Kremenekbd57e7c2007-11-13 22:16:23 +0000718}
719
Ted Kremenekec0aa782007-11-12 18:04:32 +0000720void NullStmt::EmitImpl(Serializer& S) const {
Ted Kremenek4927be62007-11-07 00:40:53 +0000721 S.Emit(SemiLoc);
722}
723
Sam Bishope2563ca2008-04-07 21:55:54 +0000724NullStmt* NullStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek4927be62007-11-07 00:40:53 +0000725 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
726 return new NullStmt(SemiLoc);
727}
Ted Kremenek0965f442007-11-07 00:37:40 +0000728
Ted Kremenekec0aa782007-11-12 18:04:32 +0000729void ParenExpr::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000730 S.Emit(L);
731 S.Emit(R);
732 S.EmitOwnedPtr(Val);
733}
734
Sam Bishope2563ca2008-04-07 21:55:54 +0000735ParenExpr* ParenExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000736 SourceLocation L = SourceLocation::ReadVal(D);
737 SourceLocation R = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000738 Expr* val = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000739 return new ParenExpr(L,R,val);
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000740}
741
Ted Kremenekec0aa782007-11-12 18:04:32 +0000742void PreDefinedExpr::EmitImpl(Serializer& S) const {
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000743 S.Emit(Loc);
744 S.EmitInt(getIdentType());
745 S.Emit(getType());
746}
747
Sam Bishope2563ca2008-04-07 21:55:54 +0000748PreDefinedExpr* PreDefinedExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek1ba485e2007-11-07 17:11:58 +0000749 SourceLocation Loc = SourceLocation::ReadVal(D);
750 IdentType it = static_cast<IdentType>(D.ReadInt());
751 QualType Q = QualType::ReadVal(D);
752 return new PreDefinedExpr(Loc,Q,it);
753}
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000754
Ted Kremenekec0aa782007-11-12 18:04:32 +0000755void ReturnStmt::EmitImpl(Serializer& S) const {
Ted Kremenek0965f442007-11-07 00:37:40 +0000756 S.Emit(RetLoc);
757 S.EmitOwnedPtr(RetExpr);
758}
759
Sam Bishope2563ca2008-04-07 21:55:54 +0000760ReturnStmt* ReturnStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek0965f442007-11-07 00:37:40 +0000761 SourceLocation RetLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000762 Expr* RetExpr = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek0965f442007-11-07 00:37:40 +0000763 return new ReturnStmt(RetLoc,RetExpr);
764}
765
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000766void SizeOfAlignOfTypeExpr::EmitImpl(Serializer& S) const {
767 S.EmitBool(isSizeof);
768 S.Emit(Ty);
769 S.Emit(getType());
770 S.Emit(OpLoc);
771 S.Emit(RParenLoc);
772}
773
Sam Bishope2563ca2008-04-07 21:55:54 +0000774SizeOfAlignOfTypeExpr* SizeOfAlignOfTypeExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekea2fe9b2007-11-13 22:30:29 +0000775 bool isSizeof = D.ReadBool();
776 QualType Ty = QualType::ReadVal(D);
777 QualType Res = QualType::ReadVal(D);
778 SourceLocation OpLoc = SourceLocation::ReadVal(D);
779 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
780
781 return new SizeOfAlignOfTypeExpr(isSizeof,Ty,Res,OpLoc,RParenLoc);
782}
783
Ted Kremenekec0aa782007-11-12 18:04:32 +0000784void StmtExpr::EmitImpl(Serializer& S) const {
Ted Kremenekaa337632007-11-08 16:32:00 +0000785 S.Emit(getType());
786 S.Emit(LParenLoc);
787 S.Emit(RParenLoc);
788 S.EmitOwnedPtr(SubStmt);
789}
790
Sam Bishope2563ca2008-04-07 21:55:54 +0000791StmtExpr* StmtExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaa337632007-11-08 16:32:00 +0000792 QualType t = QualType::ReadVal(D);
793 SourceLocation L = SourceLocation::ReadVal(D);
794 SourceLocation R = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000795 CompoundStmt* SubStmt = cast<CompoundStmt>(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenekaa337632007-11-08 16:32:00 +0000796 return new StmtExpr(SubStmt,t,L,R);
797}
798
Ted Kremenekec0aa782007-11-12 18:04:32 +0000799void StringLiteral::EmitImpl(Serializer& S) const {
Ted Kremenek7febad72007-11-07 19:08:19 +0000800 S.Emit(getType());
801 S.Emit(firstTokLoc);
802 S.Emit(lastTokLoc);
803 S.EmitBool(isWide());
804 S.Emit(getByteLength());
805
806 for (unsigned i = 0 ; i < ByteLength; ++i)
807 S.EmitInt(StrData[i]);
808}
809
Sam Bishope2563ca2008-04-07 21:55:54 +0000810StringLiteral* StringLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek7febad72007-11-07 19:08:19 +0000811 QualType t = QualType::ReadVal(D);
812 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
813 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
814 bool isWide = D.ReadBool();
815 unsigned ByteLength = D.ReadInt();
816
817 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
818
819 char* StrData = new char[ByteLength];
820 for (unsigned i = 0; i < ByteLength; ++i)
821 StrData[i] = (char) D.ReadInt();
822
823 sl->ByteLength = ByteLength;
824 sl->StrData = StrData;
825
826 return sl;
827}
828
Ted Kremenekec0aa782007-11-12 18:04:32 +0000829void SwitchStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000830 S.Emit(SwitchLoc);
831 S.EmitOwnedPtr(getCond());
832 S.EmitOwnedPtr(getBody());
833 S.EmitPtr(FirstCase);
834}
835
Sam Bishope2563ca2008-04-07 21:55:54 +0000836SwitchStmt* SwitchStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000837 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000838 Stmt* Cond = D.ReadOwnedPtr<Stmt>(C);
839 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek9eea2ca2007-11-07 05:25:31 +0000840 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
841
842 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
843 stmt->setBody(Body,Loc);
844 stmt->FirstCase = FirstCase;
845
846 return stmt;
847}
Ted Kremenek5572b942007-11-07 07:50:10 +0000848
Ted Kremenekec0aa782007-11-12 18:04:32 +0000849void UnaryOperator::EmitImpl(Serializer& S) const {
Ted Kremenek10494362007-11-08 00:26:24 +0000850 S.Emit(getType());
851 S.Emit(Loc);
852 S.EmitInt(Opc);
853 S.EmitOwnedPtr(Val);
854}
855
Sam Bishope2563ca2008-04-07 21:55:54 +0000856UnaryOperator* UnaryOperator::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek10494362007-11-08 00:26:24 +0000857 QualType t = QualType::ReadVal(D);
858 SourceLocation L = SourceLocation::ReadVal(D);
859 Opcode Opc = static_cast<Opcode>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000860 Expr* Val = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek10494362007-11-08 00:26:24 +0000861 return new UnaryOperator(Val,Opc,t,L);
862}
863
Ted Kremenekec0aa782007-11-12 18:04:32 +0000864void WhileStmt::EmitImpl(Serializer& S) const {
Ted Kremenek5572b942007-11-07 07:50:10 +0000865 S.Emit(WhileLoc);
866 S.EmitOwnedPtr(getCond());
867 S.EmitOwnedPtr(getBody());
868}
869
Sam Bishope2563ca2008-04-07 21:55:54 +0000870WhileStmt* WhileStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek5572b942007-11-07 07:50:10 +0000871 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000872 Expr* Cond = D.ReadOwnedPtr<Expr>(C);
873 Stmt* Body = D.ReadOwnedPtr<Stmt>(C);
Ted Kremenek5572b942007-11-07 07:50:10 +0000874 return new WhileStmt(Cond,Body,WhileLoc);
875}
Ted Kremenek378c1512007-11-15 18:10:29 +0000876
877//===----------------------------------------------------------------------===//
878// Objective C Serialization
879//===----------------------------------------------------------------------===//
880
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000881void ObjCAtCatchStmt::EmitImpl(Serializer& S) const {
Ted Kremenekaf526772007-12-04 00:28:54 +0000882 S.Emit(AtCatchLoc);
883 S.Emit(RParenLoc);
Ted Kremenekff981022008-02-01 21:28:59 +0000884 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, &SubExprs[0]);
Ted Kremenekaf526772007-12-04 00:28:54 +0000885}
886
Sam Bishope2563ca2008-04-07 21:55:54 +0000887ObjCAtCatchStmt* ObjCAtCatchStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekaf526772007-12-04 00:28:54 +0000888 SourceLocation AtCatchLoc = SourceLocation::ReadVal(D);
889 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
890
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000891 ObjCAtCatchStmt* stmt = new ObjCAtCatchStmt(AtCatchLoc,RParenLoc);
Sam Bishope2563ca2008-04-07 21:55:54 +0000892 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubExprs[0], C);
Ted Kremenekaf526772007-12-04 00:28:54 +0000893
894 return stmt;
895}
896
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000897void ObjCAtFinallyStmt::EmitImpl(Serializer& S) const {
Ted Kremenek04be5aa2007-12-04 00:32:22 +0000898 S.Emit(AtFinallyLoc);
899 S.EmitOwnedPtr(AtFinallyStmt);
900}
901
Sam Bishope2563ca2008-04-07 21:55:54 +0000902ObjCAtFinallyStmt* ObjCAtFinallyStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04be5aa2007-12-04 00:32:22 +0000903 SourceLocation Loc = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000904 Stmt* AtFinallyStmt = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000905 return new ObjCAtFinallyStmt(Loc,AtFinallyStmt);
Ted Kremenek04be5aa2007-12-04 00:32:22 +0000906}
907
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000908void ObjCAtSynchronizedStmt::EmitImpl(Serializer& S) const {
909 S.Emit(AtSynchronizedLoc);
Fariborz Jahaniana0f55792008-01-29 22:59:37 +0000910 S.BatchEmitOwnedPtrs((unsigned) END_EXPR,&SubStmts[0]);
911 }
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000912
Sam Bishope2563ca2008-04-07 21:55:54 +0000913ObjCAtSynchronizedStmt* ObjCAtSynchronizedStmt::CreateImpl(Deserializer& D,
914 ASTContext& C) {
915
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000916 SourceLocation L = SourceLocation::ReadVal(D);
Fariborz Jahaniana0f55792008-01-29 22:59:37 +0000917 ObjCAtSynchronizedStmt* stmt = new ObjCAtSynchronizedStmt(L,0,0);
Sam Bishope2563ca2008-04-07 21:55:54 +0000918 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubStmts[0], C);
Ted Kremenekb7e6bd72008-01-29 21:21:30 +0000919 return stmt;
920}
921
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000922void ObjCAtThrowStmt::EmitImpl(Serializer& S) const {
Ted Kremenek5bdd4e32007-12-04 00:40:49 +0000923 S.Emit(AtThrowLoc);
924 S.EmitOwnedPtr(Throw);
925}
926
Sam Bishope2563ca2008-04-07 21:55:54 +0000927ObjCAtThrowStmt* ObjCAtThrowStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek5bdd4e32007-12-04 00:40:49 +0000928 SourceLocation L = SourceLocation::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000929 Stmt* Throw = D.ReadOwnedPtr<Stmt>(C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000930 return new ObjCAtThrowStmt(L,Throw);
Ted Kremenek5bdd4e32007-12-04 00:40:49 +0000931}
932
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000933void ObjCAtTryStmt::EmitImpl(Serializer& S) const {
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000934 S.Emit(AtTryLoc);
935 S.BatchEmitOwnedPtrs((unsigned) END_EXPR, &SubStmts[0]);
936}
937
Sam Bishope2563ca2008-04-07 21:55:54 +0000938ObjCAtTryStmt* ObjCAtTryStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000939 SourceLocation L = SourceLocation::ReadVal(D);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000940 ObjCAtTryStmt* stmt = new ObjCAtTryStmt(L,NULL,NULL,NULL);
Sam Bishope2563ca2008-04-07 21:55:54 +0000941 D.BatchReadOwnedPtrs((unsigned) END_EXPR, &stmt->SubStmts[0], C);
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000942 return stmt;
943}
944
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000945void ObjCEncodeExpr::EmitImpl(Serializer& S) const {
946 S.Emit(AtLoc);
947 S.Emit(RParenLoc);
948 S.Emit(getType());
949 S.Emit(EncType);
950}
951
Sam Bishope2563ca2008-04-07 21:55:54 +0000952ObjCEncodeExpr* ObjCEncodeExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek8f6dc772007-12-05 00:43:08 +0000953 SourceLocation AtLoc = SourceLocation::ReadVal(D);
954 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
955 QualType T = QualType::ReadVal(D);
956 QualType ET = QualType::ReadVal(D);
957 return new ObjCEncodeExpr(T,ET,AtLoc,RParenLoc);
958}
959
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000960void ObjCForCollectionStmt::EmitImpl(Serializer& S) const {
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000961 S.Emit(ForLoc);
Fariborz Jahanian75712282008-01-10 00:24:29 +0000962 S.Emit(RParenLoc);
Ted Kremenek205712a2008-01-07 18:35:04 +0000963 S.BatchEmitOwnedPtrs(getElement(),getCollection(),getBody());
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000964}
965
Sam Bishope2563ca2008-04-07 21:55:54 +0000966ObjCForCollectionStmt* ObjCForCollectionStmt::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000967 SourceLocation ForLoc = SourceLocation::ReadVal(D);
Fariborz Jahanian75712282008-01-10 00:24:29 +0000968 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
Ted Kremenek205712a2008-01-07 18:35:04 +0000969 Stmt* Element;
970 Expr* Collection;
971 Stmt* Body;
Sam Bishope2563ca2008-04-07 21:55:54 +0000972 D.BatchReadOwnedPtrs(Element, Collection, Body, C);
Fariborz Jahanian75712282008-01-10 00:24:29 +0000973 return new ObjCForCollectionStmt(Element,Collection,Body,ForLoc, RParenLoc);
Ted Kremenekc3b59d32008-01-05 00:57:49 +0000974}
975
Ted Kremenek378c1512007-11-15 18:10:29 +0000976void ObjCIvarRefExpr::EmitImpl(Serializer& S) const {
977 S.Emit(Loc);
978 S.Emit(getType());
979 S.EmitPtr(getDecl());
980}
Ted Kremenek9c1efff2007-12-04 00:38:30 +0000981
Sam Bishope2563ca2008-04-07 21:55:54 +0000982ObjCIvarRefExpr* ObjCIvarRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek378c1512007-11-15 18:10:29 +0000983 SourceLocation Loc = SourceLocation::ReadVal(D);
984 QualType T = QualType::ReadVal(D);
985 ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
986 D.ReadPtr(dr->D,false);
987 return dr;
988}
Ted Kremenek46dc0a52007-12-04 00:51:11 +0000989
Ted Kremenekea958e572008-05-01 17:26:20 +0000990void ObjCMessageExpr::EmitImpl(Serializer& S) const {
991 S.EmitBool(getReceiver() ? true : false);
992 S.Emit(getType());
993 S.Emit(SelName);
994 S.Emit(LBracloc);
995 S.Emit(RBracloc);
996 S.EmitInt(NumArgs);
997 S.EmitPtr(MethodProto);
998
999 if (getReceiver())
1000 S.BatchEmitOwnedPtrs(NumArgs+1, SubExprs);
1001 else {
1002 S.EmitPtr(getClassName());
1003 S.BatchEmitOwnedPtrs(NumArgs, &SubExprs[ARGS_START]);
1004 }
1005}
1006
1007ObjCMessageExpr* ObjCMessageExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1008 bool isReceiver = D.ReadBool();
1009 QualType t = QualType::ReadVal(D);
1010 Selector S = Selector::ReadVal(D);
1011 SourceLocation L = SourceLocation::ReadVal(D);
1012 SourceLocation R = SourceLocation::ReadVal(D);
1013
1014 // Construct an array for the subexpressions.
1015 unsigned NumArgs = D.ReadInt();
1016 Expr** SubExprs = new Expr*[NumArgs+1];
1017
1018 // Construct the ObjCMessageExpr object using the special ctor.
1019 ObjCMessageExpr* ME = new ObjCMessageExpr(S, t, L, R, SubExprs, NumArgs);
1020
1021 // Read in the MethodProto. Read the instance variable directly
1022 // allows it to be backpatched.
1023 D.ReadPtr(ME->MethodProto);
1024
1025 // Now read in the arguments.
1026
1027 if (isReceiver)
1028 D.BatchReadOwnedPtrs(NumArgs+1, SubExprs, C);
1029 else {
1030 // Read the pointer for ClassName. The Deserializer will handle the
1031 // bit-mangling automatically.
1032 SubExprs[RECEIVER] = (Expr*) ((uintptr_t) 0x1);
1033 D.ReadUIntPtr((uintptr_t&) SubExprs[RECEIVER]);
1034
1035 // Read the arguments.
1036 D.BatchReadOwnedPtrs(NumArgs, &SubExprs[ARGS_START], C);
1037 }
1038
1039 return ME;
1040}
1041
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001042void ObjCSelectorExpr::EmitImpl(Serializer& S) const {
1043 S.Emit(AtLoc);
1044 S.Emit(RParenLoc);
1045 S.Emit(getType());
1046 S.Emit(SelName);
1047}
1048
Sam Bishope2563ca2008-04-07 21:55:54 +00001049ObjCSelectorExpr* ObjCSelectorExpr::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek8f6dc772007-12-05 00:43:08 +00001050 SourceLocation AtLoc = SourceLocation::ReadVal(D);
1051 SourceLocation RParenLoc = SourceLocation::ReadVal(D);
1052 QualType T = QualType::ReadVal(D);
1053 Selector SelName = Selector::ReadVal(D);
1054
1055 return new ObjCSelectorExpr(T,SelName,AtLoc,RParenLoc);
1056}
1057
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001058void ObjCStringLiteral::EmitImpl(Serializer& S) const {
1059 S.Emit(AtLoc);
1060 S.Emit(getType());
1061 S.EmitOwnedPtr(String);
1062}
1063
Sam Bishope2563ca2008-04-07 21:55:54 +00001064ObjCStringLiteral* ObjCStringLiteral::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001065 SourceLocation L = SourceLocation::ReadVal(D);
1066 QualType T = QualType::ReadVal(D);
Sam Bishope2563ca2008-04-07 21:55:54 +00001067 StringLiteral* String = cast<StringLiteral>(D.ReadOwnedPtr<Stmt>(C));
Ted Kremenek46dc0a52007-12-04 00:51:11 +00001068 return new ObjCStringLiteral(String,T,L);
1069}
Chris Lattner04421082008-04-08 04:40:51 +00001070
1071//===----------------------------------------------------------------------===//
1072// C++ Serialization
1073//===----------------------------------------------------------------------===//
1074void CXXDefaultArgExpr::EmitImpl(Serializer& S) const {
1075 S.EmitPtr(Param);
1076}
1077
1078CXXDefaultArgExpr *CXXDefaultArgExpr::CreateImpl(Deserializer& D, ASTContext& C) {
1079 ParmVarDecl* Param = 0;
1080 D.ReadPtr(Param, false);
1081 return new CXXDefaultArgExpr(Param);
1082}