blob: 6186649e70ab3a6e74e7e305b09195f68a66183d [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
Steve Naroff248a7532008-04-15 22:42:06 +000047 case Var:
48 return VarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000049
Ted Kremenek583e0082007-11-14 18:12:19 +000050 case Enum:
Sam Bishope2563ca2008-04-07 21:55:54 +000051 return EnumDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000052
53 case EnumConstant:
Sam Bishope2563ca2008-04-07 21:55:54 +000054 return EnumConstantDecl::CreateImpl(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +000055
Ted Kremenekf9d56c82007-11-14 17:47:01 +000056 case Field:
Sam Bishope2563ca2008-04-07 21:55:54 +000057 return FieldDecl::CreateImpl(D, C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +000058
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000059 case ParmVar:
Sam Bishope2563ca2008-04-07 21:55:54 +000060 return ParmVarDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000061
62 case Function:
Sam Bishope2563ca2008-04-07 21:55:54 +000063 return FunctionDecl::CreateImpl(D, C);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000064
65 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000066 case Struct:
Sam Bishope2563ca2008-04-07 21:55:54 +000067 return RecordDecl::CreateImpl(k, D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +000068
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000069 case Typedef:
Sam Bishope2563ca2008-04-07 21:55:54 +000070 return TypedefDecl::CreateImpl(D, C);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000071
72 case FileScopeAsm:
Sam Bishope2563ca2008-04-07 21:55:54 +000073 return FileScopeAsmDecl::CreateImpl(D, C);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000074 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000075}
Ted Kremenek04973312007-11-02 18:05:11 +000076
Ted Kremenek928fd7f2007-11-13 00:15:39 +000077//===----------------------------------------------------------------------===//
78// Common serialization logic for subclasses of Decl.
79//===----------------------------------------------------------------------===//
80
81void Decl::EmitInRec(Serializer& S) const {
82 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000083}
84
Sam Bishope2563ca2008-04-07 21:55:54 +000085void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000086 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000087}
88
Ted Kremenek928fd7f2007-11-13 00:15:39 +000089//===----------------------------------------------------------------------===//
90// Common serialization logic for subclasses of NamedDecl.
91//===----------------------------------------------------------------------===//
92
93void NamedDecl::EmitInRec(Serializer& S) const {
94 Decl::EmitInRec(S);
95 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000096}
97
Sam Bishope2563ca2008-04-07 21:55:54 +000098void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
99 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000100 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000101}
102
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000103//===----------------------------------------------------------------------===//
104// Common serialization logic for subclasses of ScopedDecl.
105//===----------------------------------------------------------------------===//
106
107void ScopedDecl::EmitInRec(Serializer& S) const {
108 NamedDecl::EmitInRec(S);
109 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000110 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000111}
112
Sam Bishope2563ca2008-04-07 21:55:54 +0000113void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
114 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000115 D.ReadPtr(Next); // From ScopedDecl.
Chris Lattner0ed844b2008-04-04 06:12:32 +0000116 Decl *TmpD;
117 D.ReadPtr(TmpD); // From ScopedDecl.
Chris Lattner9fdf9c62008-04-22 18:39:57 +0000118 DeclCtx = cast_or_null<DeclContext>(TmpD);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000119}
120
121 //===------------------------------------------------------------===//
122 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
123 // methods. This is because owned pointers are usually "batched" //
124 // together for efficiency. //
125 //===------------------------------------------------------------===//
126
127void ScopedDecl::EmitOutRec(Serializer& S) const {
128 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000129}
130
Sam Bishope2563ca2008-04-07 21:55:54 +0000131void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000132 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000133 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000134}
135
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000136//===----------------------------------------------------------------------===//
137// Common serialization logic for subclasses of ValueDecl.
138//===----------------------------------------------------------------------===//
139
140void ValueDecl::EmitInRec(Serializer& S) const {
141 ScopedDecl::EmitInRec(S);
142 S.Emit(getType()); // From ValueDecl.
143}
144
Sam Bishope2563ca2008-04-07 21:55:54 +0000145void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
146 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000147 DeclType = QualType::ReadVal(D); // From ValueDecl.
148}
149
150//===----------------------------------------------------------------------===//
151// Common serialization logic for subclasses of VarDecl.
152//===----------------------------------------------------------------------===//
153
154void VarDecl::EmitInRec(Serializer& S) const {
155 ValueDecl::EmitInRec(S);
156 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000157}
158
Sam Bishope2563ca2008-04-07 21:55:54 +0000159void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
160 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000161 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000162}
163
164 //===------------------------------------------------------------===//
165 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
166 // the one define in ScopedDecl. This is to batch emit the //
167 // owned pointers, which results in a smaller output.
168 //===------------------------------------------------------------===//
169
170void VarDecl::EmitOutRec(Serializer& S) const {
171 // Emit these last because they will create records of their own.
172 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
173 getNextDeclarator()); // From ScopedDecl.
174}
175
Sam Bishope2563ca2008-04-07 21:55:54 +0000176void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000177 Decl* next_declarator;
178
Sam Bishope2563ca2008-04-07 21:55:54 +0000179 D.BatchReadOwnedPtrs(Init, // From VarDecl.
180 next_declarator, // From ScopedDecl.
181 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000182
183 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000184}
185
186
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000187void VarDecl::EmitImpl(Serializer& S) const {
188 VarDecl::EmitInRec(S);
189 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000190}
191
Sam Bishope2563ca2008-04-07 21:55:54 +0000192void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
193 ReadInRec(D, C);
194 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000195}
196
197//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000198// TranslationUnitDecl Serialization.
199//===----------------------------------------------------------------------===//
200
201void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
202{
203 Decl::EmitInRec(S);
204}
205
206TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
207 ASTContext& C) {
208 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
209 TranslationUnitDecl* decl =
210 new (Mem) TranslationUnitDecl();
211
212 decl->Decl::ReadInRec(D, C);
213
214 return decl;
215}
216
217//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000218// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000219//===----------------------------------------------------------------------===//
220
Steve Naroff248a7532008-04-15 22:42:06 +0000221VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
222 void *Mem = C.getAllocator().Allocate<VarDecl>();
223 VarDecl* decl =
224 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000225
Sam Bishope2563ca2008-04-07 21:55:54 +0000226 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000227
Ted Kremenek04973312007-11-02 18:05:11 +0000228 return decl;
229}
230
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000231//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000232// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000233//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000234
Ted Kremenek137bd912007-12-13 06:28:13 +0000235void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
236 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000237 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000238 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000239}
240
Sam Bishope2563ca2008-04-07 21:55:54 +0000241ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000242 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
243 ParmVarDecl* decl = new (Mem)
244 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000245
Sam Bishope2563ca2008-04-07 21:55:54 +0000246 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000247 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000248 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000249 return decl;
250}
251
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000252//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000253// EnumDecl Serialization.
254//===----------------------------------------------------------------------===//
255
256void EnumDecl::EmitImpl(Serializer& S) const {
257 ScopedDecl::EmitInRec(S);
258 S.EmitBool(isDefinition());
259 S.Emit(IntegerType);
260 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
261}
262
Sam Bishope2563ca2008-04-07 21:55:54 +0000263EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000264 void *Mem = C.getAllocator().Allocate<EnumDecl>();
265 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000266
Sam Bishope2563ca2008-04-07 21:55:54 +0000267 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000268 decl->setDefinition(D.ReadBool());
269 decl->IntegerType = QualType::ReadVal(D);
270
271 Decl* next_declarator;
272 Decl* Elist;
273
Sam Bishope2563ca2008-04-07 21:55:54 +0000274 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000275
276 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
277 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
278
279 return decl;
280}
281
282//===----------------------------------------------------------------------===//
283// EnumConstantDecl Serialization.
284//===----------------------------------------------------------------------===//
285
286void EnumConstantDecl::EmitImpl(Serializer& S) const {
287 S.Emit(Val);
288 ValueDecl::EmitInRec(S);
289 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
290}
291
Sam Bishope2563ca2008-04-07 21:55:54 +0000292EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000293 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000294 D.Read(val);
295
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000296 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
297 EnumConstantDecl* decl = new (Mem)
298 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000299
Sam Bishope2563ca2008-04-07 21:55:54 +0000300 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000301
302 Decl* next_declarator;
303
Sam Bishope2563ca2008-04-07 21:55:54 +0000304 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000305
Ted Kremenek049b1682007-11-14 23:38:09 +0000306 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000307
308 return decl;
309}
310
311//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000312// FieldDecl Serialization.
313//===----------------------------------------------------------------------===//
314
315void FieldDecl::EmitImpl(Serializer& S) const {
316 S.Emit(getType());
317 NamedDecl::EmitInRec(S);
318 S.EmitOwnedPtr(BitWidth);
319}
320
Sam Bishope2563ca2008-04-07 21:55:54 +0000321FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000322 void *Mem = C.getAllocator().Allocate<FieldDecl>();
323 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000324 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000325 decl->ReadInRec(D, C);
326 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000327 return decl;
328}
329
330//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000331// FunctionDecl Serialization.
332//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000333
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000334void FunctionDecl::EmitImpl(Serializer& S) const {
335 S.EmitInt(SClass); // From FunctionDecl.
336 S.EmitBool(IsInline); // From FunctionDecl.
337 ValueDecl::EmitInRec(S);
338 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000339
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000340 // NOTE: We do not need to serialize out the number of parameters, because
341 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000342
Ted Kremenekd437f232007-11-13 22:51:08 +0000343 if (ParamInfo != NULL) {
344 S.EmitBool(true);
345 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
346 getNextDeclarator());
347 }
348 else {
349 S.EmitBool(false);
350 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
351 }
Ted Kremenek04973312007-11-02 18:05:11 +0000352}
353
Sam Bishope2563ca2008-04-07 21:55:54 +0000354FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000355 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
356 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000357
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000358 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
359 FunctionDecl* decl = new (Mem)
360 FunctionDecl(0, SourceLocation(), NULL, QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000361
Sam Bishope2563ca2008-04-07 21:55:54 +0000362 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000363 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000364
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000365 Decl* next_declarator;
366
Ted Kremenekd437f232007-11-13 22:51:08 +0000367 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000368
369 decl->ParamInfo = hasParamDecls
370 ? new ParmVarDecl*[decl->getNumParams()]
371 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000372
373 if (hasParamDecls)
374 D.BatchReadOwnedPtrs(decl->getNumParams(),
375 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000376 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000377 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000378 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000379
380 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000381
382 return decl;
383}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000384
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000385//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000386// RecordDecl Serialization.
387//===----------------------------------------------------------------------===//
388
Ted Kremenek583e0082007-11-14 18:12:19 +0000389void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000390 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000391 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000392 S.EmitBool(hasFlexibleArrayMember());
393 S.EmitSInt(getNumMembers());
394 if (getNumMembers() > 0) {
395 assert (Members);
396 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
397 (Decl**) &Members[0],getNextDeclarator());
398 }
399 else
400 ScopedDecl::EmitOutRec(S);
401}
402
Sam Bishope2563ca2008-04-07 21:55:54 +0000403RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
404 ASTContext& C) {
405
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000406 void *Mem = C.getAllocator().Allocate<RecordDecl>();
407 RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000408
Sam Bishope2563ca2008-04-07 21:55:54 +0000409 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000410 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000411 decl->setHasFlexibleArrayMember(D.ReadBool());
412 decl->NumMembers = D.ReadSInt();
413
414 if (decl->getNumMembers() > 0) {
415 Decl* next_declarator;
416 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
417
418 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
419 (Decl**) &decl->Members[0],
Sam Bishope2563ca2008-04-07 21:55:54 +0000420 next_declarator, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000421
422 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
423 }
424 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000425 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000426
427 return decl;
428}
429
430//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000431// TypedefDecl Serialization.
432//===----------------------------------------------------------------------===//
433
434void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000435 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000436 ScopedDecl::EmitInRec(S);
437 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000438}
439
Sam Bishope2563ca2008-04-07 21:55:54 +0000440TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000441 QualType T = QualType::ReadVal(D);
442
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000443 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
444 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000445
Sam Bishope2563ca2008-04-07 21:55:54 +0000446 decl->ScopedDecl::ReadInRec(D, C);
447 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000448
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000449 return decl;
450}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000451
452//===----------------------------------------------------------------------===//
453// LinkageSpec Serialization.
454//===----------------------------------------------------------------------===//
455
456void LinkageSpecDecl::EmitInRec(Serializer& S) const {
457 Decl::EmitInRec(S);
458 S.EmitInt(getLanguage());
459 S.EmitPtr(D);
460}
461
Sam Bishope2563ca2008-04-07 21:55:54 +0000462void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
463 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000464 Language = static_cast<LanguageIDs>(D.ReadInt());
465 D.ReadPtr(this->D);
466}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000467
468//===----------------------------------------------------------------------===//
469// FileScopeAsm Serialization.
470//===----------------------------------------------------------------------===//
471
472void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
473{
474 Decl::EmitInRec(S);
475 S.EmitOwnedPtr(AsmString);
476}
477
Sam Bishope2563ca2008-04-07 21:55:54 +0000478FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000479 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
480 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000481
Sam Bishope2563ca2008-04-07 21:55:54 +0000482 decl->Decl::ReadInRec(D, C);
483 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000484// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
485
486 return decl;
487}