blob: 555c33edf68d36a187f66bdbd9d6075945113cfd [file] [log] [blame]
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +00001//===--- DeclSerialization.cpp - Serialization of Decls ---------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Ted Kremenek and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This files defines methods that implement bitcode serialization for Decls.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Decl.h"
15#include "clang/AST/Expr.h"
16#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremenek928fd7f2007-11-13 00:15:39 +000019using llvm::Serializer;
20using llvm::Deserializer;
21using llvm::SerializedPtrID;
22
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000023using namespace clang;
24
Ted Kremenek928fd7f2007-11-13 00:15:39 +000025//===----------------------------------------------------------------------===//
26// Decl Serialization: Dispatch code to handle specialized decl types.
27//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000028
Ted Kremenek928fd7f2007-11-13 00:15:39 +000029void Decl::Emit(Serializer& S) const {
30 S.EmitInt(getKind());
31 EmitImpl(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000032}
33
Ted Kremenek928fd7f2007-11-13 00:15:39 +000034Decl* Decl::Create(Deserializer& D) {
35
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000036 Kind k = static_cast<Kind>(D.ReadInt());
37
38 switch (k) {
39 default:
40 assert (false && "Not implemented.");
41 break;
42
43 case BlockVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000044 return BlockVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000045
Ted Kremenek583e0082007-11-14 18:12:19 +000046 case Enum:
47 return EnumDecl::CreateImpl(D);
48
49 case EnumConstant:
50 return EnumConstantDecl::CreateImpl(D);
51
Ted Kremenekf9d56c82007-11-14 17:47:01 +000052 case Field:
53 return FieldDecl::CreateImpl(D);
54
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000055 case FileVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000056 return FileVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000057
58 case ParmVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000059 return ParmVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000060
61 case Function:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000062 return FunctionDecl::CreateImpl(D);
Ted Kremenek5f670ed2007-11-14 21:15:42 +000063
64 case Union:
Ted Kremenekaad48b62007-11-14 08:06:37 +000065 case Struct:
66 return RecordDecl::CreateImpl(k,D);
67
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000068 case Typedef:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000069 return TypedefDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000070 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000071}
Ted Kremenek04973312007-11-02 18:05:11 +000072
Ted Kremenek928fd7f2007-11-13 00:15:39 +000073//===----------------------------------------------------------------------===//
74// Common serialization logic for subclasses of Decl.
75//===----------------------------------------------------------------------===//
76
77void Decl::EmitInRec(Serializer& S) const {
78 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000079}
80
Ted Kremenek928fd7f2007-11-13 00:15:39 +000081void Decl::ReadInRec(Deserializer& D) {
82 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000083}
84
Ted Kremenek928fd7f2007-11-13 00:15:39 +000085//===----------------------------------------------------------------------===//
86// Common serialization logic for subclasses of NamedDecl.
87//===----------------------------------------------------------------------===//
88
89void NamedDecl::EmitInRec(Serializer& S) const {
90 Decl::EmitInRec(S);
91 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000092}
93
Ted Kremenek928fd7f2007-11-13 00:15:39 +000094void NamedDecl::ReadInRec(Deserializer& D) {
95 Decl::ReadInRec(D);
96 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000097}
98
Ted Kremenek928fd7f2007-11-13 00:15:39 +000099//===----------------------------------------------------------------------===//
100// Common serialization logic for subclasses of ScopedDecl.
101//===----------------------------------------------------------------------===//
102
103void ScopedDecl::EmitInRec(Serializer& S) const {
104 NamedDecl::EmitInRec(S);
105 S.EmitPtr(getNext()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000106}
107
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000108void ScopedDecl::ReadInRec(Deserializer& D) {
109 NamedDecl::ReadInRec(D);
110 D.ReadPtr(Next); // From ScopedDecl.
111}
112
113 //===------------------------------------------------------------===//
114 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
115 // methods. This is because owned pointers are usually "batched" //
116 // together for efficiency. //
117 //===------------------------------------------------------------===//
118
119void ScopedDecl::EmitOutRec(Serializer& S) const {
120 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000121}
122
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000123void ScopedDecl::ReadOutRec(Deserializer& D) {
124 NextDeclarator =
125 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000126}
127
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000128//===----------------------------------------------------------------------===//
129// Common serialization logic for subclasses of ValueDecl.
130//===----------------------------------------------------------------------===//
131
132void ValueDecl::EmitInRec(Serializer& S) const {
133 ScopedDecl::EmitInRec(S);
134 S.Emit(getType()); // From ValueDecl.
135}
136
137void ValueDecl::ReadInRec(Deserializer& D) {
138 ScopedDecl::ReadInRec(D);
139 DeclType = QualType::ReadVal(D); // From ValueDecl.
140}
141
142//===----------------------------------------------------------------------===//
143// Common serialization logic for subclasses of VarDecl.
144//===----------------------------------------------------------------------===//
145
146void VarDecl::EmitInRec(Serializer& S) const {
147 ValueDecl::EmitInRec(S);
148 S.EmitInt(getStorageClass()); // From VarDecl.
149 S.EmitInt(getObjcDeclQualifier()); // From VarDecl.
150}
151
152void VarDecl::ReadInRec(Deserializer& D) {
153 ValueDecl::ReadInRec(D);
154 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
155 objcDeclQualifier = static_cast<ObjcDeclQualifier>(D.ReadInt()); // VarDecl.
156}
157
158 //===------------------------------------------------------------===//
159 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
160 // the one define in ScopedDecl. This is to batch emit the //
161 // owned pointers, which results in a smaller output.
162 //===------------------------------------------------------------===//
163
164void VarDecl::EmitOutRec(Serializer& S) const {
165 // Emit these last because they will create records of their own.
166 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
167 getNextDeclarator()); // From ScopedDecl.
168}
169
170void VarDecl::ReadOutRec(Deserializer& D) {
171 Decl* next_declarator;
172
173 D.BatchReadOwnedPtrs(Init, // From VarDecl.
174 next_declarator); // From ScopedDecl.
175
176 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000177}
178
179
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000180void VarDecl::EmitImpl(Serializer& S) const {
181 VarDecl::EmitInRec(S);
182 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000183}
184
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000185void VarDecl::ReadImpl(Deserializer& D) {
186 ReadInRec(D);
187 ReadOutRec(D);
188}
189
190//===----------------------------------------------------------------------===//
191// BlockVarDecl Serialization.
192//===----------------------------------------------------------------------===//
193
194BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
195 BlockVarDecl* decl =
196 new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
197
198 decl->VarDecl::ReadImpl(D);
199
Ted Kremenek04973312007-11-02 18:05:11 +0000200 return decl;
201}
202
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000203//===----------------------------------------------------------------------===//
204// FileVarDecl Serialization.
205//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000206
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000207FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
208 FileVarDecl* decl =
209 new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
210
211 decl->VarDecl::ReadImpl(D);
212
Ted Kremenek04973312007-11-02 18:05:11 +0000213 return decl;
214}
215
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000216//===----------------------------------------------------------------------===//
217// ParmDecl Serialization.
218//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000219
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000220ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
221 ParmVarDecl* decl =
222 new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
223
224 decl->VarDecl::ReadImpl(D);
225
Ted Kremenek04973312007-11-02 18:05:11 +0000226 return decl;
227}
228
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000229//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000230// EnumDecl Serialization.
231//===----------------------------------------------------------------------===//
232
233void EnumDecl::EmitImpl(Serializer& S) const {
234 ScopedDecl::EmitInRec(S);
235 S.EmitBool(isDefinition());
236 S.Emit(IntegerType);
237 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
238}
239
240EnumDecl* EnumDecl::CreateImpl(Deserializer& D) {
241 EnumDecl* decl = new EnumDecl(SourceLocation(),NULL,NULL);
242
243 decl->ScopedDecl::ReadInRec(D);
244 decl->setDefinition(D.ReadBool());
245 decl->IntegerType = QualType::ReadVal(D);
246
247 Decl* next_declarator;
248 Decl* Elist;
249
250 D.BatchReadOwnedPtrs(Elist,next_declarator);
251
252 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
253 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
254
255 return decl;
256}
257
258//===----------------------------------------------------------------------===//
259// EnumConstantDecl Serialization.
260//===----------------------------------------------------------------------===//
261
262void EnumConstantDecl::EmitImpl(Serializer& S) const {
263 S.Emit(Val);
264 ValueDecl::EmitInRec(S);
265 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
266}
267
268EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D) {
269 llvm::APSInt val(0);
270 D.Read(val);
271
272 EnumConstantDecl* decl =
273 new EnumConstantDecl(SourceLocation(),NULL,QualType(),NULL,
274 val,NULL);
275
276 decl->ValueDecl::ReadInRec(D);
277
278 Decl* next_declarator;
279
280 D.BatchReadOwnedPtrs(next_declarator,decl->Init);
281
282 decl->setNextDeclarator(cast<ScopedDecl>(next_declarator));
283
284 return decl;
285}
286
287//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000288// FieldDecl Serialization.
289//===----------------------------------------------------------------------===//
290
291void FieldDecl::EmitImpl(Serializer& S) const {
292 S.Emit(getType());
293 NamedDecl::EmitInRec(S);
294 S.EmitOwnedPtr(BitWidth);
295}
296
297FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
298 QualType DeclType = QualType::ReadVal(D);
299 FieldDecl* decl = new FieldDecl(SourceLocation(),NULL,DeclType);
300 decl->ReadInRec(D);
301 decl->BitWidth = D.ReadOwnedPtr<Expr>();
302 return decl;
303}
304
305//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000306// FunctionDecl Serialization.
307//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000308
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000309void FunctionDecl::EmitImpl(Serializer& S) const {
310 S.EmitInt(SClass); // From FunctionDecl.
311 S.EmitBool(IsInline); // From FunctionDecl.
312 ValueDecl::EmitInRec(S);
313 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000314
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000315 // NOTE: We do not need to serialize out the number of parameters, because
316 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000317
Ted Kremenekd437f232007-11-13 22:51:08 +0000318 if (ParamInfo != NULL) {
319 S.EmitBool(true);
320 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
321 getNextDeclarator());
322 }
323 else {
324 S.EmitBool(false);
325 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
326 }
Ted Kremenek04973312007-11-02 18:05:11 +0000327}
328
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000329FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000330 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
331 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000332
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000333 FunctionDecl* decl =
334 new FunctionDecl(SourceLocation(),NULL,QualType(),SClass,IsInline);
Ted Kremenek04973312007-11-02 18:05:11 +0000335
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000336 decl->ValueDecl::ReadInRec(D);
337 D.ReadPtr(decl->DeclChain);
338
339 decl->ParamInfo = decl->getNumParams()
340 ? new ParmVarDecl*[decl->getNumParams()]
341 : NULL;
342
343 Decl* next_declarator;
344
Ted Kremenekd437f232007-11-13 22:51:08 +0000345 bool hasParamDecls = D.ReadBool();
346
347 if (hasParamDecls)
348 D.BatchReadOwnedPtrs(decl->getNumParams(),
349 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
350 decl->Body, next_declarator);
351 else
352 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000353
354 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000355
356 return decl;
357}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000358
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000359//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000360// RecordDecl Serialization.
361//===----------------------------------------------------------------------===//
362
Ted Kremenek583e0082007-11-14 18:12:19 +0000363void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000364 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000365 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000366 S.EmitBool(hasFlexibleArrayMember());
367 S.EmitSInt(getNumMembers());
368 if (getNumMembers() > 0) {
369 assert (Members);
370 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
371 (Decl**) &Members[0],getNextDeclarator());
372 }
373 else
374 ScopedDecl::EmitOutRec(S);
375}
376
377RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
378 RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000379
Ted Kremenekaad48b62007-11-14 08:06:37 +0000380 decl->ScopedDecl::ReadInRec(D);
Ted Kremenek583e0082007-11-14 18:12:19 +0000381 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000382 decl->setHasFlexibleArrayMember(D.ReadBool());
383 decl->NumMembers = D.ReadSInt();
384
385 if (decl->getNumMembers() > 0) {
386 Decl* next_declarator;
387 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
388
389 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
390 (Decl**) &decl->Members[0],
391 next_declarator);
392
393 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
394 }
395 else
396 decl->ScopedDecl::ReadOutRec(D);
397
398 return decl;
399}
400
401//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000402// TypedefDecl Serialization.
403//===----------------------------------------------------------------------===//
404
405void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000406 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000407 ScopedDecl::EmitInRec(S);
408 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000409}
410
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000411TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
412 QualType T = QualType::ReadVal(D);
413
414 TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL);
415
416 decl->ScopedDecl::ReadInRec(D);
417 decl->ScopedDecl::ReadOutRec(D);
418
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000419 return decl;
420}