blob: cfab8cc76d22d2023df0246120bd51b8e5a53977 [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
46 case FileVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000047 return FileVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000048
49 case ParmVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000050 return ParmVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000051
52 case Function:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000053 return FunctionDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000054
Ted Kremenekaad48b62007-11-14 08:06:37 +000055 case Struct:
56 return RecordDecl::CreateImpl(k,D);
57
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000058 case Typedef:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000059 return TypedefDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000060 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000061}
Ted Kremenek04973312007-11-02 18:05:11 +000062
Ted Kremenek928fd7f2007-11-13 00:15:39 +000063//===----------------------------------------------------------------------===//
64// Common serialization logic for subclasses of Decl.
65//===----------------------------------------------------------------------===//
66
67void Decl::EmitInRec(Serializer& S) const {
68 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000069}
70
Ted Kremenek928fd7f2007-11-13 00:15:39 +000071void Decl::ReadInRec(Deserializer& D) {
72 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000073}
74
Ted Kremenek928fd7f2007-11-13 00:15:39 +000075//===----------------------------------------------------------------------===//
76// Common serialization logic for subclasses of NamedDecl.
77//===----------------------------------------------------------------------===//
78
79void NamedDecl::EmitInRec(Serializer& S) const {
80 Decl::EmitInRec(S);
81 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000082}
83
Ted Kremenek928fd7f2007-11-13 00:15:39 +000084void NamedDecl::ReadInRec(Deserializer& D) {
85 Decl::ReadInRec(D);
86 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000087}
88
Ted Kremenek928fd7f2007-11-13 00:15:39 +000089//===----------------------------------------------------------------------===//
90// Common serialization logic for subclasses of ScopedDecl.
91//===----------------------------------------------------------------------===//
92
93void ScopedDecl::EmitInRec(Serializer& S) const {
94 NamedDecl::EmitInRec(S);
95 S.EmitPtr(getNext()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000096}
97
Ted Kremenek928fd7f2007-11-13 00:15:39 +000098void ScopedDecl::ReadInRec(Deserializer& D) {
99 NamedDecl::ReadInRec(D);
100 D.ReadPtr(Next); // From ScopedDecl.
101}
102
103 //===------------------------------------------------------------===//
104 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
105 // methods. This is because owned pointers are usually "batched" //
106 // together for efficiency. //
107 //===------------------------------------------------------------===//
108
109void ScopedDecl::EmitOutRec(Serializer& S) const {
110 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000111}
112
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000113void ScopedDecl::ReadOutRec(Deserializer& D) {
114 NextDeclarator =
115 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000116}
117
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000118//===----------------------------------------------------------------------===//
119// Common serialization logic for subclasses of ValueDecl.
120//===----------------------------------------------------------------------===//
121
122void ValueDecl::EmitInRec(Serializer& S) const {
123 ScopedDecl::EmitInRec(S);
124 S.Emit(getType()); // From ValueDecl.
125}
126
127void ValueDecl::ReadInRec(Deserializer& D) {
128 ScopedDecl::ReadInRec(D);
129 DeclType = QualType::ReadVal(D); // From ValueDecl.
130}
131
132//===----------------------------------------------------------------------===//
133// Common serialization logic for subclasses of VarDecl.
134//===----------------------------------------------------------------------===//
135
136void VarDecl::EmitInRec(Serializer& S) const {
137 ValueDecl::EmitInRec(S);
138 S.EmitInt(getStorageClass()); // From VarDecl.
139 S.EmitInt(getObjcDeclQualifier()); // From VarDecl.
140}
141
142void VarDecl::ReadInRec(Deserializer& D) {
143 ValueDecl::ReadInRec(D);
144 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
145 objcDeclQualifier = static_cast<ObjcDeclQualifier>(D.ReadInt()); // VarDecl.
146}
147
148 //===------------------------------------------------------------===//
149 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
150 // the one define in ScopedDecl. This is to batch emit the //
151 // owned pointers, which results in a smaller output.
152 //===------------------------------------------------------------===//
153
154void VarDecl::EmitOutRec(Serializer& S) const {
155 // Emit these last because they will create records of their own.
156 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
157 getNextDeclarator()); // From ScopedDecl.
158}
159
160void VarDecl::ReadOutRec(Deserializer& D) {
161 Decl* next_declarator;
162
163 D.BatchReadOwnedPtrs(Init, // From VarDecl.
164 next_declarator); // From ScopedDecl.
165
166 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000167}
168
169
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000170void VarDecl::EmitImpl(Serializer& S) const {
171 VarDecl::EmitInRec(S);
172 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000173}
174
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000175void VarDecl::ReadImpl(Deserializer& D) {
176 ReadInRec(D);
177 ReadOutRec(D);
178}
179
180//===----------------------------------------------------------------------===//
181// BlockVarDecl Serialization.
182//===----------------------------------------------------------------------===//
183
184BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
185 BlockVarDecl* decl =
186 new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
187
188 decl->VarDecl::ReadImpl(D);
189
Ted Kremenek04973312007-11-02 18:05:11 +0000190 return decl;
191}
192
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000193//===----------------------------------------------------------------------===//
194// FileVarDecl Serialization.
195//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000196
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000197FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
198 FileVarDecl* decl =
199 new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
200
201 decl->VarDecl::ReadImpl(D);
202
Ted Kremenek04973312007-11-02 18:05:11 +0000203 return decl;
204}
205
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000206//===----------------------------------------------------------------------===//
207// ParmDecl Serialization.
208//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000209
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000210ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
211 ParmVarDecl* decl =
212 new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
213
214 decl->VarDecl::ReadImpl(D);
215
Ted Kremenek04973312007-11-02 18:05:11 +0000216 return decl;
217}
218
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000219//===----------------------------------------------------------------------===//
220// FunctionDecl Serialization.
221//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000222
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000223void FunctionDecl::EmitImpl(Serializer& S) const {
224 S.EmitInt(SClass); // From FunctionDecl.
225 S.EmitBool(IsInline); // From FunctionDecl.
226 ValueDecl::EmitInRec(S);
227 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000228
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000229 // NOTE: We do not need to serialize out the number of parameters, because
230 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000231
Ted Kremenekd437f232007-11-13 22:51:08 +0000232 if (ParamInfo != NULL) {
233 S.EmitBool(true);
234 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
235 getNextDeclarator());
236 }
237 else {
238 S.EmitBool(false);
239 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
240 }
Ted Kremenek04973312007-11-02 18:05:11 +0000241}
242
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000243FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000244 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
245 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000246
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000247 FunctionDecl* decl =
248 new FunctionDecl(SourceLocation(),NULL,QualType(),SClass,IsInline);
Ted Kremenek04973312007-11-02 18:05:11 +0000249
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000250 decl->ValueDecl::ReadInRec(D);
251 D.ReadPtr(decl->DeclChain);
252
253 decl->ParamInfo = decl->getNumParams()
254 ? new ParmVarDecl*[decl->getNumParams()]
255 : NULL;
256
257 Decl* next_declarator;
258
Ted Kremenekd437f232007-11-13 22:51:08 +0000259 bool hasParamDecls = D.ReadBool();
260
261 if (hasParamDecls)
262 D.BatchReadOwnedPtrs(decl->getNumParams(),
263 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
264 decl->Body, next_declarator);
265 else
266 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000267
268 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000269
270 return decl;
271}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000272
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000273//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000274// RecordDecl Serialization.
275//===----------------------------------------------------------------------===//
276
277void RecordDecl::EmitImpl(llvm::Serializer& S) const {
278 ScopedDecl::EmitInRec(S);
279 S.EmitBool(hasFlexibleArrayMember());
280 S.EmitSInt(getNumMembers());
281 if (getNumMembers() > 0) {
282 assert (Members);
283 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
284 (Decl**) &Members[0],getNextDeclarator());
285 }
286 else
287 ScopedDecl::EmitOutRec(S);
288}
289
290RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
291 RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
292
293 decl->ScopedDecl::ReadInRec(D);
294 decl->setHasFlexibleArrayMember(D.ReadBool());
295 decl->NumMembers = D.ReadSInt();
296
297 if (decl->getNumMembers() > 0) {
298 Decl* next_declarator;
299 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
300
301 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
302 (Decl**) &decl->Members[0],
303 next_declarator);
304
305 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
306 }
307 else
308 decl->ScopedDecl::ReadOutRec(D);
309
310 return decl;
311}
312
313//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000314// TypedefDecl Serialization.
315//===----------------------------------------------------------------------===//
316
317void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000318 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000319 ScopedDecl::EmitInRec(S);
320 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000321}
322
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000323TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
324 QualType T = QualType::ReadVal(D);
325
326 TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL);
327
328 decl->ScopedDecl::ReadInRec(D);
329 decl->ScopedDecl::ReadOutRec(D);
330
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000331 return decl;
332}