blob: 8a4612b6745bf0518f2011c33e144b6a6ebf2b14 [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"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000016#include "clang/AST/DeclCXX.h"
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000017#include "clang/AST/Expr.h"
18#include "llvm/Bitcode/Serialize.h"
19#include "llvm/Bitcode/Deserialize.h"
20
Ted Kremenek928fd7f2007-11-13 00:15:39 +000021using llvm::Serializer;
22using llvm::Deserializer;
23using llvm::SerializedPtrID;
24
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000025using namespace clang;
26
Ted Kremenek928fd7f2007-11-13 00:15:39 +000027//===----------------------------------------------------------------------===//
28// Decl Serialization: Dispatch code to handle specialized decl types.
29//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000030
Ted Kremenek928fd7f2007-11-13 00:15:39 +000031void Decl::Emit(Serializer& S) const {
32 S.EmitInt(getKind());
33 EmitImpl(S);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000034 if (const DeclContext *DC = dyn_cast<const DeclContext>(this))
35 DC->EmitOutRec(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000036}
37
Sam Bishope2563ca2008-04-07 21:55:54 +000038Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000039
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000040 Decl *Dcl;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000041 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000042
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000043 switch (k) {
44 default:
45 assert (false && "Not implemented.");
Chris Lattner0ed844b2008-04-04 06:12:32 +000046
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000047 case TranslationUnit:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000048 Dcl = TranslationUnitDecl::CreateImpl(D, C);
49 break;
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000050
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000051 case Namespace:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000052 Dcl = NamespaceDecl::CreateImpl(D, C);
53 break;
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000054
Steve Naroff248a7532008-04-15 22:42:06 +000055 case Var:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000056 Dcl = VarDecl::CreateImpl(D, C);
57 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000058
Ted Kremenek583e0082007-11-14 18:12:19 +000059 case Enum:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000060 Dcl = EnumDecl::CreateImpl(D, C);
61 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000062
63 case EnumConstant:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000064 Dcl = EnumConstantDecl::CreateImpl(D, C);
65 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000066
Ted Kremenekf9d56c82007-11-14 17:47:01 +000067 case Field:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000068 Dcl = FieldDecl::CreateImpl(D, C);
69 break;
Ted Kremenekf9d56c82007-11-14 17:47:01 +000070
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000071 case ParmVar:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000072 Dcl = ParmVarDecl::CreateImpl(D, C);
73 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000074
75 case Function:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000076 Dcl = FunctionDecl::CreateImpl(D, C);
77 break;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000078
79 case OverloadedFunction:
80 Dcl = OverloadedFunctionDecl::CreateImpl(D, C);
81 break;
82
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +000083 case Record:
84 Dcl = RecordDecl::CreateImpl(D, C);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000085 break;
Ted Kremenekaad48b62007-11-14 08:06:37 +000086
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000087 case Typedef:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000088 Dcl = TypedefDecl::CreateImpl(D, C);
89 break;
Anders Carlssondfab6cb2008-02-08 00:33:21 +000090
91 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000092 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
93 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000094 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000095
96 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
97 DC->ReadOutRec(D, C);
98
99 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +0000100}
Ted Kremenek04973312007-11-02 18:05:11 +0000101
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000102//===----------------------------------------------------------------------===//
103// Common serialization logic for subclasses of Decl.
104//===----------------------------------------------------------------------===//
105
106void Decl::EmitInRec(Serializer& S) const {
107 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000108}
109
Sam Bishope2563ca2008-04-07 21:55:54 +0000110void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000111 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000112}
113
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000114//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000115// Common serialization logic for subclasses of DeclContext.
116//===----------------------------------------------------------------------===//
117
118void DeclContext::EmitOutRec(Serializer& S) const {
119 S.EmitPtr(DeclChain);
120}
121
122void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
123 D.ReadPtr(DeclChain);
124}
125
126//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000127// Common serialization logic for subclasses of NamedDecl.
128//===----------------------------------------------------------------------===//
129
130void NamedDecl::EmitInRec(Serializer& S) const {
131 Decl::EmitInRec(S);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000132 S.EmitInt(Name.getNameKind());
133
134 switch (Name.getNameKind()) {
135 case DeclarationName::Identifier:
136 S.EmitPtr(Name.getAsIdentifierInfo());
137 break;
138
139 case DeclarationName::ObjCZeroArgSelector:
140 case DeclarationName::ObjCOneArgSelector:
141 case DeclarationName::ObjCMultiArgSelector:
142 Name.getObjCSelector().Emit(S);
143 break;
144
145 case DeclarationName::CXXConstructorName:
146 case DeclarationName::CXXDestructorName:
147 case DeclarationName::CXXConversionFunctionName:
148 Name.getCXXNameType().Emit(S);
149 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000150
151 case DeclarationName::CXXOperatorName:
152 S.EmitInt(Name.getCXXOverloadedOperator());
153 break;
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000154 }
Ted Kremenek04973312007-11-02 18:05:11 +0000155}
156
Sam Bishope2563ca2008-04-07 21:55:54 +0000157void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
158 Decl::ReadInRec(D, C);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000159
160 DeclarationName::NameKind Kind
161 = static_cast<DeclarationName::NameKind>(D.ReadInt());
162 switch (Kind) {
163 case DeclarationName::Identifier: {
164 IdentifierInfo *Identifier;
165 D.ReadPtr(Identifier);
166 Name = Identifier;
167 break;
168 }
169
170 case DeclarationName::ObjCZeroArgSelector:
171 case DeclarationName::ObjCOneArgSelector:
172 case DeclarationName::ObjCMultiArgSelector:
173 Name = Selector::ReadVal(D);
174 break;
175
176 case DeclarationName::CXXConstructorName:
177 Name = C.DeclarationNames.getCXXConstructorName(QualType::ReadVal(D));
178 break;
179
180 case DeclarationName::CXXDestructorName:
181 Name = C.DeclarationNames.getCXXDestructorName(QualType::ReadVal(D));
182 break;
183
184 case DeclarationName::CXXConversionFunctionName:
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000185 Name
186 = C.DeclarationNames.getCXXConversionFunctionName(QualType::ReadVal(D));
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000187 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000188
189 case DeclarationName::CXXOperatorName: {
190 OverloadedOperatorKind Op
191 = static_cast<OverloadedOperatorKind>(D.ReadInt());
192 Name = C.DeclarationNames.getCXXOperatorName(Op);
193 break;
194 }
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000195 }
Ted Kremenek04973312007-11-02 18:05:11 +0000196}
197
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000198//===----------------------------------------------------------------------===//
199// Common serialization logic for subclasses of ScopedDecl.
200//===----------------------------------------------------------------------===//
201
202void ScopedDecl::EmitInRec(Serializer& S) const {
203 NamedDecl::EmitInRec(S);
204 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000205 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000206 S.EmitPtr(cast_or_null<Decl>(getLexicalDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000207}
208
Sam Bishope2563ca2008-04-07 21:55:54 +0000209void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
210 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000211 D.ReadPtr(Next); // From ScopedDecl.
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000212
213 assert(DeclCtx == 0);
214
215 const SerializedPtrID &SemaDCPtrID = D.ReadPtrID();
216 const SerializedPtrID &LexicalDCPtrID = D.ReadPtrID();
217
218 if (SemaDCPtrID == LexicalDCPtrID) {
219 // Allow back-patching. Observe that we register the variable of the
220 // *object* for back-patching. Its actual value will get filled in later.
221 D.ReadUIntPtr(DeclCtx, SemaDCPtrID);
222 }
223 else {
224 MultipleDC *MDC = new MultipleDC();
225 DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1;
226 // Allow back-patching. Observe that we register the variable of the
227 // *object* for back-patching. Its actual value will get filled in later.
Argyrios Kyrtzidisb0b847e2008-11-14 23:32:45 +0000228 D.ReadPtr(MDC->SemanticDC, SemaDCPtrID);
229 D.ReadPtr(MDC->LexicalDC, LexicalDCPtrID);
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000230 }
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000231}
232
233 //===------------------------------------------------------------===//
234 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
235 // methods. This is because owned pointers are usually "batched" //
236 // together for efficiency. //
237 //===------------------------------------------------------------===//
238
239void ScopedDecl::EmitOutRec(Serializer& S) const {
240 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000241}
242
Sam Bishope2563ca2008-04-07 21:55:54 +0000243void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000244 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000245 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000246}
247
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000248//===----------------------------------------------------------------------===//
249// Common serialization logic for subclasses of ValueDecl.
250//===----------------------------------------------------------------------===//
251
252void ValueDecl::EmitInRec(Serializer& S) const {
253 ScopedDecl::EmitInRec(S);
254 S.Emit(getType()); // From ValueDecl.
255}
256
Sam Bishope2563ca2008-04-07 21:55:54 +0000257void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
258 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000259 DeclType = QualType::ReadVal(D); // From ValueDecl.
260}
261
262//===----------------------------------------------------------------------===//
263// Common serialization logic for subclasses of VarDecl.
264//===----------------------------------------------------------------------===//
265
266void VarDecl::EmitInRec(Serializer& S) const {
267 ValueDecl::EmitInRec(S);
268 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000269}
270
Sam Bishope2563ca2008-04-07 21:55:54 +0000271void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
272 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000273 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000274}
275
276 //===------------------------------------------------------------===//
277 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
278 // the one define in ScopedDecl. This is to batch emit the //
279 // owned pointers, which results in a smaller output.
280 //===------------------------------------------------------------===//
281
282void VarDecl::EmitOutRec(Serializer& S) const {
283 // Emit these last because they will create records of their own.
284 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
285 getNextDeclarator()); // From ScopedDecl.
286}
287
Sam Bishope2563ca2008-04-07 21:55:54 +0000288void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000289 Decl* next_declarator;
290
Sam Bishope2563ca2008-04-07 21:55:54 +0000291 D.BatchReadOwnedPtrs(Init, // From VarDecl.
292 next_declarator, // From ScopedDecl.
293 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000294
295 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000296}
297
298
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000299void VarDecl::EmitImpl(Serializer& S) const {
300 VarDecl::EmitInRec(S);
301 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000302}
303
Sam Bishope2563ca2008-04-07 21:55:54 +0000304void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
305 ReadInRec(D, C);
306 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000307}
308
309//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000310// TranslationUnitDecl Serialization.
311//===----------------------------------------------------------------------===//
312
313void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
314{
315 Decl::EmitInRec(S);
316}
317
318TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
319 ASTContext& C) {
320 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000321 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000322
323 decl->Decl::ReadInRec(D, C);
324
325 return decl;
326}
327
328//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000329// NamespaceDecl Serialization.
330//===----------------------------------------------------------------------===//
331
332void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
333{
334 ScopedDecl::EmitInRec(S);
335 S.Emit(getLBracLoc());
336 S.Emit(getRBracLoc());
337 ScopedDecl::EmitOutRec(S);
338}
339
340NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
341 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
342 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
343
344 decl->ScopedDecl::ReadInRec(D, C);
345 decl->LBracLoc = SourceLocation::ReadVal(D);
346 decl->RBracLoc = SourceLocation::ReadVal(D);
347 decl->ScopedDecl::ReadOutRec(D, C);
348
349 return decl;
350}
351
352//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000353// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000354//===----------------------------------------------------------------------===//
355
Steve Naroff248a7532008-04-15 22:42:06 +0000356VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
357 void *Mem = C.getAllocator().Allocate<VarDecl>();
358 VarDecl* decl =
359 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000360
Sam Bishope2563ca2008-04-07 21:55:54 +0000361 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000362 return decl;
363}
364
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000365//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000366// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000367//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000368
Ted Kremenek137bd912007-12-13 06:28:13 +0000369void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
370 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000371 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000372 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000373}
374
Sam Bishope2563ca2008-04-07 21:55:54 +0000375ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000376 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
377 ParmVarDecl* decl = new (Mem)
378 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000379
Sam Bishope2563ca2008-04-07 21:55:54 +0000380 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000381 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000382 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000383 return decl;
384}
385
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000386//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000387// EnumDecl Serialization.
388//===----------------------------------------------------------------------===//
389
390void EnumDecl::EmitImpl(Serializer& S) const {
391 ScopedDecl::EmitInRec(S);
392 S.EmitBool(isDefinition());
393 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000394 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000395}
396
Sam Bishope2563ca2008-04-07 21:55:54 +0000397EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000398 void *Mem = C.getAllocator().Allocate<EnumDecl>();
399 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000400
Sam Bishope2563ca2008-04-07 21:55:54 +0000401 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000402 decl->setDefinition(D.ReadBool());
403 decl->IntegerType = QualType::ReadVal(D);
404
405 Decl* next_declarator;
406 Decl* Elist;
407
Sam Bishope2563ca2008-04-07 21:55:54 +0000408 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000409
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000410 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000411 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
412
413 return decl;
414}
415
416//===----------------------------------------------------------------------===//
417// EnumConstantDecl Serialization.
418//===----------------------------------------------------------------------===//
419
420void EnumConstantDecl::EmitImpl(Serializer& S) const {
421 S.Emit(Val);
422 ValueDecl::EmitInRec(S);
423 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
424}
425
Sam Bishope2563ca2008-04-07 21:55:54 +0000426EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000427 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000428 D.Read(val);
429
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000430 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
431 EnumConstantDecl* decl = new (Mem)
432 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000433
Sam Bishope2563ca2008-04-07 21:55:54 +0000434 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000435
436 Decl* next_declarator;
437
Sam Bishope2563ca2008-04-07 21:55:54 +0000438 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000439
Ted Kremenek049b1682007-11-14 23:38:09 +0000440 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000441
442 return decl;
443}
444
445//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000446// FieldDecl Serialization.
447//===----------------------------------------------------------------------===//
448
449void FieldDecl::EmitImpl(Serializer& S) const {
450 S.Emit(getType());
451 NamedDecl::EmitInRec(S);
452 S.EmitOwnedPtr(BitWidth);
453}
454
Sam Bishope2563ca2008-04-07 21:55:54 +0000455FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000456 void *Mem = C.getAllocator().Allocate<FieldDecl>();
457 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000458 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000459 decl->ReadInRec(D, C);
460 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000461 return decl;
462}
463
464//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000465// FunctionDecl Serialization.
466//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000467
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000468void FunctionDecl::EmitImpl(Serializer& S) const {
469 S.EmitInt(SClass); // From FunctionDecl.
470 S.EmitBool(IsInline); // From FunctionDecl.
471 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000472 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000473
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000474 // NOTE: We do not need to serialize out the number of parameters, because
475 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000476
Ted Kremenekd437f232007-11-13 22:51:08 +0000477 if (ParamInfo != NULL) {
478 S.EmitBool(true);
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000479 S.EmitInt(getNumParams());
Ted Kremenekd437f232007-11-13 22:51:08 +0000480 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
481 getNextDeclarator());
482 }
483 else {
484 S.EmitBool(false);
485 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
486 }
Ted Kremenek04973312007-11-02 18:05:11 +0000487}
488
Sam Bishope2563ca2008-04-07 21:55:54 +0000489FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000490 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
491 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000492
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000493 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
494 FunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000495 FunctionDecl(Function, 0, SourceLocation(), DeclarationName(),
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000496 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000497
Sam Bishope2563ca2008-04-07 21:55:54 +0000498 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000499 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000500
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000501 Decl* next_declarator;
502
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000503 int numParams;
Ted Kremenekd437f232007-11-13 22:51:08 +0000504 bool hasParamDecls = D.ReadBool();
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000505 if (hasParamDecls)
506 numParams = D.ReadInt();
Ted Kremenekda256852007-11-16 18:11:10 +0000507
508 decl->ParamInfo = hasParamDecls
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000509 ? new ParmVarDecl*[numParams]
Ted Kremenekda256852007-11-16 18:11:10 +0000510 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000511
512 if (hasParamDecls)
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000513 D.BatchReadOwnedPtrs(numParams,
Ted Kremenekd437f232007-11-13 22:51:08 +0000514 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000515 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000516 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000517 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000518
519 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000520
521 return decl;
522}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000523
Steve Naroff56ee6892008-10-08 17:01:13 +0000524void BlockDecl::EmitImpl(Serializer& S) const {
525 // FIXME: what about arguments?
526 S.Emit(getCaretLocation());
527 S.EmitOwnedPtr(Body);
528}
529
530BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
531 QualType Q = QualType::ReadVal(D);
532 SourceLocation L = SourceLocation::ReadVal(D);
533 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
534 assert(0 && "Cannot deserialize BlockBlockExpr yet");
535 // FIXME: need to handle parameters.
536 //return new BlockBlockExpr(L, Q, BodyStmt);
537 return 0;
538}
539
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000540//===----------------------------------------------------------------------===//
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000541// OverloadedFunctionDecl Serialization.
542//===----------------------------------------------------------------------===//
543
544void OverloadedFunctionDecl::EmitImpl(Serializer& S) const {
545 NamedDecl::EmitInRec(S);
546
547 S.EmitInt(getNumFunctions());
548 for (unsigned func = 0; func < getNumFunctions(); ++func)
549 S.EmitPtr(Functions[func]);
550}
551
552OverloadedFunctionDecl *
553OverloadedFunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
554 void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>();
555 OverloadedFunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000556 OverloadedFunctionDecl(0, DeclarationName());
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000557
558 decl->NamedDecl::ReadInRec(D, C);
559
560 unsigned numFunctions = D.ReadInt();
561 decl->Functions.reserve(numFunctions);
562 for (unsigned func = 0; func < numFunctions; ++func)
563 D.ReadPtr(decl->Functions[func]);
564
565 return decl;
566}
567
568//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000569// RecordDecl Serialization.
570//===----------------------------------------------------------------------===//
571
Ted Kremenek583e0082007-11-14 18:12:19 +0000572void RecordDecl::EmitImpl(Serializer& S) const {
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000573 S.EmitInt(getTagKind());
574
Ted Kremenekaad48b62007-11-14 08:06:37 +0000575 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000576 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000577 S.EmitBool(hasFlexibleArrayMember());
578 S.EmitSInt(getNumMembers());
579 if (getNumMembers() > 0) {
580 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000581 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000582 }
583 else
584 ScopedDecl::EmitOutRec(S);
585}
586
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000587RecordDecl* RecordDecl::CreateImpl(Deserializer& D, ASTContext& C) {
588 TagKind TK = TagKind(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000589
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000590 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000591 RecordDecl* decl = new (Mem) RecordDecl(Record, TK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000592
Sam Bishope2563ca2008-04-07 21:55:54 +0000593 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000594 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000595 decl->setHasFlexibleArrayMember(D.ReadBool());
596 decl->NumMembers = D.ReadSInt();
597
598 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000599 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
600
601 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000602 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000603 }
604 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000605 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000606
607 return decl;
608}
609
610//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000611// TypedefDecl Serialization.
612//===----------------------------------------------------------------------===//
613
614void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000615 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000616 ScopedDecl::EmitInRec(S);
617 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000618}
619
Sam Bishope2563ca2008-04-07 21:55:54 +0000620TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000621 QualType T = QualType::ReadVal(D);
622
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000623 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
624 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000625
Sam Bishope2563ca2008-04-07 21:55:54 +0000626 decl->ScopedDecl::ReadInRec(D, C);
627 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000628
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000629 return decl;
630}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000631
632//===----------------------------------------------------------------------===//
633// LinkageSpec Serialization.
634//===----------------------------------------------------------------------===//
635
636void LinkageSpecDecl::EmitInRec(Serializer& S) const {
637 Decl::EmitInRec(S);
638 S.EmitInt(getLanguage());
639 S.EmitPtr(D);
640}
641
Sam Bishope2563ca2008-04-07 21:55:54 +0000642void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
643 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000644 Language = static_cast<LanguageIDs>(D.ReadInt());
645 D.ReadPtr(this->D);
646}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000647
648//===----------------------------------------------------------------------===//
649// FileScopeAsm Serialization.
650//===----------------------------------------------------------------------===//
651
652void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
653{
654 Decl::EmitInRec(S);
655 S.EmitOwnedPtr(AsmString);
656}
657
Sam Bishope2563ca2008-04-07 21:55:54 +0000658FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000659 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
660 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000661
Sam Bishope2563ca2008-04-07 21:55:54 +0000662 decl->Decl::ReadInRec(D, C);
663 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000664// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
665
666 return decl;
667}