blob: 718885b2b568b2a7e6fd4b6dec8d11d026150328 [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);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000033 if (const DeclContext *DC = dyn_cast<const DeclContext>(this))
34 DC->EmitOutRec(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000035}
36
Sam Bishope2563ca2008-04-07 21:55:54 +000037Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000038
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000039 Decl *Dcl;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000040 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000041
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000042 switch (k) {
43 default:
44 assert (false && "Not implemented.");
Chris Lattner0ed844b2008-04-04 06:12:32 +000045
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000046 case TranslationUnit:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000047 Dcl = TranslationUnitDecl::CreateImpl(D, C);
48 break;
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000049
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000050 case Namespace:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000051 Dcl = NamespaceDecl::CreateImpl(D, C);
52 break;
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000053
Steve Naroff248a7532008-04-15 22:42:06 +000054 case Var:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000055 Dcl = VarDecl::CreateImpl(D, C);
56 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000057
Ted Kremenek583e0082007-11-14 18:12:19 +000058 case Enum:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000059 Dcl = EnumDecl::CreateImpl(D, C);
60 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000061
62 case EnumConstant:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000063 Dcl = EnumConstantDecl::CreateImpl(D, C);
64 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000065
Ted Kremenekf9d56c82007-11-14 17:47:01 +000066 case Field:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000067 Dcl = FieldDecl::CreateImpl(D, C);
68 break;
Ted Kremenekf9d56c82007-11-14 17:47:01 +000069
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000070 case ParmVar:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000071 Dcl = ParmVarDecl::CreateImpl(D, C);
72 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000073
74 case Function:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000075 Dcl = FunctionDecl::CreateImpl(D, C);
76 break;
77
78 case Class:
Ted Kremenek5f670ed2007-11-14 21:15:42 +000079 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000080 case Struct:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000081 Dcl = RecordDecl::CreateImpl(k, D, C);
82 break;
Ted Kremenekaad48b62007-11-14 08:06:37 +000083
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000084 case Typedef:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000085 Dcl = TypedefDecl::CreateImpl(D, C);
86 break;
Anders Carlssondfab6cb2008-02-08 00:33:21 +000087
88 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000089 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
90 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000091 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000092
93 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
94 DC->ReadOutRec(D, C);
95
96 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000097}
Ted Kremenek04973312007-11-02 18:05:11 +000098
Ted Kremenek928fd7f2007-11-13 00:15:39 +000099//===----------------------------------------------------------------------===//
100// Common serialization logic for subclasses of Decl.
101//===----------------------------------------------------------------------===//
102
103void Decl::EmitInRec(Serializer& S) const {
104 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000105}
106
Sam Bishope2563ca2008-04-07 21:55:54 +0000107void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000108 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000109}
110
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000111//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000112// Common serialization logic for subclasses of DeclContext.
113//===----------------------------------------------------------------------===//
114
115void DeclContext::EmitOutRec(Serializer& S) const {
116 S.EmitPtr(DeclChain);
117}
118
119void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
120 D.ReadPtr(DeclChain);
121}
122
123//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000124// Common serialization logic for subclasses of NamedDecl.
125//===----------------------------------------------------------------------===//
126
127void NamedDecl::EmitInRec(Serializer& S) const {
128 Decl::EmitInRec(S);
129 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000130}
131
Sam Bishope2563ca2008-04-07 21:55:54 +0000132void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
133 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000134 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000135}
136
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000137//===----------------------------------------------------------------------===//
138// Common serialization logic for subclasses of ScopedDecl.
139//===----------------------------------------------------------------------===//
140
141void ScopedDecl::EmitInRec(Serializer& S) const {
142 NamedDecl::EmitInRec(S);
143 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000144 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000145}
146
Sam Bishope2563ca2008-04-07 21:55:54 +0000147void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
148 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000149 D.ReadPtr(Next); // From ScopedDecl.
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000150
Ted Kremenekadbb6192008-05-12 17:42:30 +0000151 assert(DeclCtx == 0); // Allow back-patching. Observe that we register
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000152 D.ReadPtr(DeclCtx); // the variable of the *object* for back-patching.
Ted Kremenek81edea82008-05-12 17:40:56 +0000153 // Its actual value will get filled in later.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000154}
155
156 //===------------------------------------------------------------===//
157 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
158 // methods. This is because owned pointers are usually "batched" //
159 // together for efficiency. //
160 //===------------------------------------------------------------===//
161
162void ScopedDecl::EmitOutRec(Serializer& S) const {
163 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000164}
165
Sam Bishope2563ca2008-04-07 21:55:54 +0000166void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000167 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000168 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000169}
170
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000171//===----------------------------------------------------------------------===//
172// Common serialization logic for subclasses of ValueDecl.
173//===----------------------------------------------------------------------===//
174
175void ValueDecl::EmitInRec(Serializer& S) const {
176 ScopedDecl::EmitInRec(S);
177 S.Emit(getType()); // From ValueDecl.
178}
179
Sam Bishope2563ca2008-04-07 21:55:54 +0000180void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
181 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000182 DeclType = QualType::ReadVal(D); // From ValueDecl.
183}
184
185//===----------------------------------------------------------------------===//
186// Common serialization logic for subclasses of VarDecl.
187//===----------------------------------------------------------------------===//
188
189void VarDecl::EmitInRec(Serializer& S) const {
190 ValueDecl::EmitInRec(S);
191 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000192}
193
Sam Bishope2563ca2008-04-07 21:55:54 +0000194void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
195 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000196 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000197}
198
199 //===------------------------------------------------------------===//
200 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
201 // the one define in ScopedDecl. This is to batch emit the //
202 // owned pointers, which results in a smaller output.
203 //===------------------------------------------------------------===//
204
205void VarDecl::EmitOutRec(Serializer& S) const {
206 // Emit these last because they will create records of their own.
207 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
208 getNextDeclarator()); // From ScopedDecl.
209}
210
Sam Bishope2563ca2008-04-07 21:55:54 +0000211void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000212 Decl* next_declarator;
213
Sam Bishope2563ca2008-04-07 21:55:54 +0000214 D.BatchReadOwnedPtrs(Init, // From VarDecl.
215 next_declarator, // From ScopedDecl.
216 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000217
218 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000219}
220
221
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000222void VarDecl::EmitImpl(Serializer& S) const {
223 VarDecl::EmitInRec(S);
224 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000225}
226
Sam Bishope2563ca2008-04-07 21:55:54 +0000227void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
228 ReadInRec(D, C);
229 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000230}
231
232//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000233// TranslationUnitDecl Serialization.
234//===----------------------------------------------------------------------===//
235
236void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
237{
238 Decl::EmitInRec(S);
239}
240
241TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
242 ASTContext& C) {
243 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000244 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000245
246 decl->Decl::ReadInRec(D, C);
247
248 return decl;
249}
250
251//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000252// NamespaceDecl Serialization.
253//===----------------------------------------------------------------------===//
254
255void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
256{
257 ScopedDecl::EmitInRec(S);
258 S.Emit(getLBracLoc());
259 S.Emit(getRBracLoc());
260 ScopedDecl::EmitOutRec(S);
261}
262
263NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
264 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
265 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
266
267 decl->ScopedDecl::ReadInRec(D, C);
268 decl->LBracLoc = SourceLocation::ReadVal(D);
269 decl->RBracLoc = SourceLocation::ReadVal(D);
270 decl->ScopedDecl::ReadOutRec(D, C);
271
272 return decl;
273}
274
275//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000276// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000277//===----------------------------------------------------------------------===//
278
Steve Naroff248a7532008-04-15 22:42:06 +0000279VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
280 void *Mem = C.getAllocator().Allocate<VarDecl>();
281 VarDecl* decl =
282 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000283
Sam Bishope2563ca2008-04-07 21:55:54 +0000284 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000285 return decl;
286}
287
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000288//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000289// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000290//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000291
Ted Kremenek137bd912007-12-13 06:28:13 +0000292void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
293 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000294 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000295 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000296}
297
Sam Bishope2563ca2008-04-07 21:55:54 +0000298ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000299 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
300 ParmVarDecl* decl = new (Mem)
301 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000302
Sam Bishope2563ca2008-04-07 21:55:54 +0000303 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000304 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000305 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000306 return decl;
307}
308
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000309//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000310// EnumDecl Serialization.
311//===----------------------------------------------------------------------===//
312
313void EnumDecl::EmitImpl(Serializer& S) const {
314 ScopedDecl::EmitInRec(S);
315 S.EmitBool(isDefinition());
316 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000317 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000318}
319
Sam Bishope2563ca2008-04-07 21:55:54 +0000320EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000321 void *Mem = C.getAllocator().Allocate<EnumDecl>();
322 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000323
Sam Bishope2563ca2008-04-07 21:55:54 +0000324 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000325 decl->setDefinition(D.ReadBool());
326 decl->IntegerType = QualType::ReadVal(D);
327
328 Decl* next_declarator;
329 Decl* Elist;
330
Sam Bishope2563ca2008-04-07 21:55:54 +0000331 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000332
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000333 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000334 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
335
336 return decl;
337}
338
339//===----------------------------------------------------------------------===//
340// EnumConstantDecl Serialization.
341//===----------------------------------------------------------------------===//
342
343void EnumConstantDecl::EmitImpl(Serializer& S) const {
344 S.Emit(Val);
345 ValueDecl::EmitInRec(S);
346 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
347}
348
Sam Bishope2563ca2008-04-07 21:55:54 +0000349EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000350 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000351 D.Read(val);
352
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000353 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
354 EnumConstantDecl* decl = new (Mem)
355 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000356
Sam Bishope2563ca2008-04-07 21:55:54 +0000357 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000358
359 Decl* next_declarator;
360
Sam Bishope2563ca2008-04-07 21:55:54 +0000361 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000362
Ted Kremenek049b1682007-11-14 23:38:09 +0000363 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000364
365 return decl;
366}
367
368//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000369// FieldDecl Serialization.
370//===----------------------------------------------------------------------===//
371
372void FieldDecl::EmitImpl(Serializer& S) const {
373 S.Emit(getType());
374 NamedDecl::EmitInRec(S);
375 S.EmitOwnedPtr(BitWidth);
376}
377
Sam Bishope2563ca2008-04-07 21:55:54 +0000378FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000379 void *Mem = C.getAllocator().Allocate<FieldDecl>();
380 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000381 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000382 decl->ReadInRec(D, C);
383 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000384 return decl;
385}
386
387//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000388// FunctionDecl Serialization.
389//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000390
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000391void FunctionDecl::EmitImpl(Serializer& S) const {
392 S.EmitInt(SClass); // From FunctionDecl.
393 S.EmitBool(IsInline); // From FunctionDecl.
394 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000395 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000396
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000397 // NOTE: We do not need to serialize out the number of parameters, because
398 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000399
Ted Kremenekd437f232007-11-13 22:51:08 +0000400 if (ParamInfo != NULL) {
401 S.EmitBool(true);
402 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
403 getNextDeclarator());
404 }
405 else {
406 S.EmitBool(false);
407 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
408 }
Ted Kremenek04973312007-11-02 18:05:11 +0000409}
410
Sam Bishope2563ca2008-04-07 21:55:54 +0000411FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000412 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
413 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000414
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000415 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
416 FunctionDecl* decl = new (Mem)
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000417 FunctionDecl(Function, 0, SourceLocation(), NULL,
418 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000419
Sam Bishope2563ca2008-04-07 21:55:54 +0000420 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000421 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000422
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000423 Decl* next_declarator;
424
Ted Kremenekd437f232007-11-13 22:51:08 +0000425 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000426
427 decl->ParamInfo = hasParamDecls
428 ? new ParmVarDecl*[decl->getNumParams()]
429 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000430
431 if (hasParamDecls)
432 D.BatchReadOwnedPtrs(decl->getNumParams(),
433 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000434 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000435 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000436 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000437
438 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000439
440 return decl;
441}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000442
Steve Naroff56ee6892008-10-08 17:01:13 +0000443void BlockDecl::EmitImpl(Serializer& S) const {
444 // FIXME: what about arguments?
445 S.Emit(getCaretLocation());
446 S.EmitOwnedPtr(Body);
447}
448
449BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
450 QualType Q = QualType::ReadVal(D);
451 SourceLocation L = SourceLocation::ReadVal(D);
452 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
453 assert(0 && "Cannot deserialize BlockBlockExpr yet");
454 // FIXME: need to handle parameters.
455 //return new BlockBlockExpr(L, Q, BodyStmt);
456 return 0;
457}
458
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000459//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000460// RecordDecl Serialization.
461//===----------------------------------------------------------------------===//
462
Ted Kremenek583e0082007-11-14 18:12:19 +0000463void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000464 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000465 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000466 S.EmitBool(hasFlexibleArrayMember());
467 S.EmitSInt(getNumMembers());
468 if (getNumMembers() > 0) {
469 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000470 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000471 }
472 else
473 ScopedDecl::EmitOutRec(S);
474}
475
Sam Bishope2563ca2008-04-07 21:55:54 +0000476RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
477 ASTContext& C) {
478
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000479 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Ted Kremenekdf042e62008-09-05 01:34:33 +0000480 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000481
Sam Bishope2563ca2008-04-07 21:55:54 +0000482 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000483 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000484 decl->setHasFlexibleArrayMember(D.ReadBool());
485 decl->NumMembers = D.ReadSInt();
486
487 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000488 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
489
490 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000491 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000492 }
493 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000494 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000495
496 return decl;
497}
498
499//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000500// TypedefDecl Serialization.
501//===----------------------------------------------------------------------===//
502
503void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000504 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000505 ScopedDecl::EmitInRec(S);
506 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000507}
508
Sam Bishope2563ca2008-04-07 21:55:54 +0000509TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000510 QualType T = QualType::ReadVal(D);
511
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000512 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
513 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000514
Sam Bishope2563ca2008-04-07 21:55:54 +0000515 decl->ScopedDecl::ReadInRec(D, C);
516 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000517
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000518 return decl;
519}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000520
521//===----------------------------------------------------------------------===//
522// LinkageSpec Serialization.
523//===----------------------------------------------------------------------===//
524
525void LinkageSpecDecl::EmitInRec(Serializer& S) const {
526 Decl::EmitInRec(S);
527 S.EmitInt(getLanguage());
528 S.EmitPtr(D);
529}
530
Sam Bishope2563ca2008-04-07 21:55:54 +0000531void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
532 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000533 Language = static_cast<LanguageIDs>(D.ReadInt());
534 D.ReadPtr(this->D);
535}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000536
537//===----------------------------------------------------------------------===//
538// FileScopeAsm Serialization.
539//===----------------------------------------------------------------------===//
540
541void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
542{
543 Decl::EmitInRec(S);
544 S.EmitOwnedPtr(AsmString);
545}
546
Sam Bishope2563ca2008-04-07 21:55:54 +0000547FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000548 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
549 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000550
Sam Bishope2563ca2008-04-07 21:55:54 +0000551 decl->Decl::ReadInRec(D, C);
552 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000553// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
554
555 return decl;
556}