1 //===--- ASTWriterDecl.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 14 #include "clang/Serialization/ASTWriter.h" 15 #include "ASTCommon.h" 16 #include "clang/AST/DeclVisitor.h" 17 #include "clang/AST/DeclCXX.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/AST/Expr.h" 20 #include "clang/AST/DeclContextInternals.h" 21 #include "clang/Basic/SourceManager.h" 22 #include "llvm/ADT/Twine.h" 23 #include "llvm/Bitcode/BitstreamWriter.h" 24 #include "llvm/Support/ErrorHandling.h" 25 using namespace clang; 26 using namespace serialization; 27 28 //===----------------------------------------------------------------------===// 29 // Declaration serialization 30 //===----------------------------------------------------------------------===// 31 32 namespace clang { 33 class ASTDeclWriter : public DeclVisitor<ASTDeclWriter, void> { 34 35 ASTWriter &Writer; 36 ASTContext &Context; 37 typedef ASTWriter::RecordData RecordData; 38 RecordData &Record; 39 40 public: 41 serialization::DeclCode Code; 42 unsigned AbbrevToUse; 43 44 ASTDeclWriter(ASTWriter &Writer, ASTContext &Context, RecordData &Record) 45 : Writer(Writer), Context(Context), Record(Record) { 46 } 47 48 void Visit(Decl *D); 49 50 void VisitDecl(Decl *D); 51 void VisitTranslationUnitDecl(TranslationUnitDecl *D); 52 void VisitNamedDecl(NamedDecl *D); 53 void VisitLabelDecl(LabelDecl *LD); 54 void VisitNamespaceDecl(NamespaceDecl *D); 55 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 56 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 57 void VisitTypeDecl(TypeDecl *D); 58 void VisitTypedefNameDecl(TypedefNameDecl *D); 59 void VisitTypedefDecl(TypedefDecl *D); 60 void VisitTypeAliasDecl(TypeAliasDecl *D); 61 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 62 void VisitTagDecl(TagDecl *D); 63 void VisitEnumDecl(EnumDecl *D); 64 void VisitRecordDecl(RecordDecl *D); 65 void VisitCXXRecordDecl(CXXRecordDecl *D); 66 void VisitClassTemplateSpecializationDecl( 67 ClassTemplateSpecializationDecl *D); 68 void VisitClassTemplatePartialSpecializationDecl( 69 ClassTemplatePartialSpecializationDecl *D); 70 void VisitClassScopeFunctionSpecializationDecl( 71 ClassScopeFunctionSpecializationDecl *D); 72 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 73 void VisitValueDecl(ValueDecl *D); 74 void VisitEnumConstantDecl(EnumConstantDecl *D); 75 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 76 void VisitDeclaratorDecl(DeclaratorDecl *D); 77 void VisitFunctionDecl(FunctionDecl *D); 78 void VisitCXXMethodDecl(CXXMethodDecl *D); 79 void VisitCXXConstructorDecl(CXXConstructorDecl *D); 80 void VisitCXXDestructorDecl(CXXDestructorDecl *D); 81 void VisitCXXConversionDecl(CXXConversionDecl *D); 82 void VisitFieldDecl(FieldDecl *D); 83 void VisitIndirectFieldDecl(IndirectFieldDecl *D); 84 void VisitVarDecl(VarDecl *D); 85 void VisitImplicitParamDecl(ImplicitParamDecl *D); 86 void VisitParmVarDecl(ParmVarDecl *D); 87 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 88 void VisitTemplateDecl(TemplateDecl *D); 89 void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D); 90 void VisitClassTemplateDecl(ClassTemplateDecl *D); 91 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 92 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 93 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D); 94 void VisitUsingDecl(UsingDecl *D); 95 void VisitUsingShadowDecl(UsingShadowDecl *D); 96 void VisitLinkageSpecDecl(LinkageSpecDecl *D); 97 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D); 98 void VisitImportDecl(ImportDecl *D); 99 void VisitAccessSpecDecl(AccessSpecDecl *D); 100 void VisitFriendDecl(FriendDecl *D); 101 void VisitFriendTemplateDecl(FriendTemplateDecl *D); 102 void VisitStaticAssertDecl(StaticAssertDecl *D); 103 void VisitBlockDecl(BlockDecl *D); 104 105 void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset, 106 uint64_t VisibleOffset); 107 template <typename T> void VisitRedeclarable(Redeclarable<T> *D); 108 109 110 // FIXME: Put in the same order is DeclNodes.td? 111 void VisitObjCMethodDecl(ObjCMethodDecl *D); 112 void VisitObjCContainerDecl(ObjCContainerDecl *D); 113 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 114 void VisitObjCIvarDecl(ObjCIvarDecl *D); 115 void VisitObjCProtocolDecl(ObjCProtocolDecl *D); 116 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); 117 void VisitObjCClassDecl(ObjCClassDecl *D); 118 void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 119 void VisitObjCCategoryDecl(ObjCCategoryDecl *D); 120 void VisitObjCImplDecl(ObjCImplDecl *D); 121 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 122 void VisitObjCImplementationDecl(ObjCImplementationDecl *D); 123 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D); 124 void VisitObjCPropertyDecl(ObjCPropertyDecl *D); 125 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 126 }; 127 } 128 129 void ASTDeclWriter::Visit(Decl *D) { 130 DeclVisitor<ASTDeclWriter>::Visit(D); 131 132 // Source locations require array (variable-length) abbreviations. The 133 // abbreviation infrastructure requires that arrays are encoded last, so 134 // we handle it here in the case of those classes derived from DeclaratorDecl 135 if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)){ 136 Writer.AddTypeSourceInfo(DD->getTypeSourceInfo(), Record); 137 } 138 139 // Handle FunctionDecl's body here and write it after all other Stmts/Exprs 140 // have been written. We want it last because we will not read it back when 141 // retrieving it from the AST, we'll just lazily set the offset. 142 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 143 Record.push_back(FD->doesThisDeclarationHaveABody()); 144 if (FD->doesThisDeclarationHaveABody()) 145 Writer.AddStmt(FD->getBody()); 146 } 147 } 148 149 void ASTDeclWriter::VisitDecl(Decl *D) { 150 Writer.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()), Record); 151 Writer.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()), Record); 152 Record.push_back(D->isInvalidDecl()); 153 Record.push_back(D->hasAttrs()); 154 if (D->hasAttrs()) 155 Writer.WriteAttributes(D->getAttrs(), Record); 156 Record.push_back(D->isImplicit()); 157 Record.push_back(D->isUsed(false)); 158 Record.push_back(D->isReferenced()); 159 Record.push_back(D->TopLevelDeclInObjCContainer); 160 Record.push_back(D->getAccess()); 161 Record.push_back(D->ModulePrivate); 162 Record.push_back(Writer.inferSubmoduleIDFromLocation(D->getLocation())); 163 } 164 165 void ASTDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 166 llvm_unreachable("Translation units aren't directly serialized"); 167 } 168 169 void ASTDeclWriter::VisitNamedDecl(NamedDecl *D) { 170 VisitDecl(D); 171 Writer.AddDeclarationName(D->getDeclName(), Record); 172 } 173 174 void ASTDeclWriter::VisitTypeDecl(TypeDecl *D) { 175 VisitNamedDecl(D); 176 Writer.AddSourceLocation(D->getLocStart(), Record); 177 Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record); 178 } 179 180 void ASTDeclWriter::VisitTypedefNameDecl(TypedefNameDecl *D) { 181 VisitRedeclarable(D); 182 VisitTypeDecl(D); 183 Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record); 184 } 185 186 void ASTDeclWriter::VisitTypedefDecl(TypedefDecl *D) { 187 VisitTypedefNameDecl(D); 188 if (!D->hasAttrs() && 189 !D->isImplicit() && 190 !D->isUsed(false) && 191 !D->getPreviousDeclaration() && 192 !D->isInvalidDecl() && 193 !D->isReferenced() && 194 !D->isTopLevelDeclInObjCContainer() && 195 D->getAccess() == AS_none && 196 !D->isModulePrivate() && 197 D->getDeclName().getNameKind() == DeclarationName::Identifier) 198 AbbrevToUse = Writer.getDeclTypedefAbbrev(); 199 200 Code = serialization::DECL_TYPEDEF; 201 } 202 203 void ASTDeclWriter::VisitTypeAliasDecl(TypeAliasDecl *D) { 204 VisitTypedefNameDecl(D); 205 Code = serialization::DECL_TYPEALIAS; 206 } 207 208 void ASTDeclWriter::VisitTagDecl(TagDecl *D) { 209 VisitRedeclarable(D); 210 VisitTypeDecl(D); 211 Record.push_back(D->getIdentifierNamespace()); 212 Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding 213 Record.push_back(D->isCompleteDefinition()); 214 Record.push_back(D->isEmbeddedInDeclarator()); 215 Record.push_back(D->isFreeStanding()); 216 Writer.AddSourceLocation(D->getRBraceLoc(), Record); 217 Record.push_back(D->hasExtInfo()); 218 if (D->hasExtInfo()) 219 Writer.AddQualifierInfo(*D->getExtInfo(), Record); 220 else 221 Writer.AddDeclRef(D->getTypedefNameForAnonDecl(), Record); 222 } 223 224 void ASTDeclWriter::VisitEnumDecl(EnumDecl *D) { 225 VisitTagDecl(D); 226 Writer.AddTypeSourceInfo(D->getIntegerTypeSourceInfo(), Record); 227 if (!D->getIntegerTypeSourceInfo()) 228 Writer.AddTypeRef(D->getIntegerType(), Record); 229 Writer.AddTypeRef(D->getPromotionType(), Record); 230 Record.push_back(D->getNumPositiveBits()); 231 Record.push_back(D->getNumNegativeBits()); 232 Record.push_back(D->isScoped()); 233 Record.push_back(D->isScopedUsingClassTag()); 234 Record.push_back(D->isFixed()); 235 Writer.AddDeclRef(D->getInstantiatedFromMemberEnum(), Record); 236 237 if (!D->hasAttrs() && 238 !D->isImplicit() && 239 !D->isUsed(false) && 240 !D->hasExtInfo() && 241 !D->getPreviousDeclaration() && 242 !D->isInvalidDecl() && 243 !D->isReferenced() && 244 !D->isTopLevelDeclInObjCContainer() && 245 D->getAccess() == AS_none && 246 !D->isModulePrivate() && 247 !CXXRecordDecl::classofKind(D->getKind()) && 248 !D->getIntegerTypeSourceInfo() && 249 D->getDeclName().getNameKind() == DeclarationName::Identifier) 250 AbbrevToUse = Writer.getDeclEnumAbbrev(); 251 252 Code = serialization::DECL_ENUM; 253 } 254 255 void ASTDeclWriter::VisitRecordDecl(RecordDecl *D) { 256 VisitTagDecl(D); 257 Record.push_back(D->hasFlexibleArrayMember()); 258 Record.push_back(D->isAnonymousStructOrUnion()); 259 Record.push_back(D->hasObjectMember()); 260 261 if (!D->hasAttrs() && 262 !D->isImplicit() && 263 !D->isUsed(false) && 264 !D->hasExtInfo() && 265 !D->getPreviousDeclaration() && 266 !D->isInvalidDecl() && 267 !D->isReferenced() && 268 !D->isTopLevelDeclInObjCContainer() && 269 D->getAccess() == AS_none && 270 !D->isModulePrivate() && 271 !CXXRecordDecl::classofKind(D->getKind()) && 272 D->getDeclName().getNameKind() == DeclarationName::Identifier) 273 AbbrevToUse = Writer.getDeclRecordAbbrev(); 274 275 Code = serialization::DECL_RECORD; 276 } 277 278 void ASTDeclWriter::VisitValueDecl(ValueDecl *D) { 279 VisitNamedDecl(D); 280 Writer.AddTypeRef(D->getType(), Record); 281 } 282 283 void ASTDeclWriter::VisitEnumConstantDecl(EnumConstantDecl *D) { 284 VisitValueDecl(D); 285 Record.push_back(D->getInitExpr()? 1 : 0); 286 if (D->getInitExpr()) 287 Writer.AddStmt(D->getInitExpr()); 288 Writer.AddAPSInt(D->getInitVal(), Record); 289 290 Code = serialization::DECL_ENUM_CONSTANT; 291 } 292 293 void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) { 294 VisitValueDecl(D); 295 Writer.AddSourceLocation(D->getInnerLocStart(), Record); 296 Record.push_back(D->hasExtInfo()); 297 if (D->hasExtInfo()) 298 Writer.AddQualifierInfo(*D->getExtInfo(), Record); 299 } 300 301 void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { 302 VisitRedeclarable(D); 303 VisitDeclaratorDecl(D); 304 305 Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record); 306 Record.push_back(D->getIdentifierNamespace()); 307 Record.push_back(D->getTemplatedKind()); 308 switch (D->getTemplatedKind()) { 309 default: llvm_unreachable("Unhandled TemplatedKind!"); 310 case FunctionDecl::TK_NonTemplate: 311 break; 312 case FunctionDecl::TK_FunctionTemplate: 313 Writer.AddDeclRef(D->getDescribedFunctionTemplate(), Record); 314 break; 315 case FunctionDecl::TK_MemberSpecialization: { 316 MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo(); 317 Writer.AddDeclRef(MemberInfo->getInstantiatedFrom(), Record); 318 Record.push_back(MemberInfo->getTemplateSpecializationKind()); 319 Writer.AddSourceLocation(MemberInfo->getPointOfInstantiation(), Record); 320 break; 321 } 322 case FunctionDecl::TK_FunctionTemplateSpecialization: { 323 FunctionTemplateSpecializationInfo * 324 FTSInfo = D->getTemplateSpecializationInfo(); 325 Writer.AddDeclRef(FTSInfo->getTemplate(), Record); 326 Record.push_back(FTSInfo->getTemplateSpecializationKind()); 327 328 // Template arguments. 329 Writer.AddTemplateArgumentList(FTSInfo->TemplateArguments, Record); 330 331 // Template args as written. 332 Record.push_back(FTSInfo->TemplateArgumentsAsWritten != 0); 333 if (FTSInfo->TemplateArgumentsAsWritten) { 334 Record.push_back(FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs); 335 for (int i=0, e = FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs; 336 i!=e; ++i) 337 Writer.AddTemplateArgumentLoc((*FTSInfo->TemplateArgumentsAsWritten)[i], 338 Record); 339 Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->LAngleLoc, 340 Record); 341 Writer.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->RAngleLoc, 342 Record); 343 } 344 345 Writer.AddSourceLocation(FTSInfo->getPointOfInstantiation(), Record); 346 347 if (D->isCanonicalDecl()) { 348 // Write the template that contains the specializations set. We will 349 // add a FunctionTemplateSpecializationInfo to it when reading. 350 Writer.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl(), Record); 351 } 352 break; 353 } 354 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { 355 DependentFunctionTemplateSpecializationInfo * 356 DFTSInfo = D->getDependentSpecializationInfo(); 357 358 // Templates. 359 Record.push_back(DFTSInfo->getNumTemplates()); 360 for (int i=0, e = DFTSInfo->getNumTemplates(); i != e; ++i) 361 Writer.AddDeclRef(DFTSInfo->getTemplate(i), Record); 362 363 // Templates args. 364 Record.push_back(DFTSInfo->getNumTemplateArgs()); 365 for (int i=0, e = DFTSInfo->getNumTemplateArgs(); i != e; ++i) 366 Writer.AddTemplateArgumentLoc(DFTSInfo->getTemplateArg(i), Record); 367 Writer.AddSourceLocation(DFTSInfo->getLAngleLoc(), Record); 368 Writer.AddSourceLocation(DFTSInfo->getRAngleLoc(), Record); 369 break; 370 } 371 } 372 373 // FunctionDecl's body is handled last at ASTWriterDecl::Visit, 374 // after everything else is written. 375 376 Record.push_back(D->getStorageClass()); // FIXME: stable encoding 377 Record.push_back(D->getStorageClassAsWritten()); 378 Record.push_back(D->IsInline); 379 Record.push_back(D->isInlineSpecified()); 380 Record.push_back(D->isVirtualAsWritten()); 381 Record.push_back(D->isPure()); 382 Record.push_back(D->hasInheritedPrototype()); 383 Record.push_back(D->hasWrittenPrototype()); 384 Record.push_back(D->isDeletedAsWritten()); 385 Record.push_back(D->isTrivial()); 386 Record.push_back(D->isDefaulted()); 387 Record.push_back(D->isExplicitlyDefaulted()); 388 Record.push_back(D->hasImplicitReturnZero()); 389 Record.push_back(D->isConstexpr()); 390 Writer.AddSourceLocation(D->getLocEnd(), Record); 391 392 Record.push_back(D->param_size()); 393 for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end(); 394 P != PEnd; ++P) 395 Writer.AddDeclRef(*P, Record); 396 Code = serialization::DECL_FUNCTION; 397 } 398 399 void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 400 VisitNamedDecl(D); 401 // FIXME: convert to LazyStmtPtr? 402 // Unlike C/C++, method bodies will never be in header files. 403 bool HasBodyStuff = D->getBody() != 0 || 404 D->getSelfDecl() != 0 || D->getCmdDecl() != 0; 405 Record.push_back(HasBodyStuff); 406 if (HasBodyStuff) { 407 Writer.AddStmt(D->getBody()); 408 Writer.AddDeclRef(D->getSelfDecl(), Record); 409 Writer.AddDeclRef(D->getCmdDecl(), Record); 410 } 411 Record.push_back(D->isInstanceMethod()); 412 Record.push_back(D->isVariadic()); 413 Record.push_back(D->isSynthesized()); 414 Record.push_back(D->isDefined()); 415 416 Record.push_back(D->IsRedeclaration); 417 Record.push_back(D->HasRedeclaration); 418 if (D->HasRedeclaration) { 419 assert(Context.getObjCMethodRedeclaration(D)); 420 Writer.AddDeclRef(Context.getObjCMethodRedeclaration(D), Record); 421 } 422 423 // FIXME: stable encoding for @required/@optional 424 Record.push_back(D->getImplementationControl()); 425 // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway 426 Record.push_back(D->getObjCDeclQualifier()); 427 Record.push_back(D->hasRelatedResultType()); 428 Writer.AddTypeRef(D->getResultType(), Record); 429 Writer.AddTypeSourceInfo(D->getResultTypeSourceInfo(), Record); 430 Writer.AddSourceLocation(D->getLocEnd(), Record); 431 Record.push_back(D->param_size()); 432 for (ObjCMethodDecl::param_iterator P = D->param_begin(), 433 PEnd = D->param_end(); P != PEnd; ++P) 434 Writer.AddDeclRef(*P, Record); 435 436 Record.push_back(D->SelLocsKind); 437 unsigned NumStoredSelLocs = D->getNumStoredSelLocs(); 438 SourceLocation *SelLocs = D->getStoredSelLocs(); 439 Record.push_back(NumStoredSelLocs); 440 for (unsigned i = 0; i != NumStoredSelLocs; ++i) 441 Writer.AddSourceLocation(SelLocs[i], Record); 442 443 Code = serialization::DECL_OBJC_METHOD; 444 } 445 446 void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) { 447 VisitNamedDecl(D); 448 Writer.AddSourceLocation(D->getAtStartLoc(), Record); 449 Writer.AddSourceRange(D->getAtEndRange(), Record); 450 // Abstract class (no need to define a stable serialization::DECL code). 451 } 452 453 void ASTDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 454 VisitRedeclarable(D); 455 VisitObjCContainerDecl(D); 456 Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record); 457 458 ObjCInterfaceDecl *Def = D->getDefinition(); 459 Writer.AddDeclRef(Def, Record); 460 461 if (D == Def) { 462 // Write the DefinitionData 463 ObjCInterfaceDecl::DefinitionData &Data = D->data(); 464 465 Writer.AddDeclRef(D->getSuperClass(), Record); 466 Writer.AddSourceLocation(D->getSuperClassLoc(), Record); 467 Writer.AddSourceLocation(D->getEndOfDefinitionLoc(), Record); 468 469 // Write out the protocols that are directly referenced by the @interface. 470 Record.push_back(Data.ReferencedProtocols.size()); 471 for (ObjCInterfaceDecl::protocol_iterator P = D->protocol_begin(), 472 PEnd = D->protocol_end(); 473 P != PEnd; ++P) 474 Writer.AddDeclRef(*P, Record); 475 for (ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(), 476 PLEnd = D->protocol_loc_end(); 477 PL != PLEnd; ++PL) 478 Writer.AddSourceLocation(*PL, Record); 479 480 // Write out the protocols that are transitively referenced. 481 Record.push_back(Data.AllReferencedProtocols.size()); 482 for (ObjCList<ObjCProtocolDecl>::iterator 483 P = Data.AllReferencedProtocols.begin(), 484 PEnd = Data.AllReferencedProtocols.end(); 485 P != PEnd; ++P) 486 Writer.AddDeclRef(*P, Record); 487 488 // Write out the ivars. 489 Record.push_back(D->ivar_size()); 490 for (ObjCInterfaceDecl::ivar_iterator I = D->ivar_begin(), 491 IEnd = D->ivar_end(); I != IEnd; ++I) 492 Writer.AddDeclRef(*I, Record); 493 494 Writer.AddDeclRef(D->getCategoryList(), Record); 495 } 496 497 Code = serialization::DECL_OBJC_INTERFACE; 498 } 499 500 void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 501 VisitFieldDecl(D); 502 // FIXME: stable encoding for @public/@private/@protected/@package 503 Record.push_back(D->getAccessControl()); 504 Record.push_back(D->getSynthesize()); 505 506 if (!D->hasAttrs() && 507 !D->isImplicit() && 508 !D->isUsed(false) && 509 !D->isInvalidDecl() && 510 !D->isReferenced() && 511 !D->isModulePrivate() && 512 !D->getBitWidth() && 513 !D->hasExtInfo() && 514 D->getDeclName()) 515 AbbrevToUse = Writer.getDeclObjCIvarAbbrev(); 516 517 Code = serialization::DECL_OBJC_IVAR; 518 } 519 520 void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 521 VisitObjCContainerDecl(D); 522 Record.push_back(D->isInitiallyForwardDecl()); 523 Record.push_back(D->isForwardDecl()); 524 Writer.AddSourceLocation(D->getLocEnd(), Record); 525 Record.push_back(D->protocol_size()); 526 for (ObjCProtocolDecl::protocol_iterator 527 I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I) 528 Writer.AddDeclRef(*I, Record); 529 for (ObjCProtocolDecl::protocol_loc_iterator PL = D->protocol_loc_begin(), 530 PLEnd = D->protocol_loc_end(); 531 PL != PLEnd; ++PL) 532 Writer.AddSourceLocation(*PL, Record); 533 Code = serialization::DECL_OBJC_PROTOCOL; 534 } 535 536 void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) { 537 VisitFieldDecl(D); 538 Code = serialization::DECL_OBJC_AT_DEFS_FIELD; 539 } 540 541 void ASTDeclWriter::VisitObjCClassDecl(ObjCClassDecl *D) { 542 VisitDecl(D); 543 Writer.AddDeclRef(D->Interface, Record); 544 Writer.AddSourceLocation(D->InterfaceLoc, Record); 545 Code = serialization::DECL_OBJC_CLASS; 546 } 547 548 void ASTDeclWriter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 549 VisitDecl(D); 550 Record.push_back(D->protocol_size()); 551 for (ObjCForwardProtocolDecl::protocol_iterator 552 I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I) 553 Writer.AddDeclRef(*I, Record); 554 for (ObjCForwardProtocolDecl::protocol_loc_iterator 555 PL = D->protocol_loc_begin(), PLEnd = D->protocol_loc_end(); 556 PL != PLEnd; ++PL) 557 Writer.AddSourceLocation(*PL, Record); 558 Code = serialization::DECL_OBJC_FORWARD_PROTOCOL; 559 } 560 561 void ASTDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 562 VisitObjCContainerDecl(D); 563 Writer.AddDeclRef(D->getClassInterface(), Record); 564 Record.push_back(D->protocol_size()); 565 for (ObjCCategoryDecl::protocol_iterator 566 I = D->protocol_begin(), IEnd = D->protocol_end(); I != IEnd; ++I) 567 Writer.AddDeclRef(*I, Record); 568 for (ObjCCategoryDecl::protocol_loc_iterator 569 PL = D->protocol_loc_begin(), PLEnd = D->protocol_loc_end(); 570 PL != PLEnd; ++PL) 571 Writer.AddSourceLocation(*PL, Record); 572 Writer.AddDeclRef(D->getNextClassCategory(), Record); 573 Record.push_back(D->hasSynthBitfield()); 574 Writer.AddSourceLocation(D->getCategoryNameLoc(), Record); 575 Code = serialization::DECL_OBJC_CATEGORY; 576 } 577 578 void ASTDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) { 579 VisitNamedDecl(D); 580 Writer.AddDeclRef(D->getClassInterface(), Record); 581 Code = serialization::DECL_OBJC_COMPATIBLE_ALIAS; 582 } 583 584 void ASTDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 585 VisitNamedDecl(D); 586 Writer.AddSourceLocation(D->getAtLoc(), Record); 587 Writer.AddTypeSourceInfo(D->getTypeSourceInfo(), Record); 588 // FIXME: stable encoding 589 Record.push_back((unsigned)D->getPropertyAttributes()); 590 Record.push_back((unsigned)D->getPropertyAttributesAsWritten()); 591 // FIXME: stable encoding 592 Record.push_back((unsigned)D->getPropertyImplementation()); 593 Writer.AddDeclarationName(D->getGetterName(), Record); 594 Writer.AddDeclarationName(D->getSetterName(), Record); 595 Writer.AddDeclRef(D->getGetterMethodDecl(), Record); 596 Writer.AddDeclRef(D->getSetterMethodDecl(), Record); 597 Writer.AddDeclRef(D->getPropertyIvarDecl(), Record); 598 Code = serialization::DECL_OBJC_PROPERTY; 599 } 600 601 void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) { 602 VisitObjCContainerDecl(D); 603 Writer.AddDeclRef(D->getClassInterface(), Record); 604 // Abstract class (no need to define a stable serialization::DECL code). 605 } 606 607 void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 608 VisitObjCImplDecl(D); 609 Writer.AddIdentifierRef(D->getIdentifier(), Record); 610 Writer.AddSourceLocation(D->getCategoryNameLoc(), Record); 611 Code = serialization::DECL_OBJC_CATEGORY_IMPL; 612 } 613 614 void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 615 VisitObjCImplDecl(D); 616 Writer.AddDeclRef(D->getSuperClass(), Record); 617 Writer.AddCXXCtorInitializers(D->IvarInitializers, D->NumIvarInitializers, 618 Record); 619 Record.push_back(D->hasSynthBitfield()); 620 Code = serialization::DECL_OBJC_IMPLEMENTATION; 621 } 622 623 void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 624 VisitDecl(D); 625 Writer.AddSourceLocation(D->getLocStart(), Record); 626 Writer.AddDeclRef(D->getPropertyDecl(), Record); 627 Writer.AddDeclRef(D->getPropertyIvarDecl(), Record); 628 Writer.AddSourceLocation(D->getPropertyIvarDeclLoc(), Record); 629 Writer.AddStmt(D->getGetterCXXConstructor()); 630 Writer.AddStmt(D->getSetterCXXAssignment()); 631 Code = serialization::DECL_OBJC_PROPERTY_IMPL; 632 } 633 634 void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) { 635 VisitDeclaratorDecl(D); 636 Record.push_back(D->isMutable()); 637 Record.push_back(D->getBitWidth()? 1 : D->hasInClassInitializer() ? 2 : 0); 638 if (D->getBitWidth()) 639 Writer.AddStmt(D->getBitWidth()); 640 else if (D->hasInClassInitializer()) 641 Writer.AddStmt(D->getInClassInitializer()); 642 if (!D->getDeclName()) 643 Writer.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D), Record); 644 645 if (!D->hasAttrs() && 646 !D->isImplicit() && 647 !D->isUsed(false) && 648 !D->isInvalidDecl() && 649 !D->isReferenced() && 650 !D->isTopLevelDeclInObjCContainer() && 651 !D->isModulePrivate() && 652 !D->getBitWidth() && 653 !D->hasInClassInitializer() && 654 !D->hasExtInfo() && 655 !ObjCIvarDecl::classofKind(D->getKind()) && 656 !ObjCAtDefsFieldDecl::classofKind(D->getKind()) && 657 D->getDeclName()) 658 AbbrevToUse = Writer.getDeclFieldAbbrev(); 659 660 Code = serialization::DECL_FIELD; 661 } 662 663 void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 664 VisitValueDecl(D); 665 Record.push_back(D->getChainingSize()); 666 667 for (IndirectFieldDecl::chain_iterator 668 P = D->chain_begin(), 669 PEnd = D->chain_end(); P != PEnd; ++P) 670 Writer.AddDeclRef(*P, Record); 671 Code = serialization::DECL_INDIRECTFIELD; 672 } 673 674 void ASTDeclWriter::VisitVarDecl(VarDecl *D) { 675 VisitRedeclarable(D); 676 VisitDeclaratorDecl(D); 677 Record.push_back(D->getStorageClass()); // FIXME: stable encoding 678 Record.push_back(D->getStorageClassAsWritten()); 679 Record.push_back(D->isThreadSpecified()); 680 Record.push_back(D->hasCXXDirectInitializer()); 681 Record.push_back(D->isExceptionVariable()); 682 Record.push_back(D->isNRVOVariable()); 683 Record.push_back(D->isCXXForRangeDecl()); 684 Record.push_back(D->isARCPseudoStrong()); 685 if (D->getInit()) { 686 Record.push_back(!D->isInitKnownICE() ? 1 : (D->isInitICE() ? 3 : 2)); 687 Writer.AddStmt(D->getInit()); 688 } else { 689 Record.push_back(0); 690 } 691 692 MemberSpecializationInfo *SpecInfo 693 = D->isStaticDataMember() ? D->getMemberSpecializationInfo() : 0; 694 Record.push_back(SpecInfo != 0); 695 if (SpecInfo) { 696 Writer.AddDeclRef(SpecInfo->getInstantiatedFrom(), Record); 697 Record.push_back(SpecInfo->getTemplateSpecializationKind()); 698 Writer.AddSourceLocation(SpecInfo->getPointOfInstantiation(), Record); 699 } 700 701 if (!D->hasAttrs() && 702 !D->isImplicit() && 703 !D->isUsed(false) && 704 !D->isInvalidDecl() && 705 !D->isReferenced() && 706 !D->isTopLevelDeclInObjCContainer() && 707 D->getAccess() == AS_none && 708 !D->isModulePrivate() && 709 D->getDeclName().getNameKind() == DeclarationName::Identifier && 710 !D->hasExtInfo() && 711 !D->getPreviousDeclaration() && 712 !D->hasCXXDirectInitializer() && 713 D->getInit() == 0 && 714 !isa<ParmVarDecl>(D) && 715 !SpecInfo) 716 AbbrevToUse = Writer.getDeclVarAbbrev(); 717 718 Code = serialization::DECL_VAR; 719 } 720 721 void ASTDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 722 VisitVarDecl(D); 723 Code = serialization::DECL_IMPLICIT_PARAM; 724 } 725 726 void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) { 727 VisitVarDecl(D); 728 Record.push_back(D->isObjCMethodParameter()); 729 Record.push_back(D->getFunctionScopeDepth()); 730 Record.push_back(D->getFunctionScopeIndex()); 731 Record.push_back(D->getObjCDeclQualifier()); // FIXME: stable encoding 732 Record.push_back(D->isKNRPromoted()); 733 Record.push_back(D->hasInheritedDefaultArg()); 734 Record.push_back(D->hasUninstantiatedDefaultArg()); 735 if (D->hasUninstantiatedDefaultArg()) 736 Writer.AddStmt(D->getUninstantiatedDefaultArg()); 737 Code = serialization::DECL_PARM_VAR; 738 739 assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl 740 741 // If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here 742 // we dynamically check for the properties that we optimize for, but don't 743 // know are true of all PARM_VAR_DECLs. 744 if (!D->hasAttrs() && 745 !D->hasExtInfo() && 746 !D->isImplicit() && 747 !D->isUsed(false) && 748 D->getAccess() == AS_none && 749 !D->isModulePrivate() && 750 D->getStorageClass() == 0 && 751 !D->hasCXXDirectInitializer() && // Can params have this ever? 752 D->getFunctionScopeDepth() == 0 && 753 D->getObjCDeclQualifier() == 0 && 754 !D->isKNRPromoted() && 755 !D->hasInheritedDefaultArg() && 756 D->getInit() == 0 && 757 !D->hasUninstantiatedDefaultArg()) // No default expr. 758 AbbrevToUse = Writer.getDeclParmVarAbbrev(); 759 760 // Check things we know are true of *every* PARM_VAR_DECL, which is more than 761 // just us assuming it. 762 assert(!D->isInvalidDecl() && "Shouldn't emit invalid decls"); 763 assert(!D->isThreadSpecified() && "PARM_VAR_DECL can't be __thread"); 764 assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private"); 765 assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var"); 766 assert(D->getPreviousDeclaration() == 0 && "PARM_VAR_DECL can't be redecl"); 767 assert(!D->isStaticDataMember() && 768 "PARM_VAR_DECL can't be static data member"); 769 } 770 771 void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) { 772 VisitDecl(D); 773 Writer.AddStmt(D->getAsmString()); 774 Writer.AddSourceLocation(D->getRParenLoc(), Record); 775 Code = serialization::DECL_FILE_SCOPE_ASM; 776 } 777 778 void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) { 779 VisitDecl(D); 780 Writer.AddStmt(D->getBody()); 781 Writer.AddTypeSourceInfo(D->getSignatureAsWritten(), Record); 782 Record.push_back(D->param_size()); 783 for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end(); 784 P != PEnd; ++P) 785 Writer.AddDeclRef(*P, Record); 786 Record.push_back(D->capturesCXXThis()); 787 Record.push_back(D->getNumCaptures()); 788 for (BlockDecl::capture_iterator 789 i = D->capture_begin(), e = D->capture_end(); i != e; ++i) { 790 const BlockDecl::Capture &capture = *i; 791 Writer.AddDeclRef(capture.getVariable(), Record); 792 793 unsigned flags = 0; 794 if (capture.isByRef()) flags |= 1; 795 if (capture.isNested()) flags |= 2; 796 if (capture.hasCopyExpr()) flags |= 4; 797 Record.push_back(flags); 798 799 if (capture.hasCopyExpr()) Writer.AddStmt(capture.getCopyExpr()); 800 } 801 802 Code = serialization::DECL_BLOCK; 803 } 804 805 void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 806 VisitDecl(D); 807 Record.push_back(D->getLanguage()); 808 Writer.AddSourceLocation(D->getExternLoc(), Record); 809 Writer.AddSourceLocation(D->getRBraceLoc(), Record); 810 Code = serialization::DECL_LINKAGE_SPEC; 811 } 812 813 void ASTDeclWriter::VisitLabelDecl(LabelDecl *D) { 814 VisitNamedDecl(D); 815 Writer.AddSourceLocation(D->getLocStart(), Record); 816 Code = serialization::DECL_LABEL; 817 } 818 819 820 void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) { 821 VisitNamedDecl(D); 822 Record.push_back(D->isInline()); 823 Writer.AddSourceLocation(D->getLocStart(), Record); 824 Writer.AddSourceLocation(D->getRBraceLoc(), Record); 825 Writer.AddDeclRef(D->getNextNamespace(), Record); 826 827 // Only write one reference--original or anonymous 828 Record.push_back(D->isOriginalNamespace()); 829 if (D->isOriginalNamespace()) 830 Writer.AddDeclRef(D->getAnonymousNamespace(), Record); 831 else 832 Writer.AddDeclRef(D->getOriginalNamespace(), Record); 833 Code = serialization::DECL_NAMESPACE; 834 835 if (Writer.hasChain() && !D->isOriginalNamespace() && 836 D->getOriginalNamespace()->isFromASTFile()) { 837 NamespaceDecl *NS = D->getOriginalNamespace(); 838 Writer.AddUpdatedDeclContext(NS); 839 840 // Make sure all visible decls are written. They will be recorded later. 841 NS->lookup(DeclarationName()); 842 StoredDeclsMap *Map = static_cast<StoredDeclsMap*>(NS->getLookupPtr()); 843 if (Map) { 844 for (StoredDeclsMap::iterator D = Map->begin(), DEnd = Map->end(); 845 D != DEnd; ++D) { 846 DeclContext::lookup_result Result = D->second.getLookupResult(); 847 while (Result.first != Result.second) { 848 Writer.GetDeclRef(*Result.first); 849 ++Result.first; 850 } 851 } 852 } 853 } 854 855 if (Writer.hasChain() && D->isAnonymousNamespace() && !D->getNextNamespace()){ 856 // This is a most recent reopening of the anonymous namespace. If its parent 857 // is in a previous PCH (or is the TU), mark that parent for update, because 858 // the original namespace always points to the latest re-opening of its 859 // anonymous namespace. 860 Decl *Parent = cast<Decl>( 861 D->getParent()->getRedeclContext()->getPrimaryContext()); 862 if (Parent->isFromASTFile() || isa<TranslationUnitDecl>(Parent)) { 863 ASTWriter::UpdateRecord &Record = Writer.DeclUpdates[Parent]; 864 Record.push_back(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE); 865 Writer.AddDeclRef(D, Record); 866 } 867 } 868 } 869 870 void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 871 VisitNamedDecl(D); 872 Writer.AddSourceLocation(D->getNamespaceLoc(), Record); 873 Writer.AddSourceLocation(D->getTargetNameLoc(), Record); 874 Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record); 875 Writer.AddDeclRef(D->getNamespace(), Record); 876 Code = serialization::DECL_NAMESPACE_ALIAS; 877 } 878 879 void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) { 880 VisitNamedDecl(D); 881 Writer.AddSourceLocation(D->getUsingLocation(), Record); 882 Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record); 883 Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record); 884 Writer.AddDeclRef(D->FirstUsingShadow, Record); 885 Record.push_back(D->isTypeName()); 886 Writer.AddDeclRef(Context.getInstantiatedFromUsingDecl(D), Record); 887 Code = serialization::DECL_USING; 888 } 889 890 void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) { 891 VisitNamedDecl(D); 892 Writer.AddDeclRef(D->getTargetDecl(), Record); 893 Writer.AddDeclRef(D->UsingOrNextShadow, Record); 894 Writer.AddDeclRef(Context.getInstantiatedFromUsingShadowDecl(D), Record); 895 Code = serialization::DECL_USING_SHADOW; 896 } 897 898 void ASTDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 899 VisitNamedDecl(D); 900 Writer.AddSourceLocation(D->getUsingLoc(), Record); 901 Writer.AddSourceLocation(D->getNamespaceKeyLocation(), Record); 902 Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record); 903 Writer.AddDeclRef(D->getNominatedNamespace(), Record); 904 Writer.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()), Record); 905 Code = serialization::DECL_USING_DIRECTIVE; 906 } 907 908 void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 909 VisitValueDecl(D); 910 Writer.AddSourceLocation(D->getUsingLoc(), Record); 911 Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record); 912 Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record); 913 Code = serialization::DECL_UNRESOLVED_USING_VALUE; 914 } 915 916 void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl( 917 UnresolvedUsingTypenameDecl *D) { 918 VisitTypeDecl(D); 919 Writer.AddSourceLocation(D->getTypenameLoc(), Record); 920 Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record); 921 Code = serialization::DECL_UNRESOLVED_USING_TYPENAME; 922 } 923 924 void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) { 925 VisitRecordDecl(D); 926 927 CXXRecordDecl *DefinitionDecl = 0; 928 if (D->DefinitionData) 929 DefinitionDecl = D->DefinitionData->Definition; 930 Writer.AddDeclRef(DefinitionDecl, Record); 931 if (D == DefinitionDecl) 932 Writer.AddCXXDefinitionData(D, Record); 933 934 enum { 935 CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization 936 }; 937 if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) { 938 Record.push_back(CXXRecTemplate); 939 Writer.AddDeclRef(TemplD, Record); 940 } else if (MemberSpecializationInfo *MSInfo 941 = D->getMemberSpecializationInfo()) { 942 Record.push_back(CXXRecMemberSpecialization); 943 Writer.AddDeclRef(MSInfo->getInstantiatedFrom(), Record); 944 Record.push_back(MSInfo->getTemplateSpecializationKind()); 945 Writer.AddSourceLocation(MSInfo->getPointOfInstantiation(), Record); 946 } else { 947 Record.push_back(CXXRecNotTemplate); 948 } 949 950 // Store the key function to avoid deserializing every method so we can 951 // compute it. 952 if (D->IsCompleteDefinition) 953 Writer.AddDeclRef(Context.getKeyFunction(D), Record); 954 955 Code = serialization::DECL_CXX_RECORD; 956 } 957 958 void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) { 959 VisitFunctionDecl(D); 960 Record.push_back(D->size_overridden_methods()); 961 for (CXXMethodDecl::method_iterator 962 I = D->begin_overridden_methods(), E = D->end_overridden_methods(); 963 I != E; ++I) 964 Writer.AddDeclRef(*I, Record); 965 Code = serialization::DECL_CXX_METHOD; 966 } 967 968 void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 969 VisitCXXMethodDecl(D); 970 971 Record.push_back(D->IsExplicitSpecified); 972 Record.push_back(D->ImplicitlyDefined); 973 Writer.AddCXXCtorInitializers(D->CtorInitializers, D->NumCtorInitializers, 974 Record); 975 976 Code = serialization::DECL_CXX_CONSTRUCTOR; 977 } 978 979 void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 980 VisitCXXMethodDecl(D); 981 982 Record.push_back(D->ImplicitlyDefined); 983 Writer.AddDeclRef(D->OperatorDelete, Record); 984 985 Code = serialization::DECL_CXX_DESTRUCTOR; 986 } 987 988 void ASTDeclWriter::VisitCXXConversionDecl(CXXConversionDecl *D) { 989 VisitCXXMethodDecl(D); 990 Record.push_back(D->IsExplicitSpecified); 991 Code = serialization::DECL_CXX_CONVERSION; 992 } 993 994 void ASTDeclWriter::VisitImportDecl(ImportDecl *D) { 995 VisitDecl(D); 996 ArrayRef<SourceLocation> IdentifierLocs = D->getIdentifierLocs(); 997 Record.push_back(!IdentifierLocs.empty()); 998 if (IdentifierLocs.empty()) { 999 Writer.AddSourceLocation(D->getLocEnd(), Record); 1000 Record.push_back(1); 1001 } else { 1002 for (unsigned I = 0, N = IdentifierLocs.size(); I != N; ++I) 1003 Writer.AddSourceLocation(IdentifierLocs[I], Record); 1004 Record.push_back(IdentifierLocs.size()); 1005 } 1006 // Note: the number of source locations must always be the last element in 1007 // the record. 1008 Code = serialization::DECL_IMPORT; 1009 } 1010 1011 void ASTDeclWriter::VisitAccessSpecDecl(AccessSpecDecl *D) { 1012 VisitDecl(D); 1013 Writer.AddSourceLocation(D->getColonLoc(), Record); 1014 Code = serialization::DECL_ACCESS_SPEC; 1015 } 1016 1017 void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) { 1018 VisitDecl(D); 1019 Record.push_back(D->Friend.is<TypeSourceInfo*>()); 1020 if (D->Friend.is<TypeSourceInfo*>()) 1021 Writer.AddTypeSourceInfo(D->Friend.get<TypeSourceInfo*>(), Record); 1022 else 1023 Writer.AddDeclRef(D->Friend.get<NamedDecl*>(), Record); 1024 Writer.AddDeclRef(D->getNextFriend(), Record); 1025 Record.push_back(D->UnsupportedFriend); 1026 Writer.AddSourceLocation(D->FriendLoc, Record); 1027 Code = serialization::DECL_FRIEND; 1028 } 1029 1030 void ASTDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl *D) { 1031 VisitDecl(D); 1032 Record.push_back(D->getNumTemplateParameters()); 1033 for (unsigned i = 0, e = D->getNumTemplateParameters(); i != e; ++i) 1034 Writer.AddTemplateParameterList(D->getTemplateParameterList(i), Record); 1035 Record.push_back(D->getFriendDecl() != 0); 1036 if (D->getFriendDecl()) 1037 Writer.AddDeclRef(D->getFriendDecl(), Record); 1038 else 1039 Writer.AddTypeSourceInfo(D->getFriendType(), Record); 1040 Writer.AddSourceLocation(D->getFriendLoc(), Record); 1041 Code = serialization::DECL_FRIEND_TEMPLATE; 1042 } 1043 1044 void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) { 1045 VisitNamedDecl(D); 1046 1047 Writer.AddDeclRef(D->getTemplatedDecl(), Record); 1048 Writer.AddTemplateParameterList(D->getTemplateParameters(), Record); 1049 } 1050 1051 void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { 1052 // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that 1053 // getCommonPtr() can be used while this is still initializing. 1054 enum { FirstDeclaration, FirstInFile, PointsToPrevious }; 1055 RedeclarableTemplateDecl *Prev = D->getPreviousDeclaration(); 1056 RedeclarableTemplateDecl *First = 0; 1057 if (!Prev) { 1058 Record.push_back(FirstDeclaration); 1059 1060 // This declaration owns the 'common' pointer, so serialize that data now. 1061 Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record); 1062 if (D->getInstantiatedFromMemberTemplate()) 1063 Record.push_back(D->isMemberSpecialization()); 1064 } else { 1065 First = D->getFirstDeclaration(); 1066 Record.push_back(Prev->isFromASTFile()? FirstInFile : PointsToPrevious); 1067 Writer.AddDeclRef(First, Record); 1068 Writer.AddDeclRef(Prev, Record); 1069 } 1070 1071 if (D->getMostRecentDeclaration() != D && (!Prev || Prev->isFromASTFile())) { 1072 if (!First) 1073 First = D->getFirstDeclaration(); 1074 1075 // Capture the set of redeclarations in this file. 1076 LocalRedeclarationsInfo LocalInfo = { 1077 Writer.GetDeclRef(First), 1078 Writer.GetDeclRef(D), 1079 Writer.GetDeclRef(D->getMostRecentDeclaration()) 1080 }; 1081 Writer.LocalRedeclarations.push_back(LocalInfo); 1082 } 1083 1084 VisitTemplateDecl(D); 1085 Record.push_back(D->getIdentifierNamespace()); 1086 } 1087 1088 void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 1089 VisitRedeclarableTemplateDecl(D); 1090 1091 if (D->getPreviousDeclaration() == 0) { 1092 typedef llvm::FoldingSet<ClassTemplateSpecializationDecl> CTSDSetTy; 1093 CTSDSetTy &CTSDSet = D->getSpecializations(); 1094 Record.push_back(CTSDSet.size()); 1095 for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) { 1096 assert(I->isCanonicalDecl() && "Expected only canonical decls in set"); 1097 Writer.AddDeclRef(&*I, Record); 1098 } 1099 1100 typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> CTPSDSetTy; 1101 CTPSDSetTy &CTPSDSet = D->getPartialSpecializations(); 1102 Record.push_back(CTPSDSet.size()); 1103 for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) { 1104 assert(I->isCanonicalDecl() && "Expected only canonical decls in set"); 1105 Writer.AddDeclRef(&*I, Record); 1106 } 1107 1108 // InjectedClassNameType is computed, no need to write it. 1109 } 1110 Code = serialization::DECL_CLASS_TEMPLATE; 1111 } 1112 1113 void ASTDeclWriter::VisitClassTemplateSpecializationDecl( 1114 ClassTemplateSpecializationDecl *D) { 1115 VisitCXXRecordDecl(D); 1116 1117 llvm::PointerUnion<ClassTemplateDecl *, 1118 ClassTemplatePartialSpecializationDecl *> InstFrom 1119 = D->getSpecializedTemplateOrPartial(); 1120 if (Decl *InstFromD = InstFrom.dyn_cast<ClassTemplateDecl *>()) { 1121 Writer.AddDeclRef(InstFromD, Record); 1122 } else { 1123 Writer.AddDeclRef(InstFrom.get<ClassTemplatePartialSpecializationDecl *>(), 1124 Record); 1125 Writer.AddTemplateArgumentList(&D->getTemplateInstantiationArgs(), Record); 1126 } 1127 1128 // Explicit info. 1129 Writer.AddTypeSourceInfo(D->getTypeAsWritten(), Record); 1130 if (D->getTypeAsWritten()) { 1131 Writer.AddSourceLocation(D->getExternLoc(), Record); 1132 Writer.AddSourceLocation(D->getTemplateKeywordLoc(), Record); 1133 } 1134 1135 Writer.AddTemplateArgumentList(&D->getTemplateArgs(), Record); 1136 Writer.AddSourceLocation(D->getPointOfInstantiation(), Record); 1137 Record.push_back(D->getSpecializationKind()); 1138 1139 if (D->isCanonicalDecl()) { 1140 // When reading, we'll add it to the folding set of the following template. 1141 Writer.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl(), Record); 1142 } 1143 1144 Code = serialization::DECL_CLASS_TEMPLATE_SPECIALIZATION; 1145 } 1146 1147 void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl( 1148 ClassTemplatePartialSpecializationDecl *D) { 1149 VisitClassTemplateSpecializationDecl(D); 1150 1151 Writer.AddTemplateParameterList(D->getTemplateParameters(), Record); 1152 1153 Record.push_back(D->getNumTemplateArgsAsWritten()); 1154 for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i) 1155 Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record); 1156 1157 Record.push_back(D->getSequenceNumber()); 1158 1159 // These are read/set from/to the first declaration. 1160 if (D->getPreviousDeclaration() == 0) { 1161 Writer.AddDeclRef(D->getInstantiatedFromMember(), Record); 1162 Record.push_back(D->isMemberSpecialization()); 1163 } 1164 1165 Code = serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION; 1166 } 1167 1168 void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl( 1169 ClassScopeFunctionSpecializationDecl *D) { 1170 VisitDecl(D); 1171 Writer.AddDeclRef(D->getSpecialization(), Record); 1172 Code = serialization::DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION; 1173 } 1174 1175 1176 void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 1177 VisitRedeclarableTemplateDecl(D); 1178 1179 if (D->getPreviousDeclaration() == 0) { 1180 // This FunctionTemplateDecl owns the CommonPtr; write it. 1181 1182 // Write the function specialization declarations. 1183 Record.push_back(D->getSpecializations().size()); 1184 for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator 1185 I = D->getSpecializations().begin(), 1186 E = D->getSpecializations().end() ; I != E; ++I) { 1187 assert(I->Function->isCanonicalDecl() && 1188 "Expected only canonical decls in set"); 1189 Writer.AddDeclRef(I->Function, Record); 1190 } 1191 } 1192 Code = serialization::DECL_FUNCTION_TEMPLATE; 1193 } 1194 1195 void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 1196 VisitTypeDecl(D); 1197 1198 Record.push_back(D->wasDeclaredWithTypename()); 1199 Record.push_back(D->defaultArgumentWasInherited()); 1200 Writer.AddTypeSourceInfo(D->getDefaultArgumentInfo(), Record); 1201 1202 Code = serialization::DECL_TEMPLATE_TYPE_PARM; 1203 } 1204 1205 void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 1206 // For an expanded parameter pack, record the number of expansion types here 1207 // so that it's easier for 1208 if (D->isExpandedParameterPack()) 1209 Record.push_back(D->getNumExpansionTypes()); 1210 1211 VisitDeclaratorDecl(D); 1212 // TemplateParmPosition. 1213 Record.push_back(D->getDepth()); 1214 Record.push_back(D->getPosition()); 1215 1216 if (D->isExpandedParameterPack()) { 1217 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) { 1218 Writer.AddTypeRef(D->getExpansionType(I), Record); 1219 Writer.AddTypeSourceInfo(D->getExpansionTypeSourceInfo(I), Record); 1220 } 1221 1222 Code = serialization::DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK; 1223 } else { 1224 // Rest of NonTypeTemplateParmDecl. 1225 Record.push_back(D->isParameterPack()); 1226 Record.push_back(D->getDefaultArgument() != 0); 1227 if (D->getDefaultArgument()) { 1228 Writer.AddStmt(D->getDefaultArgument()); 1229 Record.push_back(D->defaultArgumentWasInherited()); 1230 } 1231 Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM; 1232 } 1233 } 1234 1235 void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 1236 VisitTemplateDecl(D); 1237 // TemplateParmPosition. 1238 Record.push_back(D->getDepth()); 1239 Record.push_back(D->getPosition()); 1240 // Rest of TemplateTemplateParmDecl. 1241 Writer.AddTemplateArgumentLoc(D->getDefaultArgument(), Record); 1242 Record.push_back(D->defaultArgumentWasInherited()); 1243 Record.push_back(D->isParameterPack()); 1244 Code = serialization::DECL_TEMPLATE_TEMPLATE_PARM; 1245 } 1246 1247 void ASTDeclWriter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 1248 VisitRedeclarableTemplateDecl(D); 1249 Code = serialization::DECL_TYPE_ALIAS_TEMPLATE; 1250 } 1251 1252 void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) { 1253 VisitDecl(D); 1254 Writer.AddStmt(D->getAssertExpr()); 1255 Writer.AddStmt(D->getMessage()); 1256 Writer.AddSourceLocation(D->getRParenLoc(), Record); 1257 Code = serialization::DECL_STATIC_ASSERT; 1258 } 1259 1260 /// \brief Emit the DeclContext part of a declaration context decl. 1261 /// 1262 /// \param LexicalOffset the offset at which the DECL_CONTEXT_LEXICAL 1263 /// block for this declaration context is stored. May be 0 to indicate 1264 /// that there are no declarations stored within this context. 1265 /// 1266 /// \param VisibleOffset the offset at which the DECL_CONTEXT_VISIBLE 1267 /// block for this declaration context is stored. May be 0 to indicate 1268 /// that there are no declarations visible from this context. Note 1269 /// that this value will not be emitted for non-primary declaration 1270 /// contexts. 1271 void ASTDeclWriter::VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset, 1272 uint64_t VisibleOffset) { 1273 Record.push_back(LexicalOffset); 1274 Record.push_back(VisibleOffset); 1275 } 1276 1277 template <typename T> 1278 void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) { 1279 enum { FirstDeclaration = 0, FirstInFile, PointsToPrevious }; 1280 T *Prev = D->getPreviousDeclaration(); 1281 T *First = D->getFirstDeclaration(); 1282 1283 if (!Prev) { 1284 Record.push_back(FirstDeclaration); 1285 } else { 1286 Record.push_back(Prev->isFromASTFile()? FirstInFile : PointsToPrevious); 1287 Writer.AddDeclRef(First, Record); 1288 Writer.AddDeclRef(D->getPreviousDeclaration(), Record); 1289 } 1290 1291 if (D->RedeclLink.getPointer() != D && (!Prev || Prev->isFromASTFile())) { 1292 // Capture the set of redeclarations in this file. 1293 LocalRedeclarationsInfo LocalInfo = { 1294 Writer.GetDeclRef(First), 1295 Writer.GetDeclRef(static_cast<T*>(D)), 1296 Writer.GetDeclRef(D->getMostRecentDeclaration()) 1297 }; 1298 Writer.LocalRedeclarations.push_back(LocalInfo); 1299 } 1300 } 1301 1302 //===----------------------------------------------------------------------===// 1303 // ASTWriter Implementation 1304 //===----------------------------------------------------------------------===// 1305 1306 void ASTWriter::WriteDeclsBlockAbbrevs() { 1307 using namespace llvm; 1308 1309 BitCodeAbbrev *Abv; 1310 1311 // Abbreviation for DECL_FIELD 1312 Abv = new BitCodeAbbrev(); 1313 Abv->Add(BitCodeAbbrevOp(serialization::DECL_FIELD)); 1314 // Decl 1315 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1316 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1317 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1318 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1319 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1320 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1321 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1322 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1323 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // AccessSpecifier 1324 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1325 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1326 // NamedDecl 1327 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1328 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1329 // ValueDecl 1330 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1331 // DeclaratorDecl 1332 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc 1333 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1334 // FieldDecl 1335 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable 1336 Abv->Add(BitCodeAbbrevOp(0)); //getBitWidth 1337 // Type Source Info 1338 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1339 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1340 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc 1341 DeclFieldAbbrev = Stream.EmitAbbrev(Abv); 1342 1343 // Abbreviation for DECL_OBJC_IVAR 1344 Abv = new BitCodeAbbrev(); 1345 Abv->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR)); 1346 // Decl 1347 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1348 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1349 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1350 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1351 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1352 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1353 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1354 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1355 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // AccessSpecifier 1356 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1357 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1358 // NamedDecl 1359 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1360 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1361 // ValueDecl 1362 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1363 // DeclaratorDecl 1364 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc 1365 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1366 // FieldDecl 1367 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable 1368 Abv->Add(BitCodeAbbrevOp(0)); //getBitWidth 1369 // ObjC Ivar 1370 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl 1371 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize 1372 // Type Source Info 1373 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1374 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1375 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc 1376 DeclObjCIvarAbbrev = Stream.EmitAbbrev(Abv); 1377 1378 // Abbreviation for DECL_ENUM 1379 Abv = new BitCodeAbbrev(); 1380 Abv->Add(BitCodeAbbrevOp(serialization::DECL_ENUM)); 1381 // Redeclarable 1382 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration 1383 // Decl 1384 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1385 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1386 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1387 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1388 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1389 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1390 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1391 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1392 Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier 1393 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1394 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1395 // NamedDecl 1396 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1397 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1398 // TypeDecl 1399 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location 1400 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref 1401 // TagDecl 1402 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace 1403 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getTagKind 1404 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition 1405 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator 1406 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding 1407 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation 1408 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1409 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypedefNameAnonDecl 1410 // EnumDecl 1411 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddTypeRef 1412 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IntegerType 1413 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getPromotionType 1414 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getNumPositiveBits 1415 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getNumNegativeBits 1416 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScoped 1417 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScopedUsingClassTag 1418 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isFixed 1419 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InstantiatedMembEnum 1420 // DC 1421 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset 1422 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset 1423 DeclEnumAbbrev = Stream.EmitAbbrev(Abv); 1424 1425 // Abbreviation for DECL_RECORD 1426 Abv = new BitCodeAbbrev(); 1427 Abv->Add(BitCodeAbbrevOp(serialization::DECL_RECORD)); 1428 // Redeclarable 1429 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration 1430 // Decl 1431 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1432 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1433 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1434 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1435 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1436 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1437 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1438 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1439 Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier 1440 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1441 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1442 // NamedDecl 1443 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1444 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1445 // TypeDecl 1446 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location 1447 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref 1448 // TagDecl 1449 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace 1450 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getTagKind 1451 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition 1452 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator 1453 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding 1454 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation 1455 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1456 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypedefNameAnonDecl 1457 // RecordDecl 1458 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // FlexibleArrayMember 1459 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // AnonymousStructUnion 1460 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // hasObjectMember 1461 // DC 1462 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset 1463 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset 1464 DeclRecordAbbrev = Stream.EmitAbbrev(Abv); 1465 1466 // Abbreviation for DECL_PARM_VAR 1467 Abv = new BitCodeAbbrev(); 1468 Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR)); 1469 // Redeclarable 1470 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration 1471 // Decl 1472 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1473 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1474 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1475 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1476 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1477 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1478 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1479 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1480 Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier 1481 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1482 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1483 // NamedDecl 1484 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1485 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1486 // ValueDecl 1487 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1488 // DeclaratorDecl 1489 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc 1490 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1491 // VarDecl 1492 Abv->Add(BitCodeAbbrevOp(0)); // StorageClass 1493 Abv->Add(BitCodeAbbrevOp(0)); // StorageClassAsWritten 1494 Abv->Add(BitCodeAbbrevOp(0)); // isThreadSpecified 1495 Abv->Add(BitCodeAbbrevOp(0)); // hasCXXDirectInitializer 1496 Abv->Add(BitCodeAbbrevOp(0)); // isExceptionVariable 1497 Abv->Add(BitCodeAbbrevOp(0)); // isNRVOVariable 1498 Abv->Add(BitCodeAbbrevOp(0)); // isCXXForRangeDecl 1499 Abv->Add(BitCodeAbbrevOp(0)); // isARCPseudoStrong 1500 Abv->Add(BitCodeAbbrevOp(0)); // HasInit 1501 Abv->Add(BitCodeAbbrevOp(0)); // HasMemberSpecializationInfo 1502 // ParmVarDecl 1503 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsObjCMethodParameter 1504 Abv->Add(BitCodeAbbrevOp(0)); // ScopeDepth 1505 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ScopeIndex 1506 Abv->Add(BitCodeAbbrevOp(0)); // ObjCDeclQualifier 1507 Abv->Add(BitCodeAbbrevOp(0)); // KNRPromoted 1508 Abv->Add(BitCodeAbbrevOp(0)); // HasInheritedDefaultArg 1509 Abv->Add(BitCodeAbbrevOp(0)); // HasUninstantiatedDefaultArg 1510 // Type Source Info 1511 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1512 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1513 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc 1514 DeclParmVarAbbrev = Stream.EmitAbbrev(Abv); 1515 1516 // Abbreviation for DECL_TYPEDEF 1517 Abv = new BitCodeAbbrev(); 1518 Abv->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF)); 1519 // Redeclarable 1520 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration 1521 // Decl 1522 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1523 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1524 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1525 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1526 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1527 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1528 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1529 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1530 Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier 1531 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1532 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1533 // NamedDecl 1534 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1535 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1536 // TypeDecl 1537 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location 1538 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref 1539 // TypedefDecl 1540 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1541 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc 1542 DeclTypedefAbbrev = Stream.EmitAbbrev(Abv); 1543 1544 // Abbreviation for DECL_VAR 1545 Abv = new BitCodeAbbrev(); 1546 Abv->Add(BitCodeAbbrevOp(serialization::DECL_VAR)); 1547 // Redeclarable 1548 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration 1549 // Decl 1550 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext 1551 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalDeclContext 1552 Abv->Add(BitCodeAbbrevOp(0)); // isInvalidDecl (!?) 1553 Abv->Add(BitCodeAbbrevOp(0)); // HasAttrs 1554 Abv->Add(BitCodeAbbrevOp(0)); // isImplicit 1555 Abv->Add(BitCodeAbbrevOp(0)); // isUsed 1556 Abv->Add(BitCodeAbbrevOp(0)); // isReferenced 1557 Abv->Add(BitCodeAbbrevOp(0)); // TopLevelDeclInObjCContainer 1558 Abv->Add(BitCodeAbbrevOp(AS_none)); // C++ AccessSpecifier 1559 Abv->Add(BitCodeAbbrevOp(0)); // ModulePrivate 1560 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID 1561 // NamedDecl 1562 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier 1563 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name 1564 // ValueDecl 1565 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1566 // DeclaratorDecl 1567 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc 1568 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo 1569 // VarDecl 1570 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClass 1571 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClassAsWritten 1572 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isThreadSpecified 1573 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // CXXDirectInitializer 1574 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable 1575 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable 1576 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl 1577 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong 1578 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit 1579 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo 1580 // Type Source Info 1581 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1582 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1583 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc 1584 DeclVarAbbrev = Stream.EmitAbbrev(Abv); 1585 1586 // Abbreviation for EXPR_DECL_REF 1587 Abv = new BitCodeAbbrev(); 1588 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF)); 1589 //Stmt 1590 //Expr 1591 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1592 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent 1593 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent 1594 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent 1595 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack 1596 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind 1597 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind 1598 //DeclRefExpr 1599 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HasQualifier 1600 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //GetDeclFound 1601 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ExplicitTemplateArgs 1602 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HadMultipleCandidates 1603 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclRef 1604 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location 1605 DeclRefExprAbbrev = Stream.EmitAbbrev(Abv); 1606 1607 // Abbreviation for EXPR_INTEGER_LITERAL 1608 Abv = new BitCodeAbbrev(); 1609 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_INTEGER_LITERAL)); 1610 //Stmt 1611 //Expr 1612 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1613 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent 1614 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent 1615 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent 1616 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack 1617 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind 1618 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind 1619 //Integer Literal 1620 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location 1621 Abv->Add(BitCodeAbbrevOp(32)); // Bit Width 1622 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Value 1623 IntegerLiteralAbbrev = Stream.EmitAbbrev(Abv); 1624 1625 // Abbreviation for EXPR_CHARACTER_LITERAL 1626 Abv = new BitCodeAbbrev(); 1627 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CHARACTER_LITERAL)); 1628 //Stmt 1629 //Expr 1630 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 1631 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent 1632 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent 1633 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent 1634 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack 1635 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind 1636 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind 1637 //Character Literal 1638 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getValue 1639 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location 1640 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //IsWide 1641 CharacterLiteralAbbrev = Stream.EmitAbbrev(Abv); 1642 1643 Abv = new BitCodeAbbrev(); 1644 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_LEXICAL)); 1645 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 1646 DeclContextLexicalAbbrev = Stream.EmitAbbrev(Abv); 1647 1648 Abv = new BitCodeAbbrev(); 1649 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_VISIBLE)); 1650 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1651 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 1652 DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(Abv); 1653 } 1654 1655 /// isRequiredDecl - Check if this is a "required" Decl, which must be seen by 1656 /// consumers of the AST. 1657 /// 1658 /// Such decls will always be deserialized from the AST file, so we would like 1659 /// this to be as restrictive as possible. Currently the predicate is driven by 1660 /// code generation requirements, if other clients have a different notion of 1661 /// what is "required" then we may have to consider an alternate scheme where 1662 /// clients can iterate over the top-level decls and get information on them, 1663 /// without necessary deserializing them. We could explicitly require such 1664 /// clients to use a separate API call to "realize" the decl. This should be 1665 /// relatively painless since they would presumably only do it for top-level 1666 /// decls. 1667 static bool isRequiredDecl(const Decl *D, ASTContext &Context) { 1668 // An ObjCMethodDecl is never considered as "required" because its 1669 // implementation container always is. 1670 1671 // File scoped assembly or obj-c implementation must be seen. 1672 if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplDecl>(D)) 1673 return true; 1674 1675 return Context.DeclMustBeEmitted(D); 1676 } 1677 1678 void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) { 1679 // Switch case IDs are per Decl. 1680 ClearSwitchCaseIDs(); 1681 1682 RecordData Record; 1683 ASTDeclWriter W(*this, Context, Record); 1684 1685 // If this declaration is also a DeclContext, write blocks for the 1686 // declarations that lexically stored inside its context and those 1687 // declarations that are visible from its context. These blocks 1688 // are written before the declaration itself so that we can put 1689 // their offsets into the record for the declaration. 1690 uint64_t LexicalOffset = 0; 1691 uint64_t VisibleOffset = 0; 1692 DeclContext *DC = dyn_cast<DeclContext>(D); 1693 if (DC) { 1694 LexicalOffset = WriteDeclContextLexicalBlock(Context, DC); 1695 VisibleOffset = WriteDeclContextVisibleBlock(Context, DC); 1696 } 1697 1698 // Determine the ID for this declaration 1699 serialization::DeclID &IDR = DeclIDs[D]; 1700 if (IDR == 0) 1701 IDR = NextDeclID++; 1702 serialization::DeclID ID = IDR; 1703 1704 if (ID < FirstDeclID) { 1705 // We're replacing a decl in a previous file. 1706 ReplacedDecls.push_back(ReplacedDeclInfo(ID, Stream.GetCurrentBitNo(), 1707 D->getLocation())); 1708 } else { 1709 unsigned Index = ID - FirstDeclID; 1710 1711 // Record the offset for this declaration 1712 SourceLocation Loc = D->getLocation(); 1713 if (DeclOffsets.size() == Index) 1714 DeclOffsets.push_back(DeclOffset(Loc, Stream.GetCurrentBitNo())); 1715 else if (DeclOffsets.size() < Index) { 1716 DeclOffsets.resize(Index+1); 1717 DeclOffsets[Index].setLocation(Loc); 1718 DeclOffsets[Index].BitOffset = Stream.GetCurrentBitNo(); 1719 } 1720 1721 SourceManager &SM = Context.getSourceManager(); 1722 if (Loc.isValid() && SM.isLocalSourceLocation(Loc)) 1723 associateDeclWithFile(D, ID); 1724 } 1725 1726 // Build and emit a record for this declaration 1727 Record.clear(); 1728 W.Code = (serialization::DeclCode)0; 1729 W.AbbrevToUse = 0; 1730 W.Visit(D); 1731 if (DC) W.VisitDeclContext(DC, LexicalOffset, VisibleOffset); 1732 1733 if (!W.Code) 1734 llvm::report_fatal_error(StringRef("unexpected declaration kind '") + 1735 D->getDeclKindName() + "'"); 1736 Stream.EmitRecord(W.Code, Record, W.AbbrevToUse); 1737 1738 // Flush any expressions that were written as part of this declaration. 1739 FlushStmts(); 1740 1741 // Flush C++ base specifiers, if there are any. 1742 FlushCXXBaseSpecifiers(); 1743 1744 // Note "external" declarations so that we can add them to a record in the 1745 // AST file later. 1746 // 1747 // FIXME: This should be renamed, the predicate is much more complicated. 1748 if (isRequiredDecl(D, Context)) 1749 ExternalDefinitions.push_back(ID); 1750 } 1751