blob: 058b19dab357bc8f9493821c3eaa9c96a7e9a3d3 [file] [log] [blame]
Chris Lattner487412d2009-04-27 05:27:42 +00001//===--- PCHReaderDecl.cpp - Decl Deserialization ---------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the PCHReader::ReadDeclRecord method, which is the
11// entrypoint for loading a decl.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Frontend/PCHReader.h"
16#include "clang/AST/ASTConsumer.h"
17#include "clang/AST/ASTContext.h"
18#include "clang/AST/DeclVisitor.h"
19#include "clang/AST/DeclGroup.h"
Chris Lattnerca025db2010-05-07 21:43:38 +000020#include "clang/AST/DeclCXX.h"
21#include "clang/AST/DeclTemplate.h"
Chris Lattner487412d2009-04-27 05:27:42 +000022#include "clang/AST/Expr.h"
23using namespace clang;
24
Chris Lattner487412d2009-04-27 05:27:42 +000025
26//===----------------------------------------------------------------------===//
27// Declaration deserialization
28//===----------------------------------------------------------------------===//
29
Argyrios Kyrtzidis74d28bd2010-06-29 22:47:00 +000030namespace clang {
Chris Lattner487412d2009-04-27 05:27:42 +000031 class PCHDeclReader : public DeclVisitor<PCHDeclReader, void> {
32 PCHReader &Reader;
33 const PCHReader::RecordData &Record;
34 unsigned &Idx;
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +000035 pch::TypeID TypeIDForTypeDecl;
Chris Lattner487412d2009-04-27 05:27:42 +000036
37 public:
38 PCHDeclReader(PCHReader &Reader, const PCHReader::RecordData &Record,
39 unsigned &Idx)
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +000040 : Reader(Reader), Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
Chris Lattner487412d2009-04-27 05:27:42 +000041
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +000042 void Visit(Decl *D);
43
Chris Lattner487412d2009-04-27 05:27:42 +000044 void VisitDecl(Decl *D);
45 void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
46 void VisitNamedDecl(NamedDecl *ND);
Douglas Gregore31bbd92010-02-21 18:22:14 +000047 void VisitNamespaceDecl(NamespaceDecl *D);
Chris Lattnerca025db2010-05-07 21:43:38 +000048 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
49 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000050 void VisitTypeDecl(TypeDecl *TD);
51 void VisitTypedefDecl(TypedefDecl *TD);
Argyrios Kyrtzidisbd8ac8c2010-06-30 08:49:30 +000052 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000053 void VisitTagDecl(TagDecl *TD);
54 void VisitEnumDecl(EnumDecl *ED);
55 void VisitRecordDecl(RecordDecl *RD);
Chris Lattnerca025db2010-05-07 21:43:38 +000056 void VisitCXXRecordDecl(CXXRecordDecl *D);
57 void VisitClassTemplateSpecializationDecl(
58 ClassTemplateSpecializationDecl *D);
59 void VisitClassTemplatePartialSpecializationDecl(
60 ClassTemplatePartialSpecializationDecl *D);
61 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000062 void VisitValueDecl(ValueDecl *VD);
63 void VisitEnumConstantDecl(EnumConstantDecl *ECD);
Argyrios Kyrtzidisbd8ac8c2010-06-30 08:49:30 +000064 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +000065 void VisitDeclaratorDecl(DeclaratorDecl *DD);
Chris Lattner487412d2009-04-27 05:27:42 +000066 void VisitFunctionDecl(FunctionDecl *FD);
Chris Lattnerca025db2010-05-07 21:43:38 +000067 void VisitCXXMethodDecl(CXXMethodDecl *D);
68 void VisitCXXConstructorDecl(CXXConstructorDecl *D);
69 void VisitCXXDestructorDecl(CXXDestructorDecl *D);
70 void VisitCXXConversionDecl(CXXConversionDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000071 void VisitFieldDecl(FieldDecl *FD);
72 void VisitVarDecl(VarDecl *VD);
73 void VisitImplicitParamDecl(ImplicitParamDecl *PD);
74 void VisitParmVarDecl(ParmVarDecl *PD);
Chris Lattnerca025db2010-05-07 21:43:38 +000075 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
76 void VisitTemplateDecl(TemplateDecl *D);
77 void VisitClassTemplateDecl(ClassTemplateDecl *D);
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +000078 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
Chris Lattnerca025db2010-05-07 21:43:38 +000079 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
Argyrios Kyrtzidis41d45622010-06-20 14:40:59 +000080 void VisitUsingDecl(UsingDecl *D);
81 void VisitUsingShadowDecl(UsingShadowDecl *D);
Chris Lattnerca025db2010-05-07 21:43:38 +000082 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000083 void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
Abramo Bagnarad7340582010-06-05 05:09:32 +000084 void VisitAccessSpecDecl(AccessSpecDecl *D);
Argyrios Kyrtzidis74d28bd2010-06-29 22:47:00 +000085 void VisitFriendDecl(FriendDecl *D);
Chris Lattnerca025db2010-05-07 21:43:38 +000086 void VisitFriendTemplateDecl(FriendTemplateDecl *D);
87 void VisitStaticAssertDecl(StaticAssertDecl *D);
Chris Lattner487412d2009-04-27 05:27:42 +000088 void VisitBlockDecl(BlockDecl *BD);
Chris Lattnerca025db2010-05-07 21:43:38 +000089
Chris Lattner487412d2009-04-27 05:27:42 +000090 std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
Chris Lattnerca025db2010-05-07 21:43:38 +000091
Alexis Hunted053252010-05-30 07:21:58 +000092 // FIXME: Reorder according to DeclNodes.td?
Chris Lattner487412d2009-04-27 05:27:42 +000093 void VisitObjCMethodDecl(ObjCMethodDecl *D);
94 void VisitObjCContainerDecl(ObjCContainerDecl *D);
95 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
96 void VisitObjCIvarDecl(ObjCIvarDecl *D);
97 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
98 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
99 void VisitObjCClassDecl(ObjCClassDecl *D);
100 void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
101 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
102 void VisitObjCImplDecl(ObjCImplDecl *D);
103 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
104 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
105 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
106 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
107 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
108 };
109}
110
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +0000111void PCHDeclReader::Visit(Decl *D) {
112 DeclVisitor<PCHDeclReader, void>::Visit(D);
113
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000114 if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) {
115 // if we have a fully initialized TypeDecl, we can safely read its type now.
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +0000116 TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr());
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000117 } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
118 // FunctionDecl's body was written last after all other Stmts/Exprs.
119 if (Record[Idx++])
Sebastian Redl3d3f0b12010-07-19 22:38:35 +0000120 FD->setLazyBody(Reader.Chain[0]->DeclsCursor.GetCurrentBitNo());
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000121 }
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +0000122}
123
Chris Lattner487412d2009-04-27 05:27:42 +0000124void PCHDeclReader::VisitDecl(Decl *D) {
125 D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
126 D->setLexicalDeclContext(
127 cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
128 D->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
129 D->setInvalidDecl(Record[Idx++]);
130 if (Record[Idx++])
Argyrios Kyrtzidis91167172010-06-11 23:09:25 +0000131 D->initAttrs(Reader.ReadAttributes());
Chris Lattner487412d2009-04-27 05:27:42 +0000132 D->setImplicit(Record[Idx++]);
Douglas Gregorc9c02ed2009-06-19 23:52:42 +0000133 D->setUsed(Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000134 D->setAccess((AccessSpecifier)Record[Idx++]);
Douglas Gregor16bef852009-10-16 20:01:17 +0000135 D->setPCHLevel(Record[Idx++] + 1);
Chris Lattner487412d2009-04-27 05:27:42 +0000136}
137
138void PCHDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {
139 VisitDecl(TU);
Chris Lattnerca025db2010-05-07 21:43:38 +0000140 TU->setAnonymousNamespace(
141 cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000142}
143
144void PCHDeclReader::VisitNamedDecl(NamedDecl *ND) {
145 VisitDecl(ND);
Mike Stump11289f42009-09-09 15:08:12 +0000146 ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
Chris Lattner487412d2009-04-27 05:27:42 +0000147}
148
149void PCHDeclReader::VisitTypeDecl(TypeDecl *TD) {
150 VisitNamedDecl(TD);
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +0000151 // Delay type reading until after we have fully initialized the decl.
152 TypeIDForTypeDecl = Record[Idx++];
Chris Lattner487412d2009-04-27 05:27:42 +0000153}
154
155void PCHDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
Argyrios Kyrtzidis318b0e72010-07-02 11:55:01 +0000156 VisitTypeDecl(TD);
John McCallbcd03502009-12-07 02:54:59 +0000157 TD->setTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner487412d2009-04-27 05:27:42 +0000158}
159
160void PCHDeclReader::VisitTagDecl(TagDecl *TD) {
161 VisitTypeDecl(TD);
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000162 TD->IdentifierNamespace = Record[Idx++];
Douglas Gregorb6b8f9e2009-07-29 23:36:44 +0000163 TD->setPreviousDeclaration(
164 cast_or_null<TagDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000165 TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
166 TD->setDefinition(Record[Idx++]);
Douglas Gregor5089c762010-02-12 17:40:34 +0000167 TD->setEmbeddedInDeclarator(Record[Idx++]);
Argyrios Kyrtzidis664b6902009-07-14 03:18:02 +0000168 TD->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor82fe3e32009-07-21 14:46:17 +0000169 TD->setTagKeywordLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
John McCall3e11ebe2010-03-15 10:12:16 +0000170 // FIXME: maybe read optional qualifier and its range.
171 TD->setTypedefForAnonDecl(
172 cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000173}
174
175void PCHDeclReader::VisitEnumDecl(EnumDecl *ED) {
176 VisitTagDecl(ED);
177 ED->setIntegerType(Reader.GetType(Record[Idx++]));
John McCall56774992009-12-09 09:09:27 +0000178 ED->setPromotionType(Reader.GetType(Record[Idx++]));
John McCall9aa35be2010-05-06 08:49:23 +0000179 ED->setNumPositiveBits(Record[Idx++]);
180 ED->setNumNegativeBits(Record[Idx++]);
Argyrios Kyrtzidis282b36b2010-07-06 15:36:48 +0000181 ED->setInstantiationOfMemberEnum(
182 cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000183}
184
185void PCHDeclReader::VisitRecordDecl(RecordDecl *RD) {
186 VisitTagDecl(RD);
187 RD->setHasFlexibleArrayMember(Record[Idx++]);
188 RD->setAnonymousStructOrUnion(Record[Idx++]);
Fariborz Jahanian8e0d0422009-07-08 16:37:44 +0000189 RD->setHasObjectMember(Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000190}
191
192void PCHDeclReader::VisitValueDecl(ValueDecl *VD) {
193 VisitNamedDecl(VD);
194 VD->setType(Reader.GetType(Record[Idx++]));
195}
196
197void PCHDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {
198 VisitValueDecl(ECD);
199 if (Record[Idx++])
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000200 ECD->setInitExpr(Reader.ReadExpr());
Chris Lattner487412d2009-04-27 05:27:42 +0000201 ECD->setInitVal(Reader.ReadAPSInt(Record, Idx));
202}
203
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +0000204void PCHDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
205 VisitValueDecl(DD);
John McCallbcd03502009-12-07 02:54:59 +0000206 TypeSourceInfo *TInfo = Reader.GetTypeSourceInfo(Record, Idx);
207 if (TInfo)
208 DD->setTypeSourceInfo(TInfo);
John McCall3e11ebe2010-03-15 10:12:16 +0000209 // FIXME: read optional qualifier and its range.
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +0000210}
211
Chris Lattner487412d2009-04-27 05:27:42 +0000212void PCHDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +0000213 VisitDeclaratorDecl(FD);
Chris Lattnerca025db2010-05-07 21:43:38 +0000214
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000215 FD->IdentifierNamespace = Record[Idx++];
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000216 switch ((FunctionDecl::TemplatedKind)Record[Idx++]) {
Argyrios Kyrtzidis0b0369a2010-06-28 09:31:34 +0000217 default: assert(false && "Unhandled TemplatedKind!");
218 break;
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000219 case FunctionDecl::TK_NonTemplate:
220 break;
221 case FunctionDecl::TK_FunctionTemplate:
222 FD->setDescribedFunctionTemplate(
223 cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])));
224 break;
225 case FunctionDecl::TK_MemberSpecialization: {
226 FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
227 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
228 SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
229 FD->setInstantiationOfMemberFunction(InstFD, TSK);
230 FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
231 break;
232 }
233 case FunctionDecl::TK_FunctionTemplateSpecialization: {
234 FunctionTemplateDecl *Template
235 = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
236 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
237
238 // Template arguments.
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000239 llvm::SmallVector<TemplateArgument, 8> TemplArgs;
Argyrios Kyrtzidis818c5db2010-06-23 13:48:30 +0000240 Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000241
242 // Template args as written.
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000243 llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs;
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000244 SourceLocation LAngleLoc, RAngleLoc;
Argyrios Kyrtzidis373a83a2010-07-02 11:55:40 +0000245 if (Record[Idx++]) { // TemplateArgumentsAsWritten != 0
246 unsigned NumTemplateArgLocs = Record[Idx++];
247 TemplArgLocs.reserve(NumTemplateArgLocs);
248 for (unsigned i=0; i != NumTemplateArgLocs; ++i)
249 TemplArgLocs.push_back(Reader.ReadTemplateArgumentLoc(Record, Idx));
250
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000251 LAngleLoc = Reader.ReadSourceLocation(Record, Idx);
252 RAngleLoc = Reader.ReadSourceLocation(Record, Idx);
253 }
Argyrios Kyrtzidis927d8e02010-07-05 10:37:55 +0000254
255 SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000256
Argyrios Kyrtzidisdde57902010-07-20 13:59:58 +0000257 if (FD->isCanonicalDecl()) // if canonical add to template's set.
258 FD->setFunctionTemplateSpecialization(Template, TemplArgs.size(),
259 TemplArgs.data(), TSK,
260 TemplArgLocs.size(),
261 TemplArgLocs.data(),
262 LAngleLoc, RAngleLoc, POI);
Argyrios Kyrtzidis0b0369a2010-06-28 09:31:34 +0000263 break;
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000264 }
265 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
266 // Templates.
267 UnresolvedSet<8> TemplDecls;
268 unsigned NumTemplates = Record[Idx++];
269 while (NumTemplates--)
270 TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
271
272 // Templates args.
273 TemplateArgumentListInfo TemplArgs;
274 unsigned NumArgs = Record[Idx++];
275 while (NumArgs--)
276 TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx));
Argyrios Kyrtzidis927d8e02010-07-05 10:37:55 +0000277 TemplArgs.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
278 TemplArgs.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000279
280 FD->setDependentTemplateSpecialization(*Reader.getContext(),
281 TemplDecls, TemplArgs);
Argyrios Kyrtzidis0b0369a2010-06-28 09:31:34 +0000282 break;
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000283 }
284 }
Argyrios Kyrtzidis373a83a2010-07-02 11:55:40 +0000285
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000286 // FunctionDecl's body is handled last at PCHReaderDecl::Visit,
287 // after everything else is read.
288
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000289 // Avoid side effects and invariant checking of FunctionDecl's
290 // setPreviousDeclaration.
291 FD->redeclarable_base::setPreviousDeclaration(
Argyrios Kyrtzidis373a83a2010-07-02 11:55:40 +0000292 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
293 FD->setStorageClass((FunctionDecl::StorageClass)Record[Idx++]);
294 FD->setStorageClassAsWritten((FunctionDecl::StorageClass)Record[Idx++]);
295 FD->setInlineSpecified(Record[Idx++]);
296 FD->setVirtualAsWritten(Record[Idx++]);
297 FD->setPure(Record[Idx++]);
298 FD->setHasInheritedPrototype(Record[Idx++]);
299 FD->setHasWrittenPrototype(Record[Idx++]);
300 FD->setDeleted(Record[Idx++]);
301 FD->setTrivial(Record[Idx++]);
302 FD->setCopyAssignment(Record[Idx++]);
303 FD->setHasImplicitReturnZero(Record[Idx++]);
304 FD->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
305
Chris Lattnerca025db2010-05-07 21:43:38 +0000306 // Read in the parameters.
Chris Lattner487412d2009-04-27 05:27:42 +0000307 unsigned NumParams = Record[Idx++];
308 llvm::SmallVector<ParmVarDecl *, 16> Params;
309 Params.reserve(NumParams);
310 for (unsigned I = 0; I != NumParams; ++I)
311 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregord5058122010-02-11 01:19:42 +0000312 FD->setParams(Params.data(), NumParams);
Chris Lattner487412d2009-04-27 05:27:42 +0000313}
314
315void PCHDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
316 VisitNamedDecl(MD);
317 if (Record[Idx++]) {
318 // In practice, this won't be executed (since method definitions
319 // don't occur in header files).
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000320 MD->setBody(Reader.ReadStmt());
Chris Lattner487412d2009-04-27 05:27:42 +0000321 MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
322 MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
323 }
324 MD->setInstanceMethod(Record[Idx++]);
325 MD->setVariadic(Record[Idx++]);
326 MD->setSynthesized(Record[Idx++]);
Fariborz Jahanian6e7e8cc2010-07-22 18:24:20 +0000327 MD->setDefined(Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000328 MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
329 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
Fariborz Jahaniand9235db2010-04-08 21:29:11 +0000330 MD->setNumSelectorArgs(unsigned(Record[Idx++]));
Chris Lattner487412d2009-04-27 05:27:42 +0000331 MD->setResultType(Reader.GetType(Record[Idx++]));
Douglas Gregor12852d92010-03-08 14:59:44 +0000332 MD->setResultTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner487412d2009-04-27 05:27:42 +0000333 MD->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
334 unsigned NumParams = Record[Idx++];
335 llvm::SmallVector<ParmVarDecl *, 16> Params;
336 Params.reserve(NumParams);
337 for (unsigned I = 0; I != NumParams; ++I)
338 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
Fariborz Jahaniancdabb312010-04-09 15:40:42 +0000339 MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams,
340 NumParams);
Chris Lattner487412d2009-04-27 05:27:42 +0000341}
342
343void PCHDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
344 VisitNamedDecl(CD);
Ted Kremenekc7c64312010-01-07 01:20:12 +0000345 SourceLocation A = SourceLocation::getFromRawEncoding(Record[Idx++]);
346 SourceLocation B = SourceLocation::getFromRawEncoding(Record[Idx++]);
347 CD->setAtEndRange(SourceRange(A, B));
Chris Lattner487412d2009-04-27 05:27:42 +0000348}
349
350void PCHDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
351 VisitObjCContainerDecl(ID);
352 ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
353 ID->setSuperClass(cast_or_null<ObjCInterfaceDecl>
354 (Reader.GetDecl(Record[Idx++])));
355 unsigned NumProtocols = Record[Idx++];
356 llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols;
357 Protocols.reserve(NumProtocols);
358 for (unsigned I = 0; I != NumProtocols; ++I)
359 Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor002b6712010-01-16 15:02:53 +0000360 llvm::SmallVector<SourceLocation, 16> ProtoLocs;
361 ProtoLocs.reserve(NumProtocols);
362 for (unsigned I = 0; I != NumProtocols; ++I)
363 ProtoLocs.push_back(SourceLocation::getFromRawEncoding(Record[Idx++]));
364 ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(),
365 *Reader.getContext());
Chris Lattner487412d2009-04-27 05:27:42 +0000366 unsigned NumIvars = Record[Idx++];
367 llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
368 IVars.reserve(NumIvars);
369 for (unsigned I = 0; I != NumIvars; ++I)
370 IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000371 ID->setCategoryList(
372 cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
373 ID->setForwardDecl(Record[Idx++]);
374 ID->setImplicitInterfaceDecl(Record[Idx++]);
375 ID->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
376 ID->setSuperClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisea72f422009-07-18 00:33:23 +0000377 ID->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner487412d2009-04-27 05:27:42 +0000378}
379
380void PCHDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
381 VisitFieldDecl(IVD);
382 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
Fariborz Jahanianaea8e1e2010-07-17 18:35:47 +0000383 bool synth = Record[Idx++];
384 IVD->setSynthesize(synth);
Chris Lattner487412d2009-04-27 05:27:42 +0000385}
386
387void PCHDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
388 VisitObjCContainerDecl(PD);
389 PD->setForwardDecl(Record[Idx++]);
390 PD->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
391 unsigned NumProtoRefs = Record[Idx++];
392 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
393 ProtoRefs.reserve(NumProtoRefs);
394 for (unsigned I = 0; I != NumProtoRefs; ++I)
395 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor002b6712010-01-16 15:02:53 +0000396 llvm::SmallVector<SourceLocation, 16> ProtoLocs;
397 ProtoLocs.reserve(NumProtoRefs);
398 for (unsigned I = 0; I != NumProtoRefs; ++I)
399 ProtoLocs.push_back(SourceLocation::getFromRawEncoding(Record[Idx++]));
400 PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
401 *Reader.getContext());
Chris Lattner487412d2009-04-27 05:27:42 +0000402}
403
404void PCHDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {
405 VisitFieldDecl(FD);
406}
407
408void PCHDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) {
409 VisitDecl(CD);
410 unsigned NumClassRefs = Record[Idx++];
411 llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs;
412 ClassRefs.reserve(NumClassRefs);
413 for (unsigned I = 0; I != NumClassRefs; ++I)
414 ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
Ted Kremenek9b124e12009-11-18 00:28:11 +0000415 llvm::SmallVector<SourceLocation, 16> SLocs;
416 SLocs.reserve(NumClassRefs);
417 for (unsigned I = 0; I != NumClassRefs; ++I)
418 SLocs.push_back(SourceLocation::getFromRawEncoding(Record[Idx++]));
419 CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(),
420 NumClassRefs);
Chris Lattner487412d2009-04-27 05:27:42 +0000421}
422
423void PCHDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
424 VisitDecl(FPD);
425 unsigned NumProtoRefs = Record[Idx++];
426 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
427 ProtoRefs.reserve(NumProtoRefs);
428 for (unsigned I = 0; I != NumProtoRefs; ++I)
429 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor002b6712010-01-16 15:02:53 +0000430 llvm::SmallVector<SourceLocation, 16> ProtoLocs;
431 ProtoLocs.reserve(NumProtoRefs);
432 for (unsigned I = 0; I != NumProtoRefs; ++I)
433 ProtoLocs.push_back(SourceLocation::getFromRawEncoding(Record[Idx++]));
434 FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
435 *Reader.getContext());
Chris Lattner487412d2009-04-27 05:27:42 +0000436}
437
438void PCHDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
439 VisitObjCContainerDecl(CD);
440 CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
441 unsigned NumProtoRefs = Record[Idx++];
442 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
443 ProtoRefs.reserve(NumProtoRefs);
444 for (unsigned I = 0; I != NumProtoRefs; ++I)
445 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor002b6712010-01-16 15:02:53 +0000446 llvm::SmallVector<SourceLocation, 16> ProtoLocs;
447 ProtoLocs.reserve(NumProtoRefs);
448 for (unsigned I = 0; I != NumProtoRefs; ++I)
449 ProtoLocs.push_back(SourceLocation::getFromRawEncoding(Record[Idx++]));
450 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
451 *Reader.getContext());
Chris Lattner487412d2009-04-27 05:27:42 +0000452 CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor071676f2010-01-16 16:38:58 +0000453 CD->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
454 CD->setCategoryNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner487412d2009-04-27 05:27:42 +0000455}
456
457void PCHDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {
458 VisitNamedDecl(CAD);
459 CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
460}
461
462void PCHDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
463 VisitNamedDecl(D);
Fariborz Jahanianda8ec2b2010-01-21 17:36:00 +0000464 D->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
John McCall339bb662010-06-04 20:50:08 +0000465 D->setType(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner487412d2009-04-27 05:27:42 +0000466 // FIXME: stable encoding
467 D->setPropertyAttributes(
468 (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
Fariborz Jahanian3bf0ded2010-06-22 23:20:40 +0000469 D->setPropertyAttributesAsWritten(
470 (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000471 // FIXME: stable encoding
472 D->setPropertyImplementation(
473 (ObjCPropertyDecl::PropertyControl)Record[Idx++]);
474 D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
475 D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
476 D->setGetterMethodDecl(
477 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
478 D->setSetterMethodDecl(
479 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
480 D->setPropertyIvarDecl(
481 cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
482}
483
484void PCHDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) {
Argyrios Kyrtzidis067c4072009-07-27 19:04:32 +0000485 VisitObjCContainerDecl(D);
Chris Lattner487412d2009-04-27 05:27:42 +0000486 D->setClassInterface(
487 cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000488}
489
490void PCHDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
491 VisitObjCImplDecl(D);
492 D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx));
493}
494
495void PCHDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
496 VisitObjCImplDecl(D);
497 D->setSuperClass(
498 cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
Fariborz Jahanianc83726e2010-04-28 16:11:27 +0000499 // FIXME. Add reading of IvarInitializers and NumIvarInitializers.
Chris Lattner487412d2009-04-27 05:27:42 +0000500}
501
502
503void PCHDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
504 VisitDecl(D);
505 D->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
506 D->setPropertyDecl(
507 cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
508 D->setPropertyIvarDecl(
509 cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
Fariborz Jahanian25491a22010-05-05 21:52:17 +0000510 // FIXME. read GetterCXXConstructor and SetterCXXAssignment
Chris Lattner487412d2009-04-27 05:27:42 +0000511}
512
513void PCHDeclReader::VisitFieldDecl(FieldDecl *FD) {
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +0000514 VisitDeclaratorDecl(FD);
Chris Lattner487412d2009-04-27 05:27:42 +0000515 FD->setMutable(Record[Idx++]);
516 if (Record[Idx++])
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000517 FD->setBitWidth(Reader.ReadExpr());
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +0000518 if (!FD->getDeclName()) {
519 FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
520 if (Tmpl)
521 Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
522 }
Chris Lattner487412d2009-04-27 05:27:42 +0000523}
524
525void PCHDeclReader::VisitVarDecl(VarDecl *VD) {
Argyrios Kyrtzidis560ac972009-08-19 01:28:35 +0000526 VisitDeclaratorDecl(VD);
Chris Lattner487412d2009-04-27 05:27:42 +0000527 VD->setStorageClass((VarDecl::StorageClass)Record[Idx++]);
Douglas Gregorc4df4072010-04-19 22:54:31 +0000528 VD->setStorageClassAsWritten((VarDecl::StorageClass)Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000529 VD->setThreadSpecified(Record[Idx++]);
530 VD->setCXXDirectInitializer(Record[Idx++]);
531 VD->setDeclaredInCondition(Record[Idx++]);
Douglas Gregor3f324d562010-05-03 18:51:14 +0000532 VD->setExceptionVariable(Record[Idx++]);
Douglas Gregor6fd1b182010-05-15 06:01:05 +0000533 VD->setNRVOVariable(Record[Idx++]);
Chris Lattner487412d2009-04-27 05:27:42 +0000534 VD->setPreviousDeclaration(
535 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner487412d2009-04-27 05:27:42 +0000536 if (Record[Idx++])
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000537 VD->setInit(Reader.ReadExpr());
Argyrios Kyrtzidiscdb8b3f2010-07-04 21:44:00 +0000538
539 if (Record[Idx++]) { // HasMemberSpecializationInfo.
540 VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++]));
541 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
542 SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
543 Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
544 }
Chris Lattner487412d2009-04-27 05:27:42 +0000545}
546
547void PCHDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) {
548 VisitVarDecl(PD);
549}
550
551void PCHDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
552 VisitVarDecl(PD);
553 PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
John McCallf3cd6652010-03-12 18:31:32 +0000554 PD->setHasInheritedDefaultArg(Record[Idx++]);
Argyrios Kyrtzidisccde6a02010-07-04 21:44:07 +0000555 if (Record[Idx++]) // hasUninstantiatedDefaultArg.
556 PD->setUninstantiatedDefaultArg(Reader.ReadExpr());
Chris Lattner487412d2009-04-27 05:27:42 +0000557}
558
Chris Lattner487412d2009-04-27 05:27:42 +0000559void PCHDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
560 VisitDecl(AD);
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000561 AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr()));
Chris Lattner487412d2009-04-27 05:27:42 +0000562}
563
564void PCHDeclReader::VisitBlockDecl(BlockDecl *BD) {
565 VisitDecl(BD);
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +0000566 BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt()));
John McCalla3ccba02010-06-04 11:21:44 +0000567 BD->setSignatureAsWritten(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner487412d2009-04-27 05:27:42 +0000568 unsigned NumParams = Record[Idx++];
569 llvm::SmallVector<ParmVarDecl *, 16> Params;
570 Params.reserve(NumParams);
571 for (unsigned I = 0; I != NumParams; ++I)
572 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregord5058122010-02-11 01:19:42 +0000573 BD->setParams(Params.data(), NumParams);
Chris Lattner487412d2009-04-27 05:27:42 +0000574}
575
Chris Lattnerca025db2010-05-07 21:43:38 +0000576void PCHDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
577 VisitDecl(D);
578 D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]);
579 D->setHasBraces(Record[Idx++]);
580}
581
582void PCHDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
583 VisitNamedDecl(D);
584 D->setLBracLoc(Reader.ReadSourceLocation(Record, Idx));
585 D->setRBracLoc(Reader.ReadSourceLocation(Record, Idx));
586 D->setNextNamespace(
587 cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
588
Chris Lattnerca025db2010-05-07 21:43:38 +0000589 bool IsOriginal = Record[Idx++];
Argyrios Kyrtzidisdae2a162010-07-03 07:57:53 +0000590 D->OrigOrAnonNamespace.setInt(IsOriginal);
591 D->OrigOrAnonNamespace.setPointer(
Chris Lattnerca025db2010-05-07 21:43:38 +0000592 cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
593}
594
595void PCHDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
596 VisitNamedDecl(D);
597
598 D->setAliasLoc(Reader.ReadSourceLocation(Record, Idx));
599 D->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
600 D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
601 D->setTargetNameLoc(Reader.ReadSourceLocation(Record, Idx));
602 D->setAliasedNamespace(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
603}
604
Argyrios Kyrtzidis41d45622010-06-20 14:40:59 +0000605void PCHDeclReader::VisitUsingDecl(UsingDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000606 VisitNamedDecl(D);
607 D->setUsingLocation(Reader.ReadSourceLocation(Record, Idx));
608 D->setNestedNameRange(Reader.ReadSourceRange(Record, Idx));
609 D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx));
610
611 // FIXME: It would probably be more efficient to read these into a vector
612 // and then re-cosntruct the shadow decl set over that vector since it
613 // would avoid existence checks.
614 unsigned NumShadows = Record[Idx++];
615 for(unsigned I = 0; I != NumShadows; ++I) {
Argyrios Kyrtzidis00dda6a2010-07-08 13:09:41 +0000616 // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still
617 // be initializing.
618 D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattnerca025db2010-05-07 21:43:38 +0000619 }
620 D->setTypeName(Record[Idx++]);
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +0000621 NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
622 if (Pattern)
623 Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern);
Chris Lattnerca025db2010-05-07 21:43:38 +0000624}
625
Argyrios Kyrtzidis41d45622010-06-20 14:40:59 +0000626void PCHDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000627 VisitNamedDecl(D);
628 D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
629 D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +0000630 UsingShadowDecl *Pattern
631 = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]));
632 if (Pattern)
633 Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern);
Chris Lattnerca025db2010-05-07 21:43:38 +0000634}
635
636void PCHDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
637 VisitNamedDecl(D);
638 D->setNamespaceKeyLocation(Reader.ReadSourceLocation(Record, Idx));
639 D->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
640 D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
641 D->setIdentLocation(Reader.ReadSourceLocation(Record, Idx));
642 D->setNominatedNamespace(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
643 D->setCommonAncestor(cast_or_null<DeclContext>(
644 Reader.GetDecl(Record[Idx++])));
645}
646
Argyrios Kyrtzidisbd8ac8c2010-06-30 08:49:30 +0000647void PCHDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000648 VisitValueDecl(D);
649 D->setTargetNestedNameRange(Reader.ReadSourceRange(Record, Idx));
650 D->setUsingLoc(Reader.ReadSourceLocation(Record, Idx));
651 D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
652}
653
Argyrios Kyrtzidisbd8ac8c2010-06-30 08:49:30 +0000654void PCHDeclReader::VisitUnresolvedUsingTypenameDecl(
Chris Lattnerca025db2010-05-07 21:43:38 +0000655 UnresolvedUsingTypenameDecl *D) {
656 VisitTypeDecl(D);
657 D->setTargetNestedNameRange(Reader.ReadSourceRange(Record, Idx));
658 D->setUsingLoc(Reader.ReadSourceLocation(Record, Idx));
659 D->setTypenameLoc(Reader.ReadSourceLocation(Record, Idx));
660 D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
661}
662
663void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000664 ASTContext &C = *Reader.getContext();
665
Argyrios Kyrtzidis181431c2010-07-06 15:36:58 +0000666 // We need to allocate the DefinitionData struct ahead of VisitRecordDecl
667 // so that the other CXXRecordDecls can get a pointer even when the owner
668 // is still initializing.
669 bool OwnsDefinitionData = false;
670 enum DataOwnership { Data_NoDefData, Data_Owner, Data_NotOwner };
671 switch ((DataOwnership)Record[Idx++]) {
672 default:
673 assert(0 && "Out of sync with PCHDeclWriter or messed up reading");
674 case Data_NoDefData:
675 break;
676 case Data_Owner:
677 OwnsDefinitionData = true;
678 D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
679 break;
680 case Data_NotOwner:
681 D->DefinitionData
682 = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]))->DefinitionData;
683 break;
684 }
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000685
Argyrios Kyrtzidis181431c2010-07-06 15:36:58 +0000686 VisitRecordDecl(D);
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000687
Argyrios Kyrtzidis181431c2010-07-06 15:36:58 +0000688 if (OwnsDefinitionData) {
689 assert(D->DefinitionData);
690 struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000691
Argyrios Kyrtzidis181431c2010-07-06 15:36:58 +0000692 Data.UserDeclaredConstructor = Record[Idx++];
693 Data.UserDeclaredCopyConstructor = Record[Idx++];
694 Data.UserDeclaredCopyAssignment = Record[Idx++];
695 Data.UserDeclaredDestructor = Record[Idx++];
696 Data.Aggregate = Record[Idx++];
697 Data.PlainOldData = Record[Idx++];
698 Data.Empty = Record[Idx++];
699 Data.Polymorphic = Record[Idx++];
700 Data.Abstract = Record[Idx++];
701 Data.HasTrivialConstructor = Record[Idx++];
702 Data.HasTrivialCopyConstructor = Record[Idx++];
703 Data.HasTrivialCopyAssignment = Record[Idx++];
704 Data.HasTrivialDestructor = Record[Idx++];
705 Data.ComputedVisibleConversions = Record[Idx++];
706 Data.DeclaredDefaultConstructor = Record[Idx++];
707 Data.DeclaredCopyConstructor = Record[Idx++];
708 Data.DeclaredCopyAssignment = Record[Idx++];
709 Data.DeclaredDestructor = Record[Idx++];
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000710
Argyrios Kyrtzidis181431c2010-07-06 15:36:58 +0000711 // setBases() is unsuitable since it may try to iterate the bases of an
712 // unitialized base.
713 Data.NumBases = Record[Idx++];
714 Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
715 for (unsigned i = 0; i != Data.NumBases; ++i)
716 Data.Bases[i] = Reader.ReadCXXBaseSpecifier(Record, Idx);
717
718 // FIXME: Make VBases lazily computed when needed to avoid storing them.
719 Data.NumVBases = Record[Idx++];
720 Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
721 for (unsigned i = 0; i != Data.NumVBases; ++i)
722 Data.VBases[i] = Reader.ReadCXXBaseSpecifier(Record, Idx);
723
724 Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
725 Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
726 assert(Data.Definition && "Data.Definition should be already set!");
727 Data.FirstFriend
728 = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
Argyrios Kyrtzidis2c2167a2010-07-02 11:55:32 +0000729 }
730
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000731 enum CXXRecKind {
732 CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
733 };
734 switch ((CXXRecKind)Record[Idx++]) {
735 default:
736 assert(false && "Out of sync with PCHDeclWriter::VisitCXXRecordDecl?");
737 case CXXRecNotTemplate:
738 break;
739 case CXXRecTemplate:
740 D->setDescribedClassTemplate(
741 cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])));
742 break;
743 case CXXRecMemberSpecialization: {
744 CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
745 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
746 SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
747 D->setInstantiationOfMemberClass(RD, TSK);
748 D->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
749 break;
750 }
751 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000752}
753
754void PCHDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000755 VisitFunctionDecl(D);
Argyrios Kyrtzidis6685e8a2010-07-04 21:44:35 +0000756 unsigned NumOverridenMethods = Record[Idx++];
757 while (NumOverridenMethods--) {
758 CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
759 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
760 // MD may be initializing.
761 Reader.getContext()->addOverriddenMethod(D, MD);
762 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000763}
764
765void PCHDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000766 VisitCXXMethodDecl(D);
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000767
768 D->IsExplicitSpecified = Record[Idx++];
769 D->ImplicitlyDefined = Record[Idx++];
770
771 unsigned NumInitializers = Record[Idx++];
772 D->NumBaseOrMemberInitializers = NumInitializers;
773 if (NumInitializers) {
774 ASTContext &C = *Reader.getContext();
775
776 D->BaseOrMemberInitializers
777 = new (C) CXXBaseOrMemberInitializer*[NumInitializers];
778 for (unsigned i=0; i != NumInitializers; ++i) {
Duncan Sands16143962010-07-06 18:19:40 +0000779 TypeSourceInfo *BaseClassInfo = 0;
780 bool IsBaseVirtual = false;
781 FieldDecl *Member = 0;
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000782
783 bool IsBaseInitializer = Record[Idx++];
784 if (IsBaseInitializer) {
785 BaseClassInfo = Reader.GetTypeSourceInfo(Record, Idx);
786 IsBaseVirtual = Record[Idx++];
787 } else {
788 Member = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
789 }
790 SourceLocation MemberLoc = Reader.ReadSourceLocation(Record, Idx);
791 Expr *Init = Reader.ReadExpr();
792 FieldDecl *AnonUnionMember
793 = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
794 SourceLocation LParenLoc = Reader.ReadSourceLocation(Record, Idx);
795 SourceLocation RParenLoc = Reader.ReadSourceLocation(Record, Idx);
796 bool IsWritten = Record[Idx++];
797 unsigned SourceOrderOrNumArrayIndices;
798 llvm::SmallVector<VarDecl *, 8> Indices;
799 if (IsWritten) {
800 SourceOrderOrNumArrayIndices = Record[Idx++];
801 } else {
802 SourceOrderOrNumArrayIndices = Record[Idx++];
803 Indices.reserve(SourceOrderOrNumArrayIndices);
804 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
805 Indices.push_back(cast<VarDecl>(Reader.GetDecl(Record[Idx++])));
806 }
807
808 CXXBaseOrMemberInitializer *BOMInit;
809 if (IsBaseInitializer) {
810 BOMInit = new (C) CXXBaseOrMemberInitializer(C, BaseClassInfo,
811 IsBaseVirtual, LParenLoc,
812 Init, RParenLoc);
813 } else if (IsWritten) {
814 BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member, MemberLoc,
815 LParenLoc, Init, RParenLoc);
816 } else {
817 BOMInit = CXXBaseOrMemberInitializer::Create(C, Member, MemberLoc,
818 LParenLoc, Init, RParenLoc,
819 Indices.data(),
820 Indices.size());
821 }
822
823 BOMInit->setAnonUnionMember(AnonUnionMember);
824 D->BaseOrMemberInitializers[i] = BOMInit;
825 }
826 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000827}
828
829void PCHDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000830 VisitCXXMethodDecl(D);
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000831
832 D->ImplicitlyDefined = Record[Idx++];
833 D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
Chris Lattnerca025db2010-05-07 21:43:38 +0000834}
835
836void PCHDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) {
Chris Lattnerca025db2010-05-07 21:43:38 +0000837 VisitCXXMethodDecl(D);
Argyrios Kyrtzidis33575162010-07-02 15:58:43 +0000838 D->IsExplicitSpecified = Record[Idx++];
Chris Lattnerca025db2010-05-07 21:43:38 +0000839}
840
Abramo Bagnarad7340582010-06-05 05:09:32 +0000841void PCHDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) {
842 VisitDecl(D);
843 D->setColonLoc(Reader.ReadSourceLocation(Record, Idx));
844}
845
Argyrios Kyrtzidis74d28bd2010-06-29 22:47:00 +0000846void PCHDeclReader::VisitFriendDecl(FriendDecl *D) {
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000847 VisitDecl(D);
Argyrios Kyrtzidis74d28bd2010-06-29 22:47:00 +0000848 if (Record[Idx++])
849 D->Friend = Reader.GetTypeSourceInfo(Record, Idx);
850 else
851 D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
852 D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
853 D->FriendLoc = Reader.ReadSourceLocation(Record, Idx);
854}
855
Chris Lattnerca025db2010-05-07 21:43:38 +0000856void PCHDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
Argyrios Kyrtzidis165b5812010-07-22 16:04:10 +0000857 VisitDecl(D);
858 unsigned NumParams = Record[Idx++];
859 D->NumParams = NumParams;
860 D->Params = new TemplateParameterList*[NumParams];
861 for (unsigned i = 0; i != NumParams; ++i)
862 D->Params[i] = Reader.ReadTemplateParameterList(Record, Idx);
863 if (Record[Idx++]) // HasFriendDecl
864 D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
865 else
866 D->Friend = Reader.GetTypeSourceInfo(Record, Idx);
867 D->FriendLoc = Reader.ReadSourceLocation(Record, Idx);
Chris Lattnerca025db2010-05-07 21:43:38 +0000868}
869
870void PCHDeclReader::VisitTemplateDecl(TemplateDecl *D) {
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000871 VisitNamedDecl(D);
872
Argyrios Kyrtzidis9f2d24a2010-07-08 17:12:57 +0000873 NamedDecl *TemplatedDecl
874 = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
Argyrios Kyrtzidis818c5db2010-06-23 13:48:30 +0000875 TemplateParameterList* TemplateParams
876 = Reader.ReadTemplateParameterList(Record, Idx);
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000877 D->init(TemplatedDecl, TemplateParams);
Chris Lattnerca025db2010-05-07 21:43:38 +0000878}
879
880void PCHDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000881 VisitTemplateDecl(D);
882
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000883 D->IdentifierNamespace = Record[Idx++];
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000884 ClassTemplateDecl *PrevDecl =
885 cast_or_null<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
Argyrios Kyrtzidisa35c8e42010-06-21 10:57:41 +0000886 D->setPreviousDeclaration(PrevDecl);
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000887 if (PrevDecl == 0) {
888 // This ClassTemplateDecl owns a CommonPtr; read it.
889
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000890 // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000891 unsigned size = Record[Idx++];
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000892 while (size--)
893 cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000894
895 size = Record[Idx++];
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000896 while (size--)
897 cast<ClassTemplatePartialSpecializationDecl>(
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000898 Reader.GetDecl(Record[Idx++]));
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +0000899
900 // InjectedClassNameType is computed.
901
902 if (ClassTemplateDecl *CTD
903 = cast_or_null<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
904 D->setInstantiatedFromMemberTemplate(CTD);
905 if (Record[Idx++])
906 D->setMemberSpecialization();
907 }
908 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000909}
910
911void PCHDeclReader::VisitClassTemplateSpecializationDecl(
912 ClassTemplateSpecializationDecl *D) {
Argyrios Kyrtzidis818c5db2010-06-23 13:48:30 +0000913 VisitCXXRecordDecl(D);
914
915 if (Decl *InstD = Reader.GetDecl(Record[Idx++])) {
916 if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
917 D->setInstantiationOf(CTD);
918 } else {
919 llvm::SmallVector<TemplateArgument, 8> TemplArgs;
920 Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
921 D->setInstantiationOf(cast<ClassTemplatePartialSpecializationDecl>(InstD),
922 TemplArgs.data(), TemplArgs.size());
923 }
924 }
925
926 // Explicit info.
927 if (TypeSourceInfo *TyInfo = Reader.GetTypeSourceInfo(Record, Idx)) {
928 D->setTypeAsWritten(TyInfo);
929 D->setExternLoc(Reader.ReadSourceLocation(Record, Idx));
930 D->setTemplateKeywordLoc(Reader.ReadSourceLocation(Record, Idx));
931 }
932
933 llvm::SmallVector<TemplateArgument, 8> TemplArgs;
934 Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
935 D->initTemplateArgs(TemplArgs.data(), TemplArgs.size());
936 SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
937 if (POI.isValid())
938 D->setPointOfInstantiation(POI);
939 D->setSpecializationKind((TemplateSpecializationKind)Record[Idx++]);
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000940
Argyrios Kyrtzidisc1624e92010-07-20 13:59:40 +0000941 if (D->isCanonicalDecl()) { // It's kept in the folding set.
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000942 ClassTemplateDecl *CanonPattern
943 = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
944 if (ClassTemplatePartialSpecializationDecl *Partial
945 = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
Argyrios Kyrtzidisf4cc7dc2010-07-12 21:41:31 +0000946 CanonPattern->getPartialSpecializations().InsertNode(Partial);
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000947 } else {
Argyrios Kyrtzidisf4cc7dc2010-07-12 21:41:31 +0000948 CanonPattern->getSpecializations().InsertNode(D);
Argyrios Kyrtzidis87040572010-07-09 21:11:43 +0000949 }
950 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000951}
952
953void PCHDeclReader::VisitClassTemplatePartialSpecializationDecl(
954 ClassTemplatePartialSpecializationDecl *D) {
Argyrios Kyrtzidis818c5db2010-06-23 13:48:30 +0000955 VisitClassTemplateSpecializationDecl(D);
956
957 D->initTemplateParameters(Reader.ReadTemplateParameterList(Record, Idx));
958
959 TemplateArgumentListInfo ArgInfos;
960 unsigned NumArgs = Record[Idx++];
961 while (NumArgs--)
962 ArgInfos.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx));
963 D->initTemplateArgsAsWritten(ArgInfos);
964
965 D->setSequenceNumber(Record[Idx++]);
966
967 // These are read/set from/to the first declaration.
968 if (D->getPreviousDeclaration() == 0) {
969 D->setInstantiatedFromMember(
970 cast_or_null<ClassTemplatePartialSpecializationDecl>(
971 Reader.GetDecl(Record[Idx++])));
972 if (Record[Idx++])
Argyrios Kyrtzidisdd2061b2010-07-09 21:11:35 +0000973 D->setMemberSpecialization();
Argyrios Kyrtzidis818c5db2010-06-23 13:48:30 +0000974 }
Chris Lattnerca025db2010-05-07 21:43:38 +0000975}
976
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000977void PCHDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
978 VisitTemplateDecl(D);
979
Argyrios Kyrtzidisa95d0192010-07-05 10:38:01 +0000980 D->IdentifierNamespace = Record[Idx++];
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000981 FunctionTemplateDecl *PrevDecl =
982 cast_or_null<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
983 D->setPreviousDeclaration(PrevDecl);
984 if (PrevDecl == 0) {
985 // This FunctionTemplateDecl owns a CommonPtr; read it.
986
Argyrios Kyrtzidis39fdf812010-07-06 15:37:09 +0000987 // Read the function specialization declarations.
988 // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled
989 // through the specialized FunctionDecl's setFunctionTemplateSpecialization.
990 unsigned NumSpecs = Record[Idx++];
991 while (NumSpecs--)
992 Reader.GetDecl(Record[Idx++]);
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +0000993
994 if (FunctionTemplateDecl *CTD
995 = cast_or_null<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
996 D->setInstantiatedFromMemberTemplate(CTD);
997 if (Record[Idx++])
998 D->setMemberSpecialization();
999 }
1000 }
Chris Lattnerca025db2010-05-07 21:43:38 +00001001}
1002
1003void PCHDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
Argyrios Kyrtzidis95c04ca2010-06-19 19:29:09 +00001004 VisitTypeDecl(D);
1005
1006 D->setDeclaredWithTypename(Record[Idx++]);
1007 D->setParameterPack(Record[Idx++]);
1008
1009 bool Inherited = Record[Idx++];
1010 TypeSourceInfo *DefArg = Reader.GetTypeSourceInfo(Record, Idx);
1011 D->setDefaultArgument(DefArg, Inherited);
Chris Lattnerca025db2010-05-07 21:43:38 +00001012}
1013
1014void PCHDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
Argyrios Kyrtzidisb1d38e32010-06-25 16:25:09 +00001015 VisitVarDecl(D);
1016 // TemplateParmPosition.
1017 D->setDepth(Record[Idx++]);
1018 D->setPosition(Record[Idx++]);
1019 // Rest of NonTypeTemplateParmDecl.
1020 if (Record[Idx++]) {
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +00001021 Expr *DefArg = Reader.ReadExpr();
Argyrios Kyrtzidisb1d38e32010-06-25 16:25:09 +00001022 bool Inherited = Record[Idx++];
1023 D->setDefaultArgument(DefArg, Inherited);
1024 }
Chris Lattnerca025db2010-05-07 21:43:38 +00001025}
1026
1027void PCHDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
Argyrios Kyrtzidis9f2d24a2010-07-08 17:12:57 +00001028 VisitTemplateDecl(D);
1029 // TemplateParmPosition.
1030 D->setDepth(Record[Idx++]);
1031 D->setPosition(Record[Idx++]);
1032 // Rest of TemplateTemplateParmDecl.
1033 TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(Record, Idx);
1034 bool IsInherited = Record[Idx++];
1035 D->setDefaultArgument(Arg, IsInherited);
Chris Lattnerca025db2010-05-07 21:43:38 +00001036}
1037
1038void PCHDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {
Argyrios Kyrtzidis2d8891c2010-07-22 17:28:12 +00001039 VisitDecl(D);
1040 D->AssertExpr = Reader.ReadExpr();
1041 D->Message = cast<StringLiteral>(Reader.ReadExpr());
Chris Lattnerca025db2010-05-07 21:43:38 +00001042}
1043
Mike Stump11289f42009-09-09 15:08:12 +00001044std::pair<uint64_t, uint64_t>
Chris Lattner487412d2009-04-27 05:27:42 +00001045PCHDeclReader::VisitDeclContext(DeclContext *DC) {
1046 uint64_t LexicalOffset = Record[Idx++];
1047 uint64_t VisibleOffset = Record[Idx++];
1048 return std::make_pair(LexicalOffset, VisibleOffset);
1049}
1050
1051//===----------------------------------------------------------------------===//
Chris Lattner8f63ab52009-04-27 06:01:06 +00001052// Attribute Reading
Chris Lattner487412d2009-04-27 05:27:42 +00001053//===----------------------------------------------------------------------===//
1054
Chris Lattner8f63ab52009-04-27 06:01:06 +00001055/// \brief Reads attributes from the current stream position.
1056Attr *PCHReader::ReadAttributes() {
Sebastian Redl34522812010-07-16 17:50:48 +00001057 llvm::BitstreamCursor &DeclsCursor = Chain[0]->DeclsCursor;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001058 unsigned Code = DeclsCursor.ReadCode();
Mike Stump11289f42009-09-09 15:08:12 +00001059 assert(Code == llvm::bitc::UNABBREV_RECORD &&
Chris Lattner8f63ab52009-04-27 06:01:06 +00001060 "Expected unabbreviated record"); (void)Code;
Mike Stump11289f42009-09-09 15:08:12 +00001061
Chris Lattner8f63ab52009-04-27 06:01:06 +00001062 RecordData Record;
1063 unsigned Idx = 0;
1064 unsigned RecCode = DeclsCursor.ReadRecord(Code, Record);
Mike Stump11289f42009-09-09 15:08:12 +00001065 assert(RecCode == pch::DECL_ATTR && "Expected attribute record");
Chris Lattner8f63ab52009-04-27 06:01:06 +00001066 (void)RecCode;
1067
1068#define SIMPLE_ATTR(Name) \
Alexis Hunt344393e2010-06-16 23:43:53 +00001069 case attr::Name: \
Chris Lattner8575daa2009-04-27 21:45:14 +00001070 New = ::new (*Context) Name##Attr(); \
Chris Lattner8f63ab52009-04-27 06:01:06 +00001071 break
1072
1073#define STRING_ATTR(Name) \
Alexis Hunt344393e2010-06-16 23:43:53 +00001074 case attr::Name: \
Ted Kremenek7f4945a2010-02-11 05:28:37 +00001075 New = ::new (*Context) Name##Attr(*Context, ReadString(Record, Idx)); \
Chris Lattner8f63ab52009-04-27 06:01:06 +00001076 break
1077
1078#define UNSIGNED_ATTR(Name) \
Alexis Hunt344393e2010-06-16 23:43:53 +00001079 case attr::Name: \
Chris Lattner8575daa2009-04-27 21:45:14 +00001080 New = ::new (*Context) Name##Attr(Record[Idx++]); \
Chris Lattner8f63ab52009-04-27 06:01:06 +00001081 break
1082
1083 Attr *Attrs = 0;
1084 while (Idx < Record.size()) {
1085 Attr *New = 0;
Alexis Hunt344393e2010-06-16 23:43:53 +00001086 attr::Kind Kind = (attr::Kind)Record[Idx++];
Chris Lattner8f63ab52009-04-27 06:01:06 +00001087 bool IsInherited = Record[Idx++];
1088
1089 switch (Kind) {
Anton Korobeynikov55bcea12010-01-10 12:58:08 +00001090 default:
1091 assert(0 && "Unknown attribute!");
1092 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001093 STRING_ATTR(Alias);
Daniel Dunbarfc6507e2010-05-27 02:25:39 +00001094 SIMPLE_ATTR(AlignMac68k);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001095 UNSIGNED_ATTR(Aligned);
1096 SIMPLE_ATTR(AlwaysInline);
1097 SIMPLE_ATTR(AnalyzerNoReturn);
1098 STRING_ATTR(Annotate);
1099 STRING_ATTR(AsmLabel);
Alexis Hunt54a02542009-11-25 04:20:27 +00001100 SIMPLE_ATTR(BaseCheck);
Mike Stump11289f42009-09-09 15:08:12 +00001101
Alexis Hunt344393e2010-06-16 23:43:53 +00001102 case attr::Blocks:
Chris Lattner8575daa2009-04-27 21:45:14 +00001103 New = ::new (*Context) BlocksAttr(
Chris Lattner8f63ab52009-04-27 06:01:06 +00001104 (BlocksAttr::BlocksAttrTypes)Record[Idx++]);
1105 break;
Mike Stump11289f42009-09-09 15:08:12 +00001106
Eli Friedmane4310c82009-11-09 18:38:53 +00001107 SIMPLE_ATTR(CDecl);
1108
Alexis Hunt344393e2010-06-16 23:43:53 +00001109 case attr::Cleanup:
Chris Lattner8575daa2009-04-27 21:45:14 +00001110 New = ::new (*Context) CleanupAttr(
Chris Lattner8f63ab52009-04-27 06:01:06 +00001111 cast<FunctionDecl>(GetDecl(Record[Idx++])));
1112 break;
1113
1114 SIMPLE_ATTR(Const);
1115 UNSIGNED_ATTR(Constructor);
1116 SIMPLE_ATTR(DLLExport);
1117 SIMPLE_ATTR(DLLImport);
1118 SIMPLE_ATTR(Deprecated);
1119 UNSIGNED_ATTR(Destructor);
1120 SIMPLE_ATTR(FastCall);
Alexis Hunt96d5c762009-11-21 08:43:09 +00001121 SIMPLE_ATTR(Final);
Mike Stump11289f42009-09-09 15:08:12 +00001122
Alexis Hunt344393e2010-06-16 23:43:53 +00001123 case attr::Format: {
Chris Lattner8f63ab52009-04-27 06:01:06 +00001124 std::string Type = ReadString(Record, Idx);
1125 unsigned FormatIdx = Record[Idx++];
1126 unsigned FirstArg = Record[Idx++];
Ted Kremenek7f4945a2010-02-11 05:28:37 +00001127 New = ::new (*Context) FormatAttr(*Context, Type, FormatIdx, FirstArg);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001128 break;
1129 }
Mike Stump11289f42009-09-09 15:08:12 +00001130
Alexis Hunt344393e2010-06-16 23:43:53 +00001131 case attr::FormatArg: {
Fariborz Jahanianf1c25022009-05-20 17:41:43 +00001132 unsigned FormatIdx = Record[Idx++];
1133 New = ::new (*Context) FormatArgAttr(FormatIdx);
1134 break;
1135 }
Mike Stump11289f42009-09-09 15:08:12 +00001136
Alexis Hunt344393e2010-06-16 23:43:53 +00001137 case attr::Sentinel: {
Fariborz Jahanian027b8862009-05-13 18:09:35 +00001138 int sentinel = Record[Idx++];
1139 int nullPos = Record[Idx++];
1140 New = ::new (*Context) SentinelAttr(sentinel, nullPos);
1141 break;
1142 }
Chris Lattner8f63ab52009-04-27 06:01:06 +00001143
1144 SIMPLE_ATTR(GNUInline);
Alexis Hunt54a02542009-11-25 04:20:27 +00001145 SIMPLE_ATTR(Hiding);
Mike Stump11289f42009-09-09 15:08:12 +00001146
Alexis Hunt344393e2010-06-16 23:43:53 +00001147 case attr::IBAction:
Ted Kremenek06be9682010-02-17 02:37:45 +00001148 New = ::new (*Context) IBActionAttr();
1149 break;
1150
Alexis Hunt344393e2010-06-16 23:43:53 +00001151 case attr::IBOutlet:
Chris Lattner8575daa2009-04-27 21:45:14 +00001152 New = ::new (*Context) IBOutletAttr();
Chris Lattner8f63ab52009-04-27 06:01:06 +00001153 break;
1154
Alexis Hunt344393e2010-06-16 23:43:53 +00001155 case attr::IBOutletCollection: {
Ted Kremenek26bde772010-05-19 17:38:06 +00001156 ObjCInterfaceDecl *D =
1157 cast_or_null<ObjCInterfaceDecl>(GetDecl(Record[Idx++]));
1158 New = ::new (*Context) IBOutletCollectionAttr(D);
1159 break;
1160 }
1161
Ryan Flynn1f1fdc02009-08-09 20:07:29 +00001162 SIMPLE_ATTR(Malloc);
Mike Stump3722f582009-08-26 22:31:08 +00001163 SIMPLE_ATTR(NoDebug);
1164 SIMPLE_ATTR(NoInline);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001165 SIMPLE_ATTR(NoReturn);
1166 SIMPLE_ATTR(NoThrow);
Mike Stump11289f42009-09-09 15:08:12 +00001167
Alexis Hunt344393e2010-06-16 23:43:53 +00001168 case attr::NonNull: {
Chris Lattner8f63ab52009-04-27 06:01:06 +00001169 unsigned Size = Record[Idx++];
1170 llvm::SmallVector<unsigned, 16> ArgNums;
1171 ArgNums.insert(ArgNums.end(), &Record[Idx], &Record[Idx] + Size);
1172 Idx += Size;
Ted Kremenek510ee252010-02-11 07:31:47 +00001173 New = ::new (*Context) NonNullAttr(*Context, ArgNums.data(), Size);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001174 break;
1175 }
Mike Stump11289f42009-09-09 15:08:12 +00001176
Alexis Hunt344393e2010-06-16 23:43:53 +00001177 case attr::ReqdWorkGroupSize: {
Nate Begemanf2758702009-06-26 06:32:41 +00001178 unsigned X = Record[Idx++];
1179 unsigned Y = Record[Idx++];
1180 unsigned Z = Record[Idx++];
1181 New = ::new (*Context) ReqdWorkGroupSizeAttr(X, Y, Z);
1182 break;
1183 }
Chris Lattner8f63ab52009-04-27 06:01:06 +00001184
1185 SIMPLE_ATTR(ObjCException);
1186 SIMPLE_ATTR(ObjCNSObject);
Ted Kremenekd9c66632010-02-18 00:05:45 +00001187 SIMPLE_ATTR(CFReturnsNotRetained);
Ted Kremenek9ecdfaf2009-05-09 02:44:38 +00001188 SIMPLE_ATTR(CFReturnsRetained);
Ted Kremenekd9c66632010-02-18 00:05:45 +00001189 SIMPLE_ATTR(NSReturnsNotRetained);
Ted Kremenek9ecdfaf2009-05-09 02:44:38 +00001190 SIMPLE_ATTR(NSReturnsRetained);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001191 SIMPLE_ATTR(Overloadable);
Alexis Hunt54a02542009-11-25 04:20:27 +00001192 SIMPLE_ATTR(Override);
Anders Carlsson68e0b682009-08-08 18:23:56 +00001193 SIMPLE_ATTR(Packed);
Daniel Dunbar40130442010-05-27 01:12:46 +00001194 UNSIGNED_ATTR(MaxFieldAlignment);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001195 SIMPLE_ATTR(Pure);
1196 UNSIGNED_ATTR(Regparm);
1197 STRING_ATTR(Section);
1198 SIMPLE_ATTR(StdCall);
Douglas Gregora941dca2010-05-18 16:57:00 +00001199 SIMPLE_ATTR(ThisCall);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001200 SIMPLE_ATTR(TransparentUnion);
1201 SIMPLE_ATTR(Unavailable);
1202 SIMPLE_ATTR(Unused);
1203 SIMPLE_ATTR(Used);
Mike Stump11289f42009-09-09 15:08:12 +00001204
Alexis Hunt344393e2010-06-16 23:43:53 +00001205 case attr::Visibility:
Chris Lattner8575daa2009-04-27 21:45:14 +00001206 New = ::new (*Context) VisibilityAttr(
Chris Lattner8f63ab52009-04-27 06:01:06 +00001207 (VisibilityAttr::VisibilityTypes)Record[Idx++]);
1208 break;
1209
1210 SIMPLE_ATTR(WarnUnusedResult);
1211 SIMPLE_ATTR(Weak);
Rafael Espindolac18086a2010-02-23 22:00:30 +00001212 SIMPLE_ATTR(WeakRef);
Chris Lattner8f63ab52009-04-27 06:01:06 +00001213 SIMPLE_ATTR(WeakImport);
1214 }
1215
1216 assert(New && "Unable to decode attribute?");
1217 New->setInherited(IsInherited);
1218 New->setNext(Attrs);
1219 Attrs = New;
1220 }
1221#undef UNSIGNED_ATTR
1222#undef STRING_ATTR
1223#undef SIMPLE_ATTR
1224
1225 // The list of attributes was built backwards. Reverse the list
1226 // before returning it.
1227 Attr *PrevAttr = 0, *NextAttr = 0;
1228 while (Attrs) {
1229 NextAttr = Attrs->getNext();
1230 Attrs->setNext(PrevAttr);
1231 PrevAttr = Attrs;
1232 Attrs = NextAttr;
1233 }
1234
1235 return PrevAttr;
1236}
1237
1238//===----------------------------------------------------------------------===//
1239// PCHReader Implementation
1240//===----------------------------------------------------------------------===//
Chris Lattner487412d2009-04-27 05:27:42 +00001241
1242/// \brief Note that we have loaded the declaration with the given
1243/// Index.
Mike Stump11289f42009-09-09 15:08:12 +00001244///
Chris Lattner487412d2009-04-27 05:27:42 +00001245/// This routine notes that this declaration has already been loaded,
1246/// so that future GetDecl calls will return this declaration rather
1247/// than trying to load a new declaration.
1248inline void PCHReader::LoadedDecl(unsigned Index, Decl *D) {
1249 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
1250 DeclsLoaded[Index] = D;
1251}
1252
1253
1254/// \brief Determine whether the consumer will be interested in seeing
1255/// this declaration (via HandleTopLevelDecl).
1256///
1257/// This routine should return true for anything that might affect
1258/// code generation, e.g., inline function definitions, Objective-C
1259/// declarations with metadata, etc.
1260static bool isConsumerInterestedIn(Decl *D) {
Daniel Dunbar865c2a72009-09-17 03:06:44 +00001261 if (isa<FileScopeAsmDecl>(D))
1262 return true;
Chris Lattner487412d2009-04-27 05:27:42 +00001263 if (VarDecl *Var = dyn_cast<VarDecl>(D))
1264 return Var->isFileVarDecl() && Var->getInit();
1265 if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D))
1266 return Func->isThisDeclarationADefinition();
1267 return isa<ObjCProtocolDecl>(D);
1268}
1269
Sebastian Redl34627792010-07-20 22:46:15 +00001270/// \brief Get the correct cursor and offset for loading a type.
1271PCHReader::RecordLocation PCHReader::DeclCursorForIndex(unsigned Index) {
1272 PerFileData *F = 0;
1273 for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1274 F = Chain[N - I - 1];
1275 if (Index < F->LocalNumDecls)
1276 break;
1277 Index -= F->LocalNumDecls;
1278 }
1279 assert(F && F->LocalNumDecls > Index && "Broken chain");
Sebastian Redlb2831db2010-07-20 22:55:31 +00001280 return RecordLocation(&F->DeclsCursor, F->DeclOffsets[Index]);
Sebastian Redl34627792010-07-20 22:46:15 +00001281}
1282
Chris Lattner487412d2009-04-27 05:27:42 +00001283/// \brief Read the declaration at the given offset from the PCH file.
Sebastian Redl34627792010-07-20 22:46:15 +00001284Decl *PCHReader::ReadDeclRecord(unsigned Index) {
1285 RecordLocation Loc = DeclCursorForIndex(Index);
Sebastian Redlb2831db2010-07-20 22:55:31 +00001286 llvm::BitstreamCursor &DeclsCursor = *Loc.first;
Chris Lattner487412d2009-04-27 05:27:42 +00001287 // Keep track of where we are in the stream, then jump back there
1288 // after reading this declaration.
Chris Lattner1de76db2009-04-27 05:58:23 +00001289 SavedStreamPosition SavedPosition(DeclsCursor);
Chris Lattner487412d2009-04-27 05:27:42 +00001290
Argyrios Kyrtzidisd0795b22010-06-28 22:28:35 +00001291 ReadingKindTracker ReadingKind(Read_Decl, *this);
1292
Douglas Gregor1342e842009-07-06 18:54:52 +00001293 // Note that we are loading a declaration record.
1294 LoadingTypeOrDecl Loading(*this);
Mike Stump11289f42009-09-09 15:08:12 +00001295
Sebastian Redl34627792010-07-20 22:46:15 +00001296 DeclsCursor.JumpToBit(Loc.second);
Chris Lattner487412d2009-04-27 05:27:42 +00001297 RecordData Record;
Chris Lattner1de76db2009-04-27 05:58:23 +00001298 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner487412d2009-04-27 05:27:42 +00001299 unsigned Idx = 0;
1300 PCHDeclReader Reader(*this, Record, Idx);
1301
Chris Lattner1de76db2009-04-27 05:58:23 +00001302 Decl *D = 0;
1303 switch ((pch::DeclCode)DeclsCursor.ReadRecord(Code, Record)) {
Chris Lattner487412d2009-04-27 05:27:42 +00001304 case pch::DECL_ATTR:
1305 case pch::DECL_CONTEXT_LEXICAL:
1306 case pch::DECL_CONTEXT_VISIBLE:
1307 assert(false && "Record cannot be de-serialized with ReadDeclRecord");
1308 break;
Chris Lattner487412d2009-04-27 05:27:42 +00001309 case pch::DECL_TRANSLATION_UNIT:
1310 assert(Index == 0 && "Translation unit must be at index 0");
Chris Lattner8575daa2009-04-27 21:45:14 +00001311 D = Context->getTranslationUnitDecl();
Chris Lattner487412d2009-04-27 05:27:42 +00001312 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001313 case pch::DECL_TYPEDEF:
John McCall703a3f82009-10-24 08:00:42 +00001314 D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001315 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001316 case pch::DECL_ENUM:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001317 D = EnumDecl::Create(*Context, Decl::EmptyShell());
Chris Lattner487412d2009-04-27 05:27:42 +00001318 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001319 case pch::DECL_RECORD:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001320 D = RecordDecl::Create(*Context, Decl::EmptyShell());
Chris Lattner487412d2009-04-27 05:27:42 +00001321 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001322 case pch::DECL_ENUM_CONSTANT:
Chris Lattner8575daa2009-04-27 21:45:14 +00001323 D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
Chris Lattner487412d2009-04-27 05:27:42 +00001324 0, llvm::APSInt());
1325 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001326 case pch::DECL_FUNCTION:
Mike Stump11289f42009-09-09 15:08:12 +00001327 D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(),
Argyrios Kyrtzidis60ed5602009-08-19 01:27:57 +00001328 QualType(), 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001329 break;
Chris Lattnerca025db2010-05-07 21:43:38 +00001330 case pch::DECL_LINKAGE_SPEC:
1331 D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(),
1332 (LinkageSpecDecl::LanguageIDs)0,
1333 false);
1334 break;
1335 case pch::DECL_NAMESPACE:
1336 D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0);
1337 break;
1338 case pch::DECL_NAMESPACE_ALIAS:
1339 D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(),
1340 SourceLocation(), 0, SourceRange(), 0,
1341 SourceLocation(), 0);
1342 break;
1343 case pch::DECL_USING:
1344 D = UsingDecl::Create(*Context, 0, SourceLocation(), SourceRange(),
1345 SourceLocation(), 0, DeclarationName(), false);
1346 break;
1347 case pch::DECL_USING_SHADOW:
1348 D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1349 break;
1350 case pch::DECL_USING_DIRECTIVE:
1351 D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(),
1352 SourceLocation(), SourceRange(), 0,
1353 SourceLocation(), 0, 0);
1354 break;
1355 case pch::DECL_UNRESOLVED_USING_VALUE:
1356 D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(),
1357 SourceRange(), 0, SourceLocation(),
1358 DeclarationName());
1359 break;
1360 case pch::DECL_UNRESOLVED_USING_TYPENAME:
1361 D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(),
1362 SourceLocation(), SourceRange(),
1363 0, SourceLocation(),
1364 DeclarationName());
1365 break;
1366 case pch::DECL_CXX_RECORD:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001367 D = CXXRecordDecl::Create(*Context, Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001368 break;
1369 case pch::DECL_CXX_METHOD:
1370 D = CXXMethodDecl::Create(*Context, 0, SourceLocation(), DeclarationName(),
1371 QualType(), 0);
1372 break;
1373 case pch::DECL_CXX_CONSTRUCTOR:
1374 D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell());
1375 break;
1376 case pch::DECL_CXX_DESTRUCTOR:
1377 D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell());
1378 break;
1379 case pch::DECL_CXX_CONVERSION:
1380 D = CXXConversionDecl::Create(*Context, Decl::EmptyShell());
1381 break;
Abramo Bagnarad7340582010-06-05 05:09:32 +00001382 case pch::DECL_ACCESS_SPEC:
1383 D = AccessSpecDecl::Create(*Context, AS_none, 0, SourceLocation(),
1384 SourceLocation());
1385 break;
Chris Lattnerca025db2010-05-07 21:43:38 +00001386 case pch::DECL_FRIEND:
Argyrios Kyrtzidis74d28bd2010-06-29 22:47:00 +00001387 D = FriendDecl::Create(*Context, Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001388 break;
1389 case pch::DECL_FRIEND_TEMPLATE:
Argyrios Kyrtzidis165b5812010-07-22 16:04:10 +00001390 D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001391 break;
Chris Lattnerca025db2010-05-07 21:43:38 +00001392 case pch::DECL_CLASS_TEMPLATE:
Argyrios Kyrtzidisa35c8e42010-06-21 10:57:41 +00001393 D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(),
1394 DeclarationName(), 0, 0, 0);
Chris Lattnerca025db2010-05-07 21:43:38 +00001395 break;
1396 case pch::DECL_CLASS_TEMPLATE_SPECIALIZATION:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001397 D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001398 break;
1399 case pch::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001400 D = ClassTemplatePartialSpecializationDecl::Create(*Context,
1401 Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001402 break;
1403 case pch::DECL_FUNCTION_TEMPLATE:
Argyrios Kyrtzidis69da4a82010-06-22 09:55:07 +00001404 D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(),
1405 DeclarationName(), 0, 0);
Chris Lattnerca025db2010-05-07 21:43:38 +00001406 break;
1407 case pch::DECL_TEMPLATE_TYPE_PARM:
Argyrios Kyrtzidis39f0e302010-07-02 11:54:55 +00001408 D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell());
Chris Lattnerca025db2010-05-07 21:43:38 +00001409 break;
1410 case pch::DECL_NON_TYPE_TEMPLATE_PARM:
Argyrios Kyrtzidisb1d38e32010-06-25 16:25:09 +00001411 D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0,
1412 QualType(),0);
Chris Lattnerca025db2010-05-07 21:43:38 +00001413 break;
1414 case pch::DECL_TEMPLATE_TEMPLATE_PARM:
Argyrios Kyrtzidis9f2d24a2010-07-08 17:12:57 +00001415 D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0);
Chris Lattnerca025db2010-05-07 21:43:38 +00001416 break;
1417 case pch::DECL_STATIC_ASSERT:
Argyrios Kyrtzidis2d8891c2010-07-22 17:28:12 +00001418 D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0);
Chris Lattnerca025db2010-05-07 21:43:38 +00001419 break;
1420
Chris Lattner8f63ab52009-04-27 06:01:06 +00001421 case pch::DECL_OBJC_METHOD:
Mike Stump11289f42009-09-09 15:08:12 +00001422 D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(),
Douglas Gregor12852d92010-03-08 14:59:44 +00001423 Selector(), QualType(), 0, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001424 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001425 case pch::DECL_OBJC_INTERFACE:
Chris Lattner8575daa2009-04-27 21:45:14 +00001426 D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001427 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001428 case pch::DECL_OBJC_IVAR:
Argyrios Kyrtzidis60ed5602009-08-19 01:27:57 +00001429 D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
Chris Lattner487412d2009-04-27 05:27:42 +00001430 ObjCIvarDecl::None);
1431 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001432 case pch::DECL_OBJC_PROTOCOL:
Chris Lattner8575daa2009-04-27 21:45:14 +00001433 D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001434 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001435 case pch::DECL_OBJC_AT_DEFS_FIELD:
Mike Stump11289f42009-09-09 15:08:12 +00001436 D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0,
Chris Lattner487412d2009-04-27 05:27:42 +00001437 QualType(), 0);
1438 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001439 case pch::DECL_OBJC_CLASS:
Chris Lattner8575daa2009-04-27 21:45:14 +00001440 D = ObjCClassDecl::Create(*Context, 0, SourceLocation());
Chris Lattner487412d2009-04-27 05:27:42 +00001441 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001442 case pch::DECL_OBJC_FORWARD_PROTOCOL:
Chris Lattner8575daa2009-04-27 21:45:14 +00001443 D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation());
Chris Lattner487412d2009-04-27 05:27:42 +00001444 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001445 case pch::DECL_OBJC_CATEGORY:
Douglas Gregor071676f2010-01-16 16:38:58 +00001446 D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(),
1447 SourceLocation(), SourceLocation(), 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001448 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001449 case pch::DECL_OBJC_CATEGORY_IMPL:
Chris Lattner8575daa2009-04-27 21:45:14 +00001450 D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001451 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001452 case pch::DECL_OBJC_IMPLEMENTATION:
Chris Lattner8575daa2009-04-27 21:45:14 +00001453 D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001454 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001455 case pch::DECL_OBJC_COMPATIBLE_ALIAS:
Chris Lattner8575daa2009-04-27 21:45:14 +00001456 D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001457 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001458 case pch::DECL_OBJC_PROPERTY:
Fariborz Jahanianda8ec2b2010-01-21 17:36:00 +00001459 D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(),
John McCall339bb662010-06-04 20:50:08 +00001460 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001461 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001462 case pch::DECL_OBJC_PROPERTY_IMPL:
Chris Lattner8575daa2009-04-27 21:45:14 +00001463 D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00001464 SourceLocation(), 0,
Chris Lattner487412d2009-04-27 05:27:42 +00001465 ObjCPropertyImplDecl::Dynamic, 0);
1466 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001467 case pch::DECL_FIELD:
Mike Stump11289f42009-09-09 15:08:12 +00001468 D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0,
Argyrios Kyrtzidis6032ef12009-08-21 00:31:54 +00001469 false);
Chris Lattner487412d2009-04-27 05:27:42 +00001470 break;
Chris Lattner487412d2009-04-27 05:27:42 +00001471 case pch::DECL_VAR:
Argyrios Kyrtzidis60ed5602009-08-19 01:27:57 +00001472 D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
Douglas Gregorc4df4072010-04-19 22:54:31 +00001473 VarDecl::None, VarDecl::None);
Chris Lattner487412d2009-04-27 05:27:42 +00001474 break;
1475
1476 case pch::DECL_IMPLICIT_PARAM:
Chris Lattner8575daa2009-04-27 21:45:14 +00001477 D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
Chris Lattner487412d2009-04-27 05:27:42 +00001478 break;
1479
Chris Lattner8f63ab52009-04-27 06:01:06 +00001480 case pch::DECL_PARM_VAR:
Mike Stump11289f42009-09-09 15:08:12 +00001481 D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
Douglas Gregorc4df4072010-04-19 22:54:31 +00001482 VarDecl::None, VarDecl::None, 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001483 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001484 case pch::DECL_FILE_SCOPE_ASM:
Chris Lattner8575daa2009-04-27 21:45:14 +00001485 D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
Chris Lattner487412d2009-04-27 05:27:42 +00001486 break;
Chris Lattner8f63ab52009-04-27 06:01:06 +00001487 case pch::DECL_BLOCK:
Chris Lattner8575daa2009-04-27 21:45:14 +00001488 D = BlockDecl::Create(*Context, 0, SourceLocation());
Chris Lattner487412d2009-04-27 05:27:42 +00001489 break;
1490 }
Chris Lattner487412d2009-04-27 05:27:42 +00001491
1492 assert(D && "Unknown declaration reading PCH file");
Chris Lattner8f63ab52009-04-27 06:01:06 +00001493 LoadedDecl(Index, D);
1494 Reader.Visit(D);
Chris Lattner487412d2009-04-27 05:27:42 +00001495
1496 // If this declaration is also a declaration context, get the
1497 // offsets for its tables of lexical and visible declarations.
1498 if (DeclContext *DC = dyn_cast<DeclContext>(D)) {
1499 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
1500 if (Offsets.first || Offsets.second) {
1501 DC->setHasExternalLexicalStorage(Offsets.first != 0);
1502 DC->setHasExternalVisibleStorage(Offsets.second != 0);
Sebastian Redl5c415f32010-07-22 17:01:13 +00001503 PCHReader::DeclContextInfo Info = {
1504 Loc.first,
1505 Offsets.first,
1506 Offsets.second
1507 };
1508 DeclContextOffsets[DC].push_back(Info);
Chris Lattner487412d2009-04-27 05:27:42 +00001509 }
1510 }
1511 assert(Idx == Record.size());
1512
1513 // If we have deserialized a declaration that has a definition the
Argyrios Kyrtzidis903ccd62010-07-07 15:46:26 +00001514 // AST consumer might need to know about, queue it.
1515 // We don't pass it to the consumer immediately because we may be in recursive
1516 // loading, and some declarations may still be initializing.
1517 if (isConsumerInterestedIn(D))
1518 InterestingDecls.push_back(D);
Chris Lattner487412d2009-04-27 05:27:42 +00001519
1520 return D;
1521}