PCHWriterDecl.cpp 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. //===--- PCHWriterDecl.cpp - Declaration Serialization --------------------===//
  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 serialization for Declarations.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "clang/Frontend/PCHWriter.h"
  14. #include "clang/AST/DeclVisitor.h"
  15. #include "clang/AST/DeclCXX.h"
  16. #include "clang/AST/DeclTemplate.h"
  17. #include "clang/AST/Expr.h"
  18. #include "llvm/ADT/Twine.h"
  19. #include "llvm/Bitcode/BitstreamWriter.h"
  20. #include "llvm/Support/ErrorHandling.h"
  21. using namespace clang;
  22. //===----------------------------------------------------------------------===//
  23. // Declaration serialization
  24. //===----------------------------------------------------------------------===//
  25. namespace clang {
  26. class PCHDeclWriter : public DeclVisitor<PCHDeclWriter, void> {
  27. PCHWriter &Writer;
  28. ASTContext &Context;
  29. PCHWriter::RecordData &Record;
  30. public:
  31. pch::DeclCode Code;
  32. unsigned AbbrevToUse;
  33. PCHDeclWriter(PCHWriter &Writer, ASTContext &Context,
  34. PCHWriter::RecordData &Record)
  35. : Writer(Writer), Context(Context), Record(Record) {
  36. }
  37. void Visit(Decl *D);
  38. void VisitDecl(Decl *D);
  39. void VisitTranslationUnitDecl(TranslationUnitDecl *D);
  40. void VisitNamedDecl(NamedDecl *D);
  41. void VisitNamespaceDecl(NamespaceDecl *D);
  42. void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
  43. void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
  44. void VisitTypeDecl(TypeDecl *D);
  45. void VisitTypedefDecl(TypedefDecl *D);
  46. void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
  47. void VisitTagDecl(TagDecl *D);
  48. void VisitEnumDecl(EnumDecl *D);
  49. void VisitRecordDecl(RecordDecl *D);
  50. void VisitCXXRecordDecl(CXXRecordDecl *D);
  51. void VisitClassTemplateSpecializationDecl(
  52. ClassTemplateSpecializationDecl *D);
  53. void VisitClassTemplatePartialSpecializationDecl(
  54. ClassTemplatePartialSpecializationDecl *D);
  55. void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
  56. void VisitValueDecl(ValueDecl *D);
  57. void VisitEnumConstantDecl(EnumConstantDecl *D);
  58. void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
  59. void VisitDeclaratorDecl(DeclaratorDecl *D);
  60. void VisitFunctionDecl(FunctionDecl *D);
  61. void VisitCXXMethodDecl(CXXMethodDecl *D);
  62. void VisitCXXConstructorDecl(CXXConstructorDecl *D);
  63. void VisitCXXDestructorDecl(CXXDestructorDecl *D);
  64. void VisitCXXConversionDecl(CXXConversionDecl *D);
  65. void VisitFieldDecl(FieldDecl *D);
  66. void VisitVarDecl(VarDecl *D);
  67. void VisitImplicitParamDecl(ImplicitParamDecl *D);
  68. void VisitParmVarDecl(ParmVarDecl *D);
  69. void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
  70. void VisitTemplateDecl(TemplateDecl *D);
  71. void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
  72. void VisitClassTemplateDecl(ClassTemplateDecl *D);
  73. void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
  74. void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
  75. void VisitUsingDecl(UsingDecl *D);
  76. void VisitUsingShadowDecl(UsingShadowDecl *D);
  77. void VisitLinkageSpecDecl(LinkageSpecDecl *D);
  78. void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
  79. void VisitAccessSpecDecl(AccessSpecDecl *D);
  80. void VisitFriendDecl(FriendDecl *D);
  81. void VisitFriendTemplateDecl(FriendTemplateDecl *D);
  82. void VisitStaticAssertDecl(StaticAssertDecl *D);
  83. void VisitBlockDecl(BlockDecl *D);
  84. void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
  85. uint64_t VisibleOffset);
  86. template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
  87. // FIXME: Put in the same order is DeclNodes.td?
  88. void VisitObjCMethodDecl(ObjCMethodDecl *D);
  89. void VisitObjCContainerDecl(ObjCContainerDecl *D);
  90. void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
  91. void VisitObjCIvarDecl(ObjCIvarDecl *D);
  92. void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
  93. void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
  94. void VisitObjCClassDecl(ObjCClassDecl *D);
  95. void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
  96. void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
  97. void VisitObjCImplDecl(ObjCImplDecl *D);
  98. void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
  99. void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
  100. void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
  101. void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
  102. void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
  103. };
  104. }
  105. void PCHDeclWriter::Visit(Decl *D) {
  106. DeclVisitor<PCHDeclWriter>::Visit(D);
  107. // Handle FunctionDecl's body here and write it after all other Stmts/Exprs
  108. // have been written. We want it last because we will not read it back when
  109. // retrieving it from the PCH, we'll just lazily set the offset.
  110. if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
  111. Record.push_back(FD->isThisDeclarationADefinition());
  112. if (FD->isThisDeclarationADefinition())
  113. Writer.AddStmt(FD->getBody());
  114. }
  115. }
  116. void PCHDeclWriter::VisitDecl(Decl *D) {
  117. Writer.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()), Record);
  118. Writer.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()), Record);
  119. Writer.AddSourceLocation(D->getLocation(), Record);
  120. Record.push_back(D->isInvalidDecl());
  121. Record.push_back(D->hasAttrs());
  122. Record.push_back(D->isImplicit());
  123. Record.push_back(D->isUsed(false));
  124. Record.push_back(D->getAccess());
  125. Record.push_back(D->getPCHLevel());
  126. }
  127. void PCHDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
  128. VisitDecl(D);
  129. Writer.AddDeclRef(D->getAnonymousNamespace(), Record);
  130. Code = pch::DECL_TRANSLATION_UNIT;
  131. }
  132. void PCHDeclWriter::VisitNamedDecl(NamedDecl *D) {
  133. VisitDecl(D);
  134. Writer.AddDeclarationName(D->getDeclName(), Record);
  135. }
  136. void PCHDeclWriter::VisitTypeDecl(TypeDecl *D) {
  137. VisitNamedDecl(D);
  138. Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
  139. }
  140. void PCHDeclWriter::VisitTypedefDecl(TypedefDecl *D) {
  141. VisitTypeDecl(D);
  142. Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record);
  143. Code = pch::DECL_TYPEDEF;
  144. }
  145. void PCHDeclWriter::VisitTagDecl(TagDecl *D) {
  146. VisitTypeDecl(D);
  147. Record.push_back(D->getIdentifierNamespace());
  148. VisitRedeclarable(D);
  149. Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding
  150. Record.push_back(D->isDefinition());
  151. Record.push_back(D->isEmbeddedInDeclarator());
  152. Writer.AddSourceLocation(D->getRBraceLoc(), Record);
  153. Writer.AddSourceLocation(D->getTagKeywordLoc(), Record);
  154. // FIXME: maybe write optional qualifier and its range.
  155. Writer.AddDeclRef(D->getTypedefForAnonDecl(), Record);
  156. }
  157. void PCHDeclWriter::VisitEnumDecl(EnumDecl *D) {
  158. VisitTagDecl(D);
  159. Writer.AddTypeRef(D->getIntegerType(), Record);
  160. Writer.AddTypeRef(D->getPromotionType(), Record);
  161. Record.push_back(D->getNumPositiveBits());
  162. Record.push_back(D->getNumNegativeBits());
  163. Writer.AddDeclRef(D->getInstantiatedFromMemberEnum(), Record);
  164. Code = pch::DECL_ENUM;
  165. }
  166. void PCHDeclWriter::VisitRecordDecl(RecordDecl *D) {
  167. VisitTagDecl(D);
  168. Record.push_back(D->hasFlexibleArrayMember());
  169. Record.push_back(D->isAnonymousStructOrUnion());
  170. Record.push_back(D->hasObjectMember());
  171. Code = pch::DECL_RECORD;
  172. }
  173. void PCHDeclWriter::VisitValueDecl(ValueDecl *D) {
  174. VisitNamedDecl(D);
  175. Writer.AddTypeRef(D->getType(), Record);
  176. }
  177. void PCHDeclWriter::VisitEnumConstantDecl(EnumConstantDecl *D) {
  178. VisitValueDecl(D);
  179. Record.push_back(D->getInitExpr()? 1 : 0);
  180. if (D->getInitExpr())
  181. Writer.AddStmt(D->getInitExpr());
  182. Writer.AddAPSInt(D->getInitVal(), Record);
  183. Code = pch::DECL_ENUM_CONSTANT;
  184. }
  185. void PCHDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
  186. VisitValueDecl(D);
  187. Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record);
  188. // FIXME: write optional qualifier and its range.
  189. }
  190. void PCHDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
  191. VisitDeclaratorDecl(D);
  192. Record.push_back(D->getIdentifierNamespace());
  193. Record.push_back(D->getTemplatedKind());
  194. switch (D->getTemplatedKind()) {
  195. default: assert(false && "Unhandled TemplatedKind!");
  196. break;
  197. case FunctionDecl::TK_NonTemplate:
  198. break;
  199. case FunctionDecl::TK_FunctionTemplate:
  200. Writer.AddDeclRef(D->getDescribedFunctionTemplate(), Record);
  201. break;
  202. case FunctionDecl::TK_MemberSpecialization: {
  203. MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo();
  204. Writer.AddDeclRef(MemberInfo->getInstantiatedFrom(), Record);
  205. Record.push_back(MemberInfo->getTemplateSpecializationKind());
  206. Writer.AddSourceLocation(MemberInfo->getPointOfInstantiation(), Record);
  207. break;
  208. }
  209. case FunctionDecl::TK_FunctionTemplateSpecialization: {
  210. FunctionTemplateSpecializationInfo *
  211. FTSInfo = D->getTemplateSpecializationInfo();
  212. // We want it canonical to guarantee that it has a Common*.
  213. Writer.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl(), Record);
  214. Record.push_back(FTSInfo->getTemplateSpecializationKind());
  215. // Template arguments.
  216. Writer.AddTemplateArgumentList(FTSInfo->TemplateArguments, Record);
  217. // Template args as written.
  218. Record.push_back(FTSInfo->TemplateArgumentsAsWritten != 0);
  219. if (FTSInfo->TemplateArgumentsAsWritten) {
  220. Record.push_back(FTSInfo->TemplateArgumentsAsWritten->size());
  221. for (int i=0, e = FTSInfo->TemplateArgumentsAsWritten->size(); i!=e; ++i)
  222. Writer.AddTemplateArgumentLoc((*FTSInfo->TemplateArgumentsAsWritten)[i],
  223. Record);
  224. Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->getLAngleLoc(),
  225. Record);
  226. Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->getRAngleLoc(),
  227. Record);
  228. }
  229. Writer.AddSourceLocation(FTSInfo->getPointOfInstantiation(), Record);
  230. break;
  231. }
  232. case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
  233. DependentFunctionTemplateSpecializationInfo *
  234. DFTSInfo = D->getDependentSpecializationInfo();
  235. // Templates.
  236. Record.push_back(DFTSInfo->getNumTemplates());
  237. for (int i=0, e = DFTSInfo->getNumTemplates(); i != e; ++i)
  238. Writer.AddDeclRef(DFTSInfo->getTemplate(i), Record);
  239. // Templates args.
  240. Record.push_back(DFTSInfo->getNumTemplateArgs());
  241. for (int i=0, e = DFTSInfo->getNumTemplateArgs(); i != e; ++i)
  242. Writer.AddTemplateArgumentLoc(DFTSInfo->getTemplateArg(i), Record);
  243. Writer.AddSourceLocation(DFTSInfo->getLAngleLoc(), Record);
  244. Writer.AddSourceLocation(DFTSInfo->getRAngleLoc(), Record);
  245. break;
  246. }
  247. }
  248. // FunctionDecl's body is handled last at PCHWriterDecl::Visit,
  249. // after everything else is written.
  250. VisitRedeclarable(D);
  251. Record.push_back(D->getStorageClass()); // FIXME: stable encoding
  252. Record.push_back(D->getStorageClassAsWritten());
  253. Record.push_back(D->isInlineSpecified());
  254. Record.push_back(D->isVirtualAsWritten());
  255. Record.push_back(D->isPure());
  256. Record.push_back(D->hasInheritedPrototype());
  257. Record.push_back(D->hasWrittenPrototype());
  258. Record.push_back(D->isDeleted());
  259. Record.push_back(D->isTrivial());
  260. Record.push_back(D->isCopyAssignment());
  261. Record.push_back(D->hasImplicitReturnZero());
  262. Writer.AddSourceLocation(D->getLocEnd(), Record);
  263. Record.push_back(D->param_size());
  264. for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
  265. P != PEnd; ++P)
  266. Writer.AddDeclRef(*P, Record);
  267. Code = pch::DECL_FUNCTION;
  268. }
  269. void PCHDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
  270. VisitNamedDecl(D);
  271. // FIXME: convert to LazyStmtPtr?
  272. // Unlike C/C++, method bodies will never be in header files.
  273. bool HasBodyStuff = D->getBody() != 0 ||
  274. D->getSelfDecl() != 0 || D->getCmdDecl() != 0;
  275. Record.push_back(HasBodyStuff);
  276. if (HasBodyStuff) {
  277. Writer.AddStmt(D->getBody());
  278. Writer.AddDeclRef(D->getSelfDecl(), Record);
  279. Writer.AddDeclRef(D->getCmdDecl(), Record);
  280. }
  281. Record.push_back(D->isInstanceMethod());
  282. Record.push_back(D->isVariadic());
  283. Record.push_back(D->isSynthesized());
  284. Record.push_back(D->isDefined());
  285. // FIXME: stable encoding for @required/@optional
  286. Record.push_back(D->getImplementationControl());
  287. // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway
  288. Record.push_back(D->getObjCDeclQualifier());
  289. Record.push_back(D->getNumSelectorArgs());
  290. Writer.AddTypeRef(D->getResultType(), Record);
  291. Writer.AddTypeSourceInfo(D->getResultTypeSourceInfo(), Record);
  292. Writer.AddSourceLocation(D->getLocEnd(), Record);
  293. Record.push_back(D->param_size());
  294. for (ObjCMethodDecl::param_iterator P = D->param_begin(),
  295. PEnd = D->param_end(); P != PEnd; ++P)
  296. Writer.AddDeclRef(*P, Record);
  297. Code = pch::DECL_OBJC_METHOD;
  298. }
  299. void PCHDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
  300. VisitNamedDecl(D);
  301. Writer.AddSourceRange(D->getAtEndRange(), Record);
  302. // Abstract class (no need to define a stable pch::DECL code).
  303. }
  304. void PCHDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
  305. VisitObjCContainerDecl(D);
  306. Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
  307. Writer.AddDeclRef(D->getSuperClass(), Record);
  308. Record.push_back(D->protocol_size());
  309. for (ObjCInterfaceDecl::protocol_iterator P = D->protocol_begin(),
  310. PEnd = D->protocol_end();
  311. P != PEnd; ++P)
  312. Writer.AddDeclRef(*P, Record);
  313. for (ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(),
  314. PLEnd = D->protocol_loc_end();
  315. PL != PLEnd; ++PL)
  316. Writer.AddSourceLocation(*PL, Record);
  317. Record.push_back(D->ivar_size());
  318. for (ObjCInterfaceDecl::ivar_iterator I = D->ivar_begin(),
  319. IEnd = D->ivar_end(); I != IEnd; ++I)
  320. Writer.AddDeclRef(*I, Record);
  321. Writer.AddDeclRef(D->getCategoryList(), Record);
  322. Record.push_back(D->isForwardDecl());
  323. Record.push_back(D->isImplicitInterfaceDecl());
  324. Writer.AddSourceLocation(D->getClassLoc(), Record);
  325. Writer.AddSourceLocation(D->getSuperClassLoc(), Record);
  326. Writer.AddSourceLocation(D->getLocEnd(), Record);
  327. Code = pch::DECL_OBJC_INTERFACE;
  328. }
  329. void PCHDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
  330. VisitFieldDecl(D);
  331. // FIXME: stable encoding for @public/@private/@protected/@package
  332. Record.push_back(D->getAccessControl());
  333. Record.push_back(D->getSynthesize());
  334. Code = pch::DECL_OBJC_IVAR;
  335. }
  336. void PCHDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
  337. VisitObjCContainerDecl(D);
  338. Record.push_back(D->isForwardDecl());
  339. Writer.AddSourceLocation(D->getLocEnd(), Record);
  340. Record.push_back(D->protocol_size());
  341. for (ObjCProtocolDecl::protocol_iterator
  342. I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I)
  343. Writer.AddDeclRef(*I, Record);
  344. for (ObjCProtocolDecl::protocol_loc_iterator PL = D->protocol_loc_begin(),
  345. PLEnd = D->protocol_loc_end();
  346. PL != PLEnd; ++PL)
  347. Writer.AddSourceLocation(*PL, Record);
  348. Code = pch::DECL_OBJC_PROTOCOL;
  349. }
  350. void PCHDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
  351. VisitFieldDecl(D);
  352. Code = pch::DECL_OBJC_AT_DEFS_FIELD;
  353. }
  354. void PCHDeclWriter::VisitObjCClassDecl(ObjCClassDecl *D) {
  355. VisitDecl(D);
  356. Record.push_back(D->size());
  357. for (ObjCClassDecl::iterator I = D->begin(), IEnd = D->end(); I != IEnd; ++I)
  358. Writer.AddDeclRef(I->getInterface(), Record);
  359. for (ObjCClassDecl::iterator I = D->begin(), IEnd = D->end(); I != IEnd; ++I)
  360. Writer.AddSourceLocation(I->getLocation(), Record);
  361. Code = pch::DECL_OBJC_CLASS;
  362. }
  363. void PCHDeclWriter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
  364. VisitDecl(D);
  365. Record.push_back(D->protocol_size());
  366. for (ObjCForwardProtocolDecl::protocol_iterator
  367. I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I)
  368. Writer.AddDeclRef(*I, Record);
  369. for (ObjCForwardProtocolDecl::protocol_loc_iterator
  370. PL = D->protocol_loc_begin(), PLEnd = D->protocol_loc_end();
  371. PL != PLEnd; ++PL)
  372. Writer.AddSourceLocation(*PL, Record);
  373. Code = pch::DECL_OBJC_FORWARD_PROTOCOL;
  374. }
  375. void PCHDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
  376. VisitObjCContainerDecl(D);
  377. Writer.AddDeclRef(D->getClassInterface(), Record);
  378. Record.push_back(D->protocol_size());
  379. for (ObjCCategoryDecl::protocol_iterator
  380. I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I)
  381. Writer.AddDeclRef(*I, Record);
  382. for (ObjCCategoryDecl::protocol_loc_iterator
  383. PL = D->protocol_loc_begin(), PLEnd = D->protocol_loc_end();
  384. PL != PLEnd; ++PL)
  385. Writer.AddSourceLocation(*PL, Record);
  386. Writer.AddDeclRef(D->getNextClassCategory(), Record);
  387. Writer.AddSourceLocation(D->getAtLoc(), Record);
  388. Writer.AddSourceLocation(D->getCategoryNameLoc(), Record);
  389. Code = pch::DECL_OBJC_CATEGORY;
  390. }
  391. void PCHDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
  392. VisitNamedDecl(D);
  393. Writer.AddDeclRef(D->getClassInterface(), Record);
  394. Code = pch::DECL_OBJC_COMPATIBLE_ALIAS;
  395. }
  396. void PCHDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
  397. VisitNamedDecl(D);
  398. Writer.AddSourceLocation(D->getAtLoc(), Record);
  399. Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record);
  400. // FIXME: stable encoding
  401. Record.push_back((unsigned)D->getPropertyAttributes());
  402. Record.push_back((unsigned)D->getPropertyAttributesAsWritten());
  403. // FIXME: stable encoding
  404. Record.push_back((unsigned)D->getPropertyImplementation());
  405. Writer.AddDeclarationName(D->getGetterName(), Record);
  406. Writer.AddDeclarationName(D->getSetterName(), Record);
  407. Writer.AddDeclRef(D->getGetterMethodDecl(), Record);
  408. Writer.AddDeclRef(D->getSetterMethodDecl(), Record);
  409. Writer.AddDeclRef(D->getPropertyIvarDecl(), Record);
  410. Code = pch::DECL_OBJC_PROPERTY;
  411. }
  412. void PCHDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) {
  413. VisitObjCContainerDecl(D);
  414. Writer.AddDeclRef(D->getClassInterface(), Record);
  415. // Abstract class (no need to define a stable pch::DECL code).
  416. }
  417. void PCHDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
  418. VisitObjCImplDecl(D);
  419. Writer.AddIdentifierRef(D->getIdentifier(), Record);
  420. Code = pch::DECL_OBJC_CATEGORY_IMPL;
  421. }
  422. void PCHDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
  423. VisitObjCImplDecl(D);
  424. Writer.AddDeclRef(D->getSuperClass(), Record);
  425. Writer.AddCXXBaseOrMemberInitializers(D->IvarInitializers,
  426. D->NumIvarInitializers, Record);
  427. Code = pch::DECL_OBJC_IMPLEMENTATION;
  428. }
  429. void PCHDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
  430. VisitDecl(D);
  431. Writer.AddSourceLocation(D->getLocStart(), Record);
  432. Writer.AddDeclRef(D->getPropertyDecl(), Record);
  433. Writer.AddDeclRef(D->getPropertyIvarDecl(), Record);
  434. Writer.AddStmt(D->getGetterCXXConstructor());
  435. Writer.AddStmt(D->getSetterCXXAssignment());
  436. Code = pch::DECL_OBJC_PROPERTY_IMPL;
  437. }
  438. void PCHDeclWriter::VisitFieldDecl(FieldDecl *D) {
  439. VisitDeclaratorDecl(D);
  440. Record.push_back(D->isMutable());
  441. Record.push_back(D->getBitWidth()? 1 : 0);
  442. if (D->getBitWidth())
  443. Writer.AddStmt(D->getBitWidth());
  444. if (!D->getDeclName())
  445. Writer.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D), Record);
  446. Code = pch::DECL_FIELD;
  447. }
  448. void PCHDeclWriter::VisitVarDecl(VarDecl *D) {
  449. VisitDeclaratorDecl(D);
  450. Record.push_back(D->getStorageClass()); // FIXME: stable encoding
  451. Record.push_back(D->getStorageClassAsWritten());
  452. Record.push_back(D->isThreadSpecified());
  453. Record.push_back(D->hasCXXDirectInitializer());
  454. Record.push_back(D->isExceptionVariable());
  455. Record.push_back(D->isNRVOVariable());
  456. VisitRedeclarable(D);
  457. Record.push_back(D->getInit() ? 1 : 0);
  458. if (D->getInit())
  459. Writer.AddStmt(D->getInit());
  460. MemberSpecializationInfo *SpecInfo
  461. = D->isStaticDataMember() ? D->getMemberSpecializationInfo() : 0;
  462. Record.push_back(SpecInfo != 0);
  463. if (SpecInfo) {
  464. Writer.AddDeclRef(SpecInfo->getInstantiatedFrom(), Record);
  465. Record.push_back(SpecInfo->getTemplateSpecializationKind());
  466. Writer.AddSourceLocation(SpecInfo->getPointOfInstantiation(), Record);
  467. }
  468. Code = pch::DECL_VAR;
  469. }
  470. void PCHDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
  471. VisitVarDecl(D);
  472. Code = pch::DECL_IMPLICIT_PARAM;
  473. }
  474. void PCHDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
  475. VisitVarDecl(D);
  476. Record.push_back(D->getObjCDeclQualifier()); // FIXME: stable encoding
  477. Record.push_back(D->hasInheritedDefaultArg());
  478. Record.push_back(D->hasUninstantiatedDefaultArg());
  479. if (D->hasUninstantiatedDefaultArg())
  480. Writer.AddStmt(D->getUninstantiatedDefaultArg());
  481. Code = pch::DECL_PARM_VAR;
  482. // If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
  483. // we dynamically check for the properties that we optimize for, but don't
  484. // know are true of all PARM_VAR_DECLs.
  485. if (!D->getTypeSourceInfo() &&
  486. !D->hasAttrs() &&
  487. !D->isImplicit() &&
  488. !D->isUsed(false) &&
  489. D->getAccess() == AS_none &&
  490. D->getPCHLevel() == 0 &&
  491. D->getStorageClass() == 0 &&
  492. !D->hasCXXDirectInitializer() && // Can params have this ever?
  493. D->getObjCDeclQualifier() == 0 &&
  494. !D->hasInheritedDefaultArg() &&
  495. D->getInit() == 0 &&
  496. !D->hasUninstantiatedDefaultArg()) // No default expr.
  497. AbbrevToUse = Writer.getParmVarDeclAbbrev();
  498. // Check things we know are true of *every* PARM_VAR_DECL, which is more than
  499. // just us assuming it.
  500. assert(!D->isInvalidDecl() && "Shouldn't emit invalid decls");
  501. assert(!D->isThreadSpecified() && "PARM_VAR_DECL can't be __thread");
  502. assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
  503. assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
  504. assert(D->getPreviousDeclaration() == 0 && "PARM_VAR_DECL can't be redecl");
  505. assert(!D->isStaticDataMember() &&
  506. "PARM_VAR_DECL can't be static data member");
  507. }
  508. void PCHDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
  509. VisitDecl(D);
  510. Writer.AddStmt(D->getAsmString());
  511. Code = pch::DECL_FILE_SCOPE_ASM;
  512. }
  513. void PCHDeclWriter::VisitBlockDecl(BlockDecl *D) {
  514. VisitDecl(D);
  515. Writer.AddStmt(D->getBody());
  516. Writer.AddTypeSourceInfo(D->getSignatureAsWritten(), Record);
  517. Record.push_back(D->param_size());
  518. for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
  519. P != PEnd; ++P)
  520. Writer.AddDeclRef(*P, Record);
  521. Code = pch::DECL_BLOCK;
  522. }
  523. void PCHDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
  524. VisitDecl(D);
  525. // FIXME: It might be nice to serialize the brace locations for this
  526. // declaration, which don't seem to be readily available in the AST.
  527. Record.push_back(D->getLanguage());
  528. Record.push_back(D->hasBraces());
  529. Code = pch::DECL_LINKAGE_SPEC;
  530. }
  531. void PCHDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) {
  532. VisitNamedDecl(D);
  533. Writer.AddSourceLocation(D->getLBracLoc(), Record);
  534. Writer.AddSourceLocation(D->getRBracLoc(), Record);
  535. Writer.AddDeclRef(D->getNextNamespace(), Record);
  536. // Only write one reference--original or anonymous
  537. Record.push_back(D->isOriginalNamespace());
  538. if (D->isOriginalNamespace())
  539. Writer.AddDeclRef(D->getAnonymousNamespace(), Record);
  540. else
  541. Writer.AddDeclRef(D->getOriginalNamespace(), Record);
  542. Code = pch::DECL_NAMESPACE;
  543. if (Writer.hasChain() && !D->isOriginalNamespace() &&
  544. D->getOriginalNamespace()->getPCHLevel() > 0) {
  545. Writer.AddUpdatedNamespace(D->getOriginalNamespace());
  546. }
  547. }
  548. void PCHDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
  549. VisitNamedDecl(D);
  550. Writer.AddSourceLocation(D->getAliasLoc(), Record);
  551. Writer.AddSourceRange(D->getQualifierRange(), Record);
  552. Writer.AddNestedNameSpecifier(D->getQualifier(), Record);
  553. Writer.AddSourceLocation(D->getTargetNameLoc(), Record);
  554. Writer.AddDeclRef(D->getNamespace(), Record);
  555. Code = pch::DECL_NAMESPACE_ALIAS;
  556. }
  557. void PCHDeclWriter::VisitUsingDecl(UsingDecl *D) {
  558. VisitNamedDecl(D);
  559. Writer.AddSourceRange(D->getNestedNameRange(), Record);
  560. Writer.AddSourceLocation(D->getUsingLocation(), Record);
  561. Writer.AddNestedNameSpecifier(D->getTargetNestedNameDecl(), Record);
  562. Record.push_back(D->getNumShadowDecls());
  563. for (UsingDecl::shadow_iterator P = D->shadow_begin(),
  564. PEnd = D->shadow_end(); P != PEnd; ++P)
  565. Writer.AddDeclRef(*P, Record);
  566. Record.push_back(D->isTypeName());
  567. Writer.AddDeclRef(Context.getInstantiatedFromUsingDecl(D), Record);
  568. Code = pch::DECL_USING;
  569. }
  570. void PCHDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {
  571. VisitNamedDecl(D);
  572. Writer.AddDeclRef(D->getTargetDecl(), Record);
  573. Writer.AddDeclRef(D->getUsingDecl(), Record);
  574. Writer.AddDeclRef(Context.getInstantiatedFromUsingShadowDecl(D), Record);
  575. Code = pch::DECL_USING_SHADOW;
  576. }
  577. void PCHDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
  578. VisitNamedDecl(D);
  579. Writer.AddSourceLocation(D->getNamespaceKeyLocation(), Record);
  580. Writer.AddSourceRange(D->getQualifierRange(), Record);
  581. Writer.AddNestedNameSpecifier(D->getQualifier(), Record);
  582. Writer.AddSourceLocation(D->getIdentLocation(), Record);
  583. Writer.AddDeclRef(D->getNominatedNamespace(), Record);
  584. Writer.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()), Record);
  585. Code = pch::DECL_USING_DIRECTIVE;
  586. }
  587. void PCHDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
  588. VisitValueDecl(D);
  589. Writer.AddSourceRange(D->getTargetNestedNameRange(), Record);
  590. Writer.AddSourceLocation(D->getUsingLoc(), Record);
  591. Writer.AddNestedNameSpecifier(D->getTargetNestedNameSpecifier(), Record);
  592. Code = pch::DECL_UNRESOLVED_USING_VALUE;
  593. }
  594. void PCHDeclWriter::VisitUnresolvedUsingTypenameDecl(
  595. UnresolvedUsingTypenameDecl *D) {
  596. VisitTypeDecl(D);
  597. Writer.AddSourceRange(D->getTargetNestedNameRange(), Record);
  598. Writer.AddSourceLocation(D->getUsingLoc(), Record);
  599. Writer.AddSourceLocation(D->getTypenameLoc(), Record);
  600. Writer.AddNestedNameSpecifier(D->getTargetNestedNameSpecifier(), Record);
  601. Code = pch::DECL_UNRESOLVED_USING_TYPENAME;
  602. }
  603. void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
  604. // See comments at PCHDeclReader::VisitCXXRecordDecl about why this happens
  605. // before VisitRecordDecl.
  606. enum { Data_NoDefData, Data_Owner, Data_NotOwner };
  607. bool OwnsDefinitionData = false;
  608. if (D->DefinitionData) {
  609. assert(D->DefinitionData->Definition &&
  610. "DefinitionData don't point to a definition decl!");
  611. OwnsDefinitionData = D->DefinitionData->Definition == D;
  612. if (OwnsDefinitionData) {
  613. Record.push_back(Data_Owner);
  614. } else {
  615. Record.push_back(Data_NotOwner);
  616. Writer.AddDeclRef(D->DefinitionData->Definition, Record);
  617. }
  618. } else
  619. Record.push_back(Data_NoDefData);
  620. VisitRecordDecl(D);
  621. if (OwnsDefinitionData) {
  622. assert(D->DefinitionData);
  623. struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;
  624. Record.push_back(Data.UserDeclaredConstructor);
  625. Record.push_back(Data.UserDeclaredCopyConstructor);
  626. Record.push_back(Data.UserDeclaredCopyAssignment);
  627. Record.push_back(Data.UserDeclaredDestructor);
  628. Record.push_back(Data.Aggregate);
  629. Record.push_back(Data.PlainOldData);
  630. Record.push_back(Data.Empty);
  631. Record.push_back(Data.Polymorphic);
  632. Record.push_back(Data.Abstract);
  633. Record.push_back(Data.HasTrivialConstructor);
  634. Record.push_back(Data.HasTrivialCopyConstructor);
  635. Record.push_back(Data.HasTrivialCopyAssignment);
  636. Record.push_back(Data.HasTrivialDestructor);
  637. Record.push_back(Data.ComputedVisibleConversions);
  638. Record.push_back(Data.DeclaredDefaultConstructor);
  639. Record.push_back(Data.DeclaredCopyConstructor);
  640. Record.push_back(Data.DeclaredCopyAssignment);
  641. Record.push_back(Data.DeclaredDestructor);
  642. Record.push_back(D->getNumBases());
  643. for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
  644. E = D->bases_end(); I != E; ++I)
  645. Writer.AddCXXBaseSpecifier(*I, Record);
  646. // FIXME: Make VBases lazily computed when needed to avoid storing them.
  647. Record.push_back(D->getNumVBases());
  648. for (CXXRecordDecl::base_class_iterator I = D->vbases_begin(),
  649. E = D->vbases_end(); I != E; ++I)
  650. Writer.AddCXXBaseSpecifier(*I, Record);
  651. Writer.AddUnresolvedSet(Data.Conversions, Record);
  652. Writer.AddUnresolvedSet(Data.VisibleConversions, Record);
  653. // Data.Definition is written at the top.
  654. Writer.AddDeclRef(Data.FirstFriend, Record);
  655. }
  656. enum {
  657. CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
  658. };
  659. if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) {
  660. Record.push_back(CXXRecTemplate);
  661. Writer.AddDeclRef(TemplD, Record);
  662. } else if (MemberSpecializationInfo *MSInfo
  663. = D->getMemberSpecializationInfo()) {
  664. Record.push_back(CXXRecMemberSpecialization);
  665. Writer.AddDeclRef(MSInfo->getInstantiatedFrom(), Record);
  666. Record.push_back(MSInfo->getTemplateSpecializationKind());
  667. Writer.AddSourceLocation(MSInfo->getPointOfInstantiation(), Record);
  668. } else {
  669. Record.push_back(CXXRecNotTemplate);
  670. }
  671. Code = pch::DECL_CXX_RECORD;
  672. }
  673. void PCHDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {
  674. VisitFunctionDecl(D);
  675. Record.push_back(D->size_overridden_methods());
  676. for (CXXMethodDecl::method_iterator
  677. I = D->begin_overridden_methods(), E = D->end_overridden_methods();
  678. I != E; ++I)
  679. Writer.AddDeclRef(*I, Record);
  680. Code = pch::DECL_CXX_METHOD;
  681. }
  682. void PCHDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
  683. VisitCXXMethodDecl(D);
  684. Record.push_back(D->IsExplicitSpecified);
  685. Record.push_back(D->ImplicitlyDefined);
  686. Writer.AddCXXBaseOrMemberInitializers(D->BaseOrMemberInitializers,
  687. D->NumBaseOrMemberInitializers, Record);
  688. Code = pch::DECL_CXX_CONSTRUCTOR;
  689. }
  690. void PCHDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
  691. VisitCXXMethodDecl(D);
  692. Record.push_back(D->ImplicitlyDefined);
  693. Writer.AddDeclRef(D->OperatorDelete, Record);
  694. Code = pch::DECL_CXX_DESTRUCTOR;
  695. }
  696. void PCHDeclWriter::VisitCXXConversionDecl(CXXConversionDecl *D) {
  697. VisitCXXMethodDecl(D);
  698. Record.push_back(D->IsExplicitSpecified);
  699. Code = pch::DECL_CXX_CONVERSION;
  700. }
  701. void PCHDeclWriter::VisitAccessSpecDecl(AccessSpecDecl *D) {
  702. VisitDecl(D);
  703. Writer.AddSourceLocation(D->getColonLoc(), Record);
  704. Code = pch::DECL_ACCESS_SPEC;
  705. }
  706. void PCHDeclWriter::VisitFriendDecl(FriendDecl *D) {
  707. VisitDecl(D);
  708. Record.push_back(D->Friend.is<TypeSourceInfo*>());
  709. if (D->Friend.is<TypeSourceInfo*>())
  710. Writer.AddTypeSourceInfo(D->Friend.get<TypeSourceInfo*>(), Record);
  711. else
  712. Writer.AddDeclRef(D->Friend.get<NamedDecl*>(), Record);
  713. Writer.AddDeclRef(D->NextFriend, Record);
  714. Writer.AddSourceLocation(D->FriendLoc, Record);
  715. Code = pch::DECL_FRIEND;
  716. }
  717. void PCHDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
  718. VisitDecl(D);
  719. Record.push_back(D->getNumTemplateParameters());
  720. for (unsigned i = 0, e = D->getNumTemplateParameters(); i != e; ++i)
  721. Writer.AddTemplateParameterList(D->getTemplateParameterList(i), Record);
  722. Record.push_back(D->getFriendDecl() != 0);
  723. if (D->getFriendDecl())
  724. Writer.AddDeclRef(D->getFriendDecl(), Record);
  725. else
  726. Writer.AddTypeSourceInfo(D->getFriendType(), Record);
  727. Writer.AddSourceLocation(D->getFriendLoc(), Record);
  728. Code = pch::DECL_FRIEND_TEMPLATE;
  729. }
  730. void PCHDeclWriter::VisitTemplateDecl(TemplateDecl *D) {
  731. VisitNamedDecl(D);
  732. Writer.AddDeclRef(D->getTemplatedDecl(), Record);
  733. Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
  734. }
  735. void PCHDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
  736. VisitTemplateDecl(D);
  737. Record.push_back(D->getIdentifierNamespace());
  738. Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
  739. if (D->getPreviousDeclaration() == 0) {
  740. // This TemplateDecl owns the CommonPtr; write it.
  741. assert(D->isCanonicalDecl());
  742. Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record);
  743. if (D->getInstantiatedFromMemberTemplate())
  744. Record.push_back(D->isMemberSpecialization());
  745. Writer.AddDeclRef(D->getCommonPtr()->Latest, Record);
  746. } else {
  747. RedeclarableTemplateDecl *First = D->getFirstDeclaration();
  748. assert(First != D);
  749. // If this is a most recent redeclaration that is pointed to by a first decl
  750. // in a chained PCH, keep track of the association with the map so we can
  751. // update the first decl during PCH reading.
  752. if (First->getMostRecentDeclaration() == D &&
  753. First->getPCHLevel() > D->getPCHLevel()) {
  754. assert(Writer.FirstLatestDecls.find(First)==Writer.FirstLatestDecls.end()
  755. && "The latest is already set");
  756. Writer.FirstLatestDecls[First] = D;
  757. }
  758. }
  759. }
  760. void PCHDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
  761. VisitRedeclarableTemplateDecl(D);
  762. if (D->getPreviousDeclaration() == 0) {
  763. typedef llvm::FoldingSet<ClassTemplateSpecializationDecl> CTSDSetTy;
  764. CTSDSetTy &CTSDSet = D->getSpecializations();
  765. Record.push_back(CTSDSet.size());
  766. for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) {
  767. assert(I->isCanonicalDecl() && "Expected only canonical decls in set");
  768. Writer.AddDeclRef(&*I, Record);
  769. }
  770. typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> CTPSDSetTy;
  771. CTPSDSetTy &CTPSDSet = D->getPartialSpecializations();
  772. Record.push_back(CTPSDSet.size());
  773. for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) {
  774. assert(I->isCanonicalDecl() && "Expected only canonical decls in set");
  775. Writer.AddDeclRef(&*I, Record);
  776. }
  777. // InjectedClassNameType is computed, no need to write it.
  778. }
  779. Code = pch::DECL_CLASS_TEMPLATE;
  780. }
  781. void PCHDeclWriter::VisitClassTemplateSpecializationDecl(
  782. ClassTemplateSpecializationDecl *D) {
  783. VisitCXXRecordDecl(D);
  784. llvm::PointerUnion<ClassTemplateDecl *,
  785. ClassTemplatePartialSpecializationDecl *> InstFrom
  786. = D->getSpecializedTemplateOrPartial();
  787. if (InstFrom.is<ClassTemplateDecl *>()) {
  788. Writer.AddDeclRef(InstFrom.get<ClassTemplateDecl *>(), Record);
  789. } else {
  790. Writer.AddDeclRef(InstFrom.get<ClassTemplatePartialSpecializationDecl *>(),
  791. Record);
  792. Writer.AddTemplateArgumentList(&D->getTemplateInstantiationArgs(), Record);
  793. }
  794. // Explicit info.
  795. Writer.AddTypeSourceInfo(D->getTypeAsWritten(), Record);
  796. if (D->getTypeAsWritten()) {
  797. Writer.AddSourceLocation(D->getExternLoc(), Record);
  798. Writer.AddSourceLocation(D->getTemplateKeywordLoc(), Record);
  799. }
  800. Writer.AddTemplateArgumentList(&D->getTemplateArgs(), Record);
  801. Writer.AddSourceLocation(D->getPointOfInstantiation(), Record);
  802. Record.push_back(D->getSpecializationKind());
  803. if (D->isCanonicalDecl()) {
  804. // When reading, we'll add it to the folding set of the following template.
  805. Writer.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl(), Record);
  806. }
  807. Code = pch::DECL_CLASS_TEMPLATE_SPECIALIZATION;
  808. }
  809. void PCHDeclWriter::VisitClassTemplatePartialSpecializationDecl(
  810. ClassTemplatePartialSpecializationDecl *D) {
  811. VisitClassTemplateSpecializationDecl(D);
  812. Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
  813. Record.push_back(D->getNumTemplateArgsAsWritten());
  814. for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i)
  815. Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record);
  816. Record.push_back(D->getSequenceNumber());
  817. // These are read/set from/to the first declaration.
  818. if (D->getPreviousDeclaration() == 0) {
  819. Writer.AddDeclRef(D->getInstantiatedFromMember(), Record);
  820. Record.push_back(D->isMemberSpecialization());
  821. }
  822. Code = pch::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION;
  823. }
  824. void PCHDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
  825. VisitRedeclarableTemplateDecl(D);
  826. if (D->getPreviousDeclaration() == 0) {
  827. // This FunctionTemplateDecl owns the CommonPtr; write it.
  828. // Write the function specialization declarations.
  829. Record.push_back(D->getSpecializations().size());
  830. for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator
  831. I = D->getSpecializations().begin(),
  832. E = D->getSpecializations().end() ; I != E; ++I) {
  833. assert(I->Function->isCanonicalDecl() &&
  834. "Expected only canonical decls in set");
  835. Writer.AddDeclRef(I->Function, Record);
  836. }
  837. }
  838. Code = pch::DECL_FUNCTION_TEMPLATE;
  839. }
  840. void PCHDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
  841. VisitTypeDecl(D);
  842. Record.push_back(D->wasDeclaredWithTypename());
  843. Record.push_back(D->isParameterPack());
  844. Record.push_back(D->defaultArgumentWasInherited());
  845. Writer.AddTypeSourceInfo(D->getDefaultArgumentInfo(), Record);
  846. Code = pch::DECL_TEMPLATE_TYPE_PARM;
  847. }
  848. void PCHDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
  849. VisitVarDecl(D);
  850. // TemplateParmPosition.
  851. Record.push_back(D->getDepth());
  852. Record.push_back(D->getPosition());
  853. // Rest of NonTypeTemplateParmDecl.
  854. Record.push_back(D->getDefaultArgument() != 0);
  855. if (D->getDefaultArgument()) {
  856. Writer.AddStmt(D->getDefaultArgument());
  857. Record.push_back(D->defaultArgumentWasInherited());
  858. }
  859. Code = pch::DECL_NON_TYPE_TEMPLATE_PARM;
  860. }
  861. void PCHDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
  862. VisitTemplateDecl(D);
  863. // TemplateParmPosition.
  864. Record.push_back(D->getDepth());
  865. Record.push_back(D->getPosition());
  866. // Rest of TemplateTemplateParmDecl.
  867. Writer.AddTemplateArgumentLoc(D->getDefaultArgument(), Record);
  868. Record.push_back(D->defaultArgumentWasInherited());
  869. Code = pch::DECL_TEMPLATE_TEMPLATE_PARM;
  870. }
  871. void PCHDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) {
  872. VisitDecl(D);
  873. Writer.AddStmt(D->getAssertExpr());
  874. Writer.AddStmt(D->getMessage());
  875. Code = pch::DECL_STATIC_ASSERT;
  876. }
  877. /// \brief Emit the DeclContext part of a declaration context decl.
  878. ///
  879. /// \param LexicalOffset the offset at which the DECL_CONTEXT_LEXICAL
  880. /// block for this declaration context is stored. May be 0 to indicate
  881. /// that there are no declarations stored within this context.
  882. ///
  883. /// \param VisibleOffset the offset at which the DECL_CONTEXT_VISIBLE
  884. /// block for this declaration context is stored. May be 0 to indicate
  885. /// that there are no declarations visible from this context. Note
  886. /// that this value will not be emitted for non-primary declaration
  887. /// contexts.
  888. void PCHDeclWriter::VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
  889. uint64_t VisibleOffset) {
  890. Record.push_back(LexicalOffset);
  891. Record.push_back(VisibleOffset);
  892. }
  893. template <typename T>
  894. void PCHDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
  895. enum { NoRedeclaration = 0, PointsToPrevious, PointsToLatest };
  896. if (D->RedeclLink.getNext() == D) {
  897. Record.push_back(NoRedeclaration);
  898. } else {
  899. Record.push_back(D->RedeclLink.NextIsPrevious() ? PointsToPrevious
  900. : PointsToLatest);
  901. Writer.AddDeclRef(D->RedeclLink.getPointer(), Record);
  902. }
  903. T *First = D->getFirstDeclaration();
  904. T *ThisDecl = static_cast<T*>(D);
  905. // If this is a most recent redeclaration that is pointed to by a first decl
  906. // in a chained PCH, keep track of the association with the map so we can
  907. // update the first decl during PCH reading.
  908. if (ThisDecl != First && First->getMostRecentDeclaration() == ThisDecl &&
  909. First->getPCHLevel() > ThisDecl->getPCHLevel()) {
  910. assert(Writer.FirstLatestDecls.find(First) == Writer.FirstLatestDecls.end()
  911. && "The latest is already set");
  912. Writer.FirstLatestDecls[First] = ThisDecl;
  913. }
  914. }
  915. //===----------------------------------------------------------------------===//
  916. // PCHWriter Implementation
  917. //===----------------------------------------------------------------------===//
  918. void PCHWriter::WriteDeclsBlockAbbrevs() {
  919. using namespace llvm;
  920. // Abbreviation for DECL_PARM_VAR.
  921. BitCodeAbbrev *Abv = new BitCodeAbbrev();
  922. Abv->Add(BitCodeAbbrevOp(pch::DECL_PARM_VAR));
  923. // Decl
  924. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
  925. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
  926. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
  927. Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?)
  928. Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs
  929. Abv->Add(BitCodeAbbrevOp(0)); // isImplicit
  930. Abv->Add(BitCodeAbbrevOp(0)); // isUsed
  931. Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier
  932. Abv->Add(BitCodeAbbrevOp(0)); // PCH level
  933. // NamedDecl
  934. Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
  935. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
  936. // ValueDecl
  937. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
  938. // DeclaratorDecl
  939. Abv->Add(BitCodeAbbrevOp(pch::PREDEF_TYPE_NULL_ID)); // InfoType
  940. // VarDecl
  941. Abv->Add(BitCodeAbbrevOp(0)); // StorageClass
  942. Abv->Add(BitCodeAbbrevOp(0)); // StorageClassAsWritten
  943. Abv->Add(BitCodeAbbrevOp(0)); // isThreadSpecified
  944. Abv->Add(BitCodeAbbrevOp(0)); // hasCXXDirectInitializer
  945. Abv->Add(BitCodeAbbrevOp(0)); // isExceptionVariable
  946. Abv->Add(BitCodeAbbrevOp(0)); // isNRVOVariable
  947. Abv->Add(BitCodeAbbrevOp(0)); // PrevDecl
  948. Abv->Add(BitCodeAbbrevOp(0)); // HasInit
  949. Abv->Add(BitCodeAbbrevOp(0)); // HasMemberSpecializationInfo
  950. // ParmVarDecl
  951. Abv->Add(BitCodeAbbrevOp(0)); // ObjCDeclQualifier
  952. Abv->Add(BitCodeAbbrevOp(0)); // HasInheritedDefaultArg
  953. Abv->Add(BitCodeAbbrevOp(0)); // HasUninstantiatedDefaultArg
  954. ParmVarDeclAbbrev = Stream.EmitAbbrev(Abv);
  955. Abv = new BitCodeAbbrev();
  956. Abv->Add(BitCodeAbbrevOp(pch::DECL_CONTEXT_LEXICAL));
  957. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
  958. DeclContextLexicalAbbrev = Stream.EmitAbbrev(Abv);
  959. }
  960. /// isRequiredDecl - Check if this is a "required" Decl, which must be seen by
  961. /// consumers of the AST.
  962. ///
  963. /// Such decls will always be deserialized from the PCH file, so we would like
  964. /// this to be as restrictive as possible. Currently the predicate is driven by
  965. /// code generation requirements, if other clients have a different notion of
  966. /// what is "required" then we may have to consider an alternate scheme where
  967. /// clients can iterate over the top-level decls and get information on them,
  968. /// without necessary deserializing them. We could explicitly require such
  969. /// clients to use a separate API call to "realize" the decl. This should be
  970. /// relatively painless since they would presumably only do it for top-level
  971. /// decls.
  972. static bool isRequiredDecl(const Decl *D, ASTContext &Context) {
  973. // File scoped assembly or obj-c implementation must be seen.
  974. if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplementationDecl>(D))
  975. return true;
  976. return Context.DeclMustBeEmitted(D);
  977. }
  978. void PCHWriter::WriteDecl(ASTContext &Context, Decl *D) {
  979. RecordData Record;
  980. PCHDeclWriter W(*this, Context, Record);
  981. // If this declaration is also a DeclContext, write blocks for the
  982. // declarations that lexically stored inside its context and those
  983. // declarations that are visible from its context. These blocks
  984. // are written before the declaration itself so that we can put
  985. // their offsets into the record for the declaration.
  986. uint64_t LexicalOffset = 0;
  987. uint64_t VisibleOffset = 0;
  988. DeclContext *DC = dyn_cast<DeclContext>(D);
  989. if (DC) {
  990. LexicalOffset = WriteDeclContextLexicalBlock(Context, DC);
  991. VisibleOffset = WriteDeclContextVisibleBlock(Context, DC);
  992. }
  993. // Determine the ID for this declaration
  994. pch::DeclID &ID = DeclIDs[D];
  995. if (ID == 0)
  996. ID = NextDeclID++;
  997. unsigned Index = ID - FirstDeclID;
  998. // Record the offset for this declaration
  999. if (DeclOffsets.size() == Index)
  1000. DeclOffsets.push_back(Stream.GetCurrentBitNo());
  1001. else if (DeclOffsets.size() < Index) {
  1002. DeclOffsets.resize(Index+1);
  1003. DeclOffsets[Index] = Stream.GetCurrentBitNo();
  1004. }
  1005. // Build and emit a record for this declaration
  1006. Record.clear();
  1007. W.Code = (pch::DeclCode)0;
  1008. W.AbbrevToUse = 0;
  1009. W.Visit(D);
  1010. if (DC) W.VisitDeclContext(DC, LexicalOffset, VisibleOffset);
  1011. if (!W.Code)
  1012. llvm::report_fatal_error(llvm::StringRef("unexpected declaration kind '") +
  1013. D->getDeclKindName() + "'");
  1014. Stream.EmitRecord(W.Code, Record, W.AbbrevToUse);
  1015. // If the declaration had any attributes, write them now.
  1016. if (D->hasAttrs())
  1017. WriteAttributeRecord(D->getAttrs());
  1018. // Flush any expressions that were written as part of this declaration.
  1019. FlushStmts();
  1020. // Note "external" declarations so that we can add them to a record in the
  1021. // PCH file later.
  1022. //
  1023. // FIXME: This should be renamed, the predicate is much more complicated.
  1024. if (isRequiredDecl(D, Context))
  1025. ExternalDefinitions.push_back(Index + 1);
  1026. }