blob: fe2ccefdce2afacf25d9f9abf45bf2f8cfb2764e [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
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);
Anders Carlssondfab6cb2008-02-08 00:33:21 +000070
71 case FileScopeAsm:
72 return FileScopeAsmDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000073 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000074}
Ted Kremenek04973312007-11-02 18:05:11 +000075
Ted Kremenek928fd7f2007-11-13 00:15:39 +000076//===----------------------------------------------------------------------===//
77// Common serialization logic for subclasses of Decl.
78//===----------------------------------------------------------------------===//
79
80void Decl::EmitInRec(Serializer& S) const {
81 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000082}
83
Ted Kremenek928fd7f2007-11-13 00:15:39 +000084void Decl::ReadInRec(Deserializer& D) {
85 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000086}
87
Ted Kremenek928fd7f2007-11-13 00:15:39 +000088//===----------------------------------------------------------------------===//
89// Common serialization logic for subclasses of NamedDecl.
90//===----------------------------------------------------------------------===//
91
92void NamedDecl::EmitInRec(Serializer& S) const {
93 Decl::EmitInRec(S);
94 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000095}
96
Ted Kremenek928fd7f2007-11-13 00:15:39 +000097void NamedDecl::ReadInRec(Deserializer& D) {
98 Decl::ReadInRec(D);
99 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000100}
101
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000102//===----------------------------------------------------------------------===//
103// Common serialization logic for subclasses of ScopedDecl.
104//===----------------------------------------------------------------------===//
105
106void ScopedDecl::EmitInRec(Serializer& S) const {
107 NamedDecl::EmitInRec(S);
108 S.EmitPtr(getNext()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000109}
110
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000111void ScopedDecl::ReadInRec(Deserializer& D) {
112 NamedDecl::ReadInRec(D);
113 D.ReadPtr(Next); // From ScopedDecl.
114}
115
116 //===------------------------------------------------------------===//
117 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
118 // methods. This is because owned pointers are usually "batched" //
119 // together for efficiency. //
120 //===------------------------------------------------------------===//
121
122void ScopedDecl::EmitOutRec(Serializer& S) const {
123 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000124}
125
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000126void ScopedDecl::ReadOutRec(Deserializer& D) {
127 NextDeclarator =
128 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000129}
130
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000131//===----------------------------------------------------------------------===//
132// Common serialization logic for subclasses of ValueDecl.
133//===----------------------------------------------------------------------===//
134
135void ValueDecl::EmitInRec(Serializer& S) const {
136 ScopedDecl::EmitInRec(S);
137 S.Emit(getType()); // From ValueDecl.
138}
139
140void ValueDecl::ReadInRec(Deserializer& D) {
141 ScopedDecl::ReadInRec(D);
142 DeclType = QualType::ReadVal(D); // From ValueDecl.
143}
144
145//===----------------------------------------------------------------------===//
146// Common serialization logic for subclasses of VarDecl.
147//===----------------------------------------------------------------------===//
148
149void VarDecl::EmitInRec(Serializer& S) const {
150 ValueDecl::EmitInRec(S);
151 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000152}
153
154void VarDecl::ReadInRec(Deserializer& D) {
155 ValueDecl::ReadInRec(D);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000156 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000157}
158
159 //===------------------------------------------------------------===//
160 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
161 // the one define in ScopedDecl. This is to batch emit the //
162 // owned pointers, which results in a smaller output.
163 //===------------------------------------------------------------===//
164
165void VarDecl::EmitOutRec(Serializer& S) const {
166 // Emit these last because they will create records of their own.
167 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
168 getNextDeclarator()); // From ScopedDecl.
169}
170
171void VarDecl::ReadOutRec(Deserializer& D) {
172 Decl* next_declarator;
173
174 D.BatchReadOwnedPtrs(Init, // From VarDecl.
175 next_declarator); // From ScopedDecl.
176
177 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000178}
179
180
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000181void VarDecl::EmitImpl(Serializer& S) const {
182 VarDecl::EmitInRec(S);
183 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000184}
185
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000186void VarDecl::ReadImpl(Deserializer& D) {
187 ReadInRec(D);
188 ReadOutRec(D);
189}
190
191//===----------------------------------------------------------------------===//
192// BlockVarDecl Serialization.
193//===----------------------------------------------------------------------===//
194
195BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
196 BlockVarDecl* decl =
197 new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
198
199 decl->VarDecl::ReadImpl(D);
200
Ted Kremenek04973312007-11-02 18:05:11 +0000201 return decl;
202}
203
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000204//===----------------------------------------------------------------------===//
205// FileVarDecl Serialization.
206//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000207
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000208FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
209 FileVarDecl* decl =
210 new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
211
212 decl->VarDecl::ReadImpl(D);
213
Ted Kremenek04973312007-11-02 18:05:11 +0000214 return decl;
215}
216
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000217//===----------------------------------------------------------------------===//
218// ParmDecl Serialization.
219//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000220
Ted Kremenek137bd912007-12-13 06:28:13 +0000221void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
222 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000223 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000224}
225
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000226ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
227 ParmVarDecl* decl =
228 new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
229
230 decl->VarDecl::ReadImpl(D);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000231 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Ted Kremenek137bd912007-12-13 06:28:13 +0000232
Ted Kremenek04973312007-11-02 18:05:11 +0000233 return decl;
234}
235
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000236//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000237// EnumDecl Serialization.
238//===----------------------------------------------------------------------===//
239
240void EnumDecl::EmitImpl(Serializer& S) const {
241 ScopedDecl::EmitInRec(S);
242 S.EmitBool(isDefinition());
243 S.Emit(IntegerType);
244 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
245}
246
247EnumDecl* EnumDecl::CreateImpl(Deserializer& D) {
248 EnumDecl* decl = new EnumDecl(SourceLocation(),NULL,NULL);
249
250 decl->ScopedDecl::ReadInRec(D);
251 decl->setDefinition(D.ReadBool());
252 decl->IntegerType = QualType::ReadVal(D);
253
254 Decl* next_declarator;
255 Decl* Elist;
256
257 D.BatchReadOwnedPtrs(Elist,next_declarator);
258
259 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
260 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
261
262 return decl;
263}
264
265//===----------------------------------------------------------------------===//
266// EnumConstantDecl Serialization.
267//===----------------------------------------------------------------------===//
268
269void EnumConstantDecl::EmitImpl(Serializer& S) const {
270 S.Emit(Val);
271 ValueDecl::EmitInRec(S);
272 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
273}
274
275EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000276 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000277 D.Read(val);
278
279 EnumConstantDecl* decl =
280 new EnumConstantDecl(SourceLocation(),NULL,QualType(),NULL,
281 val,NULL);
282
283 decl->ValueDecl::ReadInRec(D);
284
285 Decl* next_declarator;
286
287 D.BatchReadOwnedPtrs(next_declarator,decl->Init);
288
Ted Kremenek049b1682007-11-14 23:38:09 +0000289 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000290
291 return decl;
292}
293
294//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000295// FieldDecl Serialization.
296//===----------------------------------------------------------------------===//
297
298void FieldDecl::EmitImpl(Serializer& S) const {
299 S.Emit(getType());
300 NamedDecl::EmitInRec(S);
301 S.EmitOwnedPtr(BitWidth);
302}
303
304FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
Chris Lattner8e25d862008-03-16 00:16:02 +0000305 FieldDecl* decl = new FieldDecl(SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000306 decl->DeclType.ReadBackpatch(D);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000307 decl->ReadInRec(D);
308 decl->BitWidth = D.ReadOwnedPtr<Expr>();
309 return decl;
310}
311
312//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000313// FunctionDecl Serialization.
314//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000315
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000316void FunctionDecl::EmitImpl(Serializer& S) const {
317 S.EmitInt(SClass); // From FunctionDecl.
318 S.EmitBool(IsInline); // From FunctionDecl.
319 ValueDecl::EmitInRec(S);
320 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000321
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000322 // NOTE: We do not need to serialize out the number of parameters, because
323 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000324
Ted Kremenekd437f232007-11-13 22:51:08 +0000325 if (ParamInfo != NULL) {
326 S.EmitBool(true);
327 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
328 getNextDeclarator());
329 }
330 else {
331 S.EmitBool(false);
332 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
333 }
Ted Kremenek04973312007-11-02 18:05:11 +0000334}
335
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000336FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000337 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
338 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000339
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000340 FunctionDecl* decl =
Chris Lattnera98e58d2008-03-15 21:24:04 +0000341 new FunctionDecl(SourceLocation(),NULL,QualType(),SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000342
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000343 decl->ValueDecl::ReadInRec(D);
344 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000345
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000346 Decl* next_declarator;
347
Ted Kremenekd437f232007-11-13 22:51:08 +0000348 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000349
350 decl->ParamInfo = hasParamDecls
351 ? new ParmVarDecl*[decl->getNumParams()]
352 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000353
354 if (hasParamDecls)
355 D.BatchReadOwnedPtrs(decl->getNumParams(),
356 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
357 decl->Body, next_declarator);
358 else
359 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000360
361 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000362
363 return decl;
364}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000365
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000366//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000367// RecordDecl Serialization.
368//===----------------------------------------------------------------------===//
369
Ted Kremenek583e0082007-11-14 18:12:19 +0000370void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000371 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000372 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000373 S.EmitBool(hasFlexibleArrayMember());
374 S.EmitSInt(getNumMembers());
375 if (getNumMembers() > 0) {
376 assert (Members);
377 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
378 (Decl**) &Members[0],getNextDeclarator());
379 }
380 else
381 ScopedDecl::EmitOutRec(S);
382}
383
384RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
385 RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000386
Ted Kremenekaad48b62007-11-14 08:06:37 +0000387 decl->ScopedDecl::ReadInRec(D);
Ted Kremenek583e0082007-11-14 18:12:19 +0000388 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000389 decl->setHasFlexibleArrayMember(D.ReadBool());
390 decl->NumMembers = D.ReadSInt();
391
392 if (decl->getNumMembers() > 0) {
393 Decl* next_declarator;
394 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
395
396 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
397 (Decl**) &decl->Members[0],
398 next_declarator);
399
400 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
401 }
402 else
403 decl->ScopedDecl::ReadOutRec(D);
404
405 return decl;
406}
407
408//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000409// TypedefDecl Serialization.
410//===----------------------------------------------------------------------===//
411
412void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000413 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000414 ScopedDecl::EmitInRec(S);
415 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000416}
417
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000418TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
419 QualType T = QualType::ReadVal(D);
420
421 TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL);
422
423 decl->ScopedDecl::ReadInRec(D);
424 decl->ScopedDecl::ReadOutRec(D);
425
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000426 return decl;
427}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000428
429//===----------------------------------------------------------------------===//
430// LinkageSpec Serialization.
431//===----------------------------------------------------------------------===//
432
433void LinkageSpecDecl::EmitInRec(Serializer& S) const {
434 Decl::EmitInRec(S);
435 S.EmitInt(getLanguage());
436 S.EmitPtr(D);
437}
438
439void LinkageSpecDecl::ReadInRec(Deserializer& D) {
440 Decl::ReadInRec(D);
441 Language = static_cast<LanguageIDs>(D.ReadInt());
442 D.ReadPtr(this->D);
443}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000444
445//===----------------------------------------------------------------------===//
446// FileScopeAsm Serialization.
447//===----------------------------------------------------------------------===//
448
449void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
450{
451 Decl::EmitInRec(S);
452 S.EmitOwnedPtr(AsmString);
453}
454
455FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D) {
456 FileScopeAsmDecl* decl = new FileScopeAsmDecl(SourceLocation(), 0);
457
458 decl->Decl::ReadInRec(D);
459 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>());
460// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
461
462 return decl;
463}