blob: e6b3f93096ce4074329fdff1939de094ca79297c [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;
Chris Lattner0ed844b2008-04-04 06:12:32 +000042
Ted Kremenek2ebc89f2007-11-06 19:51:47 +000043 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.
Steve Naroffb6e64c52008-04-04 18:15:49 +0000109 S.EmitPtr(cast_or_null<Decl>(getContextDecl())); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000110}
111
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000112void ScopedDecl::ReadInRec(Deserializer& D) {
113 NamedDecl::ReadInRec(D);
114 D.ReadPtr(Next); // From ScopedDecl.
Chris Lattner0ed844b2008-04-04 06:12:32 +0000115 Decl *TmpD;
116 D.ReadPtr(TmpD); // From ScopedDecl.
117 CtxDecl = cast_or_null<ContextDecl>(TmpD);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000118}
119
120 //===------------------------------------------------------------===//
121 // NOTE: Not all subclasses of ScopedDecl will use the "OutRec" //
122 // methods. This is because owned pointers are usually "batched" //
123 // together for efficiency. //
124 //===------------------------------------------------------------===//
125
126void ScopedDecl::EmitOutRec(Serializer& S) const {
127 S.EmitOwnedPtr(getNextDeclarator()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000128}
129
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000130void ScopedDecl::ReadOutRec(Deserializer& D) {
131 NextDeclarator =
132 cast_or_null<ScopedDecl>(D.ReadOwnedPtr<Decl>()); // From ScopedDecl.
Ted Kremenek04973312007-11-02 18:05:11 +0000133}
134
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000135//===----------------------------------------------------------------------===//
136// Common serialization logic for subclasses of ValueDecl.
137//===----------------------------------------------------------------------===//
138
139void ValueDecl::EmitInRec(Serializer& S) const {
140 ScopedDecl::EmitInRec(S);
141 S.Emit(getType()); // From ValueDecl.
142}
143
144void ValueDecl::ReadInRec(Deserializer& D) {
145 ScopedDecl::ReadInRec(D);
146 DeclType = QualType::ReadVal(D); // From ValueDecl.
147}
148
149//===----------------------------------------------------------------------===//
150// Common serialization logic for subclasses of VarDecl.
151//===----------------------------------------------------------------------===//
152
153void VarDecl::EmitInRec(Serializer& S) const {
154 ValueDecl::EmitInRec(S);
155 S.EmitInt(getStorageClass()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000156}
157
158void VarDecl::ReadInRec(Deserializer& D) {
159 ValueDecl::ReadInRec(D);
Fariborz Jahaniande7b4cd2007-12-13 00:54:18 +0000160 SClass = static_cast<StorageClass>(D.ReadInt()); // From VarDecl.
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000161}
162
163 //===------------------------------------------------------------===//
164 // NOTE: VarDecl has its own "OutRec" methods that doesn't use //
165 // the one define in ScopedDecl. This is to batch emit the //
166 // owned pointers, which results in a smaller output.
167 //===------------------------------------------------------------===//
168
169void VarDecl::EmitOutRec(Serializer& S) const {
170 // Emit these last because they will create records of their own.
171 S.BatchEmitOwnedPtrs(getInit(), // From VarDecl.
172 getNextDeclarator()); // From ScopedDecl.
173}
174
175void VarDecl::ReadOutRec(Deserializer& D) {
176 Decl* next_declarator;
177
178 D.BatchReadOwnedPtrs(Init, // From VarDecl.
179 next_declarator); // From ScopedDecl.
180
181 setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000182}
183
184
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000185void VarDecl::EmitImpl(Serializer& S) const {
186 VarDecl::EmitInRec(S);
187 VarDecl::EmitOutRec(S);
Ted Kremenek04973312007-11-02 18:05:11 +0000188}
189
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000190void VarDecl::ReadImpl(Deserializer& D) {
191 ReadInRec(D);
192 ReadOutRec(D);
193}
194
195//===----------------------------------------------------------------------===//
196// BlockVarDecl Serialization.
197//===----------------------------------------------------------------------===//
198
199BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) {
200 BlockVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000201 new BlockVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000202
203 decl->VarDecl::ReadImpl(D);
204
Ted Kremenek04973312007-11-02 18:05:11 +0000205 return decl;
206}
207
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000208//===----------------------------------------------------------------------===//
209// FileVarDecl Serialization.
210//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000211
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000212FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) {
213 FileVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000214 new FileVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000215
216 decl->VarDecl::ReadImpl(D);
217
Ted Kremenek04973312007-11-02 18:05:11 +0000218 return decl;
219}
220
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000221//===----------------------------------------------------------------------===//
222// ParmDecl Serialization.
223//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000224
Ted Kremenek137bd912007-12-13 06:28:13 +0000225void ParmVarDecl::EmitImpl(llvm::Serializer& S) const {
226 VarDecl::EmitImpl(S);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000227 S.EmitInt(getObjCDeclQualifier()); // From ParmVarDecl.
Ted Kremenek137bd912007-12-13 06:28:13 +0000228}
229
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000230ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) {
231 ParmVarDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000232 new ParmVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000233
234 decl->VarDecl::ReadImpl(D);
Ted Kremeneka526c5c2008-01-07 19:49:32 +0000235 decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt());
Ted Kremenek137bd912007-12-13 06:28:13 +0000236
Ted Kremenek04973312007-11-02 18:05:11 +0000237 return decl;
238}
239
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000240//===----------------------------------------------------------------------===//
Ted Kremenek583e0082007-11-14 18:12:19 +0000241// EnumDecl Serialization.
242//===----------------------------------------------------------------------===//
243
244void EnumDecl::EmitImpl(Serializer& S) const {
245 ScopedDecl::EmitInRec(S);
246 S.EmitBool(isDefinition());
247 S.Emit(IntegerType);
248 S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
249}
250
251EnumDecl* EnumDecl::CreateImpl(Deserializer& D) {
Chris Lattner0ed844b2008-04-04 06:12:32 +0000252 EnumDecl* decl = new EnumDecl(0, SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000253
254 decl->ScopedDecl::ReadInRec(D);
255 decl->setDefinition(D.ReadBool());
256 decl->IntegerType = QualType::ReadVal(D);
257
258 Decl* next_declarator;
259 Decl* Elist;
260
261 D.BatchReadOwnedPtrs(Elist,next_declarator);
262
263 decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
264 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
265
266 return decl;
267}
268
269//===----------------------------------------------------------------------===//
270// EnumConstantDecl Serialization.
271//===----------------------------------------------------------------------===//
272
273void EnumConstantDecl::EmitImpl(Serializer& S) const {
274 S.Emit(Val);
275 ValueDecl::EmitInRec(S);
276 S.BatchEmitOwnedPtrs(getNextDeclarator(),Init);
277}
278
279EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D) {
Ted Kremenek049b1682007-11-14 23:38:09 +0000280 llvm::APSInt val(1);
Ted Kremenek583e0082007-11-14 18:12:19 +0000281 D.Read(val);
282
283 EnumConstantDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000284 new EnumConstantDecl(0, SourceLocation(),NULL,QualType(),NULL,
Ted Kremenek583e0082007-11-14 18:12:19 +0000285 val,NULL);
286
287 decl->ValueDecl::ReadInRec(D);
288
289 Decl* next_declarator;
290
291 D.BatchReadOwnedPtrs(next_declarator,decl->Init);
292
Ted Kremenek049b1682007-11-14 23:38:09 +0000293 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek583e0082007-11-14 18:12:19 +0000294
295 return decl;
296}
297
298//===----------------------------------------------------------------------===//
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000299// FieldDecl Serialization.
300//===----------------------------------------------------------------------===//
301
302void FieldDecl::EmitImpl(Serializer& S) const {
303 S.Emit(getType());
304 NamedDecl::EmitInRec(S);
305 S.EmitOwnedPtr(BitWidth);
306}
307
308FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
Chris Lattner0ed844b2008-04-04 06:12:32 +0000309 FieldDecl* decl = new FieldDecl(0, SourceLocation(), NULL, QualType(), 0);
Ted Kremenek21d50e12007-11-14 22:51:02 +0000310 decl->DeclType.ReadBackpatch(D);
Ted Kremenekf9d56c82007-11-14 17:47:01 +0000311 decl->ReadInRec(D);
312 decl->BitWidth = D.ReadOwnedPtr<Expr>();
313 return decl;
314}
315
316//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000317// FunctionDecl Serialization.
318//===----------------------------------------------------------------------===//
Ted Kremenek04973312007-11-02 18:05:11 +0000319
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000320void FunctionDecl::EmitImpl(Serializer& S) const {
321 S.EmitInt(SClass); // From FunctionDecl.
322 S.EmitBool(IsInline); // From FunctionDecl.
323 ValueDecl::EmitInRec(S);
324 S.EmitPtr(DeclChain);
Ted Kremenek04973312007-11-02 18:05:11 +0000325
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000326 // NOTE: We do not need to serialize out the number of parameters, because
327 // that is encoded in the type (accessed via getNumParams()).
Ted Kremenek04973312007-11-02 18:05:11 +0000328
Ted Kremenekd437f232007-11-13 22:51:08 +0000329 if (ParamInfo != NULL) {
330 S.EmitBool(true);
331 S.BatchEmitOwnedPtrs(getNumParams(),&ParamInfo[0], Body,
332 getNextDeclarator());
333 }
334 else {
335 S.EmitBool(false);
336 S.BatchEmitOwnedPtrs(Body,getNextDeclarator());
337 }
Ted Kremenek04973312007-11-02 18:05:11 +0000338}
339
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000340FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
Ted Kremenek04973312007-11-02 18:05:11 +0000341 StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
342 bool IsInline = D.ReadBool();
Ted Kremenek04973312007-11-02 18:05:11 +0000343
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000344 FunctionDecl* decl =
Chris Lattner0ed844b2008-04-04 06:12:32 +0000345 new FunctionDecl(0, SourceLocation(),NULL,QualType(),SClass, IsInline, 0);
Ted Kremenek04973312007-11-02 18:05:11 +0000346
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000347 decl->ValueDecl::ReadInRec(D);
348 D.ReadPtr(decl->DeclChain);
Ted Kremenekda256852007-11-16 18:11:10 +0000349
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000350 Decl* next_declarator;
351
Ted Kremenekd437f232007-11-13 22:51:08 +0000352 bool hasParamDecls = D.ReadBool();
Ted Kremenekda256852007-11-16 18:11:10 +0000353
354 decl->ParamInfo = hasParamDecls
355 ? new ParmVarDecl*[decl->getNumParams()]
356 : NULL;
Ted Kremenekd437f232007-11-13 22:51:08 +0000357
358 if (hasParamDecls)
359 D.BatchReadOwnedPtrs(decl->getNumParams(),
360 reinterpret_cast<Decl**>(&decl->ParamInfo[0]),
361 decl->Body, next_declarator);
362 else
363 D.BatchReadOwnedPtrs(decl->Body, next_declarator);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000364
365 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
Ted Kremenek04973312007-11-02 18:05:11 +0000366
367 return decl;
368}
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000369
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000370//===----------------------------------------------------------------------===//
Ted Kremenekaad48b62007-11-14 08:06:37 +0000371// RecordDecl Serialization.
372//===----------------------------------------------------------------------===//
373
Ted Kremenek583e0082007-11-14 18:12:19 +0000374void RecordDecl::EmitImpl(Serializer& S) const {
Ted Kremenekaad48b62007-11-14 08:06:37 +0000375 ScopedDecl::EmitInRec(S);
Ted Kremenek583e0082007-11-14 18:12:19 +0000376 S.EmitBool(isDefinition());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000377 S.EmitBool(hasFlexibleArrayMember());
378 S.EmitSInt(getNumMembers());
379 if (getNumMembers() > 0) {
380 assert (Members);
381 S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
382 (Decl**) &Members[0],getNextDeclarator());
383 }
384 else
385 ScopedDecl::EmitOutRec(S);
386}
387
388RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
Chris Lattner0ed844b2008-04-04 06:12:32 +0000389 RecordDecl* decl = new RecordDecl(DK,0,SourceLocation(),NULL,NULL);
Ted Kremenek583e0082007-11-14 18:12:19 +0000390
Ted Kremenekaad48b62007-11-14 08:06:37 +0000391 decl->ScopedDecl::ReadInRec(D);
Ted Kremenek583e0082007-11-14 18:12:19 +0000392 decl->setDefinition(D.ReadBool());
Ted Kremenekaad48b62007-11-14 08:06:37 +0000393 decl->setHasFlexibleArrayMember(D.ReadBool());
394 decl->NumMembers = D.ReadSInt();
395
396 if (decl->getNumMembers() > 0) {
397 Decl* next_declarator;
398 decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
399
400 D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
401 (Decl**) &decl->Members[0],
402 next_declarator);
403
404 decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
405 }
406 else
407 decl->ScopedDecl::ReadOutRec(D);
408
409 return decl;
410}
411
412//===----------------------------------------------------------------------===//
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000413// TypedefDecl Serialization.
414//===----------------------------------------------------------------------===//
415
416void TypedefDecl::EmitImpl(Serializer& S) const {
Ted Kremenek2ebc89f2007-11-06 19:51:47 +0000417 S.Emit(UnderlyingType);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000418 ScopedDecl::EmitInRec(S);
419 ScopedDecl::EmitOutRec(S);
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000420}
421
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000422TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) {
423 QualType T = QualType::ReadVal(D);
424
Chris Lattner0ed844b2008-04-04 06:12:32 +0000425 TypedefDecl* decl = new TypedefDecl(0, SourceLocation(),NULL,T,NULL);
Ted Kremenek928fd7f2007-11-13 00:15:39 +0000426
427 decl->ScopedDecl::ReadInRec(D);
428 decl->ScopedDecl::ReadOutRec(D);
429
Ted Kremenekf7bf4112007-11-05 21:49:34 +0000430 return decl;
431}
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000432
433//===----------------------------------------------------------------------===//
434// LinkageSpec Serialization.
435//===----------------------------------------------------------------------===//
436
437void LinkageSpecDecl::EmitInRec(Serializer& S) const {
438 Decl::EmitInRec(S);
439 S.EmitInt(getLanguage());
440 S.EmitPtr(D);
441}
442
443void LinkageSpecDecl::ReadInRec(Deserializer& D) {
444 Decl::ReadInRec(D);
445 Language = static_cast<LanguageIDs>(D.ReadInt());
446 D.ReadPtr(this->D);
447}
Anders Carlssondfab6cb2008-02-08 00:33:21 +0000448
449//===----------------------------------------------------------------------===//
450// FileScopeAsm Serialization.
451//===----------------------------------------------------------------------===//
452
453void FileScopeAsmDecl::EmitImpl(llvm::Serializer& S) const
454{
455 Decl::EmitInRec(S);
456 S.EmitOwnedPtr(AsmString);
457}
458
459FileScopeAsmDecl* FileScopeAsmDecl::CreateImpl(Deserializer& D) {
460 FileScopeAsmDecl* decl = new FileScopeAsmDecl(SourceLocation(), 0);
461
462 decl->Decl::ReadInRec(D);
463 decl->AsmString = cast<StringLiteral>(D.ReadOwnedPtr<Expr>());
464// D.ReadOwnedPtr(D.ReadOwnedPtr<StringLiteral>())<#T * * Ptr#>, <#bool AutoRegister#>)(decl->AsmString);
465
466 return decl;
467}