blob: 14666d6f00206f9ca3654c0014a3a8ed04b729b8 [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.
Chris Lattner04421082008-04-08 04:40:51 +0000229 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000230}
231
Sam Bishope2563ca2008-04-07 21:55:54 +0000232ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000233 ParmVarDecl* decl =
Chris Lattner04421082008-04-08 04:40:51 +0000234 new ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000235
Sam Bishope2563ca2008-04-07 21:55:54 +0000236 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000237 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000238 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000239 return decl;
240}
241
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000242//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000243// EnumDecl Serialization.
244//===----------------------------------------------------------------------===//
245
246void EnumDecl::EmitImpl(Serializer& S) const {
247 ScopedDecl::EmitInRec(S);
248 S.EmitBool(isDefinition());
249 S.Emit(IntegerType);
250 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
251}
252
Sam Bishope2563ca2008-04-07 21:55:54 +0000253EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Chris Lattner0ed844b2008-04-04 06:12:32 +0000254 EnumDecl* decl = new EnumDecl(0, SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000255
Sam Bishope2563ca2008-04-07 21:55:54 +0000256 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000257 decl->setDefinition(D.ReadBool());
258 decl->IntegerType = QualType::ReadVal(D);
259
260 Decl* next_declarator;
261 Decl* Elist;
262
Sam Bishope2563ca2008-04-07 21:55:54 +0000263 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000264
265 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
266 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
267
268 return decl;
269}
270
271//===----------------------------------------------------------------------===//
272// EnumConstantDecl Serialization.
273//===----------------------------------------------------------------------===//
274
275void EnumConstantDecl::EmitImpl(Serializer& S) const {
276 S.Emit(Val);
277 ValueDecl::EmitInRec(S);
278 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
279}
280
Sam Bishope2563ca2008-04-07 21:55:54 +0000281EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000282 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000283 D.Read(val);
284
285 EnumConstantDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000286 new EnumConstantDecl(0, SourceLocation(),NULL,QualType(),NULL,
Ted Kremenek583e0082007-11-14 18:12:19 +0000287 val,NULL);
288
Sam Bishope2563ca2008-04-07 21:55:54 +0000289 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000290
291 Decl* next_declarator;
292
Sam Bishope2563ca2008-04-07 21:55:54 +0000293 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000294
Ted Kremenek049b1682007-11-14 23:38:09 +0000295 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000296
297 return decl;
298}
299
300//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000301// FieldDecl Serialization.
302//===----------------------------------------------------------------------===//
303
304void FieldDecl::EmitImpl(Serializer& S) const {
305 S.Emit(getType());
306 NamedDecl::EmitInRec(S);
307 S.EmitOwnedPtr(BitWidth);
308}
309
Sam Bishope2563ca2008-04-07 21:55:54 +0000310FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Chris Lattnerb048c982008-04-06 04:47:34 +0000311 FieldDecl* decl = new FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000312 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000313 decl->ReadInRec(D, C);
314 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000315 return decl;
316}
317
318//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000319// FunctionDecl Serialization.
320//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000321
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000322void FunctionDecl::EmitImpl(Serializer& S) const {
323 S.EmitInt(SClass); // From FunctionDecl.
324 S.EmitBool(IsInline); // From FunctionDecl.
325 ValueDecl::EmitInRec(S);
326 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000327
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000328 // NOTE: We do not need to serialize out the number of parameters, because
329 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000330
Ted Kremenekd437f232007-11-13 22:51:08 +0000331 if (ParamInfo != NULL) {
332 S.EmitBool(true);
333 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
334 getNextDeclarator());
335 }
336 else {
337 S.EmitBool(false);
338 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
339 }
Ted Kremenek04973312007-11-02 18:05:11 +0000340}
341
Sam Bishope2563ca2008-04-07 21:55:54 +0000342FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000343 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
344 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000345
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000346 FunctionDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000347 new FunctionDecl(0, SourceLocation(),NULL,QualType(),SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000348
Sam Bishope2563ca2008-04-07 21:55:54 +0000349 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000350 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000351
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000352 Decl* next_declarator;
353
Ted Kremenekd437f232007-11-13 22:51:08 +0000354 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000355
356 decl->ParamInfo = hasParamDecls
357 ? new ParmVarDecl*[decl->getNumParams()]
358 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000359
360 if (hasParamDecls)
361 D.BatchReadOwnedPtrs(decl->getNumParams(),
362 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000363 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000364 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000365 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000366
367 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000368
369 return decl;
370}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000371
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000372//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000373// RecordDecl Serialization.
374//===----------------------------------------------------------------------===//
375
Ted Kremenek583e0082007-11-14 18:12:19 +0000376void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000377 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000378 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000379 S.EmitBool(hasFlexibleArrayMember());
380 S.EmitSInt(getNumMembers());
381 if (getNumMembers() > 0) {
382 assert (Members);
383 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
384 (Decl**) &Members[0],getNextDeclarator());
385 }
386 else
387 ScopedDecl::EmitOutRec(S);
388}
389
Sam Bishope2563ca2008-04-07 21:55:54 +0000390RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
391 ASTContext& C) {
392
Chris Lattner0ed844b2008-04-04 06:12:32 +0000393 RecordDecl* decl = new RecordDecl(DK,0,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000394
Sam Bishope2563ca2008-04-07 21:55:54 +0000395 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000396 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000397 decl->setHasFlexibleArrayMember(D.ReadBool());
398 decl->NumMembers = D.ReadSInt();
399
400 if (decl->getNumMembers() > 0) {
401 Decl* next_declarator;
402 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
403
404 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
405 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000406 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000407
408 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
409 }
410 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000411 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000412
413 return decl;
414}
415
416//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000417// TypedefDecl Serialization.
418//===----------------------------------------------------------------------===//
419
420void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000421 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000422 ScopedDecl::EmitInRec(S);
423 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000424}
425
Sam Bishope2563ca2008-04-07 21:55:54 +0000426TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000427 QualType T = QualType::ReadVal(D);
428
Chris Lattner0ed844b2008-04-04 06:12:32 +0000429 TypedefDecl* decl = new TypedefDecl(0, SourceLocation(),NULL,T,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000430
Sam Bishope2563ca2008-04-07 21:55:54 +0000431 decl->ScopedDecl::ReadInRec(D, C);
432 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000433
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000434 return decl;
435}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000436
437//===----------------------------------------------------------------------===//
438// LinkageSpec Serialization.
439//===----------------------------------------------------------------------===//
440
441void LinkageSpecDecl::EmitInRec(Serializer& S) const {
442 Decl::EmitInRec(S);
443 S.EmitInt(getLanguage());
444 S.EmitPtr(D);
445}
446
Sam Bishope2563ca2008-04-07 21:55:54 +0000447void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
448 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000449 Language = static_cast<LanguageIDs>(D.ReadInt());
450 D.ReadPtr(this->D);
451}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000452
453//===----------------------------------------------------------------------===//
454// FileScopeAsm Serialization.
455//===----------------------------------------------------------------------===//
456
457void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
458{
459 Decl::EmitInRec(S);
460 S.EmitOwnedPtr(AsmString);
461}
462
Sam Bishope2563ca2008-04-07 21:55:54 +0000463FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000464 FileScopeAsmDecl* decl = new FileScopeAsmDecl(SourceLocation(), 0);
465
Sam Bishope2563ca2008-04-07 21:55:54 +0000466 decl->Decl::ReadInRec(D, C);
467 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000468// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
469
470 return decl;
471}