blob: bc5310c4142f60d8b880ca6212f1b3a136b7484a [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
14#include "clang/AST/Decl.h"
15#include "clang/AST/Expr.h"
16#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremenek928fd7f2007-11-13 00:15:39 +000019using llvm::Serializer;
20using llvm::Deserializer;
21using llvm::SerializedPtrID;
22
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000023using namespace clang;
24
Ted Kremenek928fd7f2007-11-13 00:15:39 +000025//===----------------------------------------------------------------------===//
26// Decl Serialization: Dispatch code to handle specialized decl types.
27//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000028
Ted Kremenek928fd7f2007-11-13 00:15:39 +000029void Decl::Emit(Serializer& S) const {
30 S.EmitInt(getKind());
31 EmitImpl(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000032}
33
Sam Bishope2563ca2008-04-07 21:55:54 +000034Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000035
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000036 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000037
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000038 switch (k) {
39 default:
40 assert (false && "Not implemented.");
41 break;
Chris Lattner0ed844b2008-04-04 06:12:32 +000042
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000043 case BlockVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000044 return BlockVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000045
Ted Kremenek583e0082007-11-14 18:12:19 +000046 case Enum:
Sam Bishope2563ca2008-04-07 21:55:54 +000047 return EnumDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000048
49 case EnumConstant:
Sam Bishope2563ca2008-04-07 21:55:54 +000050 return EnumConstantDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000051
Ted Kremenekf9d56c82007-11-14 17:47:01 +000052 case Field:
Sam Bishope2563ca2008-04-07 21:55:54 +000053 return FieldDecl::CreateImpl(D, C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +000054
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000055 case FileVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000056 return FileVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000057
58 case ParmVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000059 return ParmVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000060
61 case Function:
Sam Bishope2563ca2008-04-07 21:55:54 +000062 return FunctionDecl::CreateImpl(D, C);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000063
64 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000065 case Struct:
Sam Bishope2563ca2008-04-07 21:55:54 +000066 return RecordDecl::CreateImpl(k, D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +000067
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000068 case Typedef:
Sam Bishope2563ca2008-04-07 21:55:54 +000069 return TypedefDecl::CreateImpl(D, C);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000070
71 case FileScopeAsm:
Sam Bishope2563ca2008-04-07 21:55:54 +000072 return FileScopeAsmDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000073 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000074}
Ted Kremenek04973312007-11-02 18:05:11 +000075
Ted Kremenek928fd7f2007-11-13 00:15:39 +000076//===----------------------------------------------------------------------===//
77// Common serialization logic for subclasses of Decl.
78//===----------------------------------------------------------------------===//
79
80void Decl::EmitInRec(Serializer& S) const {
81 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000082}
83
Sam Bishope2563ca2008-04-07 21:55:54 +000084void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000085 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000086}
87
Ted Kremenek928fd7f2007-11-13 00:15:39 +000088//===----------------------------------------------------------------------===//
89// Common serialization logic for subclasses of NamedDecl.
90//===----------------------------------------------------------------------===//
91
92void NamedDecl::EmitInRec(Serializer& S) const {
93 Decl::EmitInRec(S);
94 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000095}
96
Sam Bishope2563ca2008-04-07 21:55:54 +000097void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
98 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +000099 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000100}
101
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000102//===----------------------------------------------------------------------===//
103// Common serialization logic for subclasses of ScopedDecl.
104//===----------------------------------------------------------------------===//
105
106void ScopedDecl::EmitInRec(Serializer& S) const {
107 NamedDecl::EmitInRec(S);
108 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000109 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000110}
111
Sam Bishope2563ca2008-04-07 21:55:54 +0000112void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
113 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000114 D.ReadPtr(Next); // From ScopedDecl.
Chris Lattner0ed844b2008-04-04 06:12:32 +0000115 Decl *TmpD;
116 D.ReadPtr(TmpD); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000117 CtxDecl = cast_or_null<DeclContext>(TmpD);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000118}
119
120 //===------------------------------------------------------------===//
121 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
122 // methods. This is because owned pointers are usually "batched" //
123 // together for efficiency. //
124 //===------------------------------------------------------------===//
125
126void ScopedDecl::EmitOutRec(Serializer& S) const {
127 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000128}
129
Sam Bishope2563ca2008-04-07 21:55:54 +0000130void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000131 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000132 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000133}
134
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000135//===----------------------------------------------------------------------===//
136// Common serialization logic for subclasses of ValueDecl.
137//===----------------------------------------------------------------------===//
138
139void ValueDecl::EmitInRec(Serializer& S) const {
140 ScopedDecl::EmitInRec(S);
141 S.Emit(getType()); // From ValueDecl.
142}
143
Sam Bishope2563ca2008-04-07 21:55:54 +0000144void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
145 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000146 DeclType = QualType::ReadVal(D); // From ValueDecl.
147}
148
149//===----------------------------------------------------------------------===//
150// Common serialization logic for subclasses of VarDecl.
151//===----------------------------------------------------------------------===//
152
153void VarDecl::EmitInRec(Serializer& S) const {
154 ValueDecl::EmitInRec(S);
155 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000156}
157
Sam Bishope2563ca2008-04-07 21:55:54 +0000158void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
159 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000160 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000161}
162
163 //===------------------------------------------------------------===//
164 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
165 // the one define in ScopedDecl. This is to batch emit the //
166 // owned pointers, which results in a smaller output.
167 //===------------------------------------------------------------===//
168
169void VarDecl::EmitOutRec(Serializer& S) const {
170 // Emit these last because they will create records of their own.
171 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
172 getNextDeclarator()); // From ScopedDecl.
173}
174
Sam Bishope2563ca2008-04-07 21:55:54 +0000175void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000176 Decl* next_declarator;
177
Sam Bishope2563ca2008-04-07 21:55:54 +0000178 D.BatchReadOwnedPtrs(Init, // From VarDecl.
179 next_declarator, // From ScopedDecl.
180 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000181
182 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000183}
184
185
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000186void VarDecl::EmitImpl(Serializer& S) const {
187 VarDecl::EmitInRec(S);
188 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000189}
190
Sam Bishope2563ca2008-04-07 21:55:54 +0000191void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
192 ReadInRec(D, C);
193 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000194}
195
196//===----------------------------------------------------------------------===//
197// BlockVarDecl Serialization.
198//===----------------------------------------------------------------------===//
199
Sam Bishope2563ca2008-04-07 21:55:54 +0000200BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000201 BlockVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000202 new BlockVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000203
Sam Bishope2563ca2008-04-07 21:55:54 +0000204 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000205
Ted Kremenek04973312007-11-02 18:05:11 +0000206 return decl;
207}
208
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000209//===----------------------------------------------------------------------===//
210// FileVarDecl Serialization.
211//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000212
Sam Bishope2563ca2008-04-07 21:55:54 +0000213FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000214 FileVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000215 new FileVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000216
Sam Bishope2563ca2008-04-07 21:55:54 +0000217 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000218
Ted Kremenek04973312007-11-02 18:05:11 +0000219 return decl;
220}
221
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000222//===----------------------------------------------------------------------===//
223// ParmDecl Serialization.
224//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000225
Ted Kremenek137bd912007-12-13 06:28:13 +0000226void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
227 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000228 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000229}
230
Sam Bishope2563ca2008-04-07 21:55:54 +0000231ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000232 ParmVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000233 new ParmVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000234
Sam Bishope2563ca2008-04-07 21:55:54 +0000235 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000236 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Ted Kremenek137bd912007-12-13 06:28:13 +0000237
Ted Kremenek04973312007-11-02 18:05:11 +0000238 return decl;
239}
240
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000241//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000242// EnumDecl Serialization.
243//===----------------------------------------------------------------------===//
244
245void EnumDecl::EmitImpl(Serializer& S) const {
246 ScopedDecl::EmitInRec(S);
247 S.EmitBool(isDefinition());
248 S.Emit(IntegerType);
249 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
250}
251
Sam Bishope2563ca2008-04-07 21:55:54 +0000252EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Chris Lattner0ed844b2008-04-04 06:12:32 +0000253 EnumDecl* decl = new EnumDecl(0, SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000254
Sam Bishope2563ca2008-04-07 21:55:54 +0000255 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000256 decl->setDefinition(D.ReadBool());
257 decl->IntegerType = QualType::ReadVal(D);
258
259 Decl* next_declarator;
260 Decl* Elist;
261
Sam Bishope2563ca2008-04-07 21:55:54 +0000262 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000263
264 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
265 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
266
267 return decl;
268}
269
270//===----------------------------------------------------------------------===//
271// EnumConstantDecl Serialization.
272//===----------------------------------------------------------------------===//
273
274void EnumConstantDecl::EmitImpl(Serializer& S) const {
275 S.Emit(Val);
276 ValueDecl::EmitInRec(S);
277 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
278}
279
Sam Bishope2563ca2008-04-07 21:55:54 +0000280EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000281 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000282 D.Read(val);
283
284 EnumConstantDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000285 new EnumConstantDecl(0, SourceLocation(),NULL,QualType(),NULL,
Ted Kremenek583e0082007-11-14 18:12:19 +0000286 val,NULL);
287
Sam Bishope2563ca2008-04-07 21:55:54 +0000288 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000289
290 Decl* next_declarator;
291
Sam Bishope2563ca2008-04-07 21:55:54 +0000292 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000293
Ted Kremenek049b1682007-11-14 23:38:09 +0000294 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000295
296 return decl;
297}
298
299//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000300// FieldDecl Serialization.
301//===----------------------------------------------------------------------===//
302
303void FieldDecl::EmitImpl(Serializer& S) const {
304 S.Emit(getType());
305 NamedDecl::EmitInRec(S);
306 S.EmitOwnedPtr(BitWidth);
307}
308
Sam Bishope2563ca2008-04-07 21:55:54 +0000309FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Chris Lattnerb048c982008-04-06 04:47:34 +0000310 FieldDecl* decl = new FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000311 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000312 decl->ReadInRec(D, C);
313 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000314 return decl;
315}
316
317//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000318// FunctionDecl Serialization.
319//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000320
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000321void FunctionDecl::EmitImpl(Serializer& S) const {
322 S.EmitInt(SClass); // From FunctionDecl.
323 S.EmitBool(IsInline); // From FunctionDecl.
324 ValueDecl::EmitInRec(S);
325 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000326
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000327 // NOTE: We do not need to serialize out the number of parameters, because
328 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000329
Ted Kremenekd437f232007-11-13 22:51:08 +0000330 if (ParamInfo != NULL) {
331 S.EmitBool(true);
332 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
333 getNextDeclarator());
334 }
335 else {
336 S.EmitBool(false);
337 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
338 }
Ted Kremenek04973312007-11-02 18:05:11 +0000339}
340
Sam Bishope2563ca2008-04-07 21:55:54 +0000341FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000342 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
343 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000344
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000345 FunctionDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000346 new FunctionDecl(0, SourceLocation(),NULL,QualType(),SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000347
Sam Bishope2563ca2008-04-07 21:55:54 +0000348 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000349 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000350
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000351 Decl* next_declarator;
352
Ted Kremenekd437f232007-11-13 22:51:08 +0000353 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000354
355 decl->ParamInfo = hasParamDecls
356 ? new ParmVarDecl*[decl->getNumParams()]
357 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000358
359 if (hasParamDecls)
360 D.BatchReadOwnedPtrs(decl->getNumParams(),
361 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000362 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000363 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000364 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000365
366 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000367
368 return decl;
369}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000370
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000371//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000372// RecordDecl Serialization.
373//===----------------------------------------------------------------------===//
374
Ted Kremenek583e0082007-11-14 18:12:19 +0000375void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000376 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000377 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000378 S.EmitBool(hasFlexibleArrayMember());
379 S.EmitSInt(getNumMembers());
380 if (getNumMembers() > 0) {
381 assert (Members);
382 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
383 (Decl**) &Members[0],getNextDeclarator());
384 }
385 else
386 ScopedDecl::EmitOutRec(S);
387}
388
Sam Bishope2563ca2008-04-07 21:55:54 +0000389RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
390 ASTContext& C) {
391
Chris Lattner0ed844b2008-04-04 06:12:32 +0000392 RecordDecl* decl = new RecordDecl(DK,0,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000393
Sam Bishope2563ca2008-04-07 21:55:54 +0000394 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000395 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000396 decl->setHasFlexibleArrayMember(D.ReadBool());
397 decl->NumMembers = D.ReadSInt();
398
399 if (decl->getNumMembers() > 0) {
400 Decl* next_declarator;
401 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
402
403 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
404 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000405 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000406
407 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
408 }
409 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000410 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000411
412 return decl;
413}
414
415//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000416// TypedefDecl Serialization.
417//===----------------------------------------------------------------------===//
418
419void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000420 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000421 ScopedDecl::EmitInRec(S);
422 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000423}
424
Sam Bishope2563ca2008-04-07 21:55:54 +0000425TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000426 QualType T = QualType::ReadVal(D);
427
Chris Lattner0ed844b2008-04-04 06:12:32 +0000428 TypedefDecl* decl = new TypedefDecl(0, SourceLocation(),NULL,T,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000429
Sam Bishope2563ca2008-04-07 21:55:54 +0000430 decl->ScopedDecl::ReadInRec(D, C);
431 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000432
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000433 return decl;
434}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000435
436//===----------------------------------------------------------------------===//
437// LinkageSpec Serialization.
438//===----------------------------------------------------------------------===//
439
440void LinkageSpecDecl::EmitInRec(Serializer& S) const {
441 Decl::EmitInRec(S);
442 S.EmitInt(getLanguage());
443 S.EmitPtr(D);
444}
445
Sam Bishope2563ca2008-04-07 21:55:54 +0000446void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
447 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000448 Language = static_cast<LanguageIDs>(D.ReadInt());
449 D.ReadPtr(this->D);
450}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000451
452//===----------------------------------------------------------------------===//
453// FileScopeAsm Serialization.
454//===----------------------------------------------------------------------===//
455
456void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
457{
458 Decl::EmitInRec(S);
459 S.EmitOwnedPtr(AsmString);
460}
461
Sam Bishope2563ca2008-04-07 21:55:54 +0000462FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000463 FileScopeAsmDecl* decl = new FileScopeAsmDecl(SourceLocation(), 0);
464
Sam Bishope2563ca2008-04-07 21:55:54 +0000465 decl->Decl::ReadInRec(D, C);
466 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000467// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
468
469 return decl;
470}