blob: f2ed75b4b56b257daf092d84dbd59b940956d9df [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.
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000149 // FIXME: This is now in ParmVarDecl
150 // S.EmitInt(getObjcDeclQualifier()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000151}
152
153void VarDecl::ReadInRec(Deserializer& D) {
154 ValueDecl::ReadInRec(D);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000155 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
156 // FIXME: This is now in ParmVarDecl
157 // objcDeclQualifier = static_cast<ObjcDeclQualifier>(D.ReadInt()); // VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000158}
159
160 //===------------------------------------------------------------===//
161 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
162 // the one define in ScopedDecl. This is to batch emit the //
163 // owned pointers, which results in a smaller output.
164 //===------------------------------------------------------------===//
165
166void VarDecl::EmitOutRec(Serializer& S) const {
167 // Emit these last because they will create records of their own.
168 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
169 getNextDeclarator()); // From ScopedDecl.
170}
171
172void VarDecl::ReadOutRec(Deserializer& D) {
173 Decl* next_declarator;
174
175 D.BatchReadOwnedPtrs(Init, // From VarDecl.
176 next_declarator); // From ScopedDecl.
177
178 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000179}
180
181
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000182void VarDecl::EmitImpl(Serializer& S) const {
183 VarDecl::EmitInRec(S);
184 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000185}
186
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000187void VarDecl::ReadImpl(Deserializer& D) {
188 ReadInRec(D);
189 ReadOutRec(D);
190}
191
192//===----------------------------------------------------------------------===//
193// BlockVarDecl Serialization.
194//===----------------------------------------------------------------------===//
195
196BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
197 BlockVarDecl* decl =
198 new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
199
200 decl->VarDecl::ReadImpl(D);
201
Ted Kremenek04973312007-11-02 18:05:11 +0000202 return decl;
203}
204
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000205//===----------------------------------------------------------------------===//
206// FileVarDecl Serialization.
207//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000208
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000209FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
210 FileVarDecl* decl =
211 new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
212
213 decl->VarDecl::ReadImpl(D);
214
Ted Kremenek04973312007-11-02 18:05:11 +0000215 return decl;
216}
217
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000218//===----------------------------------------------------------------------===//
219// ParmDecl Serialization.
220//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000221
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000222ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
223 ParmVarDecl* decl =
224 new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
225
226 decl->VarDecl::ReadImpl(D);
227
Ted Kremenek04973312007-11-02 18:05:11 +0000228 return decl;
229}
230
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000231//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000232// EnumDecl Serialization.
233//===----------------------------------------------------------------------===//
234
235void EnumDecl::EmitImpl(Serializer& S) const {
236 ScopedDecl::EmitInRec(S);
237 S.EmitBool(isDefinition());
238 S.Emit(IntegerType);
239 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
240}
241
242EnumDecl* EnumDecl::CreateImpl(Deserializer& D) {
243 EnumDecl* decl = new EnumDecl(SourceLocation(),NULL,NULL);
244
245 decl->ScopedDecl::ReadInRec(D);
246 decl->setDefinition(D.ReadBool());
247 decl->IntegerType = QualType::ReadVal(D);
248
249 Decl* next_declarator;
250 Decl* Elist;
251
252 D.BatchReadOwnedPtrs(Elist,next_declarator);
253
254 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
255 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
256
257 return decl;
258}
259
260//===----------------------------------------------------------------------===//
261// EnumConstantDecl Serialization.
262//===----------------------------------------------------------------------===//
263
264void EnumConstantDecl::EmitImpl(Serializer& S) const {
265 S.Emit(Val);
266 ValueDecl::EmitInRec(S);
267 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
268}
269
270EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000271 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000272 D.Read(val);
273
274 EnumConstantDecl* decl =
275 new EnumConstantDecl(SourceLocation(),NULL,QualType(),NULL,
276 val,NULL);
277
278 decl->ValueDecl::ReadInRec(D);
279
280 Decl* next_declarator;
281
282 D.BatchReadOwnedPtrs(next_declarator,decl->Init);
283
Ted Kremenek049b1682007-11-14 23:38:09 +0000284 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000285
286 return decl;
287}
288
289//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000290// FieldDecl Serialization.
291//===----------------------------------------------------------------------===//
292
293void FieldDecl::EmitImpl(Serializer& S) const {
294 S.Emit(getType());
295 NamedDecl::EmitInRec(S);
296 S.EmitOwnedPtr(BitWidth);
297}
298
299FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
Ted Kremenek21d50e12007-11-14 22:51:02 +0000300 FieldDecl* decl = new FieldDecl(SourceLocation(),NULL,QualType());
301 decl->DeclType.ReadBackpatch(D);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000302 decl->ReadInRec(D);
303 decl->BitWidth = D.ReadOwnedPtr<Expr>();
304 return decl;
305}
306
307//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000308// FunctionDecl Serialization.
309//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000310
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000311void FunctionDecl::EmitImpl(Serializer& S) const {
312 S.EmitInt(SClass); // From FunctionDecl.
313 S.EmitBool(IsInline); // From FunctionDecl.
314 ValueDecl::EmitInRec(S);
315 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000316
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000317 // NOTE: We do not need to serialize out the number of parameters, because
318 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000319
Ted Kremenekd437f232007-11-13 22:51:08 +0000320 if (ParamInfo != NULL) {
321 S.EmitBool(true);
322 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
323 getNextDeclarator());
324 }
325 else {
326 S.EmitBool(false);
327 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
328 }
Ted Kremenek04973312007-11-02 18:05:11 +0000329}
330
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000331FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000332 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
333 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000334
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000335 FunctionDecl* decl =
336 new FunctionDecl(SourceLocation(),NULL,QualType(),SClass,IsInline);
Ted Kremenek04973312007-11-02 18:05:11 +0000337
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000338 decl->ValueDecl::ReadInRec(D);
339 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000340
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000341 Decl* next_declarator;
342
Ted Kremenekd437f232007-11-13 22:51:08 +0000343 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000344
345 decl->ParamInfo = hasParamDecls
346 ? new ParmVarDecl*[decl->getNumParams()]
347 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000348
349 if (hasParamDecls)
350 D.BatchReadOwnedPtrs(decl->getNumParams(),
351 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
352 decl->Body, next_declarator);
353 else
354 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000355
356 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000357
358 return decl;
359}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000360
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000361//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000362// RecordDecl Serialization.
363//===----------------------------------------------------------------------===//
364
Ted Kremenek583e0082007-11-14 18:12:19 +0000365void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000366 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000367 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000368 S.EmitBool(hasFlexibleArrayMember());
369 S.EmitSInt(getNumMembers());
370 if (getNumMembers() > 0) {
371 assert (Members);
372 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
373 (Decl**) &Members[0],getNextDeclarator());
374 }
375 else
376 ScopedDecl::EmitOutRec(S);
377}
378
379RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
380 RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000381
Ted Kremenekaad48b62007-11-14 08:06:37 +0000382 decl->ScopedDecl::ReadInRec(D);
Ted Kremenek583e0082007-11-14 18:12:19 +0000383 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000384 decl->setHasFlexibleArrayMember(D.ReadBool());
385 decl->NumMembers = D.ReadSInt();
386
387 if (decl->getNumMembers() > 0) {
388 Decl* next_declarator;
389 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
390
391 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
392 (Decl**) &decl->Members[0],
393 next_declarator);
394
395 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
396 }
397 else
398 decl->ScopedDecl::ReadOutRec(D);
399
400 return decl;
401}
402
403//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000404// TypedefDecl Serialization.
405//===----------------------------------------------------------------------===//
406
407void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000408 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000409 ScopedDecl::EmitInRec(S);
410 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000411}
412
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000413TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
414 QualType T = QualType::ReadVal(D);
415
416 TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL);
417
418 decl->ScopedDecl::ReadInRec(D);
419 decl->ScopedDecl::ReadOutRec(D);
420
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000421 return decl;
422}