clang API Documentation

ASTWriterDecl.cpp
Go to the documentation of this file.
00001 //===--- ASTWriterDecl.cpp - Declaration Serialization --------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 //  This file implements serialization for Declarations.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "clang/Serialization/ASTWriter.h"
00015 #include "clang/Serialization/ASTReader.h"
00016 #include "ASTCommon.h"
00017 #include "clang/AST/DeclVisitor.h"
00018 #include "clang/AST/DeclCXX.h"
00019 #include "clang/AST/DeclTemplate.h"
00020 #include "clang/AST/Expr.h"
00021 #include "clang/AST/DeclContextInternals.h"
00022 #include "clang/Basic/SourceManager.h"
00023 #include "llvm/ADT/Twine.h"
00024 #include "llvm/Bitcode/BitstreamWriter.h"
00025 #include "llvm/Support/ErrorHandling.h"
00026 using namespace clang;
00027 using namespace serialization;
00028 
00029 //===----------------------------------------------------------------------===//
00030 // Declaration serialization
00031 //===----------------------------------------------------------------------===//
00032 
00033 namespace clang {
00034   class ASTDeclWriter : public DeclVisitor<ASTDeclWriter, void> {
00035 
00036     ASTWriter &Writer;
00037     ASTContext &Context;
00038     typedef ASTWriter::RecordData RecordData;
00039     RecordData &Record;
00040 
00041   public:
00042     serialization::DeclCode Code;
00043     unsigned AbbrevToUse;
00044 
00045     ASTDeclWriter(ASTWriter &Writer, ASTContext &Context, RecordData &Record)
00046       : Writer(Writer), Context(Context), Record(Record) {
00047     }
00048 
00049     void Visit(Decl *D);
00050 
00051     void VisitDecl(Decl *D);
00052     void VisitTranslationUnitDecl(TranslationUnitDecl *D);
00053     void VisitNamedDecl(NamedDecl *D);
00054     void VisitLabelDecl(LabelDecl *LD);
00055     void VisitNamespaceDecl(NamespaceDecl *D);
00056     void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
00057     void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
00058     void VisitTypeDecl(TypeDecl *D);
00059     void VisitTypedefNameDecl(TypedefNameDecl *D);
00060     void VisitTypedefDecl(TypedefDecl *D);
00061     void VisitTypeAliasDecl(TypeAliasDecl *D);
00062     void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
00063     void VisitTagDecl(TagDecl *D);
00064     void VisitEnumDecl(EnumDecl *D);
00065     void VisitRecordDecl(RecordDecl *D);
00066     void VisitCXXRecordDecl(CXXRecordDecl *D);
00067     void VisitClassTemplateSpecializationDecl(
00068                                             ClassTemplateSpecializationDecl *D);
00069     void VisitClassTemplatePartialSpecializationDecl(
00070                                      ClassTemplatePartialSpecializationDecl *D);
00071     void VisitClassScopeFunctionSpecializationDecl(
00072                                        ClassScopeFunctionSpecializationDecl *D);
00073     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
00074     void VisitValueDecl(ValueDecl *D);
00075     void VisitEnumConstantDecl(EnumConstantDecl *D);
00076     void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
00077     void VisitDeclaratorDecl(DeclaratorDecl *D);
00078     void VisitFunctionDecl(FunctionDecl *D);
00079     void VisitCXXMethodDecl(CXXMethodDecl *D);
00080     void VisitCXXConstructorDecl(CXXConstructorDecl *D);
00081     void VisitCXXDestructorDecl(CXXDestructorDecl *D);
00082     void VisitCXXConversionDecl(CXXConversionDecl *D);
00083     void VisitFieldDecl(FieldDecl *D);
00084     void VisitIndirectFieldDecl(IndirectFieldDecl *D);
00085     void VisitVarDecl(VarDecl *D);
00086     void VisitImplicitParamDecl(ImplicitParamDecl *D);
00087     void VisitParmVarDecl(ParmVarDecl *D);
00088     void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
00089     void VisitTemplateDecl(TemplateDecl *D);
00090     void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
00091     void VisitClassTemplateDecl(ClassTemplateDecl *D);
00092     void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
00093     void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
00094     void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
00095     void VisitUsingDecl(UsingDecl *D);
00096     void VisitUsingShadowDecl(UsingShadowDecl *D);
00097     void VisitLinkageSpecDecl(LinkageSpecDecl *D);
00098     void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
00099     void VisitImportDecl(ImportDecl *D);
00100     void VisitAccessSpecDecl(AccessSpecDecl *D);
00101     void VisitFriendDecl(FriendDecl *D);
00102     void VisitFriendTemplateDecl(FriendTemplateDecl *D);
00103     void VisitStaticAssertDecl(StaticAssertDecl *D);
00104     void VisitBlockDecl(BlockDecl *D);
00105 
00106     void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
00107                           uint64_t VisibleOffset);
00108     template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
00109 
00110 
00111     // FIXME: Put in the same order is DeclNodes.td?
00112     void VisitObjCMethodDecl(ObjCMethodDecl *D);
00113     void VisitObjCContainerDecl(ObjCContainerDecl *D);
00114     void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
00115     void VisitObjCIvarDecl(ObjCIvarDecl *D);
00116     void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
00117     void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
00118     void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
00119     void VisitObjCImplDecl(ObjCImplDecl *D);
00120     void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
00121     void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
00122     void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
00123     void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
00124     void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
00125   };
00126 }
00127 
00128 void ASTDeclWriter::Visit(Decl *D) {
00129   DeclVisitor<ASTDeclWriter>::Visit(D);
00130 
00131   // Source locations require array (variable-length) abbreviations.  The
00132   // abbreviation infrastructure requires that arrays are encoded last, so
00133   // we handle it here in the case of those classes derived from DeclaratorDecl
00134   if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)){
00135     Writer.AddTypeSourceInfo(DD->getTypeSourceInfo(), Record);
00136   }
00137 
00138   // Handle FunctionDecl's body here and write it after all other Stmts/Exprs
00139   // have been written. We want it last because we will not read it back when
00140   // retrieving it from the AST, we'll just lazily set the offset. 
00141   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
00142     Record.push_back(FD->doesThisDeclarationHaveABody());
00143     if (FD->doesThisDeclarationHaveABody())
00144       Writer.AddStmt(FD->getBody());
00145   }
00146 }
00147 
00148 void ASTDeclWriter::VisitDecl(Decl *D) {
00149   Writer.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()), Record);
00150   Writer.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()), Record);
00151   Record.push_back(D->isInvalidDecl());
00152   Record.push_back(D->hasAttrs());
00153   if (D->hasAttrs())
00154     Writer.WriteAttributes(D->getAttrs(), Record);
00155   Record.push_back(D->isImplicit());
00156   Record.push_back(D->isUsed(false));
00157   Record.push_back(D->isReferenced());
00158   Record.push_back(D->isTopLevelDeclInObjCContainer());
00159   Record.push_back(D->getAccess());
00160   Record.push_back(D->isModulePrivate());
00161   Record.push_back(Writer.inferSubmoduleIDFromLocation(D->getLocation()));
00162 }
00163 
00164 void ASTDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
00165   llvm_unreachable("Translation units aren't directly serialized");
00166 }
00167 
00168 void ASTDeclWriter::VisitNamedDecl(NamedDecl *D) {
00169   VisitDecl(D);
00170   Writer.AddDeclarationName(D->getDeclName(), Record);
00171 }
00172 
00173 void ASTDeclWriter::VisitTypeDecl(TypeDecl *D) {
00174   VisitNamedDecl(D);
00175   Writer.AddSourceLocation(D->getLocStart(), Record);
00176   Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
00177 }
00178 
00179 void ASTDeclWriter::VisitTypedefNameDecl(TypedefNameDecl *D) {
00180   VisitRedeclarable(D);
00181   VisitTypeDecl(D);
00182   Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record);  
00183 }
00184 
00185 void ASTDeclWriter::VisitTypedefDecl(TypedefDecl *D) {
00186   VisitTypedefNameDecl(D);
00187   if (!D->hasAttrs() &&
00188       !D->isImplicit() &&
00189       !D->isUsed(false) &&
00190       D->getFirstDeclaration() == D->getMostRecentDecl() &&
00191       !D->isInvalidDecl() &&
00192       !D->isReferenced() &&
00193       !D->isTopLevelDeclInObjCContainer() &&
00194       D->getAccess() == AS_none &&
00195       !D->isModulePrivate() &&
00196       D->getDeclName().getNameKind() == DeclarationName::Identifier)
00197     AbbrevToUse = Writer.getDeclTypedefAbbrev();
00198 
00199   Code = serialization::DECL_TYPEDEF;
00200 }
00201 
00202 void ASTDeclWriter::VisitTypeAliasDecl(TypeAliasDecl *D) {
00203   VisitTypedefNameDecl(D);
00204   Code = serialization::DECL_TYPEALIAS;
00205 }
00206 
00207 void ASTDeclWriter::VisitTagDecl(TagDecl *D) {
00208   VisitRedeclarable(D);
00209   VisitTypeDecl(D);
00210   Record.push_back(D->getIdentifierNamespace());
00211   Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding
00212   Record.push_back(D->isCompleteDefinition());
00213   Record.push_back(D->isEmbeddedInDeclarator());
00214   Record.push_back(D->isFreeStanding());
00215   Writer.AddSourceLocation(D->getRBraceLoc(), Record);
00216   Record.push_back(D->hasExtInfo());
00217   if (D->hasExtInfo())
00218     Writer.AddQualifierInfo(*D->getExtInfo(), Record);
00219   else
00220     Writer.AddDeclRef(D->getTypedefNameForAnonDecl(), Record);
00221 }
00222 
00223 void ASTDeclWriter::VisitEnumDecl(EnumDecl *D) {
00224   VisitTagDecl(D);
00225   Writer.AddTypeSourceInfo(D->getIntegerTypeSourceInfo(), Record);
00226   if (!D->getIntegerTypeSourceInfo())
00227     Writer.AddTypeRef(D->getIntegerType(), Record);
00228   Writer.AddTypeRef(D->getPromotionType(), Record);
00229   Record.push_back(D->getNumPositiveBits());
00230   Record.push_back(D->getNumNegativeBits());
00231   Record.push_back(D->isScoped());
00232   Record.push_back(D->isScopedUsingClassTag());
00233   Record.push_back(D->isFixed());
00234   if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) {
00235     Writer.AddDeclRef(MemberInfo->getInstantiatedFrom(), Record);
00236     Record.push_back(MemberInfo->getTemplateSpecializationKind());
00237     Writer.AddSourceLocation(MemberInfo->getPointOfInstantiation(), Record);
00238   } else {
00239     Writer.AddDeclRef(0, Record);
00240   }
00241 
00242   if (!D->hasAttrs() &&
00243       !D->isImplicit() &&
00244       !D->isUsed(false) &&
00245       !D->hasExtInfo() &&
00246       D->getFirstDeclaration() == D->getMostRecentDecl() &&
00247       !D->isInvalidDecl() &&
00248       !D->isReferenced() &&
00249       !D->isTopLevelDeclInObjCContainer() &&
00250       D->getAccess() == AS_none &&
00251       !D->isModulePrivate() &&
00252       !CXXRecordDecl::classofKind(D->getKind()) &&
00253       !D->getIntegerTypeSourceInfo() &&
00254       D->getDeclName().getNameKind() == DeclarationName::Identifier)
00255     AbbrevToUse = Writer.getDeclEnumAbbrev();
00256 
00257   Code = serialization::DECL_ENUM;
00258 }
00259 
00260 void ASTDeclWriter::VisitRecordDecl(RecordDecl *D) {
00261   VisitTagDecl(D);
00262   Record.push_back(D->hasFlexibleArrayMember());
00263   Record.push_back(D->isAnonymousStructOrUnion());
00264   Record.push_back(D->hasObjectMember());
00265 
00266   if (!D->hasAttrs() &&
00267       !D->isImplicit() &&
00268       !D->isUsed(false) &&
00269       !D->hasExtInfo() &&
00270       D->getFirstDeclaration() == D->getMostRecentDecl() &&
00271       !D->isInvalidDecl() &&
00272       !D->isReferenced() &&
00273       !D->isTopLevelDeclInObjCContainer() &&
00274       D->getAccess() == AS_none &&
00275       !D->isModulePrivate() &&
00276       !CXXRecordDecl::classofKind(D->getKind()) &&
00277       D->getDeclName().getNameKind() == DeclarationName::Identifier)
00278     AbbrevToUse = Writer.getDeclRecordAbbrev();
00279 
00280   Code = serialization::DECL_RECORD;
00281 }
00282 
00283 void ASTDeclWriter::VisitValueDecl(ValueDecl *D) {
00284   VisitNamedDecl(D);
00285   Writer.AddTypeRef(D->getType(), Record);
00286 }
00287 
00288 void ASTDeclWriter::VisitEnumConstantDecl(EnumConstantDecl *D) {
00289   VisitValueDecl(D);
00290   Record.push_back(D->getInitExpr()? 1 : 0);
00291   if (D->getInitExpr())
00292     Writer.AddStmt(D->getInitExpr());
00293   Writer.AddAPSInt(D->getInitVal(), Record);
00294 
00295   Code = serialization::DECL_ENUM_CONSTANT;
00296 }
00297 
00298 void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
00299   VisitValueDecl(D);
00300   Writer.AddSourceLocation(D->getInnerLocStart(), Record);
00301   Record.push_back(D->hasExtInfo());
00302   if (D->hasExtInfo())
00303     Writer.AddQualifierInfo(*D->getExtInfo(), Record);
00304 }
00305 
00306 void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
00307   VisitRedeclarable(D);
00308   VisitDeclaratorDecl(D);
00309 
00310   Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record);
00311   Record.push_back(D->getIdentifierNamespace());
00312   
00313   // FunctionDecl's body is handled last at ASTWriterDecl::Visit,
00314   // after everything else is written.
00315   
00316   Record.push_back(D->getStorageClass()); // FIXME: stable encoding
00317   Record.push_back(D->getStorageClassAsWritten());
00318   Record.push_back(D->IsInline);
00319   Record.push_back(D->isInlineSpecified());
00320   Record.push_back(D->isVirtualAsWritten());
00321   Record.push_back(D->isPure());
00322   Record.push_back(D->hasInheritedPrototype());
00323   Record.push_back(D->hasWrittenPrototype());
00324   Record.push_back(D->isDeletedAsWritten());
00325   Record.push_back(D->isTrivial());
00326   Record.push_back(D->isDefaulted());
00327   Record.push_back(D->isExplicitlyDefaulted());
00328   Record.push_back(D->hasImplicitReturnZero());
00329   Record.push_back(D->isConstexpr());
00330   Writer.AddSourceLocation(D->getLocEnd(), Record);
00331 
00332   Record.push_back(D->getTemplatedKind());
00333   switch (D->getTemplatedKind()) {
00334   case FunctionDecl::TK_NonTemplate:
00335     break;
00336   case FunctionDecl::TK_FunctionTemplate:
00337     Writer.AddDeclRef(D->getDescribedFunctionTemplate(), Record);
00338     break;
00339   case FunctionDecl::TK_MemberSpecialization: {
00340     MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo();
00341     Writer.AddDeclRef(MemberInfo->getInstantiatedFrom(), Record);
00342     Record.push_back(MemberInfo->getTemplateSpecializationKind());
00343     Writer.AddSourceLocation(MemberInfo->getPointOfInstantiation(), Record);
00344     break;
00345   }
00346   case FunctionDecl::TK_FunctionTemplateSpecialization: {
00347     FunctionTemplateSpecializationInfo *
00348       FTSInfo = D->getTemplateSpecializationInfo();
00349     Writer.AddDeclRef(FTSInfo->getTemplate(), Record);
00350     Record.push_back(FTSInfo->getTemplateSpecializationKind());
00351     
00352     // Template arguments.
00353     Writer.AddTemplateArgumentList(FTSInfo->TemplateArguments, Record);
00354     
00355     // Template args as written.
00356     Record.push_back(FTSInfo->TemplateArgumentsAsWritten != 0);
00357     if (FTSInfo->TemplateArgumentsAsWritten) {
00358       Record.push_back(FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs);
00359       for (int i=0, e = FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs;
00360              i!=e; ++i)
00361         Writer.AddTemplateArgumentLoc((*FTSInfo->TemplateArgumentsAsWritten)[i],
00362                                       Record);
00363       Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->LAngleLoc,
00364                                Record);
00365       Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->RAngleLoc,
00366                                Record);
00367     }
00368     
00369     Writer.AddSourceLocation(FTSInfo->getPointOfInstantiation(), Record);
00370 
00371     if (D->isCanonicalDecl()) {
00372       // Write the template that contains the specializations set. We will
00373       // add a FunctionTemplateSpecializationInfo to it when reading.
00374       Writer.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl(), Record);
00375     }
00376     break;
00377   }
00378   case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
00379     DependentFunctionTemplateSpecializationInfo *
00380       DFTSInfo = D->getDependentSpecializationInfo();
00381     
00382     // Templates.
00383     Record.push_back(DFTSInfo->getNumTemplates());
00384     for (int i=0, e = DFTSInfo->getNumTemplates(); i != e; ++i)
00385       Writer.AddDeclRef(DFTSInfo->getTemplate(i), Record);
00386     
00387     // Templates args.
00388     Record.push_back(DFTSInfo->getNumTemplateArgs());
00389     for (int i=0, e = DFTSInfo->getNumTemplateArgs(); i != e; ++i)
00390       Writer.AddTemplateArgumentLoc(DFTSInfo->getTemplateArg(i), Record);
00391     Writer.AddSourceLocation(DFTSInfo->getLAngleLoc(), Record);
00392     Writer.AddSourceLocation(DFTSInfo->getRAngleLoc(), Record);
00393     break;
00394   }
00395   }
00396 
00397   Record.push_back(D->param_size());
00398   for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
00399        P != PEnd; ++P)
00400     Writer.AddDeclRef(*P, Record);
00401   Code = serialization::DECL_FUNCTION;
00402 }
00403 
00404 void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
00405   VisitNamedDecl(D);
00406   // FIXME: convert to LazyStmtPtr?
00407   // Unlike C/C++, method bodies will never be in header files.
00408   bool HasBodyStuff = D->getBody() != 0     ||
00409                       D->getSelfDecl() != 0 || D->getCmdDecl() != 0;
00410   Record.push_back(HasBodyStuff);
00411   if (HasBodyStuff) {
00412     Writer.AddStmt(D->getBody());
00413     Writer.AddDeclRef(D->getSelfDecl(), Record);
00414     Writer.AddDeclRef(D->getCmdDecl(), Record);
00415   }
00416   Record.push_back(D->isInstanceMethod());
00417   Record.push_back(D->isVariadic());
00418   Record.push_back(D->isSynthesized());
00419   Record.push_back(D->isDefined());
00420   Record.push_back(D->IsOverriding);
00421 
00422   Record.push_back(D->IsRedeclaration);
00423   Record.push_back(D->HasRedeclaration);
00424   if (D->HasRedeclaration) {
00425     assert(Context.getObjCMethodRedeclaration(D));
00426     Writer.AddDeclRef(Context.getObjCMethodRedeclaration(D), Record);
00427   }
00428 
00429   // FIXME: stable encoding for @required/@optional
00430   Record.push_back(D->getImplementationControl());
00431   // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway
00432   Record.push_back(D->getObjCDeclQualifier());
00433   Record.push_back(D->hasRelatedResultType());
00434   Writer.AddTypeRef(D->getResultType(), Record);
00435   Writer.AddTypeSourceInfo(D->getResultTypeSourceInfo(), Record);
00436   Writer.AddSourceLocation(D->getLocEnd(), Record);
00437   Record.push_back(D->param_size());
00438   for (ObjCMethodDecl::param_iterator P = D->param_begin(),
00439                                    PEnd = D->param_end(); P != PEnd; ++P)
00440     Writer.AddDeclRef(*P, Record);
00441 
00442   Record.push_back(D->SelLocsKind);
00443   unsigned NumStoredSelLocs = D->getNumStoredSelLocs();
00444   SourceLocation *SelLocs = D->getStoredSelLocs();
00445   Record.push_back(NumStoredSelLocs);
00446   for (unsigned i = 0; i != NumStoredSelLocs; ++i)
00447     Writer.AddSourceLocation(SelLocs[i], Record);
00448 
00449   Code = serialization::DECL_OBJC_METHOD;
00450 }
00451 
00452 void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
00453   VisitNamedDecl(D);
00454   Writer.AddSourceLocation(D->getAtStartLoc(), Record);
00455   Writer.AddSourceRange(D->getAtEndRange(), Record);
00456   // Abstract class (no need to define a stable serialization::DECL code).
00457 }
00458 
00459 void ASTDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
00460   VisitRedeclarable(D);
00461   VisitObjCContainerDecl(D);
00462   Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
00463 
00464   Record.push_back(D->isThisDeclarationADefinition());
00465   if (D->isThisDeclarationADefinition()) {
00466     // Write the DefinitionData
00467     ObjCInterfaceDecl::DefinitionData &Data = D->data();
00468     
00469     Writer.AddDeclRef(D->getSuperClass(), Record);
00470     Writer.AddSourceLocation(D->getSuperClassLoc(), Record);
00471     Writer.AddSourceLocation(D->getEndOfDefinitionLoc(), Record);
00472 
00473     // Write out the protocols that are directly referenced by the @interface.
00474     Record.push_back(Data.ReferencedProtocols.size());
00475     for (ObjCInterfaceDecl::protocol_iterator P = D->protocol_begin(),
00476                                            PEnd = D->protocol_end();
00477          P != PEnd; ++P)
00478       Writer.AddDeclRef(*P, Record);
00479     for (ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(),
00480          PLEnd = D->protocol_loc_end();
00481          PL != PLEnd; ++PL)
00482       Writer.AddSourceLocation(*PL, Record);
00483     
00484     // Write out the protocols that are transitively referenced.
00485     Record.push_back(Data.AllReferencedProtocols.size());
00486     for (ObjCList<ObjCProtocolDecl>::iterator
00487               P = Data.AllReferencedProtocols.begin(),
00488            PEnd = Data.AllReferencedProtocols.end();
00489          P != PEnd; ++P)
00490       Writer.AddDeclRef(*P, Record);
00491     
00492     if (ObjCCategoryDecl *Cat = D->getCategoryList()) {
00493       // Ensure that we write out the set of categories for this class.
00494       Writer.ObjCClassesWithCategories.insert(D);
00495       
00496       // Make sure that the categories get serialized.
00497       for (; Cat; Cat = Cat->getNextClassCategory())
00498         (void)Writer.GetDeclRef(Cat);
00499     }
00500   }  
00501   
00502   Code = serialization::DECL_OBJC_INTERFACE;
00503 }
00504 
00505 void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
00506   VisitFieldDecl(D);
00507   // FIXME: stable encoding for @public/@private/@protected/@package
00508   Record.push_back(D->getAccessControl());
00509   Record.push_back(D->getSynthesize());
00510 
00511   if (!D->hasAttrs() &&
00512       !D->isImplicit() &&
00513       !D->isUsed(false) &&
00514       !D->isInvalidDecl() &&
00515       !D->isReferenced() &&
00516       !D->isModulePrivate() &&
00517       !D->getBitWidth() &&
00518       !D->hasExtInfo() &&
00519       D->getDeclName())
00520     AbbrevToUse = Writer.getDeclObjCIvarAbbrev();
00521 
00522   Code = serialization::DECL_OBJC_IVAR;
00523 }
00524 
00525 void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
00526   VisitRedeclarable(D);
00527   VisitObjCContainerDecl(D);
00528   
00529   Record.push_back(D->isThisDeclarationADefinition());
00530   if (D->isThisDeclarationADefinition()) {
00531     Record.push_back(D->protocol_size());
00532     for (ObjCProtocolDecl::protocol_iterator
00533          I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I)
00534       Writer.AddDeclRef(*I, Record);
00535     for (ObjCProtocolDecl::protocol_loc_iterator PL = D->protocol_loc_begin(),
00536            PLEnd = D->protocol_loc_end();
00537          PL != PLEnd; ++PL)
00538       Writer.AddSourceLocation(*PL, Record);
00539   }
00540   
00541   Code = serialization::DECL_OBJC_PROTOCOL;
00542 }
00543 
00544 void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
00545   VisitFieldDecl(D);
00546   Code = serialization::DECL_OBJC_AT_DEFS_FIELD;
00547 }
00548 
00549 void ASTDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
00550   VisitObjCContainerDecl(D);
00551   Writer.AddSourceLocation(D->getCategoryNameLoc(), Record);
00552   Writer.AddSourceLocation(D->getIvarLBraceLoc(), Record);
00553   Writer.AddSourceLocation(D->getIvarRBraceLoc(), Record);
00554   Writer.AddDeclRef(D->getClassInterface(), Record);
00555   Record.push_back(D->protocol_size());
00556   for (ObjCCategoryDecl::protocol_iterator
00557        I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I)
00558     Writer.AddDeclRef(*I, Record);
00559   for (ObjCCategoryDecl::protocol_loc_iterator 
00560          PL = D->protocol_loc_begin(), PLEnd = D->protocol_loc_end();
00561        PL != PLEnd; ++PL)
00562     Writer.AddSourceLocation(*PL, Record);
00563   Record.push_back(D->hasSynthBitfield());
00564   Code = serialization::DECL_OBJC_CATEGORY;
00565 }
00566 
00567 void ASTDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
00568   VisitNamedDecl(D);
00569   Writer.AddDeclRef(D->getClassInterface(), Record);
00570   Code = serialization::DECL_OBJC_COMPATIBLE_ALIAS;
00571 }
00572 
00573 void ASTDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
00574   VisitNamedDecl(D);
00575   Writer.AddSourceLocation(D->getAtLoc(), Record);
00576   Writer.AddSourceLocation(D->getLParenLoc(), Record);
00577   Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record);
00578   // FIXME: stable encoding
00579   Record.push_back((unsigned)D->getPropertyAttributes());
00580   Record.push_back((unsigned)D->getPropertyAttributesAsWritten());
00581   // FIXME: stable encoding
00582   Record.push_back((unsigned)D->getPropertyImplementation());
00583   Writer.AddDeclarationName(D->getGetterName(), Record);
00584   Writer.AddDeclarationName(D->getSetterName(), Record);
00585   Writer.AddDeclRef(D->getGetterMethodDecl(), Record);
00586   Writer.AddDeclRef(D->getSetterMethodDecl(), Record);
00587   Writer.AddDeclRef(D->getPropertyIvarDecl(), Record);
00588   Code = serialization::DECL_OBJC_PROPERTY;
00589 }
00590 
00591 void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) {
00592   VisitObjCContainerDecl(D);
00593   Writer.AddDeclRef(D->getClassInterface(), Record);
00594   // Abstract class (no need to define a stable serialization::DECL code).
00595 }
00596 
00597 void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
00598   VisitObjCImplDecl(D);
00599   Writer.AddIdentifierRef(D->getIdentifier(), Record);
00600   Writer.AddSourceLocation(D->getCategoryNameLoc(), Record);
00601   Code = serialization::DECL_OBJC_CATEGORY_IMPL;
00602 }
00603 
00604 void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
00605   VisitObjCImplDecl(D);
00606   Writer.AddDeclRef(D->getSuperClass(), Record);
00607   Writer.AddSourceLocation(D->getIvarLBraceLoc(), Record);
00608   Writer.AddSourceLocation(D->getIvarRBraceLoc(), Record);
00609   Writer.AddCXXCtorInitializers(D->IvarInitializers, D->NumIvarInitializers,
00610                                 Record);
00611   Record.push_back(D->hasSynthBitfield());
00612   Code = serialization::DECL_OBJC_IMPLEMENTATION;
00613 }
00614 
00615 void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
00616   VisitDecl(D);
00617   Writer.AddSourceLocation(D->getLocStart(), Record);
00618   Writer.AddDeclRef(D->getPropertyDecl(), Record);
00619   Writer.AddDeclRef(D->getPropertyIvarDecl(), Record);
00620   Writer.AddSourceLocation(D->getPropertyIvarDeclLoc(), Record);
00621   Writer.AddStmt(D->getGetterCXXConstructor());
00622   Writer.AddStmt(D->getSetterCXXAssignment());
00623   Code = serialization::DECL_OBJC_PROPERTY_IMPL;
00624 }
00625 
00626 void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {
00627   VisitDeclaratorDecl(D);
00628   Record.push_back(D->isMutable());
00629   Record.push_back(D->getBitWidth()? 1 : D->hasInClassInitializer() ? 2 : 0);
00630   if (D->getBitWidth())
00631     Writer.AddStmt(D->getBitWidth());
00632   else if (D->hasInClassInitializer())
00633     Writer.AddStmt(D->getInClassInitializer());
00634   if (!D->getDeclName())
00635     Writer.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D), Record);
00636 
00637   if (!D->hasAttrs() &&
00638       !D->isImplicit() &&
00639       !D->isUsed(false) &&
00640       !D->isInvalidDecl() &&
00641       !D->isReferenced() &&
00642       !D->isTopLevelDeclInObjCContainer() &&
00643       !D->isModulePrivate() &&
00644       !D->getBitWidth() &&
00645       !D->hasInClassInitializer() &&
00646       !D->hasExtInfo() &&
00647       !ObjCIvarDecl::classofKind(D->getKind()) &&
00648       !ObjCAtDefsFieldDecl::classofKind(D->getKind()) &&
00649       D->getDeclName())
00650     AbbrevToUse = Writer.getDeclFieldAbbrev();
00651 
00652   Code = serialization::DECL_FIELD;
00653 }
00654 
00655 void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
00656   VisitValueDecl(D);
00657   Record.push_back(D->getChainingSize());
00658 
00659   for (IndirectFieldDecl::chain_iterator
00660        P = D->chain_begin(),
00661        PEnd = D->chain_end(); P != PEnd; ++P)
00662     Writer.AddDeclRef(*P, Record);
00663   Code = serialization::DECL_INDIRECTFIELD;
00664 }
00665 
00666 void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
00667   VisitRedeclarable(D);
00668   VisitDeclaratorDecl(D);
00669   Record.push_back(D->getStorageClass()); // FIXME: stable encoding
00670   Record.push_back(D->getStorageClassAsWritten());
00671   Record.push_back(D->isThreadSpecified());
00672   Record.push_back(D->getInitStyle());
00673   Record.push_back(D->isExceptionVariable());
00674   Record.push_back(D->isNRVOVariable());
00675   Record.push_back(D->isCXXForRangeDecl());
00676   Record.push_back(D->isARCPseudoStrong());
00677   if (D->getInit()) {
00678     Record.push_back(!D->isInitKnownICE() ? 1 : (D->isInitICE() ? 3 : 2));
00679     Writer.AddStmt(D->getInit());
00680   } else {
00681     Record.push_back(0);
00682   }
00683 
00684   MemberSpecializationInfo *SpecInfo
00685     = D->isStaticDataMember() ? D->getMemberSpecializationInfo() : 0;
00686   Record.push_back(SpecInfo != 0);
00687   if (SpecInfo) {
00688     Writer.AddDeclRef(SpecInfo->getInstantiatedFrom(), Record);
00689     Record.push_back(SpecInfo->getTemplateSpecializationKind());
00690     Writer.AddSourceLocation(SpecInfo->getPointOfInstantiation(), Record);
00691   }
00692 
00693   if (!D->hasAttrs() &&
00694       !D->isImplicit() &&
00695       !D->isUsed(false) &&
00696       !D->isInvalidDecl() &&
00697       !D->isReferenced() &&
00698       !D->isTopLevelDeclInObjCContainer() &&
00699       D->getAccess() == AS_none &&
00700       !D->isModulePrivate() &&
00701       D->getDeclName().getNameKind() == DeclarationName::Identifier &&
00702       !D->hasExtInfo() &&
00703       D->getFirstDeclaration() == D->getMostRecentDecl() &&
00704       D->getInitStyle() == VarDecl::CInit &&
00705       D->getInit() == 0 &&
00706       !isa<ParmVarDecl>(D) &&
00707       !SpecInfo)
00708     AbbrevToUse = Writer.getDeclVarAbbrev();
00709 
00710   Code = serialization::DECL_VAR;
00711 }
00712 
00713 void ASTDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
00714   VisitVarDecl(D);
00715   Code = serialization::DECL_IMPLICIT_PARAM;
00716 }
00717 
00718 void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
00719   VisitVarDecl(D);
00720   Record.push_back(D->isObjCMethodParameter());
00721   Record.push_back(D->getFunctionScopeDepth());
00722   Record.push_back(D->getFunctionScopeIndex());
00723   Record.push_back(D->getObjCDeclQualifier()); // FIXME: stable encoding
00724   Record.push_back(D->isKNRPromoted());
00725   Record.push_back(D->hasInheritedDefaultArg());
00726   Record.push_back(D->hasUninstantiatedDefaultArg());
00727   if (D->hasUninstantiatedDefaultArg())
00728     Writer.AddStmt(D->getUninstantiatedDefaultArg());
00729   Code = serialization::DECL_PARM_VAR;
00730 
00731   assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl
00732 
00733   // If the assumptions about the DECL_PARM_VAR abbrev are true, use it.  Here
00734   // we dynamically check for the properties that we optimize for, but don't
00735   // know are true of all PARM_VAR_DECLs.
00736   if (!D->hasAttrs() &&
00737       !D->hasExtInfo() &&
00738       !D->isImplicit() &&
00739       !D->isUsed(false) &&
00740       !D->isInvalidDecl() &&
00741       !D->isReferenced() &&
00742       D->getAccess() == AS_none &&
00743       !D->isModulePrivate() &&
00744       D->getStorageClass() == 0 &&
00745       D->getInitStyle() == VarDecl::CInit && // Can params have anything else?
00746       D->getFunctionScopeDepth() == 0 &&
00747       D->getObjCDeclQualifier() == 0 &&
00748       !D->isKNRPromoted() &&
00749       !D->hasInheritedDefaultArg() &&
00750       D->getInit() == 0 &&
00751       !D->hasUninstantiatedDefaultArg())  // No default expr.
00752     AbbrevToUse = Writer.getDeclParmVarAbbrev();
00753 
00754   // Check things we know are true of *every* PARM_VAR_DECL, which is more than
00755   // just us assuming it.
00756   assert(!D->isThreadSpecified() && "PARM_VAR_DECL can't be __thread");
00757   assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
00758   assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
00759   assert(D->getPreviousDecl() == 0 && "PARM_VAR_DECL can't be redecl");
00760   assert(!D->isStaticDataMember() &&
00761          "PARM_VAR_DECL can't be static data member");
00762 }
00763 
00764 void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
00765   VisitDecl(D);
00766   Writer.AddStmt(D->getAsmString());
00767   Writer.AddSourceLocation(D->getRParenLoc(), Record);
00768   Code = serialization::DECL_FILE_SCOPE_ASM;
00769 }
00770 
00771 void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) {
00772   VisitDecl(D);
00773   Writer.AddStmt(D->getBody());
00774   Writer.AddTypeSourceInfo(D->getSignatureAsWritten(), Record);
00775   Record.push_back(D->param_size());
00776   for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
00777        P != PEnd; ++P)
00778     Writer.AddDeclRef(*P, Record);
00779   Record.push_back(D->isVariadic());
00780   Record.push_back(D->blockMissingReturnType());
00781   Record.push_back(D->isConversionFromLambda());
00782   Record.push_back(D->capturesCXXThis());
00783   Record.push_back(D->getNumCaptures());
00784   for (BlockDecl::capture_iterator
00785          i = D->capture_begin(), e = D->capture_end(); i != e; ++i) {
00786     const BlockDecl::Capture &capture = *i;
00787     Writer.AddDeclRef(capture.getVariable(), Record);
00788 
00789     unsigned flags = 0;
00790     if (capture.isByRef()) flags |= 1;
00791     if (capture.isNested()) flags |= 2;
00792     if (capture.hasCopyExpr()) flags |= 4;
00793     Record.push_back(flags);
00794 
00795     if (capture.hasCopyExpr()) Writer.AddStmt(capture.getCopyExpr());
00796   }
00797 
00798   Code = serialization::DECL_BLOCK;
00799 }
00800 
00801 void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
00802   VisitDecl(D);
00803   Record.push_back(D->getLanguage());
00804   Writer.AddSourceLocation(D->getExternLoc(), Record);
00805   Writer.AddSourceLocation(D->getRBraceLoc(), Record);
00806   Code = serialization::DECL_LINKAGE_SPEC;
00807 }
00808 
00809 void ASTDeclWriter::VisitLabelDecl(LabelDecl *D) {
00810   VisitNamedDecl(D);
00811   Writer.AddSourceLocation(D->getLocStart(), Record);
00812   Code = serialization::DECL_LABEL;
00813 }
00814 
00815 
00816 void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) {
00817   VisitRedeclarable(D);
00818   VisitNamedDecl(D);
00819   Record.push_back(D->isInline());
00820   Writer.AddSourceLocation(D->getLocStart(), Record);
00821   Writer.AddSourceLocation(D->getRBraceLoc(), Record);
00822 
00823   if (D->isOriginalNamespace())
00824     Writer.AddDeclRef(D->getAnonymousNamespace(), Record);
00825   Code = serialization::DECL_NAMESPACE;
00826 
00827   if (Writer.hasChain() && !D->isOriginalNamespace() &&
00828       D->getOriginalNamespace()->isFromASTFile()) {
00829     NamespaceDecl *NS = D->getOriginalNamespace();
00830     Writer.AddUpdatedDeclContext(NS);
00831 
00832     // Make sure all visible decls are written. They will be recorded later.
00833     if (StoredDeclsMap *Map = NS->buildLookup()) {
00834       for (StoredDeclsMap::iterator D = Map->begin(), DEnd = Map->end();
00835            D != DEnd; ++D) {
00836         DeclContext::lookup_result Result = D->second.getLookupResult();
00837         while (Result.first != Result.second) {
00838           Writer.GetDeclRef(*Result.first);
00839           ++Result.first;
00840         }
00841       }
00842     }
00843   }
00844 
00845   if (Writer.hasChain() && D->isAnonymousNamespace() && 
00846       D == D->getMostRecentDecl()) {
00847     // This is a most recent reopening of the anonymous namespace. If its parent
00848     // is in a previous PCH (or is the TU), mark that parent for update, because
00849     // the original namespace always points to the latest re-opening of its
00850     // anonymous namespace.
00851     Decl *Parent = cast<Decl>(
00852         D->getParent()->getRedeclContext()->getPrimaryContext());
00853     if (Parent->isFromASTFile() || isa<TranslationUnitDecl>(Parent)) {
00854       ASTWriter::UpdateRecord &Record = Writer.DeclUpdates[Parent];
00855       Record.push_back(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE);
00856       Writer.AddDeclRef(D, Record);
00857     }
00858   }
00859 }
00860 
00861 void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
00862   VisitNamedDecl(D);
00863   Writer.AddSourceLocation(D->getNamespaceLoc(), Record);
00864   Writer.AddSourceLocation(D->getTargetNameLoc(), Record);
00865   Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
00866   Writer.AddDeclRef(D->getNamespace(), Record);
00867   Code = serialization::DECL_NAMESPACE_ALIAS;
00868 }
00869 
00870 void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) {
00871   VisitNamedDecl(D);
00872   Writer.AddSourceLocation(D->getUsingLocation(), Record);
00873   Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
00874   Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record);
00875   Writer.AddDeclRef(D->FirstUsingShadow.getPointer(), Record);
00876   Record.push_back(D->isTypeName());
00877   Writer.AddDeclRef(Context.getInstantiatedFromUsingDecl(D), Record);
00878   Code = serialization::DECL_USING;
00879 }
00880 
00881 void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {
00882   VisitNamedDecl(D);
00883   Writer.AddDeclRef(D->getTargetDecl(), Record);
00884   Writer.AddDeclRef(D->UsingOrNextShadow, Record);
00885   Writer.AddDeclRef(Context.getInstantiatedFromUsingShadowDecl(D), Record);
00886   Code = serialization::DECL_USING_SHADOW;
00887 }
00888 
00889 void ASTDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
00890   VisitNamedDecl(D);
00891   Writer.AddSourceLocation(D->getUsingLoc(), Record);
00892   Writer.AddSourceLocation(D->getNamespaceKeyLocation(), Record);
00893   Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
00894   Writer.AddDeclRef(D->getNominatedNamespace(), Record);
00895   Writer.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()), Record);
00896   Code = serialization::DECL_USING_DIRECTIVE;
00897 }
00898 
00899 void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
00900   VisitValueDecl(D);
00901   Writer.AddSourceLocation(D->getUsingLoc(), Record);
00902   Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
00903   Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record);
00904   Code = serialization::DECL_UNRESOLVED_USING_VALUE;
00905 }
00906 
00907 void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl(
00908                                                UnresolvedUsingTypenameDecl *D) {
00909   VisitTypeDecl(D);
00910   Writer.AddSourceLocation(D->getTypenameLoc(), Record);
00911   Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
00912   Code = serialization::DECL_UNRESOLVED_USING_TYPENAME;
00913 }
00914 
00915 void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
00916   VisitRecordDecl(D);
00917   Record.push_back(D->isThisDeclarationADefinition());
00918   if (D->isThisDeclarationADefinition())
00919     Writer.AddCXXDefinitionData(D, Record);
00920 
00921   enum {
00922     CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
00923   };
00924   if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) {
00925     Record.push_back(CXXRecTemplate);
00926     Writer.AddDeclRef(TemplD, Record);
00927   } else if (MemberSpecializationInfo *MSInfo
00928                = D->getMemberSpecializationInfo()) {
00929     Record.push_back(CXXRecMemberSpecialization);
00930     Writer.AddDeclRef(MSInfo->getInstantiatedFrom(), Record);
00931     Record.push_back(MSInfo->getTemplateSpecializationKind());
00932     Writer.AddSourceLocation(MSInfo->getPointOfInstantiation(), Record);
00933   } else {
00934     Record.push_back(CXXRecNotTemplate);
00935   }
00936 
00937   // Store the key function to avoid deserializing every method so we can
00938   // compute it.
00939   if (D->IsCompleteDefinition)
00940     Writer.AddDeclRef(Context.getKeyFunction(D), Record);
00941 
00942   Code = serialization::DECL_CXX_RECORD;
00943 }
00944 
00945 void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {
00946   VisitFunctionDecl(D);
00947   Record.push_back(D->size_overridden_methods());
00948   for (CXXMethodDecl::method_iterator
00949          I = D->begin_overridden_methods(), E = D->end_overridden_methods();
00950          I != E; ++I)
00951     Writer.AddDeclRef(*I, Record);
00952   Code = serialization::DECL_CXX_METHOD;
00953 }
00954 
00955 void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
00956   VisitCXXMethodDecl(D);
00957 
00958   Record.push_back(D->IsExplicitSpecified);
00959   Record.push_back(D->ImplicitlyDefined);
00960   Writer.AddCXXCtorInitializers(D->CtorInitializers, D->NumCtorInitializers,
00961                                 Record);
00962 
00963   Code = serialization::DECL_CXX_CONSTRUCTOR;
00964 }
00965 
00966 void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
00967   VisitCXXMethodDecl(D);
00968 
00969   Record.push_back(D->ImplicitlyDefined);
00970   Writer.AddDeclRef(D->OperatorDelete, Record);
00971 
00972   Code = serialization::DECL_CXX_DESTRUCTOR;
00973 }
00974 
00975 void ASTDeclWriter::VisitCXXConversionDecl(CXXConversionDecl *D) {
00976   VisitCXXMethodDecl(D);
00977   Record.push_back(D->IsExplicitSpecified);
00978   Code = serialization::DECL_CXX_CONVERSION;
00979 }
00980 
00981 void ASTDeclWriter::VisitImportDecl(ImportDecl *D) {
00982   VisitDecl(D);
00983   ArrayRef<SourceLocation> IdentifierLocs = D->getIdentifierLocs();
00984   Record.push_back(!IdentifierLocs.empty());
00985   if (IdentifierLocs.empty()) {
00986     Writer.AddSourceLocation(D->getLocEnd(), Record);
00987     Record.push_back(1);
00988   } else {
00989     for (unsigned I = 0, N = IdentifierLocs.size(); I != N; ++I)
00990       Writer.AddSourceLocation(IdentifierLocs[I], Record);
00991     Record.push_back(IdentifierLocs.size());
00992   }
00993   // Note: the number of source locations must always be the last element in
00994   // the record.
00995   Code = serialization::DECL_IMPORT;
00996 }
00997 
00998 void ASTDeclWriter::VisitAccessSpecDecl(AccessSpecDecl *D) {
00999   VisitDecl(D);
01000   Writer.AddSourceLocation(D->getColonLoc(), Record);
01001   Code = serialization::DECL_ACCESS_SPEC;
01002 }
01003 
01004 void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) {
01005   VisitDecl(D);
01006   Record.push_back(D->Friend.is<TypeSourceInfo*>());
01007   if (D->Friend.is<TypeSourceInfo*>())
01008     Writer.AddTypeSourceInfo(D->Friend.get<TypeSourceInfo*>(), Record);
01009   else
01010     Writer.AddDeclRef(D->Friend.get<NamedDecl*>(), Record);
01011   Writer.AddDeclRef(D->getNextFriend(), Record);
01012   Record.push_back(D->UnsupportedFriend);
01013   Writer.AddSourceLocation(D->FriendLoc, Record);
01014   Code = serialization::DECL_FRIEND;
01015 }
01016 
01017 void ASTDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
01018   VisitDecl(D);
01019   Record.push_back(D->getNumTemplateParameters());
01020   for (unsigned i = 0, e = D->getNumTemplateParameters(); i != e; ++i)
01021     Writer.AddTemplateParameterList(D->getTemplateParameterList(i), Record);
01022   Record.push_back(D->getFriendDecl() != 0);
01023   if (D->getFriendDecl())
01024     Writer.AddDeclRef(D->getFriendDecl(), Record);
01025   else
01026     Writer.AddTypeSourceInfo(D->getFriendType(), Record);
01027   Writer.AddSourceLocation(D->getFriendLoc(), Record);
01028   Code = serialization::DECL_FRIEND_TEMPLATE;
01029 }
01030 
01031 void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) {
01032   VisitNamedDecl(D);
01033 
01034   Writer.AddDeclRef(D->getTemplatedDecl(), Record);
01035   Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
01036 }
01037 
01038 void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
01039   VisitRedeclarable(D);
01040 
01041   // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that
01042   // getCommonPtr() can be used while this is still initializing.
01043   if (D->isFirstDeclaration()) {
01044     // This declaration owns the 'common' pointer, so serialize that data now.
01045     Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record);
01046     if (D->getInstantiatedFromMemberTemplate())
01047       Record.push_back(D->isMemberSpecialization());
01048   }
01049   
01050   VisitTemplateDecl(D);
01051   Record.push_back(D->getIdentifierNamespace());
01052 }
01053 
01054 void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
01055   VisitRedeclarableTemplateDecl(D);
01056 
01057   if (D->isFirstDeclaration()) {
01058     typedef llvm::FoldingSetVector<ClassTemplateSpecializationDecl> CTSDSetTy;
01059     CTSDSetTy &CTSDSet = D->getSpecializations();
01060     Record.push_back(CTSDSet.size());
01061     for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) {
01062       assert(I->isCanonicalDecl() && "Expected only canonical decls in set");
01063       Writer.AddDeclRef(&*I, Record);
01064     }
01065 
01066     typedef llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>
01067       CTPSDSetTy;
01068     CTPSDSetTy &CTPSDSet = D->getPartialSpecializations();
01069     Record.push_back(CTPSDSet.size());
01070     for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) {
01071       assert(I->isCanonicalDecl() && "Expected only canonical decls in set");
01072       Writer.AddDeclRef(&*I, Record); 
01073     }
01074 
01075     // InjectedClassNameType is computed, no need to write it.
01076   }
01077   Code = serialization::DECL_CLASS_TEMPLATE;
01078 }
01079 
01080 void ASTDeclWriter::VisitClassTemplateSpecializationDecl(
01081                                            ClassTemplateSpecializationDecl *D) {
01082   VisitCXXRecordDecl(D);
01083 
01084   llvm::PointerUnion<ClassTemplateDecl *,
01085                      ClassTemplatePartialSpecializationDecl *> InstFrom
01086     = D->getSpecializedTemplateOrPartial();
01087   if (Decl *InstFromD = InstFrom.dyn_cast<ClassTemplateDecl *>()) {
01088     Writer.AddDeclRef(InstFromD, Record);
01089   } else {
01090     Writer.AddDeclRef(InstFrom.get<ClassTemplatePartialSpecializationDecl *>(),
01091                       Record);
01092     Writer.AddTemplateArgumentList(&D->getTemplateInstantiationArgs(), Record);
01093   }
01094 
01095   // Explicit info.
01096   Writer.AddTypeSourceInfo(D->getTypeAsWritten(), Record);
01097   if (D->getTypeAsWritten()) {
01098     Writer.AddSourceLocation(D->getExternLoc(), Record);
01099     Writer.AddSourceLocation(D->getTemplateKeywordLoc(), Record);
01100   }
01101 
01102   Writer.AddTemplateArgumentList(&D->getTemplateArgs(), Record);
01103   Writer.AddSourceLocation(D->getPointOfInstantiation(), Record);
01104   Record.push_back(D->getSpecializationKind());
01105 
01106   if (D->isCanonicalDecl()) {
01107     // When reading, we'll add it to the folding set of the following template. 
01108     Writer.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl(), Record);
01109   }
01110 
01111   Code = serialization::DECL_CLASS_TEMPLATE_SPECIALIZATION;
01112 }
01113 
01114 void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl(
01115                                     ClassTemplatePartialSpecializationDecl *D) {
01116   VisitClassTemplateSpecializationDecl(D);
01117 
01118   Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
01119 
01120   Record.push_back(D->getNumTemplateArgsAsWritten());
01121   for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i)
01122     Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record);
01123 
01124   Record.push_back(D->getSequenceNumber());
01125 
01126   // These are read/set from/to the first declaration.
01127   if (D->getPreviousDecl() == 0) {
01128     Writer.AddDeclRef(D->getInstantiatedFromMember(), Record);
01129     Record.push_back(D->isMemberSpecialization());
01130   }
01131 
01132   Code = serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION;
01133 }
01134 
01135 void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl(
01136                                     ClassScopeFunctionSpecializationDecl *D) {
01137   VisitDecl(D);
01138   Writer.AddDeclRef(D->getSpecialization(), Record);
01139   Code = serialization::DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION;
01140 }
01141 
01142 
01143 void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
01144   VisitRedeclarableTemplateDecl(D);
01145 
01146   if (D->isFirstDeclaration()) {
01147     // This FunctionTemplateDecl owns the CommonPtr; write it.
01148 
01149     // Write the function specialization declarations.
01150     Record.push_back(D->getSpecializations().size());
01151     for (llvm::FoldingSetVector<FunctionTemplateSpecializationInfo>::iterator
01152            I = D->getSpecializations().begin(),
01153            E = D->getSpecializations().end()   ; I != E; ++I) {
01154       assert(I->Function->isCanonicalDecl() &&
01155              "Expected only canonical decls in set");
01156       Writer.AddDeclRef(I->Function, Record);
01157     }
01158   }
01159   Code = serialization::DECL_FUNCTION_TEMPLATE;
01160 }
01161 
01162 void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
01163   VisitTypeDecl(D);
01164 
01165   Record.push_back(D->wasDeclaredWithTypename());
01166   Record.push_back(D->defaultArgumentWasInherited());
01167   Writer.AddTypeSourceInfo(D->getDefaultArgumentInfo(), Record);
01168 
01169   Code = serialization::DECL_TEMPLATE_TYPE_PARM;
01170 }
01171 
01172 void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
01173   // For an expanded parameter pack, record the number of expansion types here
01174   // so that it's easier for 
01175   if (D->isExpandedParameterPack())
01176     Record.push_back(D->getNumExpansionTypes());
01177   
01178   VisitDeclaratorDecl(D);
01179   // TemplateParmPosition.
01180   Record.push_back(D->getDepth());
01181   Record.push_back(D->getPosition());
01182   
01183   if (D->isExpandedParameterPack()) {
01184     for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
01185       Writer.AddTypeRef(D->getExpansionType(I), Record);
01186       Writer.AddTypeSourceInfo(D->getExpansionTypeSourceInfo(I), Record);
01187     }
01188       
01189     Code = serialization::DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK;
01190   } else {
01191     // Rest of NonTypeTemplateParmDecl.
01192     Record.push_back(D->isParameterPack());
01193     Record.push_back(D->getDefaultArgument() != 0);
01194     if (D->getDefaultArgument()) {
01195       Writer.AddStmt(D->getDefaultArgument());
01196       Record.push_back(D->defaultArgumentWasInherited());
01197     }
01198     Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM;
01199   }
01200 }
01201 
01202 void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
01203   VisitTemplateDecl(D);
01204   // TemplateParmPosition.
01205   Record.push_back(D->getDepth());
01206   Record.push_back(D->getPosition());
01207   // Rest of TemplateTemplateParmDecl.
01208   Writer.AddTemplateArgumentLoc(D->getDefaultArgument(), Record);
01209   Record.push_back(D->defaultArgumentWasInherited());
01210   Record.push_back(D->isParameterPack());
01211   Code = serialization::DECL_TEMPLATE_TEMPLATE_PARM;
01212 }
01213 
01214 void ASTDeclWriter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
01215   VisitRedeclarableTemplateDecl(D);
01216   Code = serialization::DECL_TYPE_ALIAS_TEMPLATE;
01217 }
01218 
01219 void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) {
01220   VisitDecl(D);
01221   Writer.AddStmt(D->getAssertExpr());
01222   Writer.AddStmt(D->getMessage());
01223   Writer.AddSourceLocation(D->getRParenLoc(), Record);
01224   Code = serialization::DECL_STATIC_ASSERT;
01225 }
01226 
01227 /// \brief Emit the DeclContext part of a declaration context decl.
01228 ///
01229 /// \param LexicalOffset the offset at which the DECL_CONTEXT_LEXICAL
01230 /// block for this declaration context is stored. May be 0 to indicate
01231 /// that there are no declarations stored within this context.
01232 ///
01233 /// \param VisibleOffset the offset at which the DECL_CONTEXT_VISIBLE
01234 /// block for this declaration context is stored. May be 0 to indicate
01235 /// that there are no declarations visible from this context. Note
01236 /// that this value will not be emitted for non-primary declaration
01237 /// contexts.
01238 void ASTDeclWriter::VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
01239                                      uint64_t VisibleOffset) {
01240   Record.push_back(LexicalOffset);
01241   Record.push_back(VisibleOffset);
01242 }
01243 
01244 template <typename T>
01245 void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
01246   T *First = D->getFirstDeclaration();
01247   if (First->getMostRecentDecl() != First) {
01248     // There is more than one declaration of this entity, so we will need to 
01249     // write a redeclaration chain.
01250     Writer.AddDeclRef(First, Record);
01251     Writer.Redeclarations.insert(First);
01252 
01253     // Make sure that we serialize both the previous and the most-recent 
01254     // declarations, which (transitively) ensures that all declarations in the
01255     // chain get serialized.
01256     (void)Writer.GetDeclRef(D->getPreviousDecl());
01257     (void)Writer.GetDeclRef(First->getMostRecentDecl());
01258   } else {
01259     // We use the sentinel value 0 to indicate an only declaration.
01260     Record.push_back(0);
01261   }
01262   
01263 }
01264 
01265 //===----------------------------------------------------------------------===//
01266 // ASTWriter Implementation
01267 //===----------------------------------------------------------------------===//
01268 
01269 void ASTWriter::WriteDeclsBlockAbbrevs() {
01270   using namespace llvm;
01271 
01272   BitCodeAbbrev *Abv;
01273 
01274   // Abbreviation for DECL_FIELD
01275   Abv = new BitCodeAbbrev();
01276   Abv->Add(BitCodeAbbrevOp(serialization::DECL_FIELD));
01277   // Decl
01278   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01279   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01280   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01281   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01282   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01283   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01284   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01285   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01286   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));  // AccessSpecifier
01287   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01288   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01289   // NamedDecl
01290   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01291   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01292   // ValueDecl
01293   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01294   // DeclaratorDecl
01295   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
01296   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
01297   // FieldDecl
01298   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
01299   Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth
01300   // Type Source Info
01301   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
01302   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
01303   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
01304   DeclFieldAbbrev = Stream.EmitAbbrev(Abv);
01305 
01306   // Abbreviation for DECL_OBJC_IVAR
01307   Abv = new BitCodeAbbrev();
01308   Abv->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR));
01309   // Decl
01310   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01311   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01312   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01313   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01314   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01315   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01316   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01317   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01318   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));  // AccessSpecifier
01319   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01320   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01321   // NamedDecl
01322   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01323   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01324   // ValueDecl
01325   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01326   // DeclaratorDecl
01327   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
01328   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
01329   // FieldDecl
01330   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
01331   Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth
01332   // ObjC Ivar
01333   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl
01334   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize
01335   // Type Source Info
01336   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
01337   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
01338   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
01339   DeclObjCIvarAbbrev = Stream.EmitAbbrev(Abv);
01340 
01341   // Abbreviation for DECL_ENUM
01342   Abv = new BitCodeAbbrev();
01343   Abv->Add(BitCodeAbbrevOp(serialization::DECL_ENUM));
01344   // Redeclarable
01345   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
01346   // Decl
01347   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01348   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01349   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01350   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01351   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01352   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01353   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01354   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01355   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
01356   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01357   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01358   // NamedDecl
01359   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01360   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01361   // TypeDecl
01362   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
01363   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
01364   // TagDecl
01365   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IdentifierNamespace
01366   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getTagKind
01367   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition
01368   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator
01369   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
01370   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
01371   Abv->Add(BitCodeAbbrevOp(0));                         // hasExtInfo
01372   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // TypedefNameAnonDecl
01373   // EnumDecl
01374   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // AddTypeRef
01375   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IntegerType
01376   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getPromotionType
01377   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getNumPositiveBits
01378   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getNumNegativeBits
01379   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScoped
01380   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScopedUsingClassTag
01381   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isFixed
01382   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // InstantiatedMembEnum
01383   // DC
01384   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LexicalOffset
01385   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // VisibleOffset
01386   DeclEnumAbbrev = Stream.EmitAbbrev(Abv);
01387 
01388   // Abbreviation for DECL_RECORD
01389   Abv = new BitCodeAbbrev();
01390   Abv->Add(BitCodeAbbrevOp(serialization::DECL_RECORD));
01391   // Redeclarable
01392   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
01393   // Decl
01394   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01395   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01396   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01397   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01398   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01399   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01400   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01401   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01402   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
01403   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01404   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01405   // NamedDecl
01406   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01407   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01408   // TypeDecl
01409   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
01410   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
01411   // TagDecl
01412   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IdentifierNamespace
01413   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getTagKind
01414   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition
01415   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator
01416   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
01417   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
01418   Abv->Add(BitCodeAbbrevOp(0));                         // hasExtInfo
01419   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // TypedefNameAnonDecl
01420   // RecordDecl
01421   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // FlexibleArrayMember
01422   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // AnonymousStructUnion
01423   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // hasObjectMember
01424   // DC
01425   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LexicalOffset
01426   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // VisibleOffset
01427   DeclRecordAbbrev = Stream.EmitAbbrev(Abv);
01428 
01429   // Abbreviation for DECL_PARM_VAR
01430   Abv = new BitCodeAbbrev();
01431   Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR));
01432   // Redeclarable
01433   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
01434   // Decl
01435   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01436   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01437   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01438   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01439   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01440   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01441   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01442   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01443   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
01444   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01445   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01446   // NamedDecl
01447   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01448   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01449   // ValueDecl
01450   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01451   // DeclaratorDecl
01452   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
01453   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
01454   // VarDecl
01455   Abv->Add(BitCodeAbbrevOp(0));                       // StorageClass
01456   Abv->Add(BitCodeAbbrevOp(0));                       // StorageClassAsWritten
01457   Abv->Add(BitCodeAbbrevOp(0));                       // isThreadSpecified
01458   Abv->Add(BitCodeAbbrevOp(0));                       // hasCXXDirectInitializer
01459   Abv->Add(BitCodeAbbrevOp(0));                       // isExceptionVariable
01460   Abv->Add(BitCodeAbbrevOp(0));                       // isNRVOVariable
01461   Abv->Add(BitCodeAbbrevOp(0));                       // isCXXForRangeDecl
01462   Abv->Add(BitCodeAbbrevOp(0));                       // isARCPseudoStrong
01463   Abv->Add(BitCodeAbbrevOp(0));                       // HasInit
01464   Abv->Add(BitCodeAbbrevOp(0));                   // HasMemberSpecializationInfo
01465   // ParmVarDecl
01466   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsObjCMethodParameter
01467   Abv->Add(BitCodeAbbrevOp(0));                       // ScopeDepth
01468   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ScopeIndex
01469   Abv->Add(BitCodeAbbrevOp(0));                       // ObjCDeclQualifier
01470   Abv->Add(BitCodeAbbrevOp(0));                       // KNRPromoted
01471   Abv->Add(BitCodeAbbrevOp(0));                       // HasInheritedDefaultArg
01472   Abv->Add(BitCodeAbbrevOp(0));                   // HasUninstantiatedDefaultArg
01473   // Type Source Info
01474   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
01475   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
01476   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
01477   DeclParmVarAbbrev = Stream.EmitAbbrev(Abv);
01478 
01479   // Abbreviation for DECL_TYPEDEF
01480   Abv = new BitCodeAbbrev();
01481   Abv->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF));
01482   // Redeclarable
01483   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
01484   // Decl
01485   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01486   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01487   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01488   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01489   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01490   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01491   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01492   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01493   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
01494   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01495   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01496   // NamedDecl
01497   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01498   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01499   // TypeDecl
01500   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
01501   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
01502   // TypedefDecl
01503   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
01504   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
01505   DeclTypedefAbbrev = Stream.EmitAbbrev(Abv);
01506 
01507   // Abbreviation for DECL_VAR
01508   Abv = new BitCodeAbbrev();
01509   Abv->Add(BitCodeAbbrevOp(serialization::DECL_VAR));
01510   // Redeclarable
01511   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
01512   // Decl
01513   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
01514   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext
01515   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
01516   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
01517   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
01518   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
01519   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
01520   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
01521   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
01522   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
01523   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
01524   // NamedDecl
01525   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
01526   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
01527   // ValueDecl
01528   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01529   // DeclaratorDecl
01530   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
01531   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
01532   // VarDecl
01533   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClass
01534   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClassAsWritten
01535   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isThreadSpecified
01536   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // CXXDirectInitializer
01537   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable
01538   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable
01539   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl
01540   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong
01541   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit
01542   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo
01543   // Type Source Info
01544   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
01545   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
01546   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
01547   DeclVarAbbrev = Stream.EmitAbbrev(Abv);
01548 
01549   // Abbreviation for EXPR_DECL_REF
01550   Abv = new BitCodeAbbrev();
01551   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF));
01552   //Stmt
01553   //Expr
01554   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01555   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
01556   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
01557   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
01558   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
01559   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
01560   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
01561   //DeclRefExpr
01562   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HasQualifier
01563   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //GetDeclFound
01564   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ExplicitTemplateArgs
01565   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HadMultipleCandidates
01566   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //RefersToEnclosingLocal
01567   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclRef
01568   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
01569   DeclRefExprAbbrev = Stream.EmitAbbrev(Abv);
01570 
01571   // Abbreviation for EXPR_INTEGER_LITERAL
01572   Abv = new BitCodeAbbrev();
01573   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_INTEGER_LITERAL));
01574   //Stmt
01575   //Expr
01576   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01577   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
01578   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
01579   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
01580   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
01581   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
01582   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
01583   //Integer Literal
01584   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
01585   Abv->Add(BitCodeAbbrevOp(32));                      // Bit Width
01586   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Value
01587   IntegerLiteralAbbrev = Stream.EmitAbbrev(Abv);
01588 
01589   // Abbreviation for EXPR_CHARACTER_LITERAL
01590   Abv = new BitCodeAbbrev();
01591   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CHARACTER_LITERAL));
01592   //Stmt
01593   //Expr
01594   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
01595   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
01596   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
01597   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
01598   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
01599   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
01600   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
01601   //Character Literal
01602   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getValue
01603   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
01604   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsWide
01605   CharacterLiteralAbbrev = Stream.EmitAbbrev(Abv);
01606 
01607   Abv = new BitCodeAbbrev();
01608   Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_LEXICAL));
01609   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
01610   DeclContextLexicalAbbrev = Stream.EmitAbbrev(Abv);
01611 
01612   Abv = new BitCodeAbbrev();
01613   Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_VISIBLE));
01614   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
01615   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
01616   DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(Abv);
01617 }
01618 
01619 /// isRequiredDecl - Check if this is a "required" Decl, which must be seen by
01620 /// consumers of the AST.
01621 ///
01622 /// Such decls will always be deserialized from the AST file, so we would like
01623 /// this to be as restrictive as possible. Currently the predicate is driven by
01624 /// code generation requirements, if other clients have a different notion of
01625 /// what is "required" then we may have to consider an alternate scheme where
01626 /// clients can iterate over the top-level decls and get information on them,
01627 /// without necessary deserializing them. We could explicitly require such
01628 /// clients to use a separate API call to "realize" the decl. This should be
01629 /// relatively painless since they would presumably only do it for top-level
01630 /// decls.
01631 static bool isRequiredDecl(const Decl *D, ASTContext &Context) {
01632   // An ObjCMethodDecl is never considered as "required" because its
01633   // implementation container always is.
01634 
01635   // File scoped assembly or obj-c implementation must be seen.
01636   if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplDecl>(D))
01637     return true;
01638 
01639   return Context.DeclMustBeEmitted(D);
01640 }
01641 
01642 void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) {
01643   // Switch case IDs are per Decl.
01644   ClearSwitchCaseIDs();
01645 
01646   RecordData Record;
01647   ASTDeclWriter W(*this, Context, Record);
01648 
01649   // Determine the ID for this declaration.
01650   serialization::DeclID ID;
01651   if (D->isFromASTFile())
01652     ID = getDeclID(D);
01653   else {
01654     serialization::DeclID &IDR = DeclIDs[D];
01655     if (IDR == 0)
01656       IDR = NextDeclID++;
01657     
01658     ID= IDR;
01659   }
01660 
01661   bool isReplacingADecl = ID < FirstDeclID;
01662 
01663   // If this declaration is also a DeclContext, write blocks for the
01664   // declarations that lexically stored inside its context and those
01665   // declarations that are visible from its context. These blocks
01666   // are written before the declaration itself so that we can put
01667   // their offsets into the record for the declaration.
01668   uint64_t LexicalOffset = 0;
01669   uint64_t VisibleOffset = 0;
01670   DeclContext *DC = dyn_cast<DeclContext>(D);
01671   if (DC) {
01672     if (isReplacingADecl) {
01673       // It is replacing a decl from a chained PCH; make sure that the
01674       // DeclContext is fully loaded.
01675       if (DC->hasExternalLexicalStorage())
01676         DC->LoadLexicalDeclsFromExternalStorage();
01677       if (DC->hasExternalVisibleStorage())
01678         Chain->completeVisibleDeclsMap(DC);
01679     }
01680     LexicalOffset = WriteDeclContextLexicalBlock(Context, DC);
01681     VisibleOffset = WriteDeclContextVisibleBlock(Context, DC);
01682   }
01683   
01684   if (isReplacingADecl) {
01685     // We're replacing a decl in a previous file.
01686     ReplacedDecls.push_back(ReplacedDeclInfo(ID, Stream.GetCurrentBitNo(),
01687                                              D->getLocation()));
01688   } else {
01689     unsigned Index = ID - FirstDeclID;
01690 
01691     // Record the offset for this declaration
01692     SourceLocation Loc = D->getLocation();
01693     if (DeclOffsets.size() == Index)
01694       DeclOffsets.push_back(DeclOffset(Loc, Stream.GetCurrentBitNo()));
01695     else if (DeclOffsets.size() < Index) {
01696       DeclOffsets.resize(Index+1);
01697       DeclOffsets[Index].setLocation(Loc);
01698       DeclOffsets[Index].BitOffset = Stream.GetCurrentBitNo();
01699     }
01700     
01701     SourceManager &SM = Context.getSourceManager();
01702     if (Loc.isValid() && SM.isLocalSourceLocation(Loc))
01703       associateDeclWithFile(D, ID);
01704   }
01705 
01706   // Build and emit a record for this declaration
01707   Record.clear();
01708   W.Code = (serialization::DeclCode)0;
01709   W.AbbrevToUse = 0;
01710   W.Visit(D);
01711   if (DC) W.VisitDeclContext(DC, LexicalOffset, VisibleOffset);
01712 
01713   if (!W.Code)
01714     llvm::report_fatal_error(StringRef("unexpected declaration kind '") +
01715                             D->getDeclKindName() + "'");
01716   Stream.EmitRecord(W.Code, Record, W.AbbrevToUse);
01717 
01718   // Flush any expressions that were written as part of this declaration.
01719   FlushStmts();
01720   
01721   // Flush C++ base specifiers, if there are any.
01722   FlushCXXBaseSpecifiers();
01723   
01724   // Note "external" declarations so that we can add them to a record in the
01725   // AST file later.
01726   //
01727   // FIXME: This should be renamed, the predicate is much more complicated.
01728   if (isRequiredDecl(D, Context))
01729     ExternalDefinitions.push_back(ID);
01730 }