blob: a0befbdbb0852fc756b61f8c815ae5e753760bdc [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.");
Chris Lattner0ed844b2008-04-04 06:12:32 +000045
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000046 case TranslationUnit:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000047 Dcl = TranslationUnitDecl::CreateImpl(D, C);
48 break;
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000049
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000050 case Namespace:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000051 Dcl = NamespaceDecl::CreateImpl(D, C);
52 break;
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000053
Steve Naroff248a7532008-04-15 22:42:06 +000054 case Var:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000055 Dcl = VarDecl::CreateImpl(D, C);
56 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000057
Ted Kremenek583e0082007-11-14 18:12:19 +000058 case Enum:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000059 Dcl = EnumDecl::CreateImpl(D, C);
60 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000061
62 case EnumConstant:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000063 Dcl = EnumConstantDecl::CreateImpl(D, C);
64 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000065
Ted Kremenekf9d56c82007-11-14 17:47:01 +000066 case Field:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000067 Dcl = FieldDecl::CreateImpl(D, C);
68 break;
Ted Kremenekf9d56c82007-11-14 17:47:01 +000069
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000070 case ParmVar:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000071 Dcl = ParmVarDecl::CreateImpl(D, C);
72 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000073
74 case Function:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000075 Dcl = FunctionDecl::CreateImpl(D, C);
76 break;
77
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +000078 case Record:
79 Dcl = RecordDecl::CreateImpl(D, C);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000080 break;
Ted Kremenekaad48b62007-11-14 08:06:37 +000081
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000082 case Typedef:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000083 Dcl = TypedefDecl::CreateImpl(D, C);
84 break;
Anders Carlssondfab6cb2008-02-08 00:33:21 +000085
86 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000087 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
88 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000089 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000090
91 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
92 DC->ReadOutRec(D, C);
93
94 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000095}
Ted Kremenek04973312007-11-02 18:05:11 +000096
Ted Kremenek928fd7f2007-11-13 00:15:39 +000097//===----------------------------------------------------------------------===//
98// Common serialization logic for subclasses of Decl.
99//===----------------------------------------------------------------------===//
100
101void Decl::EmitInRec(Serializer& S) const {
102 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000103}
104
Sam Bishope2563ca2008-04-07 21:55:54 +0000105void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000106 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000107}
108
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000109//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000110// Common serialization logic for subclasses of DeclContext.
111//===----------------------------------------------------------------------===//
112
113void DeclContext::EmitOutRec(Serializer& S) const {
114 S.EmitPtr(DeclChain);
115}
116
117void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
118 D.ReadPtr(DeclChain);
119}
120
121//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000122// Common serialization logic for subclasses of NamedDecl.
123//===----------------------------------------------------------------------===//
124
125void NamedDecl::EmitInRec(Serializer& S) const {
126 Decl::EmitInRec(S);
127 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000128}
129
Sam Bishope2563ca2008-04-07 21:55:54 +0000130void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
131 Decl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000132 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000133}
134
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000135//===----------------------------------------------------------------------===//
136// Common serialization logic for subclasses of ScopedDecl.
137//===----------------------------------------------------------------------===//
138
139void ScopedDecl::EmitInRec(Serializer& S) const {
140 NamedDecl::EmitInRec(S);
141 S.EmitPtr(getNext()); // From ScopedDecl.
Chris Lattnerb048c982008-04-06 04:47:34 +0000142 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000143}
144
Sam Bishope2563ca2008-04-07 21:55:54 +0000145void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
146 NamedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000147 D.ReadPtr(Next); // From ScopedDecl.
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000148
Ted Kremenekadbb6192008-05-12 17:42:30 +0000149 assert(DeclCtx == 0); // Allow back-patching. Observe that we register
Ted Kremenek9f3e89a2008-05-12 17:29:34 +0000150 D.ReadPtr(DeclCtx); // the variable of the *object* for back-patching.
Ted Kremenek81edea82008-05-12 17:40:56 +0000151 // Its actual value will get filled in later.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000152}
153
154 //===------------------------------------------------------------===//
155 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
156 // methods. This is because owned pointers are usually "batched" //
157 // together for efficiency. //
158 //===------------------------------------------------------------===//
159
160void ScopedDecl::EmitOutRec(Serializer& S) const {
161 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000162}
163
Sam Bishope2563ca2008-04-07 21:55:54 +0000164void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000165 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000166 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000167}
168
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000169//===----------------------------------------------------------------------===//
170// Common serialization logic for subclasses of ValueDecl.
171//===----------------------------------------------------------------------===//
172
173void ValueDecl::EmitInRec(Serializer& S) const {
174 ScopedDecl::EmitInRec(S);
175 S.Emit(getType()); // From ValueDecl.
176}
177
Sam Bishope2563ca2008-04-07 21:55:54 +0000178void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
179 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000180 DeclType = QualType::ReadVal(D); // From ValueDecl.
181}
182
183//===----------------------------------------------------------------------===//
184// Common serialization logic for subclasses of VarDecl.
185//===----------------------------------------------------------------------===//
186
187void VarDecl::EmitInRec(Serializer& S) const {
188 ValueDecl::EmitInRec(S);
189 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000190}
191
Sam Bishope2563ca2008-04-07 21:55:54 +0000192void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
193 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000194 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000195}
196
197 //===------------------------------------------------------------===//
198 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
199 // the one define in ScopedDecl. This is to batch emit the //
200 // owned pointers, which results in a smaller output.
201 //===------------------------------------------------------------===//
202
203void VarDecl::EmitOutRec(Serializer& S) const {
204 // Emit these last because they will create records of their own.
205 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
206 getNextDeclarator()); // From ScopedDecl.
207}
208
Sam Bishope2563ca2008-04-07 21:55:54 +0000209void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000210 Decl* next_declarator;
211
Sam Bishope2563ca2008-04-07 21:55:54 +0000212 D.BatchReadOwnedPtrs(Init, // From VarDecl.
213 next_declarator, // From ScopedDecl.
214 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000215
216 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000217}
218
219
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000220void VarDecl::EmitImpl(Serializer& S) const {
221 VarDecl::EmitInRec(S);
222 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000223}
224
Sam Bishope2563ca2008-04-07 21:55:54 +0000225void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
226 ReadInRec(D, C);
227 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000228}
229
230//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000231// TranslationUnitDecl Serialization.
232//===----------------------------------------------------------------------===//
233
234void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
235{
236 Decl::EmitInRec(S);
237}
238
239TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
240 ASTContext& C) {
241 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000242 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000243
244 decl->Decl::ReadInRec(D, C);
245
246 return decl;
247}
248
249//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000250// NamespaceDecl Serialization.
251//===----------------------------------------------------------------------===//
252
253void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
254{
255 ScopedDecl::EmitInRec(S);
256 S.Emit(getLBracLoc());
257 S.Emit(getRBracLoc());
258 ScopedDecl::EmitOutRec(S);
259}
260
261NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
262 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
263 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
264
265 decl->ScopedDecl::ReadInRec(D, C);
266 decl->LBracLoc = SourceLocation::ReadVal(D);
267 decl->RBracLoc = SourceLocation::ReadVal(D);
268 decl->ScopedDecl::ReadOutRec(D, C);
269
270 return decl;
271}
272
273//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000274// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000275//===----------------------------------------------------------------------===//
276
Steve Naroff248a7532008-04-15 22:42:06 +0000277VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
278 void *Mem = C.getAllocator().Allocate<VarDecl>();
279 VarDecl* decl =
280 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000281
Sam Bishope2563ca2008-04-07 21:55:54 +0000282 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000283 return decl;
284}
285
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000286//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000287// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000288//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000289
Ted Kremenek137bd912007-12-13 06:28:13 +0000290void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
291 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000292 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000293 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000294}
295
Sam Bishope2563ca2008-04-07 21:55:54 +0000296ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000297 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
298 ParmVarDecl* decl = new (Mem)
299 ParmVarDecl(0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000300
Sam Bishope2563ca2008-04-07 21:55:54 +0000301 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000302 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000303 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000304 return decl;
305}
306
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000307//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000308// EnumDecl Serialization.
309//===----------------------------------------------------------------------===//
310
311void EnumDecl::EmitImpl(Serializer& S) const {
312 ScopedDecl::EmitInRec(S);
313 S.EmitBool(isDefinition());
314 S.Emit(IntegerType);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000315 S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000316}
317
Sam Bishope2563ca2008-04-07 21:55:54 +0000318EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000319 void *Mem = C.getAllocator().Allocate<EnumDecl>();
320 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000321
Sam Bishope2563ca2008-04-07 21:55:54 +0000322 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000323 decl->setDefinition(D.ReadBool());
324 decl->IntegerType = QualType::ReadVal(D);
325
326 Decl* next_declarator;
327 Decl* Elist;
328
Sam Bishope2563ca2008-04-07 21:55:54 +0000329 D.BatchReadOwnedPtrs(Elist, next_declarator, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000330
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000331 decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
Ted Kremenek583e0082007-11-14 18:12:19 +0000332 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
333
334 return decl;
335}
336
337//===----------------------------------------------------------------------===//
338// EnumConstantDecl Serialization.
339//===----------------------------------------------------------------------===//
340
341void EnumConstantDecl::EmitImpl(Serializer& S) const {
342 S.Emit(Val);
343 ValueDecl::EmitInRec(S);
344 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
345}
346
Sam Bishope2563ca2008-04-07 21:55:54 +0000347EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000348 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000349 D.Read(val);
350
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000351 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
352 EnumConstantDecl* decl = new (Mem)
353 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000354
Sam Bishope2563ca2008-04-07 21:55:54 +0000355 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000356
357 Decl* next_declarator;
358
Sam Bishope2563ca2008-04-07 21:55:54 +0000359 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000360
Ted Kremenek049b1682007-11-14 23:38:09 +0000361 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000362
363 return decl;
364}
365
366//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000367// FieldDecl Serialization.
368//===----------------------------------------------------------------------===//
369
370void FieldDecl::EmitImpl(Serializer& S) const {
371 S.Emit(getType());
372 NamedDecl::EmitInRec(S);
373 S.EmitOwnedPtr(BitWidth);
374}
375
Sam Bishope2563ca2008-04-07 21:55:54 +0000376FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000377 void *Mem = C.getAllocator().Allocate<FieldDecl>();
378 FieldDecl* decl = new (Mem) FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000379 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000380 decl->ReadInRec(D, C);
381 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000382 return decl;
383}
384
385//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000386// FunctionDecl Serialization.
387//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000388
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000389void FunctionDecl::EmitImpl(Serializer& S) const {
390 S.EmitInt(SClass); // From FunctionDecl.
391 S.EmitBool(IsInline); // From FunctionDecl.
392 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000393 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000394
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000395 // NOTE: We do not need to serialize out the number of parameters, because
396 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000397
Ted Kremenekd437f232007-11-13 22:51:08 +0000398 if (ParamInfo != NULL) {
399 S.EmitBool(true);
400 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
401 getNextDeclarator());
402 }
403 else {
404 S.EmitBool(false);
405 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
406 }
Ted Kremenek04973312007-11-02 18:05:11 +0000407}
408
Sam Bishope2563ca2008-04-07 21:55:54 +0000409FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000410 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
411 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000412
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000413 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
414 FunctionDecl* decl = new (Mem)
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000415 FunctionDecl(Function, 0, SourceLocation(), NULL,
416 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000417
Sam Bishope2563ca2008-04-07 21:55:54 +0000418 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000419 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000420
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000421 Decl* next_declarator;
422
Ted Kremenekd437f232007-11-13 22:51:08 +0000423 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000424
425 decl->ParamInfo = hasParamDecls
426 ? new ParmVarDecl*[decl->getNumParams()]
427 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000428
429 if (hasParamDecls)
430 D.BatchReadOwnedPtrs(decl->getNumParams(),
431 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000432 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000433 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000434 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000435
436 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000437
438 return decl;
439}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000440
Steve Naroff56ee6892008-10-08 17:01:13 +0000441void BlockDecl::EmitImpl(Serializer& S) const {
442 // FIXME: what about arguments?
443 S.Emit(getCaretLocation());
444 S.EmitOwnedPtr(Body);
445}
446
447BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
448 QualType Q = QualType::ReadVal(D);
449 SourceLocation L = SourceLocation::ReadVal(D);
450 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
451 assert(0 && "Cannot deserialize BlockBlockExpr yet");
452 // FIXME: need to handle parameters.
453 //return new BlockBlockExpr(L, Q, BodyStmt);
454 return 0;
455}
456
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000457//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000458// RecordDecl Serialization.
459//===----------------------------------------------------------------------===//
460
Ted Kremenek583e0082007-11-14 18:12:19 +0000461void RecordDecl::EmitImpl(Serializer& S) const {
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000462 S.EmitInt(getTagKind());
463
Ted Kremenekaad48b62007-11-14 08:06:37 +0000464 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000465 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000466 S.EmitBool(hasFlexibleArrayMember());
467 S.EmitSInt(getNumMembers());
468 if (getNumMembers() > 0) {
469 assert (Members);
Ted Kremenek6812a732008-09-02 20:42:52 +0000470 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(), (Decl**) &Members[0]);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000471 }
472 else
473 ScopedDecl::EmitOutRec(S);
474}
475
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000476RecordDecl* RecordDecl::CreateImpl(Deserializer& D, ASTContext& C) {
477 TagKind TK = TagKind(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000478
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000479 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000480 RecordDecl* decl = new (Mem) RecordDecl(Record, TK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000481
Sam Bishope2563ca2008-04-07 21:55:54 +0000482 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000483 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000484 decl->setHasFlexibleArrayMember(D.ReadBool());
485 decl->NumMembers = D.ReadSInt();
486
487 if (decl->getNumMembers() > 0) {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000488 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
489
490 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
Ted Kremenek6812a732008-09-02 20:42:52 +0000491 (Decl**) &decl->Members[0], C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000492 }
493 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000494 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000495
496 return decl;
497}
498
499//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000500// TypedefDecl Serialization.
501//===----------------------------------------------------------------------===//
502
503void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000504 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000505 ScopedDecl::EmitInRec(S);
506 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000507}
508
Sam Bishope2563ca2008-04-07 21:55:54 +0000509TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000510 QualType T = QualType::ReadVal(D);
511
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000512 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
513 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000514
Sam Bishope2563ca2008-04-07 21:55:54 +0000515 decl->ScopedDecl::ReadInRec(D, C);
516 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000517
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000518 return decl;
519}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000520
521//===----------------------------------------------------------------------===//
522// LinkageSpec Serialization.
523//===----------------------------------------------------------------------===//
524
525void LinkageSpecDecl::EmitInRec(Serializer& S) const {
526 Decl::EmitInRec(S);
527 S.EmitInt(getLanguage());
528 S.EmitPtr(D);
529}
530
Sam Bishope2563ca2008-04-07 21:55:54 +0000531void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
532 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000533 Language = static_cast<LanguageIDs>(D.ReadInt());
534 D.ReadPtr(this->D);
535}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000536
537//===----------------------------------------------------------------------===//
538// FileScopeAsm Serialization.
539//===----------------------------------------------------------------------===//
540
541void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
542{
543 Decl::EmitInRec(S);
544 S.EmitOwnedPtr(AsmString);
545}
546
Sam Bishope2563ca2008-04-07 21:55:54 +0000547FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000548 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
549 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000550
Sam Bishope2563ca2008-04-07 21:55:54 +0000551 decl->Decl::ReadInRec(D, C);
552 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000553// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
554
555 return decl;
556}