blob: 3e2ce0fcc8c74c48ad7ba738b90cc862e4a8a17d [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 Kremenekf9d56c82007-11-14 17:47:01 +000046 case Field:
47 return FieldDecl::CreateImpl(D);
48
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000049 case FileVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000050 return FileVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000051
52 case ParmVar:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000053 return ParmVarDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000054
55 case Function:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000056 return FunctionDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000057
Ted Kremenekaad48b62007-11-14 08:06:37 +000058 case Struct:
59 return RecordDecl::CreateImpl(k,D);
60
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000061 case Typedef:
Ted Kremenek928fd7f2007-11-13 00:15:39 +000062 return TypedefDecl::CreateImpl(D);
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000063 }
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000064}
Ted Kremenek04973312007-11-02 18:05:11 +000065
Ted Kremenek928fd7f2007-11-13 00:15:39 +000066//===----------------------------------------------------------------------===//
67// Common serialization logic for subclasses of Decl.
68//===----------------------------------------------------------------------===//
69
70void Decl::EmitInRec(Serializer& S) const {
71 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000072}
73
Ted Kremenek928fd7f2007-11-13 00:15:39 +000074void Decl::ReadInRec(Deserializer& D) {
75 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +000076}
77
Ted Kremenek928fd7f2007-11-13 00:15:39 +000078//===----------------------------------------------------------------------===//
79// Common serialization logic for subclasses of NamedDecl.
80//===----------------------------------------------------------------------===//
81
82void NamedDecl::EmitInRec(Serializer& S) const {
83 Decl::EmitInRec(S);
84 S.EmitPtr(getIdentifier()); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000085}
86
Ted Kremenek928fd7f2007-11-13 00:15:39 +000087void NamedDecl::ReadInRec(Deserializer& D) {
88 Decl::ReadInRec(D);
89 D.ReadPtr(Identifier); // From NamedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000090}
91
Ted Kremenek928fd7f2007-11-13 00:15:39 +000092//===----------------------------------------------------------------------===//
93// Common serialization logic for subclasses of ScopedDecl.
94//===----------------------------------------------------------------------===//
95
96void ScopedDecl::EmitInRec(Serializer& S) const {
97 NamedDecl::EmitInRec(S);
98 S.EmitPtr(getNext()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +000099}
100
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000101void ScopedDecl::ReadInRec(Deserializer& D) {
102 NamedDecl::ReadInRec(D);
103 D.ReadPtr(Next); // From ScopedDecl.
104}
105
106 //===------------------------------------------------------------===//
107 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
108 // methods. This is because owned pointers are usually "batched" //
109 // together for efficiency. //
110 //===------------------------------------------------------------===//
111
112void ScopedDecl::EmitOutRec(Serializer& S) const {
113 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000114}
115
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000116void ScopedDecl::ReadOutRec(Deserializer& D) {
117 NextDeclarator =
118 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000119}
120
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000121//===----------------------------------------------------------------------===//
122// Common serialization logic for subclasses of ValueDecl.
123//===----------------------------------------------------------------------===//
124
125void ValueDecl::EmitInRec(Serializer& S) const {
126 ScopedDecl::EmitInRec(S);
127 S.Emit(getType()); // From ValueDecl.
128}
129
130void ValueDecl::ReadInRec(Deserializer& D) {
131 ScopedDecl::ReadInRec(D);
132 DeclType = QualType::ReadVal(D); // From ValueDecl.
133}
134
135//===----------------------------------------------------------------------===//
136// Common serialization logic for subclasses of VarDecl.
137//===----------------------------------------------------------------------===//
138
139void VarDecl::EmitInRec(Serializer& S) const {
140 ValueDecl::EmitInRec(S);
141 S.EmitInt(getStorageClass()); // From VarDecl.
142 S.EmitInt(getObjcDeclQualifier()); // From VarDecl.
143}
144
145void VarDecl::ReadInRec(Deserializer& D) {
146 ValueDecl::ReadInRec(D);
147 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
148 objcDeclQualifier = static_cast<ObjcDeclQualifier>(D.ReadInt()); // VarDecl.
149}
150
151 //===------------------------------------------------------------===//
152 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
153 // the one define in ScopedDecl. This is to batch emit the //
154 // owned pointers, which results in a smaller output.
155 //===------------------------------------------------------------===//
156
157void VarDecl::EmitOutRec(Serializer& S) const {
158 // Emit these last because they will create records of their own.
159 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
160 getNextDeclarator()); // From ScopedDecl.
161}
162
163void VarDecl::ReadOutRec(Deserializer& D) {
164 Decl* next_declarator;
165
166 D.BatchReadOwnedPtrs(Init, // From VarDecl.
167 next_declarator); // From ScopedDecl.
168
169 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000170}
171
172
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000173void VarDecl::EmitImpl(Serializer& S) const {
174 VarDecl::EmitInRec(S);
175 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000176}
177
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000178void VarDecl::ReadImpl(Deserializer& D) {
179 ReadInRec(D);
180 ReadOutRec(D);
181}
182
183//===----------------------------------------------------------------------===//
184// BlockVarDecl Serialization.
185//===----------------------------------------------------------------------===//
186
187BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
188 BlockVarDecl* decl =
189 new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
190
191 decl->VarDecl::ReadImpl(D);
192
Ted Kremenek04973312007-11-02 18:05:11 +0000193 return decl;
194}
195
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000196//===----------------------------------------------------------------------===//
197// FileVarDecl Serialization.
198//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000199
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000200FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
201 FileVarDecl* decl =
202 new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
203
204 decl->VarDecl::ReadImpl(D);
205
Ted Kremenek04973312007-11-02 18:05:11 +0000206 return decl;
207}
208
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000209//===----------------------------------------------------------------------===//
210// ParmDecl Serialization.
211//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000212
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000213ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
214 ParmVarDecl* decl =
215 new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL);
216
217 decl->VarDecl::ReadImpl(D);
218
Ted Kremenek04973312007-11-02 18:05:11 +0000219 return decl;
220}
221
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000222//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000223// FieldDecl Serialization.
224//===----------------------------------------------------------------------===//
225
226void FieldDecl::EmitImpl(Serializer& S) const {
227 S.Emit(getType());
228 NamedDecl::EmitInRec(S);
229 S.EmitOwnedPtr(BitWidth);
230}
231
232FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
233 QualType DeclType = QualType::ReadVal(D);
234 FieldDecl* decl = new FieldDecl(SourceLocation(),NULL,DeclType);
235 decl->ReadInRec(D);
236 decl->BitWidth = D.ReadOwnedPtr<Expr>();
237 return decl;
238}
239
240//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000241// FunctionDecl Serialization.
242//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000243
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000244void FunctionDecl::EmitImpl(Serializer& S) const {
245 S.EmitInt(SClass); // From FunctionDecl.
246 S.EmitBool(IsInline); // From FunctionDecl.
247 ValueDecl::EmitInRec(S);
248 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000249
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000250 // NOTE: We do not need to serialize out the number of parameters, because
251 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000252
Ted Kremenekd437f232007-11-13 22:51:08 +0000253 if (ParamInfo != NULL) {
254 S.EmitBool(true);
255 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
256 getNextDeclarator());
257 }
258 else {
259 S.EmitBool(false);
260 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
261 }
Ted Kremenek04973312007-11-02 18:05:11 +0000262}
263
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000264FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000265 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
266 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000267
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000268 FunctionDecl* decl =
269 new FunctionDecl(SourceLocation(),NULL,QualType(),SClass,IsInline);
Ted Kremenek04973312007-11-02 18:05:11 +0000270
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000271 decl->ValueDecl::ReadInRec(D);
272 D.ReadPtr(decl->DeclChain);
273
274 decl->ParamInfo = decl->getNumParams()
275 ? new ParmVarDecl*[decl->getNumParams()]
276 : NULL;
277
278 Decl* next_declarator;
279
Ted Kremenekd437f232007-11-13 22:51:08 +0000280 bool hasParamDecls = D.ReadBool();
281
282 if (hasParamDecls)
283 D.BatchReadOwnedPtrs(decl->getNumParams(),
284 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
285 decl->Body, next_declarator);
286 else
287 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000288
289 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000290
291 return decl;
292}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000293
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000294//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000295// RecordDecl Serialization.
296//===----------------------------------------------------------------------===//
297
298void RecordDecl::EmitImpl(llvm::Serializer& S) const {
299 ScopedDecl::EmitInRec(S);
300 S.EmitBool(hasFlexibleArrayMember());
301 S.EmitSInt(getNumMembers());
302 if (getNumMembers() > 0) {
303 assert (Members);
304 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
305 (Decl**) &Members[0],getNextDeclarator());
306 }
307 else
308 ScopedDecl::EmitOutRec(S);
309}
310
311RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
312 RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
313
314 decl->ScopedDecl::ReadInRec(D);
315 decl->setHasFlexibleArrayMember(D.ReadBool());
316 decl->NumMembers = D.ReadSInt();
317
318 if (decl->getNumMembers() > 0) {
319 Decl* next_declarator;
320 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
321
322 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
323 (Decl**) &decl->Members[0],
324 next_declarator);
325
326 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
327 }
328 else
329 decl->ScopedDecl::ReadOutRec(D);
330
331 return decl;
332}
333
334//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000335// TypedefDecl Serialization.
336//===----------------------------------------------------------------------===//
337
338void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000339 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000340 ScopedDecl::EmitInRec(S);
341 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000342}
343
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000344TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
345 QualType T = QualType::ReadVal(D);
346
347 TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL);
348
349 decl->ScopedDecl::ReadInRec(D);
350 decl->ScopedDecl::ReadOutRec(D);
351
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000352 return decl;
353}