blob: 29714c0125cb8e3e7a5aff50146ba00bdcc9f09d [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
Douglas Gregor72c3f312008-12-05 18:15:24 +000091 case TemplateTypeParm:
92 Dcl = TemplateTypeParmDecl::CreateImpl(D, C);
93 break;
94
Anders Carlssondfab6cb2008-02-08 00:33:21 +000095 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000096 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
97 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000098 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000099
100 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
101 DC->ReadOutRec(D, C);
102
103 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +0000104}
Ted Kremenek04973312007-11-02 18:05:11 +0000105
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000106//===----------------------------------------------------------------------===//
107// Common serialization logic for subclasses of Decl.
108//===----------------------------------------------------------------------===//
109
110void Decl::EmitInRec(Serializer& S) const {
111 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000112}
113
Sam Bishope2563ca2008-04-07 21:55:54 +0000114void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000115 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000116}
117
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000118//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000119// Common serialization logic for subclasses of DeclContext.
120//===----------------------------------------------------------------------===//
121
122void DeclContext::EmitOutRec(Serializer& S) const {
123 S.EmitPtr(DeclChain);
124}
125
126void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
127 D.ReadPtr(DeclChain);
128}
129
130//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000131// Common serialization logic for subclasses of NamedDecl.
132//===----------------------------------------------------------------------===//
133
134void NamedDecl::EmitInRec(Serializer& S) const {
135 Decl::EmitInRec(S);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000136 S.EmitInt(Name.getNameKind());
137
138 switch (Name.getNameKind()) {
139 case DeclarationName::Identifier:
140 S.EmitPtr(Name.getAsIdentifierInfo());
141 break;
142
143 case DeclarationName::ObjCZeroArgSelector:
144 case DeclarationName::ObjCOneArgSelector:
145 case DeclarationName::ObjCMultiArgSelector:
146 Name.getObjCSelector().Emit(S);
147 break;
148
149 case DeclarationName::CXXConstructorName:
150 case DeclarationName::CXXDestructorName:
151 case DeclarationName::CXXConversionFunctionName:
152 Name.getCXXNameType().Emit(S);
153 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000154
155 case DeclarationName::CXXOperatorName:
156 S.EmitInt(Name.getCXXOverloadedOperator());
157 break;
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000158 }
Ted Kremenek04973312007-11-02 18:05:11 +0000159}
160
Sam Bishope2563ca2008-04-07 21:55:54 +0000161void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
162 Decl::ReadInRec(D, C);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000163
164 DeclarationName::NameKind Kind
165 = static_cast<DeclarationName::NameKind>(D.ReadInt());
166 switch (Kind) {
167 case DeclarationName::Identifier: {
168 IdentifierInfo *Identifier;
169 D.ReadPtr(Identifier);
170 Name = Identifier;
171 break;
172 }
173
174 case DeclarationName::ObjCZeroArgSelector:
175 case DeclarationName::ObjCOneArgSelector:
176 case DeclarationName::ObjCMultiArgSelector:
177 Name = Selector::ReadVal(D);
178 break;
179
180 case DeclarationName::CXXConstructorName:
181 Name = C.DeclarationNames.getCXXConstructorName(QualType::ReadVal(D));
182 break;
183
184 case DeclarationName::CXXDestructorName:
185 Name = C.DeclarationNames.getCXXDestructorName(QualType::ReadVal(D));
186 break;
187
188 case DeclarationName::CXXConversionFunctionName:
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000189 Name
190 = C.DeclarationNames.getCXXConversionFunctionName(QualType::ReadVal(D));
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000191 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000192
193 case DeclarationName::CXXOperatorName: {
194 OverloadedOperatorKind Op
195 = static_cast<OverloadedOperatorKind>(D.ReadInt());
196 Name = C.DeclarationNames.getCXXOperatorName(Op);
197 break;
198 }
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000199 }
Ted Kremenek04973312007-11-02 18:05:11 +0000200}
201
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000202//===----------------------------------------------------------------------===//
203// Common serialization logic for subclasses of ScopedDecl.
204//===----------------------------------------------------------------------===//
205
206void ScopedDecl::EmitInRec(Serializer& S) const {
207 NamedDecl::EmitInRec(S);
208 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000209 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000210 S.EmitPtr(cast_or_null<Decl>(getLexicalDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000211}
212
Sam Bishope2563ca2008-04-07 21:55:54 +0000213void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
214 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000215 D.ReadPtr(Next); // From ScopedDecl.
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000216
217 assert(DeclCtx == 0);
218
219 const SerializedPtrID &SemaDCPtrID = D.ReadPtrID();
220 const SerializedPtrID &LexicalDCPtrID = D.ReadPtrID();
221
222 if (SemaDCPtrID == LexicalDCPtrID) {
223 // Allow back-patching. Observe that we register the variable of the
224 // *object* for back-patching. Its actual value will get filled in later.
225 D.ReadUIntPtr(DeclCtx, SemaDCPtrID);
226 }
227 else {
228 MultipleDC *MDC = new MultipleDC();
229 DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1;
230 // Allow back-patching. Observe that we register the variable of the
231 // *object* for back-patching. Its actual value will get filled in later.
Argyrios Kyrtzidisb0b847e2008-11-14 23:32:45 +0000232 D.ReadPtr(MDC->SemanticDC, SemaDCPtrID);
233 D.ReadPtr(MDC->LexicalDC, LexicalDCPtrID);
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000234 }
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000235}
236
237 //===------------------------------------------------------------===//
238 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
239 // methods. This is because owned pointers are usually "batched" //
240 // together for efficiency. //
241 //===------------------------------------------------------------===//
242
243void ScopedDecl::EmitOutRec(Serializer& S) const {
244 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000245}
246
Sam Bishope2563ca2008-04-07 21:55:54 +0000247void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000248 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000249 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000250}
251
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000252//===----------------------------------------------------------------------===//
253// Common serialization logic for subclasses of ValueDecl.
254//===----------------------------------------------------------------------===//
255
256void ValueDecl::EmitInRec(Serializer& S) const {
257 ScopedDecl::EmitInRec(S);
258 S.Emit(getType()); // From ValueDecl.
259}
260
Sam Bishope2563ca2008-04-07 21:55:54 +0000261void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
262 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000263 DeclType = QualType::ReadVal(D); // From ValueDecl.
264}
265
266//===----------------------------------------------------------------------===//
267// Common serialization logic for subclasses of VarDecl.
268//===----------------------------------------------------------------------===//
269
270void VarDecl::EmitInRec(Serializer& S) const {
271 ValueDecl::EmitInRec(S);
272 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000273}
274
Sam Bishope2563ca2008-04-07 21:55:54 +0000275void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
276 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000277 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000278}
279
280 //===------------------------------------------------------------===//
281 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
282 // the one define in ScopedDecl. This is to batch emit the //
283 // owned pointers, which results in a smaller output.
284 //===------------------------------------------------------------===//
285
286void VarDecl::EmitOutRec(Serializer& S) const {
287 // Emit these last because they will create records of their own.
288 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
289 getNextDeclarator()); // From ScopedDecl.
290}
291
Sam Bishope2563ca2008-04-07 21:55:54 +0000292void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000293 Decl* next_declarator;
294
Sam Bishope2563ca2008-04-07 21:55:54 +0000295 D.BatchReadOwnedPtrs(Init, // From VarDecl.
296 next_declarator, // From ScopedDecl.
297 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000298
299 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000300}
301
302
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000303void VarDecl::EmitImpl(Serializer& S) const {
304 VarDecl::EmitInRec(S);
305 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000306}
307
Sam Bishope2563ca2008-04-07 21:55:54 +0000308void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
309 ReadInRec(D, C);
310 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000311}
312
313//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000314// TranslationUnitDecl Serialization.
315//===----------------------------------------------------------------------===//
316
317void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
318{
319 Decl::EmitInRec(S);
320}
321
322TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
323 ASTContext& C) {
324 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000325 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000326
327 decl->Decl::ReadInRec(D, C);
328
329 return decl;
330}
331
332//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000333// NamespaceDecl Serialization.
334//===----------------------------------------------------------------------===//
335
336void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
337{
338 ScopedDecl::EmitInRec(S);
339 S.Emit(getLBracLoc());
340 S.Emit(getRBracLoc());
341 ScopedDecl::EmitOutRec(S);
342}
343
344NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
345 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
346 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
347
348 decl->ScopedDecl::ReadInRec(D, C);
349 decl->LBracLoc = SourceLocation::ReadVal(D);
350 decl->RBracLoc = SourceLocation::ReadVal(D);
351 decl->ScopedDecl::ReadOutRec(D, C);
352
353 return decl;
354}
355
356//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000357// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000358//===----------------------------------------------------------------------===//
359
Steve Naroff248a7532008-04-15 22:42:06 +0000360VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
361 void *Mem = C.getAllocator().Allocate<VarDecl>();
362 VarDecl* decl =
363 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000364
Sam Bishope2563ca2008-04-07 21:55:54 +0000365 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000366 return decl;
367}
368
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000369//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000370// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000371//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000372
Ted Kremenek137bd912007-12-13 06:28:13 +0000373void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
374 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000375 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000376 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000377}
378
Sam Bishope2563ca2008-04-07 21:55:54 +0000379ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000380 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
381 ParmVarDecl* decl = new (Mem)
382 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000383
Sam Bishope2563ca2008-04-07 21:55:54 +0000384 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000385 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000386 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000387 return decl;
388}
389
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000390//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000391// EnumDecl Serialization.
392//===----------------------------------------------------------------------===//
393
394void EnumDecl::EmitImpl(Serializer& S) const {
395 ScopedDecl::EmitInRec(S);
396 S.EmitBool(isDefinition());
397 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000398 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000399}
400
Sam Bishope2563ca2008-04-07 21:55:54 +0000401EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000402 void *Mem = C.getAllocator().Allocate<EnumDecl>();
403 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000404
Sam Bishope2563ca2008-04-07 21:55:54 +0000405 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000406 decl->setDefinition(D.ReadBool());
407 decl->IntegerType = QualType::ReadVal(D);
408
409 Decl* next_declarator;
410 Decl* Elist;
411
Sam Bishope2563ca2008-04-07 21:55:54 +0000412 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000413
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000414 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000415 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
416
417 return decl;
418}
419
420//===----------------------------------------------------------------------===//
421// EnumConstantDecl Serialization.
422//===----------------------------------------------------------------------===//
423
424void EnumConstantDecl::EmitImpl(Serializer& S) const {
425 S.Emit(Val);
426 ValueDecl::EmitInRec(S);
427 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
428}
429
Sam Bishope2563ca2008-04-07 21:55:54 +0000430EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000431 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000432 D.Read(val);
433
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000434 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
435 EnumConstantDecl* decl = new (Mem)
436 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000437
Sam Bishope2563ca2008-04-07 21:55:54 +0000438 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000439
440 Decl* next_declarator;
441
Sam Bishope2563ca2008-04-07 21:55:54 +0000442 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000443
Ted Kremenek049b1682007-11-14 23:38:09 +0000444 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000445
446 return decl;
447}
448
449//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000450// FieldDecl Serialization.
451//===----------------------------------------------------------------------===//
452
453void FieldDecl::EmitImpl(Serializer& S) const {
454 S.Emit(getType());
455 NamedDecl::EmitInRec(S);
456 S.EmitOwnedPtr(BitWidth);
457}
458
Sam Bishope2563ca2008-04-07 21:55:54 +0000459FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000460 void *Mem = C.getAllocator().Allocate<FieldDecl>();
461 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000462 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000463 decl->ReadInRec(D, C);
464 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000465 return decl;
466}
467
468//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000469// FunctionDecl Serialization.
470//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000471
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000472void FunctionDecl::EmitImpl(Serializer& S) const {
473 S.EmitInt(SClass); // From FunctionDecl.
474 S.EmitBool(IsInline); // From FunctionDecl.
475 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000476 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000477
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000478 // NOTE: We do not need to serialize out the number of parameters, because
479 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000480
Ted Kremenekd437f232007-11-13 22:51:08 +0000481 if (ParamInfo != NULL) {
482 S.EmitBool(true);
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000483 S.EmitInt(getNumParams());
Ted Kremenekd437f232007-11-13 22:51:08 +0000484 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
485 getNextDeclarator());
486 }
487 else {
488 S.EmitBool(false);
489 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
490 }
Ted Kremenek04973312007-11-02 18:05:11 +0000491}
492
Sam Bishope2563ca2008-04-07 21:55:54 +0000493FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000494 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
495 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000496
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000497 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
498 FunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000499 FunctionDecl(Function, 0, SourceLocation(), DeclarationName(),
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000500 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000501
Sam Bishope2563ca2008-04-07 21:55:54 +0000502 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000503 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000504
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000505 Decl* next_declarator;
506
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000507 int numParams;
Ted Kremenekd437f232007-11-13 22:51:08 +0000508 bool hasParamDecls = D.ReadBool();
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000509 if (hasParamDecls)
510 numParams = D.ReadInt();
Ted Kremenekda256852007-11-16 18:11:10 +0000511
512 decl->ParamInfo = hasParamDecls
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000513 ? new ParmVarDecl*[numParams]
Ted Kremenekda256852007-11-16 18:11:10 +0000514 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000515
516 if (hasParamDecls)
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000517 D.BatchReadOwnedPtrs(numParams,
Ted Kremenekd437f232007-11-13 22:51:08 +0000518 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000519 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000520 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000521 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000522
523 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000524
525 return decl;
526}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000527
Steve Naroff56ee6892008-10-08 17:01:13 +0000528void BlockDecl::EmitImpl(Serializer& S) const {
529 // FIXME: what about arguments?
530 S.Emit(getCaretLocation());
531 S.EmitOwnedPtr(Body);
532}
533
534BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
535 QualType Q = QualType::ReadVal(D);
536 SourceLocation L = SourceLocation::ReadVal(D);
537 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
538 assert(0 && "Cannot deserialize BlockBlockExpr yet");
539 // FIXME: need to handle parameters.
540 //return new BlockBlockExpr(L, Q, BodyStmt);
541 return 0;
542}
543
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000544//===----------------------------------------------------------------------===//
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000545// OverloadedFunctionDecl Serialization.
546//===----------------------------------------------------------------------===//
547
548void OverloadedFunctionDecl::EmitImpl(Serializer& S) const {
549 NamedDecl::EmitInRec(S);
550
551 S.EmitInt(getNumFunctions());
552 for (unsigned func = 0; func < getNumFunctions(); ++func)
553 S.EmitPtr(Functions[func]);
554}
555
556OverloadedFunctionDecl *
557OverloadedFunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
558 void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>();
559 OverloadedFunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000560 OverloadedFunctionDecl(0, DeclarationName());
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000561
562 decl->NamedDecl::ReadInRec(D, C);
563
564 unsigned numFunctions = D.ReadInt();
565 decl->Functions.reserve(numFunctions);
566 for (unsigned func = 0; func < numFunctions; ++func)
567 D.ReadPtr(decl->Functions[func]);
568
569 return decl;
570}
571
572//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000573// RecordDecl Serialization.
574//===----------------------------------------------------------------------===//
575
Ted Kremenek583e0082007-11-14 18:12:19 +0000576void RecordDecl::EmitImpl(Serializer& S) const {
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000577 S.EmitInt(getTagKind());
578
Ted Kremenekaad48b62007-11-14 08:06:37 +0000579 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000580 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000581 S.EmitBool(hasFlexibleArrayMember());
582 S.EmitSInt(getNumMembers());
583 if (getNumMembers() > 0) {
584 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000585 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000586 }
587 else
588 ScopedDecl::EmitOutRec(S);
589}
590
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000591RecordDecl* RecordDecl::CreateImpl(Deserializer& D, ASTContext& C) {
592 TagKind TK = TagKind(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000593
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000594 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000595 RecordDecl* decl = new (Mem) RecordDecl(Record, TK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000596
Sam Bishope2563ca2008-04-07 21:55:54 +0000597 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000598 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000599 decl->setHasFlexibleArrayMember(D.ReadBool());
600 decl->NumMembers = D.ReadSInt();
601
602 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000603 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
604
605 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000606 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000607 }
608 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000609 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000610
611 return decl;
612}
613
614//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000615// TypedefDecl Serialization.
616//===----------------------------------------------------------------------===//
617
618void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000619 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000620 ScopedDecl::EmitInRec(S);
621 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000622}
623
Sam Bishope2563ca2008-04-07 21:55:54 +0000624TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000625 QualType T = QualType::ReadVal(D);
626
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000627 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
628 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000629
Sam Bishope2563ca2008-04-07 21:55:54 +0000630 decl->ScopedDecl::ReadInRec(D, C);
631 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000632
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000633 return decl;
634}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000635
636//===----------------------------------------------------------------------===//
Douglas Gregor72c3f312008-12-05 18:15:24 +0000637// TemplateTypeParmDecl Serialization.
638//===----------------------------------------------------------------------===//
639
640void TemplateTypeParmDecl::EmitImpl(Serializer& S) const {
641 S.EmitBool(Typename);
642 ScopedDecl::EmitInRec(S);
643 ScopedDecl::EmitOutRec(S);
644}
645
646TemplateTypeParmDecl *
647TemplateTypeParmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
648 bool Typename = D.ReadBool();
649 void *Mem = C.getAllocator().Allocate<TemplateTypeParmDecl>();
650 TemplateTypeParmDecl *decl
651 = new (Mem) TemplateTypeParmDecl(0, SourceLocation(), NULL, Typename);
652 decl->ScopedDecl::ReadInRec(D, C);
653 decl->ScopedDecl::ReadOutRec(D, C);
654 return decl;
655}
656
657//===----------------------------------------------------------------------===//
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000658// LinkageSpec Serialization.
659//===----------------------------------------------------------------------===//
660
661void LinkageSpecDecl::EmitInRec(Serializer& S) const {
662 Decl::EmitInRec(S);
663 S.EmitInt(getLanguage());
664 S.EmitPtr(D);
665}
666
Sam Bishope2563ca2008-04-07 21:55:54 +0000667void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
668 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000669 Language = static_cast<LanguageIDs>(D.ReadInt());
670 D.ReadPtr(this->D);
671}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000672
673//===----------------------------------------------------------------------===//
674// FileScopeAsm Serialization.
675//===----------------------------------------------------------------------===//
676
677void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
678{
679 Decl::EmitInRec(S);
680 S.EmitOwnedPtr(AsmString);
681}
682
Sam Bishope2563ca2008-04-07 21:55:54 +0000683FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000684 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
685 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000686
Sam Bishope2563ca2008-04-07 21:55:54 +0000687 decl->Decl::ReadInRec(D, C);
688 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000689// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
690
691 return decl;
692}