blob: f2aa3f30276c72f3975226e63f96748606e92b4c [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);
132 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000133}
134
Sam Bishope2563ca2008-04-07 21:55:54 +0000135void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
136 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000137 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000138}
139
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000140//===----------------------------------------------------------------------===//
141// Common serialization logic for subclasses of ScopedDecl.
142//===----------------------------------------------------------------------===//
143
144void ScopedDecl::EmitInRec(Serializer& S) const {
145 NamedDecl::EmitInRec(S);
146 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000147 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000148}
149
Sam Bishope2563ca2008-04-07 21:55:54 +0000150void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
151 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000152 D.ReadPtr(Next); // From ScopedDecl.
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000153
Ted Kremenekadbb6192008-05-12 17:42:30 +0000154 assert(DeclCtx == 0); // Allow back-patching. Observe that we register
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000155 D.ReadPtr(DeclCtx); // the variable of the *object* for back-patching.
Ted Kremenek81edea82008-05-12 17:40:56 +0000156 // Its actual value will get filled in later.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000157}
158
159 //===------------------------------------------------------------===//
160 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
161 // methods. This is because owned pointers are usually "batched" //
162 // together for efficiency. //
163 //===------------------------------------------------------------===//
164
165void ScopedDecl::EmitOutRec(Serializer& S) const {
166 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000167}
168
Sam Bishope2563ca2008-04-07 21:55:54 +0000169void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000170 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000171 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000172}
173
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000174//===----------------------------------------------------------------------===//
175// Common serialization logic for subclasses of ValueDecl.
176//===----------------------------------------------------------------------===//
177
178void ValueDecl::EmitInRec(Serializer& S) const {
179 ScopedDecl::EmitInRec(S);
180 S.Emit(getType()); // From ValueDecl.
181}
182
Sam Bishope2563ca2008-04-07 21:55:54 +0000183void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
184 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000185 DeclType = QualType::ReadVal(D); // From ValueDecl.
186}
187
188//===----------------------------------------------------------------------===//
189// Common serialization logic for subclasses of VarDecl.
190//===----------------------------------------------------------------------===//
191
192void VarDecl::EmitInRec(Serializer& S) const {
193 ValueDecl::EmitInRec(S);
194 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000195}
196
Sam Bishope2563ca2008-04-07 21:55:54 +0000197void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
198 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000199 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000200}
201
202 //===------------------------------------------------------------===//
203 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
204 // the one define in ScopedDecl. This is to batch emit the //
205 // owned pointers, which results in a smaller output.
206 //===------------------------------------------------------------===//
207
208void VarDecl::EmitOutRec(Serializer& S) const {
209 // Emit these last because they will create records of their own.
210 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
211 getNextDeclarator()); // From ScopedDecl.
212}
213
Sam Bishope2563ca2008-04-07 21:55:54 +0000214void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000215 Decl* next_declarator;
216
Sam Bishope2563ca2008-04-07 21:55:54 +0000217 D.BatchReadOwnedPtrs(Init, // From VarDecl.
218 next_declarator, // From ScopedDecl.
219 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000220
221 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000222}
223
224
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000225void VarDecl::EmitImpl(Serializer& S) const {
226 VarDecl::EmitInRec(S);
227 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000228}
229
Sam Bishope2563ca2008-04-07 21:55:54 +0000230void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
231 ReadInRec(D, C);
232 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000233}
234
235//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000236// TranslationUnitDecl Serialization.
237//===----------------------------------------------------------------------===//
238
239void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
240{
241 Decl::EmitInRec(S);
242}
243
244TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
245 ASTContext& C) {
246 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000247 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000248
249 decl->Decl::ReadInRec(D, C);
250
251 return decl;
252}
253
254//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000255// NamespaceDecl Serialization.
256//===----------------------------------------------------------------------===//
257
258void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
259{
260 ScopedDecl::EmitInRec(S);
261 S.Emit(getLBracLoc());
262 S.Emit(getRBracLoc());
263 ScopedDecl::EmitOutRec(S);
264}
265
266NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
267 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
268 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
269
270 decl->ScopedDecl::ReadInRec(D, C);
271 decl->LBracLoc = SourceLocation::ReadVal(D);
272 decl->RBracLoc = SourceLocation::ReadVal(D);
273 decl->ScopedDecl::ReadOutRec(D, C);
274
275 return decl;
276}
277
278//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000279// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000280//===----------------------------------------------------------------------===//
281
Steve Naroff248a7532008-04-15 22:42:06 +0000282VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
283 void *Mem = C.getAllocator().Allocate<VarDecl>();
284 VarDecl* decl =
285 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000286
Sam Bishope2563ca2008-04-07 21:55:54 +0000287 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000288 return decl;
289}
290
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000291//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000292// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000293//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000294
Ted Kremenek137bd912007-12-13 06:28:13 +0000295void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
296 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000297 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000298 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000299}
300
Sam Bishope2563ca2008-04-07 21:55:54 +0000301ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000302 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
303 ParmVarDecl* decl = new (Mem)
304 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000305
Sam Bishope2563ca2008-04-07 21:55:54 +0000306 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000307 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000308 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000309 return decl;
310}
311
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000312//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000313// EnumDecl Serialization.
314//===----------------------------------------------------------------------===//
315
316void EnumDecl::EmitImpl(Serializer& S) const {
317 ScopedDecl::EmitInRec(S);
318 S.EmitBool(isDefinition());
319 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000320 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000321}
322
Sam Bishope2563ca2008-04-07 21:55:54 +0000323EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000324 void *Mem = C.getAllocator().Allocate<EnumDecl>();
325 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000326
Sam Bishope2563ca2008-04-07 21:55:54 +0000327 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000328 decl->setDefinition(D.ReadBool());
329 decl->IntegerType = QualType::ReadVal(D);
330
331 Decl* next_declarator;
332 Decl* Elist;
333
Sam Bishope2563ca2008-04-07 21:55:54 +0000334 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000335
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000336 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000337 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
338
339 return decl;
340}
341
342//===----------------------------------------------------------------------===//
343// EnumConstantDecl Serialization.
344//===----------------------------------------------------------------------===//
345
346void EnumConstantDecl::EmitImpl(Serializer& S) const {
347 S.Emit(Val);
348 ValueDecl::EmitInRec(S);
349 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
350}
351
Sam Bishope2563ca2008-04-07 21:55:54 +0000352EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000353 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000354 D.Read(val);
355
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000356 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
357 EnumConstantDecl* decl = new (Mem)
358 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000359
Sam Bishope2563ca2008-04-07 21:55:54 +0000360 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000361
362 Decl* next_declarator;
363
Sam Bishope2563ca2008-04-07 21:55:54 +0000364 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000365
Ted Kremenek049b1682007-11-14 23:38:09 +0000366 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000367
368 return decl;
369}
370
371//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000372// FieldDecl Serialization.
373//===----------------------------------------------------------------------===//
374
375void FieldDecl::EmitImpl(Serializer& S) const {
376 S.Emit(getType());
377 NamedDecl::EmitInRec(S);
378 S.EmitOwnedPtr(BitWidth);
379}
380
Sam Bishope2563ca2008-04-07 21:55:54 +0000381FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000382 void *Mem = C.getAllocator().Allocate<FieldDecl>();
383 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000384 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000385 decl->ReadInRec(D, C);
386 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000387 return decl;
388}
389
390//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000391// FunctionDecl Serialization.
392//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000393
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000394void FunctionDecl::EmitImpl(Serializer& S) const {
395 S.EmitInt(SClass); // From FunctionDecl.
396 S.EmitBool(IsInline); // From FunctionDecl.
397 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000398 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000399
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000400 // NOTE: We do not need to serialize out the number of parameters, because
401 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000402
Ted Kremenekd437f232007-11-13 22:51:08 +0000403 if (ParamInfo != NULL) {
404 S.EmitBool(true);
405 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
406 getNextDeclarator());
407 }
408 else {
409 S.EmitBool(false);
410 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
411 }
Ted Kremenek04973312007-11-02 18:05:11 +0000412}
413
Sam Bishope2563ca2008-04-07 21:55:54 +0000414FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000415 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
416 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000417
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000418 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
419 FunctionDecl* decl = new (Mem)
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000420 FunctionDecl(Function, 0, SourceLocation(), NULL,
421 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000422
Sam Bishope2563ca2008-04-07 21:55:54 +0000423 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000424 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000425
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000426 Decl* next_declarator;
427
Ted Kremenekd437f232007-11-13 22:51:08 +0000428 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000429
430 decl->ParamInfo = hasParamDecls
431 ? new ParmVarDecl*[decl->getNumParams()]
432 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000433
434 if (hasParamDecls)
435 D.BatchReadOwnedPtrs(decl->getNumParams(),
436 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000437 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000438 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000439 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000440
441 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000442
443 return decl;
444}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000445
Steve Naroff56ee6892008-10-08 17:01:13 +0000446void BlockDecl::EmitImpl(Serializer& S) const {
447 // FIXME: what about arguments?
448 S.Emit(getCaretLocation());
449 S.EmitOwnedPtr(Body);
450}
451
452BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
453 QualType Q = QualType::ReadVal(D);
454 SourceLocation L = SourceLocation::ReadVal(D);
455 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
456 assert(0 && "Cannot deserialize BlockBlockExpr yet");
457 // FIXME: need to handle parameters.
458 //return new BlockBlockExpr(L, Q, BodyStmt);
459 return 0;
460}
461
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000462//===----------------------------------------------------------------------===//
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000463// OverloadedFunctionDecl Serialization.
464//===----------------------------------------------------------------------===//
465
466void OverloadedFunctionDecl::EmitImpl(Serializer& S) const {
467 NamedDecl::EmitInRec(S);
468
469 S.EmitInt(getNumFunctions());
470 for (unsigned func = 0; func < getNumFunctions(); ++func)
471 S.EmitPtr(Functions[func]);
472}
473
474OverloadedFunctionDecl *
475OverloadedFunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
476 void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>();
477 OverloadedFunctionDecl* decl = new (Mem)
478 OverloadedFunctionDecl(0, NULL);
479
480 decl->NamedDecl::ReadInRec(D, C);
481
482 unsigned numFunctions = D.ReadInt();
483 decl->Functions.reserve(numFunctions);
484 for (unsigned func = 0; func < numFunctions; ++func)
485 D.ReadPtr(decl->Functions[func]);
486
487 return decl;
488}
489
490//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000491// RecordDecl Serialization.
492//===----------------------------------------------------------------------===//
493
Ted Kremenek583e0082007-11-14 18:12:19 +0000494void RecordDecl::EmitImpl(Serializer& S) const {
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000495 S.EmitInt(getTagKind());
496
Ted Kremenekaad48b62007-11-14 08:06:37 +0000497 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000498 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000499 S.EmitBool(hasFlexibleArrayMember());
500 S.EmitSInt(getNumMembers());
501 if (getNumMembers() > 0) {
502 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000503 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000504 }
505 else
506 ScopedDecl::EmitOutRec(S);
507}
508
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000509RecordDecl* RecordDecl::CreateImpl(Deserializer& D, ASTContext& C) {
510 TagKind TK = TagKind(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000511
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000512 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000513 RecordDecl* decl = new (Mem) RecordDecl(Record, TK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000514
Sam Bishope2563ca2008-04-07 21:55:54 +0000515 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000516 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000517 decl->setHasFlexibleArrayMember(D.ReadBool());
518 decl->NumMembers = D.ReadSInt();
519
520 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000521 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
522
523 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000524 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000525 }
526 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000527 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000528
529 return decl;
530}
531
532//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000533// TypedefDecl Serialization.
534//===----------------------------------------------------------------------===//
535
536void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000537 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000538 ScopedDecl::EmitInRec(S);
539 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000540}
541
Sam Bishope2563ca2008-04-07 21:55:54 +0000542TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000543 QualType T = QualType::ReadVal(D);
544
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000545 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
546 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000547
Sam Bishope2563ca2008-04-07 21:55:54 +0000548 decl->ScopedDecl::ReadInRec(D, C);
549 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000550
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000551 return decl;
552}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000553
554//===----------------------------------------------------------------------===//
555// LinkageSpec Serialization.
556//===----------------------------------------------------------------------===//
557
558void LinkageSpecDecl::EmitInRec(Serializer& S) const {
559 Decl::EmitInRec(S);
560 S.EmitInt(getLanguage());
561 S.EmitPtr(D);
562}
563
Sam Bishope2563ca2008-04-07 21:55:54 +0000564void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
565 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000566 Language = static_cast<LanguageIDs>(D.ReadInt());
567 D.ReadPtr(this->D);
568}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000569
570//===----------------------------------------------------------------------===//
571// FileScopeAsm Serialization.
572//===----------------------------------------------------------------------===//
573
574void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
575{
576 Decl::EmitInRec(S);
577 S.EmitOwnedPtr(AsmString);
578}
579
Sam Bishope2563ca2008-04-07 21:55:54 +0000580FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000581 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
582 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000583
Sam Bishope2563ca2008-04-07 21:55:54 +0000584 decl->Decl::ReadInRec(D, C);
585 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000586// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
587
588 return decl;
589}