blob: ca9a15224f6215628387335fd71b383feb67adf7 [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);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000033}
34
Sam Bishope2563ca2008-04-07 21:55:54 +000035Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000036
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000037 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000038
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000039 switch (k) {
40 default:
41 assert (false && "Not implemented.");
42 break;
Chris Lattner0ed844b2008-04-04 06:12:32 +000043
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000044 case TranslationUnit:
45 return TranslationUnitDecl::CreateImpl(D, C);
46
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000047 case Namespace:
48 return NamespaceDecl::CreateImpl(D, C);
49
Steve Naroff248a7532008-04-15 22:42:06 +000050 case Var:
51 return VarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000052
Ted Kremenek583e0082007-11-14 18:12:19 +000053 case Enum:
Sam Bishope2563ca2008-04-07 21:55:54 +000054 return EnumDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000055
56 case EnumConstant:
Sam Bishope2563ca2008-04-07 21:55:54 +000057 return EnumConstantDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000058
Ted Kremenekf9d56c82007-11-14 17:47:01 +000059 case Field:
Sam Bishope2563ca2008-04-07 21:55:54 +000060 return FieldDecl::CreateImpl(D, C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +000061
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000062 case ParmVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000063 return ParmVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000064
65 case Function:
Sam Bishope2563ca2008-04-07 21:55:54 +000066 return FunctionDecl::CreateImpl(D, C);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000067
68 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000069 case Struct:
Sam Bishope2563ca2008-04-07 21:55:54 +000070 return RecordDecl::CreateImpl(k, D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +000071
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000072 case Typedef:
Sam Bishope2563ca2008-04-07 21:55:54 +000073 return TypedefDecl::CreateImpl(D, C);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000074
75 case FileScopeAsm:
Sam Bishope2563ca2008-04-07 21:55:54 +000076 return FileScopeAsmDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000077 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000078}
Ted Kremenek04973312007-11-02 18:05:11 +000079
Ted Kremenek928fd7f2007-11-13 00:15:39 +000080//===----------------------------------------------------------------------===//
81// Common serialization logic for subclasses of Decl.
82//===----------------------------------------------------------------------===//
83
84void Decl::EmitInRec(Serializer& S) const {
85 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000086}
87
Sam Bishope2563ca2008-04-07 21:55:54 +000088void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000089 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000090}
91
Ted Kremenek928fd7f2007-11-13 00:15:39 +000092//===----------------------------------------------------------------------===//
93// Common serialization logic for subclasses of NamedDecl.
94//===----------------------------------------------------------------------===//
95
96void NamedDecl::EmitInRec(Serializer& S) const {
97 Decl::EmitInRec(S);
98 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000099}
100
Sam Bishope2563ca2008-04-07 21:55:54 +0000101void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
102 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000103 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000104}
105
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000106//===----------------------------------------------------------------------===//
107// Common serialization logic for subclasses of ScopedDecl.
108//===----------------------------------------------------------------------===//
109
110void ScopedDecl::EmitInRec(Serializer& S) const {
111 NamedDecl::EmitInRec(S);
112 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000113 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000114}
115
Sam Bishope2563ca2008-04-07 21:55:54 +0000116void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
117 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000118 D.ReadPtr(Next); // From ScopedDecl.
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000119
Ted Kremenekadbb6192008-05-12 17:42:30 +0000120 assert(DeclCtx == 0); // Allow back-patching. Observe that we register
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000121 D.ReadPtr(DeclCtx); // the variable of the *object* for back-patching.
Ted Kremenek81edea82008-05-12 17:40:56 +0000122 // Its actual value will get filled in later.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000123}
124
125 //===------------------------------------------------------------===//
126 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
127 // methods. This is because owned pointers are usually "batched" //
128 // together for efficiency. //
129 //===------------------------------------------------------------===//
130
131void ScopedDecl::EmitOutRec(Serializer& S) const {
132 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000133}
134
Sam Bishope2563ca2008-04-07 21:55:54 +0000135void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000136 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000137 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000138}
139
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000140//===----------------------------------------------------------------------===//
141// Common serialization logic for subclasses of ValueDecl.
142//===----------------------------------------------------------------------===//
143
144void ValueDecl::EmitInRec(Serializer& S) const {
145 ScopedDecl::EmitInRec(S);
146 S.Emit(getType()); // From ValueDecl.
147}
148
Sam Bishope2563ca2008-04-07 21:55:54 +0000149void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
150 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000151 DeclType = QualType::ReadVal(D); // From ValueDecl.
152}
153
154//===----------------------------------------------------------------------===//
155// Common serialization logic for subclasses of VarDecl.
156//===----------------------------------------------------------------------===//
157
158void VarDecl::EmitInRec(Serializer& S) const {
159 ValueDecl::EmitInRec(S);
160 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000161}
162
Sam Bishope2563ca2008-04-07 21:55:54 +0000163void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
164 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000165 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000166}
167
168 //===------------------------------------------------------------===//
169 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
170 // the one define in ScopedDecl. This is to batch emit the //
171 // owned pointers, which results in a smaller output.
172 //===------------------------------------------------------------===//
173
174void VarDecl::EmitOutRec(Serializer& S) const {
175 // Emit these last because they will create records of their own.
176 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
177 getNextDeclarator()); // From ScopedDecl.
178}
179
Sam Bishope2563ca2008-04-07 21:55:54 +0000180void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000181 Decl* next_declarator;
182
Sam Bishope2563ca2008-04-07 21:55:54 +0000183 D.BatchReadOwnedPtrs(Init, // From VarDecl.
184 next_declarator, // From ScopedDecl.
185 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000186
187 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000188}
189
190
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000191void VarDecl::EmitImpl(Serializer& S) const {
192 VarDecl::EmitInRec(S);
193 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000194}
195
Sam Bishope2563ca2008-04-07 21:55:54 +0000196void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
197 ReadInRec(D, C);
198 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000199}
200
201//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000202// TranslationUnitDecl Serialization.
203//===----------------------------------------------------------------------===//
204
205void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
206{
207 Decl::EmitInRec(S);
208}
209
210TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
211 ASTContext& C) {
212 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000213 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000214
215 decl->Decl::ReadInRec(D, C);
216
217 return decl;
218}
219
220//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000221// NamespaceDecl Serialization.
222//===----------------------------------------------------------------------===//
223
224void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
225{
226 ScopedDecl::EmitInRec(S);
227 S.Emit(getLBracLoc());
228 S.Emit(getRBracLoc());
229 ScopedDecl::EmitOutRec(S);
230}
231
232NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
233 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
234 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
235
236 decl->ScopedDecl::ReadInRec(D, C);
237 decl->LBracLoc = SourceLocation::ReadVal(D);
238 decl->RBracLoc = SourceLocation::ReadVal(D);
239 decl->ScopedDecl::ReadOutRec(D, C);
240
241 return decl;
242}
243
244//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000245// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000246//===----------------------------------------------------------------------===//
247
Steve Naroff248a7532008-04-15 22:42:06 +0000248VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
249 void *Mem = C.getAllocator().Allocate<VarDecl>();
250 VarDecl* decl =
251 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000252
Sam Bishope2563ca2008-04-07 21:55:54 +0000253 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000254 return decl;
255}
256
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000257//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000258// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000259//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000260
Ted Kremenek137bd912007-12-13 06:28:13 +0000261void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
262 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000263 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000264 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000265}
266
Sam Bishope2563ca2008-04-07 21:55:54 +0000267ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000268 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
269 ParmVarDecl* decl = new (Mem)
270 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000271
Sam Bishope2563ca2008-04-07 21:55:54 +0000272 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000273 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000274 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000275 return decl;
276}
277
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000278//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000279// EnumDecl Serialization.
280//===----------------------------------------------------------------------===//
281
282void EnumDecl::EmitImpl(Serializer& S) const {
283 ScopedDecl::EmitInRec(S);
284 S.EmitBool(isDefinition());
285 S.Emit(IntegerType);
286 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
287}
288
Sam Bishope2563ca2008-04-07 21:55:54 +0000289EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000290 void *Mem = C.getAllocator().Allocate<EnumDecl>();
291 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000292
Sam Bishope2563ca2008-04-07 21:55:54 +0000293 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000294 decl->setDefinition(D.ReadBool());
295 decl->IntegerType = QualType::ReadVal(D);
296
297 Decl* next_declarator;
298 Decl* Elist;
299
Sam Bishope2563ca2008-04-07 21:55:54 +0000300 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000301
302 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
303 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
304
305 return decl;
306}
307
308//===----------------------------------------------------------------------===//
309// EnumConstantDecl Serialization.
310//===----------------------------------------------------------------------===//
311
312void EnumConstantDecl::EmitImpl(Serializer& S) const {
313 S.Emit(Val);
314 ValueDecl::EmitInRec(S);
315 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
316}
317
Sam Bishope2563ca2008-04-07 21:55:54 +0000318EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000319 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000320 D.Read(val);
321
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000322 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
323 EnumConstantDecl* decl = new (Mem)
324 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000325
Sam Bishope2563ca2008-04-07 21:55:54 +0000326 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000327
328 Decl* next_declarator;
329
Sam Bishope2563ca2008-04-07 21:55:54 +0000330 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000331
Ted Kremenek049b1682007-11-14 23:38:09 +0000332 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000333
334 return decl;
335}
336
337//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000338// FieldDecl Serialization.
339//===----------------------------------------------------------------------===//
340
341void FieldDecl::EmitImpl(Serializer& S) const {
342 S.Emit(getType());
343 NamedDecl::EmitInRec(S);
344 S.EmitOwnedPtr(BitWidth);
345}
346
Sam Bishope2563ca2008-04-07 21:55:54 +0000347FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000348 void *Mem = C.getAllocator().Allocate<FieldDecl>();
349 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000350 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000351 decl->ReadInRec(D, C);
352 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000353 return decl;
354}
355
356//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000357// FunctionDecl Serialization.
358//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000359
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000360void FunctionDecl::EmitImpl(Serializer& S) const {
361 S.EmitInt(SClass); // From FunctionDecl.
362 S.EmitBool(IsInline); // From FunctionDecl.
363 ValueDecl::EmitInRec(S);
364 S.EmitPtr(DeclChain);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000365 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000366
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000367 // NOTE: We do not need to serialize out the number of parameters, because
368 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000369
Ted Kremenekd437f232007-11-13 22:51:08 +0000370 if (ParamInfo != NULL) {
371 S.EmitBool(true);
372 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
373 getNextDeclarator());
374 }
375 else {
376 S.EmitBool(false);
377 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
378 }
Ted Kremenek04973312007-11-02 18:05:11 +0000379}
380
Sam Bishope2563ca2008-04-07 21:55:54 +0000381FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000382 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
383 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000384
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000385 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
386 FunctionDecl* decl = new (Mem)
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000387 FunctionDecl(Function, 0, SourceLocation(), NULL,
388 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000389
Sam Bishope2563ca2008-04-07 21:55:54 +0000390 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000391 D.ReadPtr(decl->DeclChain);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000392 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000393
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000394 Decl* next_declarator;
395
Ted Kremenekd437f232007-11-13 22:51:08 +0000396 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000397
398 decl->ParamInfo = hasParamDecls
399 ? new ParmVarDecl*[decl->getNumParams()]
400 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000401
402 if (hasParamDecls)
403 D.BatchReadOwnedPtrs(decl->getNumParams(),
404 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000405 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000406 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000407 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000408
409 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000410
411 return decl;
412}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000413
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000414//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000415// RecordDecl Serialization.
416//===----------------------------------------------------------------------===//
417
Ted Kremenek583e0082007-11-14 18:12:19 +0000418void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000419 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000420 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000421 S.EmitBool(hasFlexibleArrayMember());
422 S.EmitSInt(getNumMembers());
423 if (getNumMembers() > 0) {
424 assert (Members);
425 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
426 (Decl**) &Members[0],getNextDeclarator());
427 }
428 else
429 ScopedDecl::EmitOutRec(S);
430}
431
Sam Bishope2563ca2008-04-07 21:55:54 +0000432RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
433 ASTContext& C) {
434
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000435 void *Mem = C.getAllocator().Allocate<RecordDecl>();
436 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000437
Sam Bishope2563ca2008-04-07 21:55:54 +0000438 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000439 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000440 decl->setHasFlexibleArrayMember(D.ReadBool());
441 decl->NumMembers = D.ReadSInt();
442
443 if (decl->getNumMembers() > 0) {
444 Decl* next_declarator;
445 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
446
447 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
448 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000449 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000450
451 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
452 }
453 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000454 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000455
456 return decl;
457}
458
459//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000460// TypedefDecl Serialization.
461//===----------------------------------------------------------------------===//
462
463void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000464 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000465 ScopedDecl::EmitInRec(S);
466 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000467}
468
Sam Bishope2563ca2008-04-07 21:55:54 +0000469TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000470 QualType T = QualType::ReadVal(D);
471
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000472 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
473 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000474
Sam Bishope2563ca2008-04-07 21:55:54 +0000475 decl->ScopedDecl::ReadInRec(D, C);
476 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000477
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000478 return decl;
479}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000480
481//===----------------------------------------------------------------------===//
482// LinkageSpec Serialization.
483//===----------------------------------------------------------------------===//
484
485void LinkageSpecDecl::EmitInRec(Serializer& S) const {
486 Decl::EmitInRec(S);
487 S.EmitInt(getLanguage());
488 S.EmitPtr(D);
489}
490
Sam Bishope2563ca2008-04-07 21:55:54 +0000491void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
492 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000493 Language = static_cast<LanguageIDs>(D.ReadInt());
494 D.ReadPtr(this->D);
495}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000496
497//===----------------------------------------------------------------------===//
498// FileScopeAsm Serialization.
499//===----------------------------------------------------------------------===//
500
501void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
502{
503 Decl::EmitInRec(S);
504 S.EmitOwnedPtr(AsmString);
505}
506
Sam Bishope2563ca2008-04-07 21:55:54 +0000507FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000508 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
509 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000510
Sam Bishope2563ca2008-04-07 21:55:54 +0000511 decl->Decl::ReadInRec(D, C);
512 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000513// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
514
515 return decl;
516}