blob: 96df1b7fbf40b6e87543e309baf115449498759c [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
Steve Naroff248a7532008-04-15 22:42:06 +000044 case Var:
45 return VarDecl::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 ParmVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000057 return ParmVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000058
59 case Function:
Sam Bishope2563ca2008-04-07 21:55:54 +000060 return FunctionDecl::CreateImpl(D, C);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000061
62 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000063 case Struct:
Sam Bishope2563ca2008-04-07 21:55:54 +000064 return RecordDecl::CreateImpl(k, D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +000065
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000066 case Typedef:
Sam Bishope2563ca2008-04-07 21:55:54 +000067 return TypedefDecl::CreateImpl(D, C);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000068
69 case FileScopeAsm:
Sam Bishope2563ca2008-04-07 21:55:54 +000070 return FileScopeAsmDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000071 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000072}
Ted Kremenek04973312007-11-02 18:05:11 +000073
Ted Kremenek928fd7f2007-11-13 00:15:39 +000074//===----------------------------------------------------------------------===//
75// Common serialization logic for subclasses of Decl.
76//===----------------------------------------------------------------------===//
77
78void Decl::EmitInRec(Serializer& S) const {
79 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000080}
81
Sam Bishope2563ca2008-04-07 21:55:54 +000082void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000083 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000084}
85
Ted Kremenek928fd7f2007-11-13 00:15:39 +000086//===----------------------------------------------------------------------===//
87// Common serialization logic for subclasses of NamedDecl.
88//===----------------------------------------------------------------------===//
89
90void NamedDecl::EmitInRec(Serializer& S) const {
91 Decl::EmitInRec(S);
92 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000093}
94
Sam Bishope2563ca2008-04-07 21:55:54 +000095void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
96 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +000097 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000098}
99
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000100//===----------------------------------------------------------------------===//
101// Common serialization logic for subclasses of ScopedDecl.
102//===----------------------------------------------------------------------===//
103
104void ScopedDecl::EmitInRec(Serializer& S) const {
105 NamedDecl::EmitInRec(S);
106 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000107 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000108}
109
Sam Bishope2563ca2008-04-07 21:55:54 +0000110void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
111 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000112 D.ReadPtr(Next); // From ScopedDecl.
Chris Lattner0ed844b2008-04-04 06:12:32 +0000113 Decl *TmpD;
114 D.ReadPtr(TmpD); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000115 CtxDecl = cast_or_null<DeclContext>(TmpD);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000116}
117
118 //===------------------------------------------------------------===//
119 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
120 // methods. This is because owned pointers are usually "batched" //
121 // together for efficiency. //
122 //===------------------------------------------------------------===//
123
124void ScopedDecl::EmitOutRec(Serializer& S) const {
125 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000126}
127
Sam Bishope2563ca2008-04-07 21:55:54 +0000128void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000129 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000130 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000131}
132
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000133//===----------------------------------------------------------------------===//
134// Common serialization logic for subclasses of ValueDecl.
135//===----------------------------------------------------------------------===//
136
137void ValueDecl::EmitInRec(Serializer& S) const {
138 ScopedDecl::EmitInRec(S);
139 S.Emit(getType()); // From ValueDecl.
140}
141
Sam Bishope2563ca2008-04-07 21:55:54 +0000142void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
143 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000144 DeclType = QualType::ReadVal(D); // From ValueDecl.
145}
146
147//===----------------------------------------------------------------------===//
148// Common serialization logic for subclasses of VarDecl.
149//===----------------------------------------------------------------------===//
150
151void VarDecl::EmitInRec(Serializer& S) const {
152 ValueDecl::EmitInRec(S);
153 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000154}
155
Sam Bishope2563ca2008-04-07 21:55:54 +0000156void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
157 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000158 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000159}
160
161 //===------------------------------------------------------------===//
162 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
163 // the one define in ScopedDecl. This is to batch emit the //
164 // owned pointers, which results in a smaller output.
165 //===------------------------------------------------------------===//
166
167void VarDecl::EmitOutRec(Serializer& S) const {
168 // Emit these last because they will create records of their own.
169 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
170 getNextDeclarator()); // From ScopedDecl.
171}
172
Sam Bishope2563ca2008-04-07 21:55:54 +0000173void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000174 Decl* next_declarator;
175
Sam Bishope2563ca2008-04-07 21:55:54 +0000176 D.BatchReadOwnedPtrs(Init, // From VarDecl.
177 next_declarator, // From ScopedDecl.
178 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000179
180 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000181}
182
183
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000184void VarDecl::EmitImpl(Serializer& S) const {
185 VarDecl::EmitInRec(S);
186 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000187}
188
Sam Bishope2563ca2008-04-07 21:55:54 +0000189void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
190 ReadInRec(D, C);
191 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000192}
193
194//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000195// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000196//===----------------------------------------------------------------------===//
197
Steve Naroff248a7532008-04-15 22:42:06 +0000198VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
199 void *Mem = C.getAllocator().Allocate<VarDecl>();
200 VarDecl* decl =
201 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000202
Sam Bishope2563ca2008-04-07 21:55:54 +0000203 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000204
Ted Kremenek04973312007-11-02 18:05:11 +0000205 return decl;
206}
207
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000208//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000209// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000210//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000211
Ted Kremenek137bd912007-12-13 06:28:13 +0000212void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
213 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000214 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000215 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000216}
217
Sam Bishope2563ca2008-04-07 21:55:54 +0000218ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000219 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
220 ParmVarDecl* decl = new (Mem)
221 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000222
Sam Bishope2563ca2008-04-07 21:55:54 +0000223 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000224 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000225 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000226 return decl;
227}
228
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000229//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000230// EnumDecl Serialization.
231//===----------------------------------------------------------------------===//
232
233void EnumDecl::EmitImpl(Serializer& S) const {
234 ScopedDecl::EmitInRec(S);
235 S.EmitBool(isDefinition());
236 S.Emit(IntegerType);
237 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
238}
239
Sam Bishope2563ca2008-04-07 21:55:54 +0000240EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000241 void *Mem = C.getAllocator().Allocate<EnumDecl>();
242 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000243
Sam Bishope2563ca2008-04-07 21:55:54 +0000244 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000245 decl->setDefinition(D.ReadBool());
246 decl->IntegerType = QualType::ReadVal(D);
247
248 Decl* next_declarator;
249 Decl* Elist;
250
Sam Bishope2563ca2008-04-07 21:55:54 +0000251 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000252
253 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
254 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
255
256 return decl;
257}
258
259//===----------------------------------------------------------------------===//
260// EnumConstantDecl Serialization.
261//===----------------------------------------------------------------------===//
262
263void EnumConstantDecl::EmitImpl(Serializer& S) const {
264 S.Emit(Val);
265 ValueDecl::EmitInRec(S);
266 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
267}
268
Sam Bishope2563ca2008-04-07 21:55:54 +0000269EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000270 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000271 D.Read(val);
272
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000273 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
274 EnumConstantDecl* decl = new (Mem)
275 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000276
Sam Bishope2563ca2008-04-07 21:55:54 +0000277 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000278
279 Decl* next_declarator;
280
Sam Bishope2563ca2008-04-07 21:55:54 +0000281 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000282
Ted Kremenek049b1682007-11-14 23:38:09 +0000283 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000284
285 return decl;
286}
287
288//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000289// FieldDecl Serialization.
290//===----------------------------------------------------------------------===//
291
292void FieldDecl::EmitImpl(Serializer& S) const {
293 S.Emit(getType());
294 NamedDecl::EmitInRec(S);
295 S.EmitOwnedPtr(BitWidth);
296}
297
Sam Bishope2563ca2008-04-07 21:55:54 +0000298FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000299 void *Mem = C.getAllocator().Allocate<FieldDecl>();
300 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000301 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000302 decl->ReadInRec(D, C);
303 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000304 return decl;
305}
306
307//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000308// FunctionDecl Serialization.
309//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000310
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000311void FunctionDecl::EmitImpl(Serializer& S) const {
312 S.EmitInt(SClass); // From FunctionDecl.
313 S.EmitBool(IsInline); // From FunctionDecl.
314 ValueDecl::EmitInRec(S);
315 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000316
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000317 // NOTE: We do not need to serialize out the number of parameters, because
318 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000319
Ted Kremenekd437f232007-11-13 22:51:08 +0000320 if (ParamInfo != NULL) {
321 S.EmitBool(true);
322 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
323 getNextDeclarator());
324 }
325 else {
326 S.EmitBool(false);
327 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
328 }
Ted Kremenek04973312007-11-02 18:05:11 +0000329}
330
Sam Bishope2563ca2008-04-07 21:55:54 +0000331FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000332 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
333 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000334
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000335 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
336 FunctionDecl* decl = new (Mem)
337 FunctionDecl(0, SourceLocation(), NULL, QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000338
Sam Bishope2563ca2008-04-07 21:55:54 +0000339 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000340 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000341
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000342 Decl* next_declarator;
343
Ted Kremenekd437f232007-11-13 22:51:08 +0000344 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000345
346 decl->ParamInfo = hasParamDecls
347 ? new ParmVarDecl*[decl->getNumParams()]
348 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000349
350 if (hasParamDecls)
351 D.BatchReadOwnedPtrs(decl->getNumParams(),
352 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000353 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000354 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000355 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000356
357 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000358
359 return decl;
360}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000361
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000362//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000363// RecordDecl Serialization.
364//===----------------------------------------------------------------------===//
365
Ted Kremenek583e0082007-11-14 18:12:19 +0000366void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000367 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000368 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000369 S.EmitBool(hasFlexibleArrayMember());
370 S.EmitSInt(getNumMembers());
371 if (getNumMembers() > 0) {
372 assert (Members);
373 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
374 (Decl**) &Members[0],getNextDeclarator());
375 }
376 else
377 ScopedDecl::EmitOutRec(S);
378}
379
Sam Bishope2563ca2008-04-07 21:55:54 +0000380RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
381 ASTContext& C) {
382
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000383 void *Mem = C.getAllocator().Allocate<RecordDecl>();
384 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000385
Sam Bishope2563ca2008-04-07 21:55:54 +0000386 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000387 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000388 decl->setHasFlexibleArrayMember(D.ReadBool());
389 decl->NumMembers = D.ReadSInt();
390
391 if (decl->getNumMembers() > 0) {
392 Decl* next_declarator;
393 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
394
395 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
396 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000397 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000398
399 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
400 }
401 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000402 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000403
404 return decl;
405}
406
407//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000408// TypedefDecl Serialization.
409//===----------------------------------------------------------------------===//
410
411void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000412 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000413 ScopedDecl::EmitInRec(S);
414 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000415}
416
Sam Bishope2563ca2008-04-07 21:55:54 +0000417TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000418 QualType T = QualType::ReadVal(D);
419
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000420 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
421 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000422
Sam Bishope2563ca2008-04-07 21:55:54 +0000423 decl->ScopedDecl::ReadInRec(D, C);
424 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000425
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000426 return decl;
427}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000428
429//===----------------------------------------------------------------------===//
430// LinkageSpec Serialization.
431//===----------------------------------------------------------------------===//
432
433void LinkageSpecDecl::EmitInRec(Serializer& S) const {
434 Decl::EmitInRec(S);
435 S.EmitInt(getLanguage());
436 S.EmitPtr(D);
437}
438
Sam Bishope2563ca2008-04-07 21:55:54 +0000439void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
440 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000441 Language = static_cast<LanguageIDs>(D.ReadInt());
442 D.ReadPtr(this->D);
443}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000444
445//===----------------------------------------------------------------------===//
446// FileScopeAsm Serialization.
447//===----------------------------------------------------------------------===//
448
449void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
450{
451 Decl::EmitInRec(S);
452 S.EmitOwnedPtr(AsmString);
453}
454
Sam Bishope2563ca2008-04-07 21:55:54 +0000455FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000456 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
457 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000458
Sam Bishope2563ca2008-04-07 21:55:54 +0000459 decl->Decl::ReadInRec(D, C);
460 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000461// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
462
463 return decl;
464}