blob: 6b0d7f881a865a9a23ac82d166a6cb1b964fc430 [file] [log] [blame]
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +00001//===--- DeclSerialization.cpp - Serialization of Decls ---------*- C++ -*-===//
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 Kremenek2f1f8cb2007-10-25 21:37:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Gabor Greif843e9342008-03-06 10:40:09 +000010// This file defines methods that implement bitcode serialization for Decls.
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000011//
12//===----------------------------------------------------------------------===//
13
Sam Bishopf3c63ae2008-04-11 14:49:10 +000014#include "clang/AST/ASTContext.h"
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000015#include "clang/AST/Decl.h"
16#include "clang/AST/Expr.h"
17#include "llvm/Bitcode/Serialize.h"
18#include "llvm/Bitcode/Deserialize.h"
19
Ted Kremenek928fd7f2007-11-13 00:15:39 +000020using llvm::Serializer;
21using llvm::Deserializer;
22using llvm::SerializedPtrID;
23
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000024using namespace clang;
25
Ted Kremenek928fd7f2007-11-13 00:15:39 +000026//===----------------------------------------------------------------------===//
27// Decl Serialization: Dispatch code to handle specialized decl types.
28//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000029
Ted Kremenek928fd7f2007-11-13 00:15:39 +000030void Decl::Emit(Serializer& S) const {
31 S.EmitInt(getKind());
32 EmitImpl(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000033}
34
Sam Bishope2563ca2008-04-07 21:55:54 +000035Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000036
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000037 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000038
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000039 switch (k) {
40 default:
41 assert (false && "Not implemented.");
42 break;
Chris Lattner0ed844b2008-04-04 06:12:32 +000043
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000044 case BlockVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000045 return BlockVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000046
Ted Kremenek583e0082007-11-14 18:12:19 +000047 case Enum:
Sam Bishope2563ca2008-04-07 21:55:54 +000048 return EnumDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000049
50 case EnumConstant:
Sam Bishope2563ca2008-04-07 21:55:54 +000051 return EnumConstantDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000052
Ted Kremenekf9d56c82007-11-14 17:47:01 +000053 case Field:
Sam Bishope2563ca2008-04-07 21:55:54 +000054 return FieldDecl::CreateImpl(D, C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +000055
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000056 case FileVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000057 return FileVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000058
59 case ParmVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000060 return ParmVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000061
62 case Function:
Sam Bishope2563ca2008-04-07 21:55:54 +000063 return FunctionDecl::CreateImpl(D, C);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000064
65 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000066 case Struct:
Sam Bishope2563ca2008-04-07 21:55:54 +000067 return RecordDecl::CreateImpl(k, D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +000068
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000069 case Typedef:
Sam Bishope2563ca2008-04-07 21:55:54 +000070 return TypedefDecl::CreateImpl(D, C);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000071
72 case FileScopeAsm:
Sam Bishope2563ca2008-04-07 21:55:54 +000073 return FileScopeAsmDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000074 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000075}
Ted Kremenek04973312007-11-02 18:05:11 +000076
Ted Kremenek928fd7f2007-11-13 00:15:39 +000077//===----------------------------------------------------------------------===//
78// Common serialization logic for subclasses of Decl.
79//===----------------------------------------------------------------------===//
80
81void Decl::EmitInRec(Serializer& S) const {
82 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000083}
84
Sam Bishope2563ca2008-04-07 21:55:54 +000085void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000086 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000087}
88
Ted Kremenek928fd7f2007-11-13 00:15:39 +000089//===----------------------------------------------------------------------===//
90// Common serialization logic for subclasses of NamedDecl.
91//===----------------------------------------------------------------------===//
92
93void NamedDecl::EmitInRec(Serializer& S) const {
94 Decl::EmitInRec(S);
95 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000096}
97
Sam Bishope2563ca2008-04-07 21:55:54 +000098void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
99 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000100 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000101}
102
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000103//===----------------------------------------------------------------------===//
104// Common serialization logic for subclasses of ScopedDecl.
105//===----------------------------------------------------------------------===//
106
107void ScopedDecl::EmitInRec(Serializer& S) const {
108 NamedDecl::EmitInRec(S);
109 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000110 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000111}
112
Sam Bishope2563ca2008-04-07 21:55:54 +0000113void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
114 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000115 D.ReadPtr(Next); // From ScopedDecl.
Chris Lattner0ed844b2008-04-04 06:12:32 +0000116 Decl *TmpD;
117 D.ReadPtr(TmpD); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000118 CtxDecl = cast_or_null<DeclContext>(TmpD);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000119}
120
121 //===------------------------------------------------------------===//
122 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
123 // methods. This is because owned pointers are usually "batched" //
124 // together for efficiency. //
125 //===------------------------------------------------------------===//
126
127void ScopedDecl::EmitOutRec(Serializer& S) const {
128 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000129}
130
Sam Bishope2563ca2008-04-07 21:55:54 +0000131void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000132 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000133 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000134}
135
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000136//===----------------------------------------------------------------------===//
137// Common serialization logic for subclasses of ValueDecl.
138//===----------------------------------------------------------------------===//
139
140void ValueDecl::EmitInRec(Serializer& S) const {
141 ScopedDecl::EmitInRec(S);
142 S.Emit(getType()); // From ValueDecl.
143}
144
Sam Bishope2563ca2008-04-07 21:55:54 +0000145void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
146 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000147 DeclType = QualType::ReadVal(D); // From ValueDecl.
148}
149
150//===----------------------------------------------------------------------===//
151// Common serialization logic for subclasses of VarDecl.
152//===----------------------------------------------------------------------===//
153
154void VarDecl::EmitInRec(Serializer& S) const {
155 ValueDecl::EmitInRec(S);
156 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000157}
158
Sam Bishope2563ca2008-04-07 21:55:54 +0000159void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
160 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000161 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000162}
163
164 //===------------------------------------------------------------===//
165 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
166 // the one define in ScopedDecl. This is to batch emit the //
167 // owned pointers, which results in a smaller output.
168 //===------------------------------------------------------------===//
169
170void VarDecl::EmitOutRec(Serializer& S) const {
171 // Emit these last because they will create records of their own.
172 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
173 getNextDeclarator()); // From ScopedDecl.
174}
175
Sam Bishope2563ca2008-04-07 21:55:54 +0000176void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000177 Decl* next_declarator;
178
Sam Bishope2563ca2008-04-07 21:55:54 +0000179 D.BatchReadOwnedPtrs(Init, // From VarDecl.
180 next_declarator, // From ScopedDecl.
181 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000182
183 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000184}
185
186
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000187void VarDecl::EmitImpl(Serializer& S) const {
188 VarDecl::EmitInRec(S);
189 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000190}
191
Sam Bishope2563ca2008-04-07 21:55:54 +0000192void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
193 ReadInRec(D, C);
194 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000195}
196
197//===----------------------------------------------------------------------===//
198// BlockVarDecl Serialization.
199//===----------------------------------------------------------------------===//
200
Sam Bishope2563ca2008-04-07 21:55:54 +0000201BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000202 void *Mem = C.getAllocator().Allocate<BlockVarDecl>();
203 BlockVarDecl* decl =
204 new (Mem) BlockVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000205
Sam Bishope2563ca2008-04-07 21:55:54 +0000206 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000207
Ted Kremenek04973312007-11-02 18:05:11 +0000208 return decl;
209}
210
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000211//===----------------------------------------------------------------------===//
212// FileVarDecl Serialization.
213//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000214
Sam Bishope2563ca2008-04-07 21:55:54 +0000215FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000216 void *Mem = C.getAllocator().Allocate<FileVarDecl>();
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000217 FileVarDecl* decl =
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000218 new (Mem) FileVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000219
Sam Bishope2563ca2008-04-07 21:55:54 +0000220 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000221
Ted Kremenek04973312007-11-02 18:05:11 +0000222 return decl;
223}
224
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000225//===----------------------------------------------------------------------===//
226// ParmDecl Serialization.
227//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000228
Ted Kremenek137bd912007-12-13 06:28:13 +0000229void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
230 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000231 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000232 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000233}
234
Sam Bishope2563ca2008-04-07 21:55:54 +0000235ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000236 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
237 ParmVarDecl* decl = new (Mem)
238 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000239
Sam Bishope2563ca2008-04-07 21:55:54 +0000240 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000241 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000242 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000243 return decl;
244}
245
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000246//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000247// EnumDecl Serialization.
248//===----------------------------------------------------------------------===//
249
250void EnumDecl::EmitImpl(Serializer& S) const {
251 ScopedDecl::EmitInRec(S);
252 S.EmitBool(isDefinition());
253 S.Emit(IntegerType);
254 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
255}
256
Sam Bishope2563ca2008-04-07 21:55:54 +0000257EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000258 void *Mem = C.getAllocator().Allocate<EnumDecl>();
259 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000260
Sam Bishope2563ca2008-04-07 21:55:54 +0000261 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000262 decl->setDefinition(D.ReadBool());
263 decl->IntegerType = QualType::ReadVal(D);
264
265 Decl* next_declarator;
266 Decl* Elist;
267
Sam Bishope2563ca2008-04-07 21:55:54 +0000268 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000269
270 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
271 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
272
273 return decl;
274}
275
276//===----------------------------------------------------------------------===//
277// EnumConstantDecl Serialization.
278//===----------------------------------------------------------------------===//
279
280void EnumConstantDecl::EmitImpl(Serializer& S) const {
281 S.Emit(Val);
282 ValueDecl::EmitInRec(S);
283 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
284}
285
Sam Bishope2563ca2008-04-07 21:55:54 +0000286EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000287 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000288 D.Read(val);
289
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000290 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
291 EnumConstantDecl* decl = new (Mem)
292 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000293
Sam Bishope2563ca2008-04-07 21:55:54 +0000294 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000295
296 Decl* next_declarator;
297
Sam Bishope2563ca2008-04-07 21:55:54 +0000298 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000299
Ted Kremenek049b1682007-11-14 23:38:09 +0000300 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000301
302 return decl;
303}
304
305//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000306// FieldDecl Serialization.
307//===----------------------------------------------------------------------===//
308
309void FieldDecl::EmitImpl(Serializer& S) const {
310 S.Emit(getType());
311 NamedDecl::EmitInRec(S);
312 S.EmitOwnedPtr(BitWidth);
313}
314
Sam Bishope2563ca2008-04-07 21:55:54 +0000315FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000316 void *Mem = C.getAllocator().Allocate<FieldDecl>();
317 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000318 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000319 decl->ReadInRec(D, C);
320 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000321 return decl;
322}
323
324//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000325// FunctionDecl Serialization.
326//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000327
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000328void FunctionDecl::EmitImpl(Serializer& S) const {
329 S.EmitInt(SClass); // From FunctionDecl.
330 S.EmitBool(IsInline); // From FunctionDecl.
331 ValueDecl::EmitInRec(S);
332 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000333
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000334 // NOTE: We do not need to serialize out the number of parameters, because
335 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000336
Ted Kremenekd437f232007-11-13 22:51:08 +0000337 if (ParamInfo != NULL) {
338 S.EmitBool(true);
339 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
340 getNextDeclarator());
341 }
342 else {
343 S.EmitBool(false);
344 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
345 }
Ted Kremenek04973312007-11-02 18:05:11 +0000346}
347
Sam Bishope2563ca2008-04-07 21:55:54 +0000348FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000349 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
350 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000351
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000352 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
353 FunctionDecl* decl = new (Mem)
354 FunctionDecl(0, SourceLocation(), NULL, QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000355
Sam Bishope2563ca2008-04-07 21:55:54 +0000356 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000357 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000358
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000359 Decl* next_declarator;
360
Ted Kremenekd437f232007-11-13 22:51:08 +0000361 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000362
363 decl->ParamInfo = hasParamDecls
364 ? new ParmVarDecl*[decl->getNumParams()]
365 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000366
367 if (hasParamDecls)
368 D.BatchReadOwnedPtrs(decl->getNumParams(),
369 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000370 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000371 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000372 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000373
374 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000375
376 return decl;
377}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000378
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000379//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000380// RecordDecl Serialization.
381//===----------------------------------------------------------------------===//
382
Ted Kremenek583e0082007-11-14 18:12:19 +0000383void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000384 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000385 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000386 S.EmitBool(hasFlexibleArrayMember());
387 S.EmitSInt(getNumMembers());
388 if (getNumMembers() > 0) {
389 assert (Members);
390 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
391 (Decl**) &Members[0],getNextDeclarator());
392 }
393 else
394 ScopedDecl::EmitOutRec(S);
395}
396
Sam Bishope2563ca2008-04-07 21:55:54 +0000397RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
398 ASTContext& C) {
399
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000400 void *Mem = C.getAllocator().Allocate<RecordDecl>();
401 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000402
Sam Bishope2563ca2008-04-07 21:55:54 +0000403 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000404 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000405 decl->setHasFlexibleArrayMember(D.ReadBool());
406 decl->NumMembers = D.ReadSInt();
407
408 if (decl->getNumMembers() > 0) {
409 Decl* next_declarator;
410 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
411
412 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
413 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000414 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000415
416 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
417 }
418 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000419 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000420
421 return decl;
422}
423
424//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000425// TypedefDecl Serialization.
426//===----------------------------------------------------------------------===//
427
428void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000429 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000430 ScopedDecl::EmitInRec(S);
431 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000432}
433
Sam Bishope2563ca2008-04-07 21:55:54 +0000434TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000435 QualType T = QualType::ReadVal(D);
436
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000437 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
438 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000439
Sam Bishope2563ca2008-04-07 21:55:54 +0000440 decl->ScopedDecl::ReadInRec(D, C);
441 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000442
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000443 return decl;
444}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000445
446//===----------------------------------------------------------------------===//
447// LinkageSpec Serialization.
448//===----------------------------------------------------------------------===//
449
450void LinkageSpecDecl::EmitInRec(Serializer& S) const {
451 Decl::EmitInRec(S);
452 S.EmitInt(getLanguage());
453 S.EmitPtr(D);
454}
455
Sam Bishope2563ca2008-04-07 21:55:54 +0000456void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
457 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000458 Language = static_cast<LanguageIDs>(D.ReadInt());
459 D.ReadPtr(this->D);
460}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000461
462//===----------------------------------------------------------------------===//
463// FileScopeAsm Serialization.
464//===----------------------------------------------------------------------===//
465
466void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
467{
468 Decl::EmitInRec(S);
469 S.EmitOwnedPtr(AsmString);
470}
471
Sam Bishope2563ca2008-04-07 21:55:54 +0000472FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000473 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
474 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000475
Sam Bishope2563ca2008-04-07 21:55:54 +0000476 decl->Decl::ReadInRec(D, C);
477 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000478// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
479
480 return decl;
481}