blob: 82a8fcd0f6209057d162215fd3aee855da37d98c [file] [log] [blame]
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +00001//===--- DeclSerialization.cpp - Serialization of Decls ---------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Gabor Greif843e9342008-03-06 10:40:09 +000010// This file defines methods that implement bitcode serialization for Decls.
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000011//
12//===----------------------------------------------------------------------===//
13
Sam Bishopf3c63ae2008-04-11 14:49:10 +000014#include "clang/AST/ASTContext.h"
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000015#include "clang/AST/Decl.h"
16#include "clang/AST/Expr.h"
17#include "llvm/Bitcode/Serialize.h"
18#include "llvm/Bitcode/Deserialize.h"
19
Ted Kremenek928fd7f2007-11-13 00:15:39 +000020using llvm::Serializer;
21using llvm::Deserializer;
22using llvm::SerializedPtrID;
23
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000024using namespace clang;
25
Ted Kremenek928fd7f2007-11-13 00:15:39 +000026//===----------------------------------------------------------------------===//
27// Decl Serialization: Dispatch code to handle specialized decl types.
28//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000029
Ted Kremenek928fd7f2007-11-13 00:15:39 +000030void Decl::Emit(Serializer& S) const {
31 S.EmitInt(getKind());
32 EmitImpl(S);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000033 if (const DeclContext *DC = dyn_cast<const DeclContext>(this))
34 DC->EmitOutRec(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000035}
36
Sam Bishope2563ca2008-04-07 21:55:54 +000037Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000038
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000039 Decl *Dcl;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000040 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000041
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000042 switch (k) {
43 default:
44 assert (false && "Not implemented.");
45 break;
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;
78
79 case Class:
Ted Kremenek5f670ed2007-11-14 21:15:42 +000080 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000081 case Struct:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000082 Dcl = RecordDecl::CreateImpl(k, D, C);
83 break;
Ted Kremenekaad48b62007-11-14 08:06:37 +000084
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000085 case Typedef:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000086 Dcl = TypedefDecl::CreateImpl(D, C);
87 break;
Anders Carlssondfab6cb2008-02-08 00:33:21 +000088
89 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000090 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
91 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000092 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000093
94 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
95 DC->ReadOutRec(D, C);
96
97 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000098}
Ted Kremenek04973312007-11-02 18:05:11 +000099
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000100//===----------------------------------------------------------------------===//
101// Common serialization logic for subclasses of Decl.
102//===----------------------------------------------------------------------===//
103
104void Decl::EmitInRec(Serializer& S) const {
105 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000106}
107
Sam Bishope2563ca2008-04-07 21:55:54 +0000108void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000109 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000110}
111
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000112//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000113// Common serialization logic for subclasses of DeclContext.
114//===----------------------------------------------------------------------===//
115
116void DeclContext::EmitOutRec(Serializer& S) const {
117 S.EmitPtr(DeclChain);
118}
119
120void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
121 D.ReadPtr(DeclChain);
122}
123
124//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000125// Common serialization logic for subclasses of NamedDecl.
126//===----------------------------------------------------------------------===//
127
128void NamedDecl::EmitInRec(Serializer& S) const {
129 Decl::EmitInRec(S);
130 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000131}
132
Sam Bishope2563ca2008-04-07 21:55:54 +0000133void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
134 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000135 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000136}
137
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000138//===----------------------------------------------------------------------===//
139// Common serialization logic for subclasses of ScopedDecl.
140//===----------------------------------------------------------------------===//
141
142void ScopedDecl::EmitInRec(Serializer& S) const {
143 NamedDecl::EmitInRec(S);
144 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000145 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000146}
147
Sam Bishope2563ca2008-04-07 21:55:54 +0000148void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
149 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000150 D.ReadPtr(Next); // From ScopedDecl.
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000151
Ted Kremenekadbb6192008-05-12 17:42:30 +0000152 assert(DeclCtx == 0); // Allow back-patching. Observe that we register
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000153 D.ReadPtr(DeclCtx); // the variable of the *object* for back-patching.
Ted Kremenek81edea82008-05-12 17:40:56 +0000154 // Its actual value will get filled in later.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000155}
156
157 //===------------------------------------------------------------===//
158 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
159 // methods. This is because owned pointers are usually "batched" //
160 // together for efficiency. //
161 //===------------------------------------------------------------===//
162
163void ScopedDecl::EmitOutRec(Serializer& S) const {
164 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000165}
166
Sam Bishope2563ca2008-04-07 21:55:54 +0000167void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000168 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000169 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000170}
171
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000172//===----------------------------------------------------------------------===//
173// Common serialization logic for subclasses of ValueDecl.
174//===----------------------------------------------------------------------===//
175
176void ValueDecl::EmitInRec(Serializer& S) const {
177 ScopedDecl::EmitInRec(S);
178 S.Emit(getType()); // From ValueDecl.
179}
180
Sam Bishope2563ca2008-04-07 21:55:54 +0000181void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
182 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000183 DeclType = QualType::ReadVal(D); // From ValueDecl.
184}
185
186//===----------------------------------------------------------------------===//
187// Common serialization logic for subclasses of VarDecl.
188//===----------------------------------------------------------------------===//
189
190void VarDecl::EmitInRec(Serializer& S) const {
191 ValueDecl::EmitInRec(S);
192 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000193}
194
Sam Bishope2563ca2008-04-07 21:55:54 +0000195void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
196 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000197 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000198}
199
200 //===------------------------------------------------------------===//
201 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
202 // the one define in ScopedDecl. This is to batch emit the //
203 // owned pointers, which results in a smaller output.
204 //===------------------------------------------------------------===//
205
206void VarDecl::EmitOutRec(Serializer& S) const {
207 // Emit these last because they will create records of their own.
208 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
209 getNextDeclarator()); // From ScopedDecl.
210}
211
Sam Bishope2563ca2008-04-07 21:55:54 +0000212void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000213 Decl* next_declarator;
214
Sam Bishope2563ca2008-04-07 21:55:54 +0000215 D.BatchReadOwnedPtrs(Init, // From VarDecl.
216 next_declarator, // From ScopedDecl.
217 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000218
219 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000220}
221
222
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000223void VarDecl::EmitImpl(Serializer& S) const {
224 VarDecl::EmitInRec(S);
225 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000226}
227
Sam Bishope2563ca2008-04-07 21:55:54 +0000228void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
229 ReadInRec(D, C);
230 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000231}
232
233//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000234// TranslationUnitDecl Serialization.
235//===----------------------------------------------------------------------===//
236
237void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
238{
239 Decl::EmitInRec(S);
240}
241
242TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
243 ASTContext& C) {
244 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000245 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000246
247 decl->Decl::ReadInRec(D, C);
248
249 return decl;
250}
251
252//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000253// NamespaceDecl Serialization.
254//===----------------------------------------------------------------------===//
255
256void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
257{
258 ScopedDecl::EmitInRec(S);
259 S.Emit(getLBracLoc());
260 S.Emit(getRBracLoc());
261 ScopedDecl::EmitOutRec(S);
262}
263
264NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
265 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
266 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
267
268 decl->ScopedDecl::ReadInRec(D, C);
269 decl->LBracLoc = SourceLocation::ReadVal(D);
270 decl->RBracLoc = SourceLocation::ReadVal(D);
271 decl->ScopedDecl::ReadOutRec(D, C);
272
273 return decl;
274}
275
276//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000277// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000278//===----------------------------------------------------------------------===//
279
Steve Naroff248a7532008-04-15 22:42:06 +0000280VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
281 void *Mem = C.getAllocator().Allocate<VarDecl>();
282 VarDecl* decl =
283 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000284
Sam Bishope2563ca2008-04-07 21:55:54 +0000285 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000286 return decl;
287}
288
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000289//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000290// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000291//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000292
Ted Kremenek137bd912007-12-13 06:28:13 +0000293void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
294 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000295 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000296 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000297}
298
Sam Bishope2563ca2008-04-07 21:55:54 +0000299ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000300 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
301 ParmVarDecl* decl = new (Mem)
302 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000303
Sam Bishope2563ca2008-04-07 21:55:54 +0000304 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000305 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000306 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000307 return decl;
308}
309
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000310//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000311// EnumDecl Serialization.
312//===----------------------------------------------------------------------===//
313
314void EnumDecl::EmitImpl(Serializer& S) const {
315 ScopedDecl::EmitInRec(S);
316 S.EmitBool(isDefinition());
317 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000318 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000319}
320
Sam Bishope2563ca2008-04-07 21:55:54 +0000321EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000322 void *Mem = C.getAllocator().Allocate<EnumDecl>();
323 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000324
Sam Bishope2563ca2008-04-07 21:55:54 +0000325 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000326 decl->setDefinition(D.ReadBool());
327 decl->IntegerType = QualType::ReadVal(D);
328
329 Decl* next_declarator;
330 Decl* Elist;
331
Sam Bishope2563ca2008-04-07 21:55:54 +0000332 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000333
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000334 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000335 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
336
337 return decl;
338}
339
340//===----------------------------------------------------------------------===//
341// EnumConstantDecl Serialization.
342//===----------------------------------------------------------------------===//
343
344void EnumConstantDecl::EmitImpl(Serializer& S) const {
345 S.Emit(Val);
346 ValueDecl::EmitInRec(S);
347 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
348}
349
Sam Bishope2563ca2008-04-07 21:55:54 +0000350EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000351 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000352 D.Read(val);
353
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000354 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
355 EnumConstantDecl* decl = new (Mem)
356 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000357
Sam Bishope2563ca2008-04-07 21:55:54 +0000358 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000359
360 Decl* next_declarator;
361
Sam Bishope2563ca2008-04-07 21:55:54 +0000362 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000363
Ted Kremenek049b1682007-11-14 23:38:09 +0000364 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000365
366 return decl;
367}
368
369//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000370// FieldDecl Serialization.
371//===----------------------------------------------------------------------===//
372
373void FieldDecl::EmitImpl(Serializer& S) const {
374 S.Emit(getType());
375 NamedDecl::EmitInRec(S);
376 S.EmitOwnedPtr(BitWidth);
377}
378
Sam Bishope2563ca2008-04-07 21:55:54 +0000379FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000380 void *Mem = C.getAllocator().Allocate<FieldDecl>();
381 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000382 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000383 decl->ReadInRec(D, C);
384 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000385 return decl;
386}
387
388//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000389// FunctionDecl Serialization.
390//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000391
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000392void FunctionDecl::EmitImpl(Serializer& S) const {
393 S.EmitInt(SClass); // From FunctionDecl.
394 S.EmitBool(IsInline); // From FunctionDecl.
395 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000396 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000397
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000398 // NOTE: We do not need to serialize out the number of parameters, because
399 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000400
Ted Kremenekd437f232007-11-13 22:51:08 +0000401 if (ParamInfo != NULL) {
402 S.EmitBool(true);
403 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
404 getNextDeclarator());
405 }
406 else {
407 S.EmitBool(false);
408 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
409 }
Ted Kremenek04973312007-11-02 18:05:11 +0000410}
411
Sam Bishope2563ca2008-04-07 21:55:54 +0000412FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000413 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
414 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000415
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000416 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
417 FunctionDecl* decl = new (Mem)
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000418 FunctionDecl(Function, 0, SourceLocation(), NULL,
419 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000420
Sam Bishope2563ca2008-04-07 21:55:54 +0000421 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000422 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000423
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000424 Decl* next_declarator;
425
Ted Kremenekd437f232007-11-13 22:51:08 +0000426 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000427
428 decl->ParamInfo = hasParamDecls
429 ? new ParmVarDecl*[decl->getNumParams()]
430 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000431
432 if (hasParamDecls)
433 D.BatchReadOwnedPtrs(decl->getNumParams(),
434 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000435 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000436 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000437 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000438
439 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000440
441 return decl;
442}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000443
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000444//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000445// RecordDecl Serialization.
446//===----------------------------------------------------------------------===//
447
Ted Kremenek583e0082007-11-14 18:12:19 +0000448void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000449 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000450 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000451 S.EmitBool(hasFlexibleArrayMember());
Ted Kremenek6812a732008-09-02 20:42:52 +0000452 S.EmitPtr(NextDecl);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000453 S.EmitSInt(getNumMembers());
454 if (getNumMembers() > 0) {
455 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000456 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000457 }
458 else
459 ScopedDecl::EmitOutRec(S);
460}
461
Sam Bishope2563ca2008-04-07 21:55:54 +0000462RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
463 ASTContext& C) {
464
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000465 void *Mem = C.getAllocator().Allocate<RecordDecl>();
466 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000467
Sam Bishope2563ca2008-04-07 21:55:54 +0000468 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000469 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000470 decl->setHasFlexibleArrayMember(D.ReadBool());
Ted Kremenek6812a732008-09-02 20:42:52 +0000471 D.ReadPtr(decl->NextDecl); // Allow backpatching.
Ted Kremenekaad48b62007-11-14 08:06:37 +0000472 decl->NumMembers = D.ReadSInt();
473
474 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000475 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
476
477 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000478 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000479 }
480 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000481 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000482
483 return decl;
484}
485
486//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000487// TypedefDecl Serialization.
488//===----------------------------------------------------------------------===//
489
490void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000491 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000492 ScopedDecl::EmitInRec(S);
493 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000494}
495
Sam Bishope2563ca2008-04-07 21:55:54 +0000496TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000497 QualType T = QualType::ReadVal(D);
498
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000499 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
500 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000501
Sam Bishope2563ca2008-04-07 21:55:54 +0000502 decl->ScopedDecl::ReadInRec(D, C);
503 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000504
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000505 return decl;
506}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000507
508//===----------------------------------------------------------------------===//
509// LinkageSpec Serialization.
510//===----------------------------------------------------------------------===//
511
512void LinkageSpecDecl::EmitInRec(Serializer& S) const {
513 Decl::EmitInRec(S);
514 S.EmitInt(getLanguage());
515 S.EmitPtr(D);
516}
517
Sam Bishope2563ca2008-04-07 21:55:54 +0000518void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
519 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000520 Language = static_cast<LanguageIDs>(D.ReadInt());
521 D.ReadPtr(this->D);
522}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000523
524//===----------------------------------------------------------------------===//
525// FileScopeAsm Serialization.
526//===----------------------------------------------------------------------===//
527
528void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
529{
530 Decl::EmitInRec(S);
531 S.EmitOwnedPtr(AsmString);
532}
533
Sam Bishope2563ca2008-04-07 21:55:54 +0000534FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000535 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
536 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000537
Sam Bishope2563ca2008-04-07 21:55:54 +0000538 decl->Decl::ReadInRec(D, C);
539 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000540// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
541
542 return decl;
543}