blob: 11577cd6dc298f7970672c977eda89a8ec95f8b9 [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
Sam Bishopf3c63ae2008-04-11 14:49:10 +000014#include "clang/AST/ASTContext.h"
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000015#include "clang/AST/Decl.h"
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000016#include "clang/AST/DeclCXX.h"
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000017#include "clang/AST/Expr.h"
18#include "llvm/Bitcode/Serialize.h"
19#include "llvm/Bitcode/Deserialize.h"
20
Ted Kremenek928fd7f2007-11-13 00:15:39 +000021using llvm::Serializer;
22using llvm::Deserializer;
23using llvm::SerializedPtrID;
24
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000025using namespace clang;
26
Ted Kremenek928fd7f2007-11-13 00:15:39 +000027//===----------------------------------------------------------------------===//
28// Decl Serialization: Dispatch code to handle specialized decl types.
29//===----------------------------------------------------------------------===//
Ted Kremenek8af8fe32007-11-05 21:38:00 +000030
Ted Kremenek928fd7f2007-11-13 00:15:39 +000031void Decl::Emit(Serializer& S) const {
32 S.EmitInt(getKind());
33 EmitImpl(S);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000034 if (const DeclContext *DC = dyn_cast<const DeclContext>(this))
35 DC->EmitOutRec(S);
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +000036}
37
Sam Bishope2563ca2008-04-07 21:55:54 +000038Decl* Decl::Create(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +000039
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000040 Decl *Dcl;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000041 Kind k = static_cast<Kind>(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +000042
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000043 switch (k) {
44 default:
45 assert (false && "Not implemented.");
Chris Lattner0ed844b2008-04-04 06:12:32 +000046
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000047 case TranslationUnit:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000048 Dcl = TranslationUnitDecl::CreateImpl(D, C);
49 break;
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +000050
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000051 case Namespace:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000052 Dcl = NamespaceDecl::CreateImpl(D, C);
53 break;
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +000054
Steve Naroff248a7532008-04-15 22:42:06 +000055 case Var:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000056 Dcl = VarDecl::CreateImpl(D, C);
57 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000058
Ted Kremenek583e0082007-11-14 18:12:19 +000059 case Enum:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000060 Dcl = EnumDecl::CreateImpl(D, C);
61 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000062
63 case EnumConstant:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000064 Dcl = EnumConstantDecl::CreateImpl(D, C);
65 break;
Ted Kremenek583e0082007-11-14 18:12:19 +000066
Ted Kremenekf9d56c82007-11-14 17:47:01 +000067 case Field:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000068 Dcl = FieldDecl::CreateImpl(D, C);
69 break;
Ted Kremenekf9d56c82007-11-14 17:47:01 +000070
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000071 case ParmVar:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000072 Dcl = ParmVarDecl::CreateImpl(D, C);
73 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000074
Fariborz Jahanian73da9e42008-12-20 20:56:12 +000075 case OriginalParmVar:
76 Dcl = ParmVarWithOriginalTypeDecl::CreateImpl(D, C);
77 break;
78
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000079 case Function:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000080 Dcl = FunctionDecl::CreateImpl(D, C);
81 break;
Douglas Gregor8e9bebd2008-10-21 16:13:35 +000082
83 case OverloadedFunction:
84 Dcl = OverloadedFunctionDecl::CreateImpl(D, C);
85 break;
86
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +000087 case Record:
88 Dcl = RecordDecl::CreateImpl(D, C);
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000089 break;
Ted Kremenekaad48b62007-11-14 08:06:37 +000090
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000091 case Typedef:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +000092 Dcl = TypedefDecl::CreateImpl(D, C);
93 break;
Anders Carlssondfab6cb2008-02-08 00:33:21 +000094
Douglas Gregor72c3f312008-12-05 18:15:24 +000095 case TemplateTypeParm:
96 Dcl = TemplateTypeParmDecl::CreateImpl(D, C);
97 break;
98
Anders Carlssondfab6cb2008-02-08 00:33:21 +000099 case FileScopeAsm:
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000100 Dcl = FileScopeAsmDecl::CreateImpl(D, C);
101 break;
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000102 }
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000103
104 if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
105 DC->ReadOutRec(D, C);
106
107 return Dcl;
Ted Kremenek2f1f8cb2007-10-25 21:37:16 +0000108}
Ted Kremenek04973312007-11-02 18:05:11 +0000109
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000110//===----------------------------------------------------------------------===//
111// Common serialization logic for subclasses of Decl.
112//===----------------------------------------------------------------------===//
113
114void Decl::EmitInRec(Serializer& S) const {
115 S.Emit(getLocation()); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000116}
117
Sam Bishope2563ca2008-04-07 21:55:54 +0000118void Decl::ReadInRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000119 Loc = SourceLocation::ReadVal(D); // From Decl.
Ted Kremenek04973312007-11-02 18:05:11 +0000120}
121
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000122//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000123// Common serialization logic for subclasses of DeclContext.
124//===----------------------------------------------------------------------===//
125
126void DeclContext::EmitOutRec(Serializer& S) const {
Douglas Gregor6037fcb2009-01-09 19:42:16 +0000127#if 0
128 // FIXME: it would be far easier to just serialize FirstDecl and let
129 // ScopedDecl do the work of serializing NextDeclInScope.
Douglas Gregor44b43212008-12-11 16:49:14 +0000130 S.EmitInt(Decls.size());
131 for (decl_iterator D = decls_begin(); D != decls_end(); ++D) {
132 bool Owned = ((*D)->getLexicalDeclContext() == this &&
133 DeclKind != Decl::TranslationUnit &&
134 !isFunctionOrMethod());
135 S.EmitBool(Owned);
136 if (Owned)
137 S.EmitOwnedPtr(*D);
138 else
139 S.EmitPtr(*D);
140 }
Douglas Gregor6037fcb2009-01-09 19:42:16 +0000141#endif
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000142}
143
144void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
Douglas Gregor6037fcb2009-01-09 19:42:16 +0000145#if 0
146 // FIXME: See comment in DeclContext::EmitOutRec
Douglas Gregor44b43212008-12-11 16:49:14 +0000147 unsigned NumDecls = D.ReadInt();
148 Decls.resize(NumDecls);
149 for (unsigned Idx = 0; Idx < NumDecls; ++Idx) {
150 bool Owned = D.ReadBool();
151 if (Owned)
152 Decls[Idx] = cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C));
153 else
154 D.ReadPtr<ScopedDecl>(Decls[Idx]);
155 }
Douglas Gregor6037fcb2009-01-09 19:42:16 +0000156#endif
Argyrios Kyrtzidis76435362008-06-10 01:32:09 +0000157}
158
159//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000160// Common serialization logic for subclasses of NamedDecl.
161//===----------------------------------------------------------------------===//
162
163void NamedDecl::EmitInRec(Serializer& S) const {
164 Decl::EmitInRec(S);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000165 S.EmitInt(Name.getNameKind());
166
167 switch (Name.getNameKind()) {
168 case DeclarationName::Identifier:
169 S.EmitPtr(Name.getAsIdentifierInfo());
170 break;
171
172 case DeclarationName::ObjCZeroArgSelector:
173 case DeclarationName::ObjCOneArgSelector:
174 case DeclarationName::ObjCMultiArgSelector:
175 Name.getObjCSelector().Emit(S);
176 break;
177
178 case DeclarationName::CXXConstructorName:
179 case DeclarationName::CXXDestructorName:
180 case DeclarationName::CXXConversionFunctionName:
181 Name.getCXXNameType().Emit(S);
182 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000183
184 case DeclarationName::CXXOperatorName:
185 S.EmitInt(Name.getCXXOverloadedOperator());
186 break;
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000187 }
Ted Kremenek04973312007-11-02 18:05:11 +0000188}
189
Sam Bishope2563ca2008-04-07 21:55:54 +0000190void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
191 Decl::ReadInRec(D, C);
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000192
193 DeclarationName::NameKind Kind
194 = static_cast<DeclarationName::NameKind>(D.ReadInt());
195 switch (Kind) {
196 case DeclarationName::Identifier: {
197 IdentifierInfo *Identifier;
198 D.ReadPtr(Identifier);
199 Name = Identifier;
200 break;
201 }
202
203 case DeclarationName::ObjCZeroArgSelector:
204 case DeclarationName::ObjCOneArgSelector:
205 case DeclarationName::ObjCMultiArgSelector:
206 Name = Selector::ReadVal(D);
207 break;
208
209 case DeclarationName::CXXConstructorName:
210 Name = C.DeclarationNames.getCXXConstructorName(QualType::ReadVal(D));
211 break;
212
213 case DeclarationName::CXXDestructorName:
214 Name = C.DeclarationNames.getCXXDestructorName(QualType::ReadVal(D));
215 break;
216
217 case DeclarationName::CXXConversionFunctionName:
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000218 Name
219 = C.DeclarationNames.getCXXConversionFunctionName(QualType::ReadVal(D));
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000220 break;
Douglas Gregore94ca9e42008-11-18 14:39:36 +0000221
222 case DeclarationName::CXXOperatorName: {
223 OverloadedOperatorKind Op
224 = static_cast<OverloadedOperatorKind>(D.ReadInt());
225 Name = C.DeclarationNames.getCXXOperatorName(Op);
226 break;
227 }
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000228 }
Ted Kremenek04973312007-11-02 18:05:11 +0000229}
230
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000231//===----------------------------------------------------------------------===//
232// Common serialization logic for subclasses of ScopedDecl.
233//===----------------------------------------------------------------------===//
234
235void ScopedDecl::EmitInRec(Serializer& S) const {
236 NamedDecl::EmitInRec(S);
Chris Lattnerb048c982008-04-06 04:47:34 +0000237 S.EmitPtr(cast_or_null<Decl>(getDeclContext())); // From ScopedDecl.
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000238 S.EmitPtr(cast_or_null<Decl>(getLexicalDeclContext())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000239}
240
Sam Bishope2563ca2008-04-07 21:55:54 +0000241void ScopedDecl::ReadInRec(Deserializer& D, ASTContext& C) {
242 NamedDecl::ReadInRec(D, C);
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000243
244 assert(DeclCtx == 0);
245
246 const SerializedPtrID &SemaDCPtrID = D.ReadPtrID();
247 const SerializedPtrID &LexicalDCPtrID = D.ReadPtrID();
248
249 if (SemaDCPtrID == LexicalDCPtrID) {
250 // Allow back-patching. Observe that we register the variable of the
251 // *object* for back-patching. Its actual value will get filled in later.
252 D.ReadUIntPtr(DeclCtx, SemaDCPtrID);
253 }
254 else {
255 MultipleDC *MDC = new MultipleDC();
256 DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1;
257 // Allow back-patching. Observe that we register the variable of the
258 // *object* for back-patching. Its actual value will get filled in later.
Argyrios Kyrtzidisb0b847e2008-11-14 23:32:45 +0000259 D.ReadPtr(MDC->SemanticDC, SemaDCPtrID);
260 D.ReadPtr(MDC->LexicalDC, LexicalDCPtrID);
Argyrios Kyrtzidis52393042008-11-09 23:41:00 +0000261 }
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000262}
263
264 //===------------------------------------------------------------===//
265 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
266 // methods. This is because owned pointers are usually "batched" //
267 // together for efficiency. //
268 //===------------------------------------------------------------===//
269
270void ScopedDecl::EmitOutRec(Serializer& S) const {
271 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000272}
273
Sam Bishope2563ca2008-04-07 21:55:54 +0000274void ScopedDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000275 NextDeclarator =
Sam Bishope2563ca2008-04-07 21:55:54 +0000276 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>(C)); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000277}
278
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000279//===----------------------------------------------------------------------===//
280// Common serialization logic for subclasses of ValueDecl.
281//===----------------------------------------------------------------------===//
282
283void ValueDecl::EmitInRec(Serializer& S) const {
284 ScopedDecl::EmitInRec(S);
285 S.Emit(getType()); // From ValueDecl.
286}
287
Sam Bishope2563ca2008-04-07 21:55:54 +0000288void ValueDecl::ReadInRec(Deserializer& D, ASTContext& C) {
289 ScopedDecl::ReadInRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000290 DeclType = QualType::ReadVal(D); // From ValueDecl.
291}
292
293//===----------------------------------------------------------------------===//
294// Common serialization logic for subclasses of VarDecl.
295//===----------------------------------------------------------------------===//
296
297void VarDecl::EmitInRec(Serializer& S) const {
298 ValueDecl::EmitInRec(S);
299 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000300}
301
Sam Bishope2563ca2008-04-07 21:55:54 +0000302void VarDecl::ReadInRec(Deserializer& D, ASTContext& C) {
303 ValueDecl::ReadInRec(D, C);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000304 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000305}
306
307 //===------------------------------------------------------------===//
308 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
309 // the one define in ScopedDecl. This is to batch emit the //
310 // owned pointers, which results in a smaller output.
311 //===------------------------------------------------------------===//
312
313void VarDecl::EmitOutRec(Serializer& S) const {
314 // Emit these last because they will create records of their own.
315 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
316 getNextDeclarator()); // From ScopedDecl.
317}
318
Sam Bishope2563ca2008-04-07 21:55:54 +0000319void VarDecl::ReadOutRec(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000320 Decl* next_declarator;
321
Sam Bishope2563ca2008-04-07 21:55:54 +0000322 D.BatchReadOwnedPtrs(Init, // From VarDecl.
323 next_declarator, // From ScopedDecl.
324 C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000325
326 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000327}
328
329
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000330void VarDecl::EmitImpl(Serializer& S) const {
331 VarDecl::EmitInRec(S);
332 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000333}
334
Sam Bishope2563ca2008-04-07 21:55:54 +0000335void VarDecl::ReadImpl(Deserializer& D, ASTContext& C) {
336 ReadInRec(D, C);
337 ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000338}
339
340//===----------------------------------------------------------------------===//
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000341// TranslationUnitDecl Serialization.
342//===----------------------------------------------------------------------===//
343
344void TranslationUnitDecl::EmitImpl(llvm::Serializer& S) const
345{
346 Decl::EmitInRec(S);
347}
348
349TranslationUnitDecl* TranslationUnitDecl::CreateImpl(Deserializer& D,
350 ASTContext& C) {
351 void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000352 TranslationUnitDecl* decl = new (Mem) TranslationUnitDecl();
Argyrios Kyrtzidisef177822008-04-17 14:40:12 +0000353
354 decl->Decl::ReadInRec(D, C);
355
356 return decl;
357}
358
359//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis2d1c5d32008-04-27 13:50:30 +0000360// NamespaceDecl Serialization.
361//===----------------------------------------------------------------------===//
362
363void NamespaceDecl::EmitImpl(llvm::Serializer& S) const
364{
365 ScopedDecl::EmitInRec(S);
366 S.Emit(getLBracLoc());
367 S.Emit(getRBracLoc());
368 ScopedDecl::EmitOutRec(S);
369}
370
371NamespaceDecl* NamespaceDecl::CreateImpl(Deserializer& D, ASTContext& C) {
372 void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
373 NamespaceDecl* decl = new (Mem) NamespaceDecl(0, SourceLocation(), 0);
374
375 decl->ScopedDecl::ReadInRec(D, C);
376 decl->LBracLoc = SourceLocation::ReadVal(D);
377 decl->RBracLoc = SourceLocation::ReadVal(D);
378 decl->ScopedDecl::ReadOutRec(D, C);
379
380 return decl;
381}
382
383//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000384// VarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000385//===----------------------------------------------------------------------===//
386
Steve Naroff248a7532008-04-15 22:42:06 +0000387VarDecl* VarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
388 void *Mem = C.getAllocator().Allocate<VarDecl>();
389 VarDecl* decl =
390 new (Mem) VarDecl(Var, 0, SourceLocation(), NULL, QualType(), None, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000391
Sam Bishope2563ca2008-04-07 21:55:54 +0000392 decl->VarDecl::ReadImpl(D, C);
Ted Kremenek04973312007-11-02 18:05:11 +0000393 return decl;
394}
395
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000396//===----------------------------------------------------------------------===//
Steve Naroff248a7532008-04-15 22:42:06 +0000397// ParmVarDecl Serialization.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000398//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000399
Ted Kremenek137bd912007-12-13 06:28:13 +0000400void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
401 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000402 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Chris Lattner04421082008-04-08 04:40:51 +0000403 S.EmitOwnedPtr(getDefaultArg()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000404}
405
Sam Bishope2563ca2008-04-07 21:55:54 +0000406ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000407 void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
408 ParmVarDecl* decl = new (Mem)
Fariborz Jahanian4306d3c2008-12-20 23:29:59 +0000409 ParmVarDecl(ParmVar,
410 0, SourceLocation(), NULL, QualType(), None, NULL, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000411
Sam Bishope2563ca2008-04-07 21:55:54 +0000412 decl->VarDecl::ReadImpl(D, C);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000413 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Chris Lattner04421082008-04-08 04:40:51 +0000414 decl->DefaultArg = D.ReadOwnedPtr<Expr>(C);
Ted Kremenek04973312007-11-02 18:05:11 +0000415 return decl;
416}
417
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000418//===----------------------------------------------------------------------===//
Fariborz Jahanian73da9e42008-12-20 20:56:12 +0000419// ParmVarWithOriginalTypeDecl Serialization.
420//===----------------------------------------------------------------------===//
421
422void ParmVarWithOriginalTypeDecl::EmitImpl(llvm::Serializer& S) const {
423 ParmVarDecl::EmitImpl(S);
424 S.Emit(OriginalType);
425}
426
427ParmVarWithOriginalTypeDecl* ParmVarWithOriginalTypeDecl::CreateImpl(
428 Deserializer& D, ASTContext& C) {
429 void *Mem = C.getAllocator().Allocate<ParmVarWithOriginalTypeDecl>();
430 ParmVarWithOriginalTypeDecl* decl = new (Mem)
431 ParmVarWithOriginalTypeDecl(0, SourceLocation(), NULL, QualType(),
432 QualType(), None, NULL, NULL);
433
434 decl->ParmVarDecl::ReadImpl(D, C);
435 decl->OriginalType = QualType::ReadVal(D);
436 return decl;
437}
438//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000439// EnumDecl Serialization.
440//===----------------------------------------------------------------------===//
441
442void EnumDecl::EmitImpl(Serializer& S) const {
443 ScopedDecl::EmitInRec(S);
444 S.EmitBool(isDefinition());
Douglas Gregor44b43212008-12-11 16:49:14 +0000445 S.Emit(IntegerType);
446 S.EmitOwnedPtr(getNextDeclarator());
Ted Kremenek583e0082007-11-14 18:12:19 +0000447}
448
Sam Bishope2563ca2008-04-07 21:55:54 +0000449EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000450 void *Mem = C.getAllocator().Allocate<EnumDecl>();
451 EnumDecl* decl = new (Mem) EnumDecl(0, SourceLocation(), NULL, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000452
Sam Bishope2563ca2008-04-07 21:55:54 +0000453 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000454 decl->setDefinition(D.ReadBool());
455 decl->IntegerType = QualType::ReadVal(D);
456
Douglas Gregor44b43212008-12-11 16:49:14 +0000457 Decl* next_declarator = D.ReadOwnedPtr<Decl>(C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000458 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
459
460 return decl;
461}
462
463//===----------------------------------------------------------------------===//
464// EnumConstantDecl Serialization.
465//===----------------------------------------------------------------------===//
466
467void EnumConstantDecl::EmitImpl(Serializer& S) const {
468 S.Emit(Val);
469 ValueDecl::EmitInRec(S);
470 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
471}
472
Sam Bishope2563ca2008-04-07 21:55:54 +0000473EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000474 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000475 D.Read(val);
476
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000477 void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
478 EnumConstantDecl* decl = new (Mem)
479 EnumConstantDecl(0, SourceLocation(), NULL, QualType(), NULL, val, NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000480
Sam Bishope2563ca2008-04-07 21:55:54 +0000481 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000482
483 Decl* next_declarator;
484
Sam Bishope2563ca2008-04-07 21:55:54 +0000485 D.BatchReadOwnedPtrs(next_declarator, decl->Init, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000486
Ted Kremenek049b1682007-11-14 23:38:09 +0000487 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000488
489 return decl;
490}
491
492//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000493// FieldDecl Serialization.
494//===----------------------------------------------------------------------===//
495
496void FieldDecl::EmitImpl(Serializer& S) const {
Douglas Gregor44b43212008-12-11 16:49:14 +0000497 S.EmitBool(Mutable);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000498 S.Emit(getType());
Douglas Gregor44b43212008-12-11 16:49:14 +0000499 ScopedDecl::EmitInRec(S);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000500 S.EmitOwnedPtr(BitWidth);
501}
502
Sam Bishope2563ca2008-04-07 21:55:54 +0000503FieldDecl* FieldDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000504 void *Mem = C.getAllocator().Allocate<FieldDecl>();
Douglas Gregor44b43212008-12-11 16:49:14 +0000505 FieldDecl* decl = new (Mem) FieldDecl(Field, 0, SourceLocation(), NULL,
506 QualType(), 0, false, 0);
507 decl->Mutable = D.ReadBool();
Ted Kremenek21d50e12007-11-14 22:51:02 +0000508 decl->DeclType.ReadBackpatch(D);
Sam Bishope2563ca2008-04-07 21:55:54 +0000509 decl->ReadInRec(D, C);
510 decl->BitWidth = D.ReadOwnedPtr<Expr>(C);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000511 return decl;
512}
513
514//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000515// FunctionDecl Serialization.
516//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000517
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000518void FunctionDecl::EmitImpl(Serializer& S) const {
519 S.EmitInt(SClass); // From FunctionDecl.
520 S.EmitBool(IsInline); // From FunctionDecl.
521 ValueDecl::EmitInRec(S);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000522 S.EmitPtr(PreviousDeclaration);
Ted Kremenek04973312007-11-02 18:05:11 +0000523
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000524 // NOTE: We do not need to serialize out the number of parameters, because
525 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000526
Ted Kremenekd437f232007-11-13 22:51:08 +0000527 if (ParamInfo != NULL) {
528 S.EmitBool(true);
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000529 S.EmitInt(getNumParams());
Ted Kremenekd437f232007-11-13 22:51:08 +0000530 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
531 getNextDeclarator());
532 }
533 else {
534 S.EmitBool(false);
535 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
536 }
Ted Kremenek04973312007-11-02 18:05:11 +0000537}
538
Sam Bishope2563ca2008-04-07 21:55:54 +0000539FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek04973312007-11-02 18:05:11 +0000540 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
541 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000542
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000543 void *Mem = C.getAllocator().Allocate<FunctionDecl>();
544 FunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000545 FunctionDecl(Function, 0, SourceLocation(), DeclarationName(),
Argyrios Kyrtzidisd3bb44f2008-06-09 21:05:31 +0000546 QualType(), SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000547
Sam Bishope2563ca2008-04-07 21:55:54 +0000548 decl->ValueDecl::ReadInRec(D, C);
Ted Kremenek3bbc1982008-05-20 03:33:58 +0000549 D.ReadPtr(decl->PreviousDeclaration);
Ted Kremenekda256852007-11-16 18:11:10 +0000550
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000551 Decl* next_declarator;
552
Douglas Gregor6b54bd12009-01-05 17:18:30 +0000553 int numParams = 0;
Ted Kremenekd437f232007-11-13 22:51:08 +0000554 bool hasParamDecls = D.ReadBool();
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000555 if (hasParamDecls)
556 numParams = D.ReadInt();
Ted Kremenekda256852007-11-16 18:11:10 +0000557
558 decl->ParamInfo = hasParamDecls
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000559 ? new ParmVarDecl*[numParams]
Ted Kremenekda256852007-11-16 18:11:10 +0000560 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000561
562 if (hasParamDecls)
Argyrios Kyrtzidisdc5ddbf2008-11-07 14:22:23 +0000563 D.BatchReadOwnedPtrs(numParams,
Ted Kremenekd437f232007-11-13 22:51:08 +0000564 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
Sam Bishope2563ca2008-04-07 21:55:54 +0000565 decl->Body, next_declarator, C);
Ted Kremenekd437f232007-11-13 22:51:08 +0000566 else
Sam Bishope2563ca2008-04-07 21:55:54 +0000567 D.BatchReadOwnedPtrs(decl->Body, next_declarator, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000568
569 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000570
571 return decl;
572}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000573
Steve Naroff56ee6892008-10-08 17:01:13 +0000574void BlockDecl::EmitImpl(Serializer& S) const {
575 // FIXME: what about arguments?
576 S.Emit(getCaretLocation());
577 S.EmitOwnedPtr(Body);
578}
579
580BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) {
581 QualType Q = QualType::ReadVal(D);
582 SourceLocation L = SourceLocation::ReadVal(D);
583 /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/;
584 assert(0 && "Cannot deserialize BlockBlockExpr yet");
585 // FIXME: need to handle parameters.
586 //return new BlockBlockExpr(L, Q, BodyStmt);
587 return 0;
588}
589
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000590//===----------------------------------------------------------------------===//
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000591// OverloadedFunctionDecl Serialization.
592//===----------------------------------------------------------------------===//
593
594void OverloadedFunctionDecl::EmitImpl(Serializer& S) const {
595 NamedDecl::EmitInRec(S);
596
597 S.EmitInt(getNumFunctions());
598 for (unsigned func = 0; func < getNumFunctions(); ++func)
599 S.EmitPtr(Functions[func]);
600}
601
602OverloadedFunctionDecl *
603OverloadedFunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) {
604 void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>();
605 OverloadedFunctionDecl* decl = new (Mem)
Douglas Gregor2e1cd422008-11-17 14:58:09 +0000606 OverloadedFunctionDecl(0, DeclarationName());
Douglas Gregor8e9bebd2008-10-21 16:13:35 +0000607
608 decl->NamedDecl::ReadInRec(D, C);
609
610 unsigned numFunctions = D.ReadInt();
611 decl->Functions.reserve(numFunctions);
612 for (unsigned func = 0; func < numFunctions; ++func)
613 D.ReadPtr(decl->Functions[func]);
614
615 return decl;
616}
617
618//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000619// RecordDecl Serialization.
620//===----------------------------------------------------------------------===//
621
Ted Kremenek583e0082007-11-14 18:12:19 +0000622void RecordDecl::EmitImpl(Serializer& S) const {
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000623 S.EmitInt(getTagKind());
624
Ted Kremenekaad48b62007-11-14 08:06:37 +0000625 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000626 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000627 S.EmitBool(hasFlexibleArrayMember());
Douglas Gregorbcbffc42009-01-07 00:43:41 +0000628 S.EmitBool(isAnonymousStructOrUnion());
Douglas Gregor44b43212008-12-11 16:49:14 +0000629 ScopedDecl::EmitOutRec(S);
Ted Kremenekaad48b62007-11-14 08:06:37 +0000630}
631
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000632RecordDecl* RecordDecl::CreateImpl(Deserializer& D, ASTContext& C) {
633 TagKind TK = TagKind(D.ReadInt());
Sam Bishope2563ca2008-04-07 21:55:54 +0000634
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000635 void *Mem = C.getAllocator().Allocate<RecordDecl>();
Argyrios Kyrtzidis35bc0822008-10-15 00:42:39 +0000636 RecordDecl* decl = new (Mem) RecordDecl(Record, TK, 0, SourceLocation(), NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000637
Sam Bishope2563ca2008-04-07 21:55:54 +0000638 decl->ScopedDecl::ReadInRec(D, C);
Ted Kremenek583e0082007-11-14 18:12:19 +0000639 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000640 decl->setHasFlexibleArrayMember(D.ReadBool());
Douglas Gregorbcbffc42009-01-07 00:43:41 +0000641 decl->setAnonymousStructOrUnion(D.ReadBool());
Douglas Gregor44b43212008-12-11 16:49:14 +0000642 decl->ScopedDecl::ReadOutRec(D, C);
643
Ted Kremenekaad48b62007-11-14 08:06:37 +0000644 return decl;
645}
646
647//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000648// TypedefDecl Serialization.
649//===----------------------------------------------------------------------===//
650
651void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000652 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000653 ScopedDecl::EmitInRec(S);
654 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000655}
656
Sam Bishope2563ca2008-04-07 21:55:54 +0000657TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000658 QualType T = QualType::ReadVal(D);
659
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000660 void *Mem = C.getAllocator().Allocate<TypedefDecl>();
661 TypedefDecl* decl = new (Mem) TypedefDecl(0, SourceLocation(), NULL, T, NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000662
Sam Bishope2563ca2008-04-07 21:55:54 +0000663 decl->ScopedDecl::ReadInRec(D, C);
664 decl->ScopedDecl::ReadOutRec(D, C);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000665
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000666 return decl;
667}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000668
669//===----------------------------------------------------------------------===//
Douglas Gregor72c3f312008-12-05 18:15:24 +0000670// TemplateTypeParmDecl Serialization.
671//===----------------------------------------------------------------------===//
672
673void TemplateTypeParmDecl::EmitImpl(Serializer& S) const {
674 S.EmitBool(Typename);
675 ScopedDecl::EmitInRec(S);
676 ScopedDecl::EmitOutRec(S);
677}
678
679TemplateTypeParmDecl *
680TemplateTypeParmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
681 bool Typename = D.ReadBool();
682 void *Mem = C.getAllocator().Allocate<TemplateTypeParmDecl>();
683 TemplateTypeParmDecl *decl
684 = new (Mem) TemplateTypeParmDecl(0, SourceLocation(), NULL, Typename);
685 decl->ScopedDecl::ReadInRec(D, C);
686 decl->ScopedDecl::ReadOutRec(D, C);
687 return decl;
688}
689
690//===----------------------------------------------------------------------===//
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000691// LinkageSpec Serialization.
692//===----------------------------------------------------------------------===//
693
694void LinkageSpecDecl::EmitInRec(Serializer& S) const {
695 Decl::EmitInRec(S);
696 S.EmitInt(getLanguage());
Douglas Gregorf44515a2008-12-16 22:23:02 +0000697 S.EmitBool(HadBraces);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000698}
699
Sam Bishope2563ca2008-04-07 21:55:54 +0000700void LinkageSpecDecl::ReadInRec(Deserializer& D, ASTContext& C) {
701 Decl::ReadInRec(D, C);
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000702 Language = static_cast<LanguageIDs>(D.ReadInt());
Douglas Gregorf44515a2008-12-16 22:23:02 +0000703 HadBraces = D.ReadBool();
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000704}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000705
706//===----------------------------------------------------------------------===//
707// FileScopeAsm Serialization.
708//===----------------------------------------------------------------------===//
709
710void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
711{
712 Decl::EmitInRec(S);
713 S.EmitOwnedPtr(AsmString);
714}
715
Sam Bishope2563ca2008-04-07 21:55:54 +0000716FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D, ASTContext& C) {
Sam Bishopf3c63ae2008-04-11 14:49:10 +0000717 void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
718 FileScopeAsmDecl* decl = new (Mem) FileScopeAsmDecl(SourceLocation(), 0);
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000719
Sam Bishope2563ca2008-04-07 21:55:54 +0000720 decl->Decl::ReadInRec(D, C);
721 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>(C));
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000722// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
723
724 return decl;
725}