1 //===--- ASTWriter.cpp - AST File Writer ----------------------------------===// 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 defines the ASTWriter class, which writes AST files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Serialization/ASTWriter.h" 15 #include "ASTCommon.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/Decl.h" 18 #include "clang/AST/DeclContextInternals.h" 19 #include "clang/AST/DeclFriend.h" 20 #include "clang/AST/DeclLookups.h" 21 #include "clang/AST/DeclTemplate.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/Type.h" 25 #include "clang/AST/TypeLocVisitor.h" 26 #include "clang/Basic/DiagnosticOptions.h" 27 #include "clang/Basic/FileManager.h" 28 #include "clang/Basic/FileSystemStatCache.h" 29 #include "clang/Basic/SourceManager.h" 30 #include "clang/Basic/SourceManagerInternals.h" 31 #include "clang/Basic/TargetInfo.h" 32 #include "clang/Basic/TargetOptions.h" 33 #include "clang/Basic/Version.h" 34 #include "clang/Basic/VersionTuple.h" 35 #include "clang/Lex/HeaderSearch.h" 36 #include "clang/Lex/HeaderSearchOptions.h" 37 #include "clang/Lex/MacroInfo.h" 38 #include "clang/Lex/PreprocessingRecord.h" 39 #include "clang/Lex/Preprocessor.h" 40 #include "clang/Lex/PreprocessorOptions.h" 41 #include "clang/Sema/IdentifierResolver.h" 42 #include "clang/Sema/Sema.h" 43 #include "clang/Serialization/ASTReader.h" 44 #include "llvm/ADT/APFloat.h" 45 #include "llvm/ADT/APInt.h" 46 #include "llvm/ADT/Hashing.h" 47 #include "llvm/ADT/StringExtras.h" 48 #include "llvm/Bitcode/BitstreamWriter.h" 49 #include "llvm/Support/EndianStream.h" 50 #include "llvm/Support/FileSystem.h" 51 #include "llvm/Support/MemoryBuffer.h" 52 #include "llvm/Support/OnDiskHashTable.h" 53 #include "llvm/Support/Path.h" 54 #include "llvm/Support/Process.h" 55 #include <algorithm> 56 #include <cstdio> 57 #include <string.h> 58 #include <utility> 59 using namespace clang; 60 using namespace clang::serialization; 61 62 template <typename T, typename Allocator> 63 static StringRef bytes(const std::vector<T, Allocator> &v) { 64 if (v.empty()) return StringRef(); 65 return StringRef(reinterpret_cast<const char*>(&v[0]), 66 sizeof(T) * v.size()); 67 } 68 69 template <typename T> 70 static StringRef bytes(const SmallVectorImpl<T> &v) { 71 return StringRef(reinterpret_cast<const char*>(v.data()), 72 sizeof(T) * v.size()); 73 } 74 75 //===----------------------------------------------------------------------===// 76 // Type serialization 77 //===----------------------------------------------------------------------===// 78 79 namespace { 80 class ASTTypeWriter { 81 ASTWriter &Writer; 82 ASTWriter::RecordDataImpl &Record; 83 84 public: 85 /// \brief Type code that corresponds to the record generated. 86 TypeCode Code; 87 /// \brief Abbreviation to use for the record, if any. 88 unsigned AbbrevToUse; 89 90 ASTTypeWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record) 91 : Writer(Writer), Record(Record), Code(TYPE_EXT_QUAL) { } 92 93 void VisitArrayType(const ArrayType *T); 94 void VisitFunctionType(const FunctionType *T); 95 void VisitTagType(const TagType *T); 96 97 #define TYPE(Class, Base) void Visit##Class##Type(const Class##Type *T); 98 #define ABSTRACT_TYPE(Class, Base) 99 #include "clang/AST/TypeNodes.def" 100 }; 101 } 102 103 void ASTTypeWriter::VisitBuiltinType(const BuiltinType *T) { 104 llvm_unreachable("Built-in types are never serialized"); 105 } 106 107 void ASTTypeWriter::VisitComplexType(const ComplexType *T) { 108 Writer.AddTypeRef(T->getElementType(), Record); 109 Code = TYPE_COMPLEX; 110 } 111 112 void ASTTypeWriter::VisitPointerType(const PointerType *T) { 113 Writer.AddTypeRef(T->getPointeeType(), Record); 114 Code = TYPE_POINTER; 115 } 116 117 void ASTTypeWriter::VisitDecayedType(const DecayedType *T) { 118 Writer.AddTypeRef(T->getOriginalType(), Record); 119 Code = TYPE_DECAYED; 120 } 121 122 void ASTTypeWriter::VisitAdjustedType(const AdjustedType *T) { 123 Writer.AddTypeRef(T->getOriginalType(), Record); 124 Writer.AddTypeRef(T->getAdjustedType(), Record); 125 Code = TYPE_ADJUSTED; 126 } 127 128 void ASTTypeWriter::VisitBlockPointerType(const BlockPointerType *T) { 129 Writer.AddTypeRef(T->getPointeeType(), Record); 130 Code = TYPE_BLOCK_POINTER; 131 } 132 133 void ASTTypeWriter::VisitLValueReferenceType(const LValueReferenceType *T) { 134 Writer.AddTypeRef(T->getPointeeTypeAsWritten(), Record); 135 Record.push_back(T->isSpelledAsLValue()); 136 Code = TYPE_LVALUE_REFERENCE; 137 } 138 139 void ASTTypeWriter::VisitRValueReferenceType(const RValueReferenceType *T) { 140 Writer.AddTypeRef(T->getPointeeTypeAsWritten(), Record); 141 Code = TYPE_RVALUE_REFERENCE; 142 } 143 144 void ASTTypeWriter::VisitMemberPointerType(const MemberPointerType *T) { 145 Writer.AddTypeRef(T->getPointeeType(), Record); 146 Writer.AddTypeRef(QualType(T->getClass(), 0), Record); 147 Code = TYPE_MEMBER_POINTER; 148 } 149 150 void ASTTypeWriter::VisitArrayType(const ArrayType *T) { 151 Writer.AddTypeRef(T->getElementType(), Record); 152 Record.push_back(T->getSizeModifier()); // FIXME: stable values 153 Record.push_back(T->getIndexTypeCVRQualifiers()); // FIXME: stable values 154 } 155 156 void ASTTypeWriter::VisitConstantArrayType(const ConstantArrayType *T) { 157 VisitArrayType(T); 158 Writer.AddAPInt(T->getSize(), Record); 159 Code = TYPE_CONSTANT_ARRAY; 160 } 161 162 void ASTTypeWriter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 163 VisitArrayType(T); 164 Code = TYPE_INCOMPLETE_ARRAY; 165 } 166 167 void ASTTypeWriter::VisitVariableArrayType(const VariableArrayType *T) { 168 VisitArrayType(T); 169 Writer.AddSourceLocation(T->getLBracketLoc(), Record); 170 Writer.AddSourceLocation(T->getRBracketLoc(), Record); 171 Writer.AddStmt(T->getSizeExpr()); 172 Code = TYPE_VARIABLE_ARRAY; 173 } 174 175 void ASTTypeWriter::VisitVectorType(const VectorType *T) { 176 Writer.AddTypeRef(T->getElementType(), Record); 177 Record.push_back(T->getNumElements()); 178 Record.push_back(T->getVectorKind()); 179 Code = TYPE_VECTOR; 180 } 181 182 void ASTTypeWriter::VisitExtVectorType(const ExtVectorType *T) { 183 VisitVectorType(T); 184 Code = TYPE_EXT_VECTOR; 185 } 186 187 void ASTTypeWriter::VisitFunctionType(const FunctionType *T) { 188 Writer.AddTypeRef(T->getReturnType(), Record); 189 FunctionType::ExtInfo C = T->getExtInfo(); 190 Record.push_back(C.getNoReturn()); 191 Record.push_back(C.getHasRegParm()); 192 Record.push_back(C.getRegParm()); 193 // FIXME: need to stabilize encoding of calling convention... 194 Record.push_back(C.getCC()); 195 Record.push_back(C.getProducesResult()); 196 197 if (C.getHasRegParm() || C.getRegParm() || C.getProducesResult()) 198 AbbrevToUse = 0; 199 } 200 201 void ASTTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 202 VisitFunctionType(T); 203 Code = TYPE_FUNCTION_NO_PROTO; 204 } 205 206 static void addExceptionSpec(ASTWriter &Writer, const FunctionProtoType *T, 207 ASTWriter::RecordDataImpl &Record) { 208 Record.push_back(T->getExceptionSpecType()); 209 if (T->getExceptionSpecType() == EST_Dynamic) { 210 Record.push_back(T->getNumExceptions()); 211 for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I) 212 Writer.AddTypeRef(T->getExceptionType(I), Record); 213 } else if (T->getExceptionSpecType() == EST_ComputedNoexcept) { 214 Writer.AddStmt(T->getNoexceptExpr()); 215 } else if (T->getExceptionSpecType() == EST_Uninstantiated) { 216 Writer.AddDeclRef(T->getExceptionSpecDecl(), Record); 217 Writer.AddDeclRef(T->getExceptionSpecTemplate(), Record); 218 } else if (T->getExceptionSpecType() == EST_Unevaluated) { 219 Writer.AddDeclRef(T->getExceptionSpecDecl(), Record); 220 } 221 } 222 223 void ASTTypeWriter::VisitFunctionProtoType(const FunctionProtoType *T) { 224 VisitFunctionType(T); 225 226 Record.push_back(T->isVariadic()); 227 Record.push_back(T->hasTrailingReturn()); 228 Record.push_back(T->getTypeQuals()); 229 Record.push_back(static_cast<unsigned>(T->getRefQualifier())); 230 addExceptionSpec(Writer, T, Record); 231 232 Record.push_back(T->getNumParams()); 233 for (unsigned I = 0, N = T->getNumParams(); I != N; ++I) 234 Writer.AddTypeRef(T->getParamType(I), Record); 235 236 if (T->isVariadic() || T->hasTrailingReturn() || T->getTypeQuals() || 237 T->getRefQualifier() || T->getExceptionSpecType() != EST_None) 238 AbbrevToUse = 0; 239 240 Code = TYPE_FUNCTION_PROTO; 241 } 242 243 void ASTTypeWriter::VisitUnresolvedUsingType(const UnresolvedUsingType *T) { 244 Writer.AddDeclRef(T->getDecl(), Record); 245 Code = TYPE_UNRESOLVED_USING; 246 } 247 248 void ASTTypeWriter::VisitTypedefType(const TypedefType *T) { 249 Writer.AddDeclRef(T->getDecl(), Record); 250 assert(!T->isCanonicalUnqualified() && "Invalid typedef ?"); 251 Writer.AddTypeRef(T->getCanonicalTypeInternal(), Record); 252 Code = TYPE_TYPEDEF; 253 } 254 255 void ASTTypeWriter::VisitTypeOfExprType(const TypeOfExprType *T) { 256 Writer.AddStmt(T->getUnderlyingExpr()); 257 Code = TYPE_TYPEOF_EXPR; 258 } 259 260 void ASTTypeWriter::VisitTypeOfType(const TypeOfType *T) { 261 Writer.AddTypeRef(T->getUnderlyingType(), Record); 262 Code = TYPE_TYPEOF; 263 } 264 265 void ASTTypeWriter::VisitDecltypeType(const DecltypeType *T) { 266 Writer.AddTypeRef(T->getUnderlyingType(), Record); 267 Writer.AddStmt(T->getUnderlyingExpr()); 268 Code = TYPE_DECLTYPE; 269 } 270 271 void ASTTypeWriter::VisitUnaryTransformType(const UnaryTransformType *T) { 272 Writer.AddTypeRef(T->getBaseType(), Record); 273 Writer.AddTypeRef(T->getUnderlyingType(), Record); 274 Record.push_back(T->getUTTKind()); 275 Code = TYPE_UNARY_TRANSFORM; 276 } 277 278 void ASTTypeWriter::VisitAutoType(const AutoType *T) { 279 Writer.AddTypeRef(T->getDeducedType(), Record); 280 Record.push_back(T->isDecltypeAuto()); 281 if (T->getDeducedType().isNull()) 282 Record.push_back(T->isDependentType()); 283 Code = TYPE_AUTO; 284 } 285 286 void ASTTypeWriter::VisitTagType(const TagType *T) { 287 Record.push_back(T->isDependentType()); 288 Writer.AddDeclRef(T->getDecl()->getCanonicalDecl(), Record); 289 assert(!T->isBeingDefined() && 290 "Cannot serialize in the middle of a type definition"); 291 } 292 293 void ASTTypeWriter::VisitRecordType(const RecordType *T) { 294 VisitTagType(T); 295 Code = TYPE_RECORD; 296 } 297 298 void ASTTypeWriter::VisitEnumType(const EnumType *T) { 299 VisitTagType(T); 300 Code = TYPE_ENUM; 301 } 302 303 void ASTTypeWriter::VisitAttributedType(const AttributedType *T) { 304 Writer.AddTypeRef(T->getModifiedType(), Record); 305 Writer.AddTypeRef(T->getEquivalentType(), Record); 306 Record.push_back(T->getAttrKind()); 307 Code = TYPE_ATTRIBUTED; 308 } 309 310 void 311 ASTTypeWriter::VisitSubstTemplateTypeParmType( 312 const SubstTemplateTypeParmType *T) { 313 Writer.AddTypeRef(QualType(T->getReplacedParameter(), 0), Record); 314 Writer.AddTypeRef(T->getReplacementType(), Record); 315 Code = TYPE_SUBST_TEMPLATE_TYPE_PARM; 316 } 317 318 void 319 ASTTypeWriter::VisitSubstTemplateTypeParmPackType( 320 const SubstTemplateTypeParmPackType *T) { 321 Writer.AddTypeRef(QualType(T->getReplacedParameter(), 0), Record); 322 Writer.AddTemplateArgument(T->getArgumentPack(), Record); 323 Code = TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK; 324 } 325 326 void 327 ASTTypeWriter::VisitTemplateSpecializationType( 328 const TemplateSpecializationType *T) { 329 Record.push_back(T->isDependentType()); 330 Writer.AddTemplateName(T->getTemplateName(), Record); 331 Record.push_back(T->getNumArgs()); 332 for (TemplateSpecializationType::iterator ArgI = T->begin(), ArgE = T->end(); 333 ArgI != ArgE; ++ArgI) 334 Writer.AddTemplateArgument(*ArgI, Record); 335 Writer.AddTypeRef(T->isTypeAlias() ? T->getAliasedType() : 336 T->isCanonicalUnqualified() ? QualType() 337 : T->getCanonicalTypeInternal(), 338 Record); 339 Code = TYPE_TEMPLATE_SPECIALIZATION; 340 } 341 342 void 343 ASTTypeWriter::VisitDependentSizedArrayType(const DependentSizedArrayType *T) { 344 VisitArrayType(T); 345 Writer.AddStmt(T->getSizeExpr()); 346 Writer.AddSourceRange(T->getBracketsRange(), Record); 347 Code = TYPE_DEPENDENT_SIZED_ARRAY; 348 } 349 350 void 351 ASTTypeWriter::VisitDependentSizedExtVectorType( 352 const DependentSizedExtVectorType *T) { 353 // FIXME: Serialize this type (C++ only) 354 llvm_unreachable("Cannot serialize dependent sized extended vector types"); 355 } 356 357 void 358 ASTTypeWriter::VisitTemplateTypeParmType(const TemplateTypeParmType *T) { 359 Record.push_back(T->getDepth()); 360 Record.push_back(T->getIndex()); 361 Record.push_back(T->isParameterPack()); 362 Writer.AddDeclRef(T->getDecl(), Record); 363 Code = TYPE_TEMPLATE_TYPE_PARM; 364 } 365 366 void 367 ASTTypeWriter::VisitDependentNameType(const DependentNameType *T) { 368 Record.push_back(T->getKeyword()); 369 Writer.AddNestedNameSpecifier(T->getQualifier(), Record); 370 Writer.AddIdentifierRef(T->getIdentifier(), Record); 371 Writer.AddTypeRef(T->isCanonicalUnqualified() ? QualType() 372 : T->getCanonicalTypeInternal(), 373 Record); 374 Code = TYPE_DEPENDENT_NAME; 375 } 376 377 void 378 ASTTypeWriter::VisitDependentTemplateSpecializationType( 379 const DependentTemplateSpecializationType *T) { 380 Record.push_back(T->getKeyword()); 381 Writer.AddNestedNameSpecifier(T->getQualifier(), Record); 382 Writer.AddIdentifierRef(T->getIdentifier(), Record); 383 Record.push_back(T->getNumArgs()); 384 for (DependentTemplateSpecializationType::iterator 385 I = T->begin(), E = T->end(); I != E; ++I) 386 Writer.AddTemplateArgument(*I, Record); 387 Code = TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION; 388 } 389 390 void ASTTypeWriter::VisitPackExpansionType(const PackExpansionType *T) { 391 Writer.AddTypeRef(T->getPattern(), Record); 392 if (Optional<unsigned> NumExpansions = T->getNumExpansions()) 393 Record.push_back(*NumExpansions + 1); 394 else 395 Record.push_back(0); 396 Code = TYPE_PACK_EXPANSION; 397 } 398 399 void ASTTypeWriter::VisitParenType(const ParenType *T) { 400 Writer.AddTypeRef(T->getInnerType(), Record); 401 Code = TYPE_PAREN; 402 } 403 404 void ASTTypeWriter::VisitElaboratedType(const ElaboratedType *T) { 405 Record.push_back(T->getKeyword()); 406 Writer.AddNestedNameSpecifier(T->getQualifier(), Record); 407 Writer.AddTypeRef(T->getNamedType(), Record); 408 Code = TYPE_ELABORATED; 409 } 410 411 void ASTTypeWriter::VisitInjectedClassNameType(const InjectedClassNameType *T) { 412 Writer.AddDeclRef(T->getDecl()->getCanonicalDecl(), Record); 413 Writer.AddTypeRef(T->getInjectedSpecializationType(), Record); 414 Code = TYPE_INJECTED_CLASS_NAME; 415 } 416 417 void ASTTypeWriter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 418 Writer.AddDeclRef(T->getDecl()->getCanonicalDecl(), Record); 419 Code = TYPE_OBJC_INTERFACE; 420 } 421 422 void ASTTypeWriter::VisitObjCObjectType(const ObjCObjectType *T) { 423 Writer.AddTypeRef(T->getBaseType(), Record); 424 Record.push_back(T->getTypeArgsAsWritten().size()); 425 for (auto TypeArg : T->getTypeArgsAsWritten()) 426 Writer.AddTypeRef(TypeArg, Record); 427 Record.push_back(T->getNumProtocols()); 428 for (const auto *I : T->quals()) 429 Writer.AddDeclRef(I, Record); 430 Record.push_back(T->isKindOfTypeAsWritten()); 431 Code = TYPE_OBJC_OBJECT; 432 } 433 434 void 435 ASTTypeWriter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 436 Writer.AddTypeRef(T->getPointeeType(), Record); 437 Code = TYPE_OBJC_OBJECT_POINTER; 438 } 439 440 void 441 ASTTypeWriter::VisitAtomicType(const AtomicType *T) { 442 Writer.AddTypeRef(T->getValueType(), Record); 443 Code = TYPE_ATOMIC; 444 } 445 446 namespace { 447 448 class TypeLocWriter : public TypeLocVisitor<TypeLocWriter> { 449 ASTWriter &Writer; 450 ASTWriter::RecordDataImpl &Record; 451 452 public: 453 TypeLocWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record) 454 : Writer(Writer), Record(Record) { } 455 456 #define ABSTRACT_TYPELOC(CLASS, PARENT) 457 #define TYPELOC(CLASS, PARENT) \ 458 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 459 #include "clang/AST/TypeLocNodes.def" 460 461 void VisitArrayTypeLoc(ArrayTypeLoc TyLoc); 462 void VisitFunctionTypeLoc(FunctionTypeLoc TyLoc); 463 }; 464 465 } 466 467 void TypeLocWriter::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 468 // nothing to do 469 } 470 void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 471 Writer.AddSourceLocation(TL.getBuiltinLoc(), Record); 472 if (TL.needsExtraLocalData()) { 473 Record.push_back(TL.getWrittenTypeSpec()); 474 Record.push_back(TL.getWrittenSignSpec()); 475 Record.push_back(TL.getWrittenWidthSpec()); 476 Record.push_back(TL.hasModeAttr()); 477 } 478 } 479 void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) { 480 Writer.AddSourceLocation(TL.getNameLoc(), Record); 481 } 482 void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) { 483 Writer.AddSourceLocation(TL.getStarLoc(), Record); 484 } 485 void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 486 // nothing to do 487 } 488 void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 489 // nothing to do 490 } 491 void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 492 Writer.AddSourceLocation(TL.getCaretLoc(), Record); 493 } 494 void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 495 Writer.AddSourceLocation(TL.getAmpLoc(), Record); 496 } 497 void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 498 Writer.AddSourceLocation(TL.getAmpAmpLoc(), Record); 499 } 500 void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 501 Writer.AddSourceLocation(TL.getStarLoc(), Record); 502 Writer.AddTypeSourceInfo(TL.getClassTInfo(), Record); 503 } 504 void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) { 505 Writer.AddSourceLocation(TL.getLBracketLoc(), Record); 506 Writer.AddSourceLocation(TL.getRBracketLoc(), Record); 507 Record.push_back(TL.getSizeExpr() ? 1 : 0); 508 if (TL.getSizeExpr()) 509 Writer.AddStmt(TL.getSizeExpr()); 510 } 511 void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 512 VisitArrayTypeLoc(TL); 513 } 514 void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 515 VisitArrayTypeLoc(TL); 516 } 517 void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 518 VisitArrayTypeLoc(TL); 519 } 520 void TypeLocWriter::VisitDependentSizedArrayTypeLoc( 521 DependentSizedArrayTypeLoc TL) { 522 VisitArrayTypeLoc(TL); 523 } 524 void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc( 525 DependentSizedExtVectorTypeLoc TL) { 526 Writer.AddSourceLocation(TL.getNameLoc(), Record); 527 } 528 void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) { 529 Writer.AddSourceLocation(TL.getNameLoc(), Record); 530 } 531 void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 532 Writer.AddSourceLocation(TL.getNameLoc(), Record); 533 } 534 void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 535 Writer.AddSourceLocation(TL.getLocalRangeBegin(), Record); 536 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 537 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 538 Writer.AddSourceLocation(TL.getLocalRangeEnd(), Record); 539 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) 540 Writer.AddDeclRef(TL.getParam(i), Record); 541 } 542 void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 543 VisitFunctionTypeLoc(TL); 544 } 545 void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 546 VisitFunctionTypeLoc(TL); 547 } 548 void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 549 Writer.AddSourceLocation(TL.getNameLoc(), Record); 550 } 551 void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 552 Writer.AddSourceLocation(TL.getNameLoc(), Record); 553 } 554 void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 555 Writer.AddSourceLocation(TL.getTypeofLoc(), Record); 556 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 557 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 558 } 559 void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 560 Writer.AddSourceLocation(TL.getTypeofLoc(), Record); 561 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 562 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 563 Writer.AddTypeSourceInfo(TL.getUnderlyingTInfo(), Record); 564 } 565 void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 566 Writer.AddSourceLocation(TL.getNameLoc(), Record); 567 } 568 void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 569 Writer.AddSourceLocation(TL.getKWLoc(), Record); 570 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 571 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 572 Writer.AddTypeSourceInfo(TL.getUnderlyingTInfo(), Record); 573 } 574 void TypeLocWriter::VisitAutoTypeLoc(AutoTypeLoc TL) { 575 Writer.AddSourceLocation(TL.getNameLoc(), Record); 576 } 577 void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) { 578 Writer.AddSourceLocation(TL.getNameLoc(), Record); 579 } 580 void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { 581 Writer.AddSourceLocation(TL.getNameLoc(), Record); 582 } 583 void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 584 Writer.AddSourceLocation(TL.getAttrNameLoc(), Record); 585 if (TL.hasAttrOperand()) { 586 SourceRange range = TL.getAttrOperandParensRange(); 587 Writer.AddSourceLocation(range.getBegin(), Record); 588 Writer.AddSourceLocation(range.getEnd(), Record); 589 } 590 if (TL.hasAttrExprOperand()) { 591 Expr *operand = TL.getAttrExprOperand(); 592 Record.push_back(operand ? 1 : 0); 593 if (operand) Writer.AddStmt(operand); 594 } else if (TL.hasAttrEnumOperand()) { 595 Writer.AddSourceLocation(TL.getAttrEnumOperandLoc(), Record); 596 } 597 } 598 void TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 599 Writer.AddSourceLocation(TL.getNameLoc(), Record); 600 } 601 void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc( 602 SubstTemplateTypeParmTypeLoc TL) { 603 Writer.AddSourceLocation(TL.getNameLoc(), Record); 604 } 605 void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc( 606 SubstTemplateTypeParmPackTypeLoc TL) { 607 Writer.AddSourceLocation(TL.getNameLoc(), Record); 608 } 609 void TypeLocWriter::VisitTemplateSpecializationTypeLoc( 610 TemplateSpecializationTypeLoc TL) { 611 Writer.AddSourceLocation(TL.getTemplateKeywordLoc(), Record); 612 Writer.AddSourceLocation(TL.getTemplateNameLoc(), Record); 613 Writer.AddSourceLocation(TL.getLAngleLoc(), Record); 614 Writer.AddSourceLocation(TL.getRAngleLoc(), Record); 615 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 616 Writer.AddTemplateArgumentLocInfo(TL.getArgLoc(i).getArgument().getKind(), 617 TL.getArgLoc(i).getLocInfo(), Record); 618 } 619 void TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) { 620 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 621 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 622 } 623 void TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 624 Writer.AddSourceLocation(TL.getElaboratedKeywordLoc(), Record); 625 Writer.AddNestedNameSpecifierLoc(TL.getQualifierLoc(), Record); 626 } 627 void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 628 Writer.AddSourceLocation(TL.getNameLoc(), Record); 629 } 630 void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 631 Writer.AddSourceLocation(TL.getElaboratedKeywordLoc(), Record); 632 Writer.AddNestedNameSpecifierLoc(TL.getQualifierLoc(), Record); 633 Writer.AddSourceLocation(TL.getNameLoc(), Record); 634 } 635 void TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc( 636 DependentTemplateSpecializationTypeLoc TL) { 637 Writer.AddSourceLocation(TL.getElaboratedKeywordLoc(), Record); 638 Writer.AddNestedNameSpecifierLoc(TL.getQualifierLoc(), Record); 639 Writer.AddSourceLocation(TL.getTemplateKeywordLoc(), Record); 640 Writer.AddSourceLocation(TL.getTemplateNameLoc(), Record); 641 Writer.AddSourceLocation(TL.getLAngleLoc(), Record); 642 Writer.AddSourceLocation(TL.getRAngleLoc(), Record); 643 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 644 Writer.AddTemplateArgumentLocInfo(TL.getArgLoc(I).getArgument().getKind(), 645 TL.getArgLoc(I).getLocInfo(), Record); 646 } 647 void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 648 Writer.AddSourceLocation(TL.getEllipsisLoc(), Record); 649 } 650 void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 651 Writer.AddSourceLocation(TL.getNameLoc(), Record); 652 } 653 void TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 654 Record.push_back(TL.hasBaseTypeAsWritten()); 655 Writer.AddSourceLocation(TL.getTypeArgsLAngleLoc(), Record); 656 Writer.AddSourceLocation(TL.getTypeArgsRAngleLoc(), Record); 657 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 658 Writer.AddTypeSourceInfo(TL.getTypeArgTInfo(i), Record); 659 Writer.AddSourceLocation(TL.getProtocolLAngleLoc(), Record); 660 Writer.AddSourceLocation(TL.getProtocolRAngleLoc(), Record); 661 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 662 Writer.AddSourceLocation(TL.getProtocolLoc(i), Record); 663 } 664 void TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 665 Writer.AddSourceLocation(TL.getStarLoc(), Record); 666 } 667 void TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 668 Writer.AddSourceLocation(TL.getKWLoc(), Record); 669 Writer.AddSourceLocation(TL.getLParenLoc(), Record); 670 Writer.AddSourceLocation(TL.getRParenLoc(), Record); 671 } 672 673 void ASTWriter::WriteTypeAbbrevs() { 674 using namespace llvm; 675 676 BitCodeAbbrev *Abv; 677 678 // Abbreviation for TYPE_EXT_QUAL 679 Abv = new BitCodeAbbrev(); 680 Abv->Add(BitCodeAbbrevOp(serialization::TYPE_EXT_QUAL)); 681 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 682 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3)); // Quals 683 TypeExtQualAbbrev = Stream.EmitAbbrev(Abv); 684 685 // Abbreviation for TYPE_FUNCTION_PROTO 686 Abv = new BitCodeAbbrev(); 687 Abv->Add(BitCodeAbbrevOp(serialization::TYPE_FUNCTION_PROTO)); 688 // FunctionType 689 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ReturnType 690 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // NoReturn 691 Abv->Add(BitCodeAbbrevOp(0)); // HasRegParm 692 Abv->Add(BitCodeAbbrevOp(0)); // RegParm 693 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // CC 694 Abv->Add(BitCodeAbbrevOp(0)); // ProducesResult 695 // FunctionProtoType 696 Abv->Add(BitCodeAbbrevOp(0)); // IsVariadic 697 Abv->Add(BitCodeAbbrevOp(0)); // HasTrailingReturn 698 Abv->Add(BitCodeAbbrevOp(0)); // TypeQuals 699 Abv->Add(BitCodeAbbrevOp(0)); // RefQualifier 700 Abv->Add(BitCodeAbbrevOp(EST_None)); // ExceptionSpec 701 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumParams 702 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 703 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Params 704 TypeFunctionProtoAbbrev = Stream.EmitAbbrev(Abv); 705 } 706 707 //===----------------------------------------------------------------------===// 708 // ASTWriter Implementation 709 //===----------------------------------------------------------------------===// 710 711 static void EmitBlockID(unsigned ID, const char *Name, 712 llvm::BitstreamWriter &Stream, 713 ASTWriter::RecordDataImpl &Record) { 714 Record.clear(); 715 Record.push_back(ID); 716 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record); 717 718 // Emit the block name if present. 719 if (!Name || Name[0] == 0) 720 return; 721 Record.clear(); 722 while (*Name) 723 Record.push_back(*Name++); 724 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, Record); 725 } 726 727 static void EmitRecordID(unsigned ID, const char *Name, 728 llvm::BitstreamWriter &Stream, 729 ASTWriter::RecordDataImpl &Record) { 730 Record.clear(); 731 Record.push_back(ID); 732 while (*Name) 733 Record.push_back(*Name++); 734 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record); 735 } 736 737 static void AddStmtsExprs(llvm::BitstreamWriter &Stream, 738 ASTWriter::RecordDataImpl &Record) { 739 #define RECORD(X) EmitRecordID(X, #X, Stream, Record) 740 RECORD(STMT_STOP); 741 RECORD(STMT_NULL_PTR); 742 RECORD(STMT_REF_PTR); 743 RECORD(STMT_NULL); 744 RECORD(STMT_COMPOUND); 745 RECORD(STMT_CASE); 746 RECORD(STMT_DEFAULT); 747 RECORD(STMT_LABEL); 748 RECORD(STMT_ATTRIBUTED); 749 RECORD(STMT_IF); 750 RECORD(STMT_SWITCH); 751 RECORD(STMT_WHILE); 752 RECORD(STMT_DO); 753 RECORD(STMT_FOR); 754 RECORD(STMT_GOTO); 755 RECORD(STMT_INDIRECT_GOTO); 756 RECORD(STMT_CONTINUE); 757 RECORD(STMT_BREAK); 758 RECORD(STMT_RETURN); 759 RECORD(STMT_DECL); 760 RECORD(STMT_GCCASM); 761 RECORD(STMT_MSASM); 762 RECORD(EXPR_PREDEFINED); 763 RECORD(EXPR_DECL_REF); 764 RECORD(EXPR_INTEGER_LITERAL); 765 RECORD(EXPR_FLOATING_LITERAL); 766 RECORD(EXPR_IMAGINARY_LITERAL); 767 RECORD(EXPR_STRING_LITERAL); 768 RECORD(EXPR_CHARACTER_LITERAL); 769 RECORD(EXPR_PAREN); 770 RECORD(EXPR_PAREN_LIST); 771 RECORD(EXPR_UNARY_OPERATOR); 772 RECORD(EXPR_SIZEOF_ALIGN_OF); 773 RECORD(EXPR_ARRAY_SUBSCRIPT); 774 RECORD(EXPR_CALL); 775 RECORD(EXPR_MEMBER); 776 RECORD(EXPR_BINARY_OPERATOR); 777 RECORD(EXPR_COMPOUND_ASSIGN_OPERATOR); 778 RECORD(EXPR_CONDITIONAL_OPERATOR); 779 RECORD(EXPR_IMPLICIT_CAST); 780 RECORD(EXPR_CSTYLE_CAST); 781 RECORD(EXPR_COMPOUND_LITERAL); 782 RECORD(EXPR_EXT_VECTOR_ELEMENT); 783 RECORD(EXPR_INIT_LIST); 784 RECORD(EXPR_DESIGNATED_INIT); 785 RECORD(EXPR_DESIGNATED_INIT_UPDATE); 786 RECORD(EXPR_IMPLICIT_VALUE_INIT); 787 RECORD(EXPR_NO_INIT); 788 RECORD(EXPR_VA_ARG); 789 RECORD(EXPR_ADDR_LABEL); 790 RECORD(EXPR_STMT); 791 RECORD(EXPR_CHOOSE); 792 RECORD(EXPR_GNU_NULL); 793 RECORD(EXPR_SHUFFLE_VECTOR); 794 RECORD(EXPR_BLOCK); 795 RECORD(EXPR_GENERIC_SELECTION); 796 RECORD(EXPR_OBJC_STRING_LITERAL); 797 RECORD(EXPR_OBJC_BOXED_EXPRESSION); 798 RECORD(EXPR_OBJC_ARRAY_LITERAL); 799 RECORD(EXPR_OBJC_DICTIONARY_LITERAL); 800 RECORD(EXPR_OBJC_ENCODE); 801 RECORD(EXPR_OBJC_SELECTOR_EXPR); 802 RECORD(EXPR_OBJC_PROTOCOL_EXPR); 803 RECORD(EXPR_OBJC_IVAR_REF_EXPR); 804 RECORD(EXPR_OBJC_PROPERTY_REF_EXPR); 805 RECORD(EXPR_OBJC_KVC_REF_EXPR); 806 RECORD(EXPR_OBJC_MESSAGE_EXPR); 807 RECORD(STMT_OBJC_FOR_COLLECTION); 808 RECORD(STMT_OBJC_CATCH); 809 RECORD(STMT_OBJC_FINALLY); 810 RECORD(STMT_OBJC_AT_TRY); 811 RECORD(STMT_OBJC_AT_SYNCHRONIZED); 812 RECORD(STMT_OBJC_AT_THROW); 813 RECORD(EXPR_OBJC_BOOL_LITERAL); 814 RECORD(STMT_CXX_CATCH); 815 RECORD(STMT_CXX_TRY); 816 RECORD(STMT_CXX_FOR_RANGE); 817 RECORD(EXPR_CXX_OPERATOR_CALL); 818 RECORD(EXPR_CXX_MEMBER_CALL); 819 RECORD(EXPR_CXX_CONSTRUCT); 820 RECORD(EXPR_CXX_TEMPORARY_OBJECT); 821 RECORD(EXPR_CXX_STATIC_CAST); 822 RECORD(EXPR_CXX_DYNAMIC_CAST); 823 RECORD(EXPR_CXX_REINTERPRET_CAST); 824 RECORD(EXPR_CXX_CONST_CAST); 825 RECORD(EXPR_CXX_FUNCTIONAL_CAST); 826 RECORD(EXPR_USER_DEFINED_LITERAL); 827 RECORD(EXPR_CXX_STD_INITIALIZER_LIST); 828 RECORD(EXPR_CXX_BOOL_LITERAL); 829 RECORD(EXPR_CXX_NULL_PTR_LITERAL); 830 RECORD(EXPR_CXX_TYPEID_EXPR); 831 RECORD(EXPR_CXX_TYPEID_TYPE); 832 RECORD(EXPR_CXX_THIS); 833 RECORD(EXPR_CXX_THROW); 834 RECORD(EXPR_CXX_DEFAULT_ARG); 835 RECORD(EXPR_CXX_DEFAULT_INIT); 836 RECORD(EXPR_CXX_BIND_TEMPORARY); 837 RECORD(EXPR_CXX_SCALAR_VALUE_INIT); 838 RECORD(EXPR_CXX_NEW); 839 RECORD(EXPR_CXX_DELETE); 840 RECORD(EXPR_CXX_PSEUDO_DESTRUCTOR); 841 RECORD(EXPR_EXPR_WITH_CLEANUPS); 842 RECORD(EXPR_CXX_DEPENDENT_SCOPE_MEMBER); 843 RECORD(EXPR_CXX_DEPENDENT_SCOPE_DECL_REF); 844 RECORD(EXPR_CXX_UNRESOLVED_CONSTRUCT); 845 RECORD(EXPR_CXX_UNRESOLVED_MEMBER); 846 RECORD(EXPR_CXX_UNRESOLVED_LOOKUP); 847 RECORD(EXPR_CXX_EXPRESSION_TRAIT); 848 RECORD(EXPR_CXX_NOEXCEPT); 849 RECORD(EXPR_OPAQUE_VALUE); 850 RECORD(EXPR_BINARY_CONDITIONAL_OPERATOR); 851 RECORD(EXPR_TYPE_TRAIT); 852 RECORD(EXPR_ARRAY_TYPE_TRAIT); 853 RECORD(EXPR_PACK_EXPANSION); 854 RECORD(EXPR_SIZEOF_PACK); 855 RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM); 856 RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK); 857 RECORD(EXPR_FUNCTION_PARM_PACK); 858 RECORD(EXPR_MATERIALIZE_TEMPORARY); 859 RECORD(EXPR_CUDA_KERNEL_CALL); 860 RECORD(EXPR_CXX_UUIDOF_EXPR); 861 RECORD(EXPR_CXX_UUIDOF_TYPE); 862 RECORD(EXPR_LAMBDA); 863 #undef RECORD 864 } 865 866 void ASTWriter::WriteBlockInfoBlock() { 867 RecordData Record; 868 Stream.EnterSubblock(llvm::bitc::BLOCKINFO_BLOCK_ID, 3); 869 870 #define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record) 871 #define RECORD(X) EmitRecordID(X, #X, Stream, Record) 872 873 // Control Block. 874 BLOCK(CONTROL_BLOCK); 875 RECORD(METADATA); 876 RECORD(SIGNATURE); 877 RECORD(MODULE_NAME); 878 RECORD(MODULE_MAP_FILE); 879 RECORD(IMPORTS); 880 RECORD(LANGUAGE_OPTIONS); 881 RECORD(TARGET_OPTIONS); 882 RECORD(ORIGINAL_FILE); 883 RECORD(ORIGINAL_PCH_DIR); 884 RECORD(ORIGINAL_FILE_ID); 885 RECORD(INPUT_FILE_OFFSETS); 886 RECORD(DIAGNOSTIC_OPTIONS); 887 RECORD(FILE_SYSTEM_OPTIONS); 888 RECORD(HEADER_SEARCH_OPTIONS); 889 RECORD(PREPROCESSOR_OPTIONS); 890 891 BLOCK(INPUT_FILES_BLOCK); 892 RECORD(INPUT_FILE); 893 894 // AST Top-Level Block. 895 BLOCK(AST_BLOCK); 896 RECORD(TYPE_OFFSET); 897 RECORD(DECL_OFFSET); 898 RECORD(IDENTIFIER_OFFSET); 899 RECORD(IDENTIFIER_TABLE); 900 RECORD(EAGERLY_DESERIALIZED_DECLS); 901 RECORD(SPECIAL_TYPES); 902 RECORD(STATISTICS); 903 RECORD(TENTATIVE_DEFINITIONS); 904 RECORD(UNUSED_FILESCOPED_DECLS); 905 RECORD(SELECTOR_OFFSETS); 906 RECORD(METHOD_POOL); 907 RECORD(PP_COUNTER_VALUE); 908 RECORD(SOURCE_LOCATION_OFFSETS); 909 RECORD(SOURCE_LOCATION_PRELOADS); 910 RECORD(EXT_VECTOR_DECLS); 911 RECORD(PPD_ENTITIES_OFFSETS); 912 RECORD(REFERENCED_SELECTOR_POOL); 913 RECORD(TU_UPDATE_LEXICAL); 914 RECORD(LOCAL_REDECLARATIONS_MAP); 915 RECORD(SEMA_DECL_REFS); 916 RECORD(WEAK_UNDECLARED_IDENTIFIERS); 917 RECORD(PENDING_IMPLICIT_INSTANTIATIONS); 918 RECORD(DECL_REPLACEMENTS); 919 RECORD(UPDATE_VISIBLE); 920 RECORD(DECL_UPDATE_OFFSETS); 921 RECORD(DECL_UPDATES); 922 RECORD(CXX_BASE_SPECIFIER_OFFSETS); 923 RECORD(DIAG_PRAGMA_MAPPINGS); 924 RECORD(CUDA_SPECIAL_DECL_REFS); 925 RECORD(HEADER_SEARCH_TABLE); 926 RECORD(FP_PRAGMA_OPTIONS); 927 RECORD(OPENCL_EXTENSIONS); 928 RECORD(DELEGATING_CTORS); 929 RECORD(KNOWN_NAMESPACES); 930 RECORD(UNDEFINED_BUT_USED); 931 RECORD(MODULE_OFFSET_MAP); 932 RECORD(SOURCE_MANAGER_LINE_TABLE); 933 RECORD(OBJC_CATEGORIES_MAP); 934 RECORD(FILE_SORTED_DECLS); 935 RECORD(IMPORTED_MODULES); 936 RECORD(LOCAL_REDECLARATIONS); 937 RECORD(OBJC_CATEGORIES); 938 RECORD(MACRO_OFFSET); 939 RECORD(LATE_PARSED_TEMPLATE); 940 RECORD(OPTIMIZE_PRAGMA_OPTIONS); 941 942 // SourceManager Block. 943 BLOCK(SOURCE_MANAGER_BLOCK); 944 RECORD(SM_SLOC_FILE_ENTRY); 945 RECORD(SM_SLOC_BUFFER_ENTRY); 946 RECORD(SM_SLOC_BUFFER_BLOB); 947 RECORD(SM_SLOC_EXPANSION_ENTRY); 948 949 // Preprocessor Block. 950 BLOCK(PREPROCESSOR_BLOCK); 951 RECORD(PP_MACRO_DIRECTIVE_HISTORY); 952 RECORD(PP_MACRO_FUNCTION_LIKE); 953 RECORD(PP_MACRO_OBJECT_LIKE); 954 RECORD(PP_MODULE_MACRO); 955 RECORD(PP_TOKEN); 956 957 // Decls and Types block. 958 BLOCK(DECLTYPES_BLOCK); 959 RECORD(TYPE_EXT_QUAL); 960 RECORD(TYPE_COMPLEX); 961 RECORD(TYPE_POINTER); 962 RECORD(TYPE_BLOCK_POINTER); 963 RECORD(TYPE_LVALUE_REFERENCE); 964 RECORD(TYPE_RVALUE_REFERENCE); 965 RECORD(TYPE_MEMBER_POINTER); 966 RECORD(TYPE_CONSTANT_ARRAY); 967 RECORD(TYPE_INCOMPLETE_ARRAY); 968 RECORD(TYPE_VARIABLE_ARRAY); 969 RECORD(TYPE_VECTOR); 970 RECORD(TYPE_EXT_VECTOR); 971 RECORD(TYPE_FUNCTION_NO_PROTO); 972 RECORD(TYPE_FUNCTION_PROTO); 973 RECORD(TYPE_TYPEDEF); 974 RECORD(TYPE_TYPEOF_EXPR); 975 RECORD(TYPE_TYPEOF); 976 RECORD(TYPE_RECORD); 977 RECORD(TYPE_ENUM); 978 RECORD(TYPE_OBJC_INTERFACE); 979 RECORD(TYPE_OBJC_OBJECT_POINTER); 980 RECORD(TYPE_DECLTYPE); 981 RECORD(TYPE_ELABORATED); 982 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM); 983 RECORD(TYPE_UNRESOLVED_USING); 984 RECORD(TYPE_INJECTED_CLASS_NAME); 985 RECORD(TYPE_OBJC_OBJECT); 986 RECORD(TYPE_TEMPLATE_TYPE_PARM); 987 RECORD(TYPE_TEMPLATE_SPECIALIZATION); 988 RECORD(TYPE_DEPENDENT_NAME); 989 RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION); 990 RECORD(TYPE_DEPENDENT_SIZED_ARRAY); 991 RECORD(TYPE_PAREN); 992 RECORD(TYPE_PACK_EXPANSION); 993 RECORD(TYPE_ATTRIBUTED); 994 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK); 995 RECORD(TYPE_AUTO); 996 RECORD(TYPE_UNARY_TRANSFORM); 997 RECORD(TYPE_ATOMIC); 998 RECORD(TYPE_DECAYED); 999 RECORD(TYPE_ADJUSTED); 1000 RECORD(DECL_TYPEDEF); 1001 RECORD(DECL_TYPEALIAS); 1002 RECORD(DECL_ENUM); 1003 RECORD(DECL_RECORD); 1004 RECORD(DECL_ENUM_CONSTANT); 1005 RECORD(DECL_FUNCTION); 1006 RECORD(DECL_OBJC_METHOD); 1007 RECORD(DECL_OBJC_INTERFACE); 1008 RECORD(DECL_OBJC_PROTOCOL); 1009 RECORD(DECL_OBJC_IVAR); 1010 RECORD(DECL_OBJC_AT_DEFS_FIELD); 1011 RECORD(DECL_OBJC_CATEGORY); 1012 RECORD(DECL_OBJC_CATEGORY_IMPL); 1013 RECORD(DECL_OBJC_IMPLEMENTATION); 1014 RECORD(DECL_OBJC_COMPATIBLE_ALIAS); 1015 RECORD(DECL_OBJC_PROPERTY); 1016 RECORD(DECL_OBJC_PROPERTY_IMPL); 1017 RECORD(DECL_FIELD); 1018 RECORD(DECL_MS_PROPERTY); 1019 RECORD(DECL_VAR); 1020 RECORD(DECL_IMPLICIT_PARAM); 1021 RECORD(DECL_PARM_VAR); 1022 RECORD(DECL_FILE_SCOPE_ASM); 1023 RECORD(DECL_BLOCK); 1024 RECORD(DECL_CONTEXT_LEXICAL); 1025 RECORD(DECL_CONTEXT_VISIBLE); 1026 RECORD(DECL_NAMESPACE); 1027 RECORD(DECL_NAMESPACE_ALIAS); 1028 RECORD(DECL_USING); 1029 RECORD(DECL_USING_SHADOW); 1030 RECORD(DECL_USING_DIRECTIVE); 1031 RECORD(DECL_UNRESOLVED_USING_VALUE); 1032 RECORD(DECL_UNRESOLVED_USING_TYPENAME); 1033 RECORD(DECL_LINKAGE_SPEC); 1034 RECORD(DECL_CXX_RECORD); 1035 RECORD(DECL_CXX_METHOD); 1036 RECORD(DECL_CXX_CONSTRUCTOR); 1037 RECORD(DECL_CXX_DESTRUCTOR); 1038 RECORD(DECL_CXX_CONVERSION); 1039 RECORD(DECL_ACCESS_SPEC); 1040 RECORD(DECL_FRIEND); 1041 RECORD(DECL_FRIEND_TEMPLATE); 1042 RECORD(DECL_CLASS_TEMPLATE); 1043 RECORD(DECL_CLASS_TEMPLATE_SPECIALIZATION); 1044 RECORD(DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION); 1045 RECORD(DECL_VAR_TEMPLATE); 1046 RECORD(DECL_VAR_TEMPLATE_SPECIALIZATION); 1047 RECORD(DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION); 1048 RECORD(DECL_FUNCTION_TEMPLATE); 1049 RECORD(DECL_TEMPLATE_TYPE_PARM); 1050 RECORD(DECL_NON_TYPE_TEMPLATE_PARM); 1051 RECORD(DECL_TEMPLATE_TEMPLATE_PARM); 1052 RECORD(DECL_STATIC_ASSERT); 1053 RECORD(DECL_CXX_BASE_SPECIFIERS); 1054 RECORD(DECL_INDIRECTFIELD); 1055 RECORD(DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK); 1056 1057 // Statements and Exprs can occur in the Decls and Types block. 1058 AddStmtsExprs(Stream, Record); 1059 1060 BLOCK(PREPROCESSOR_DETAIL_BLOCK); 1061 RECORD(PPD_MACRO_EXPANSION); 1062 RECORD(PPD_MACRO_DEFINITION); 1063 RECORD(PPD_INCLUSION_DIRECTIVE); 1064 1065 #undef RECORD 1066 #undef BLOCK 1067 Stream.ExitBlock(); 1068 } 1069 1070 /// \brief Prepares a path for being written to an AST file by converting it 1071 /// to an absolute path and removing nested './'s. 1072 /// 1073 /// \return \c true if the path was changed. 1074 static bool cleanPathForOutput(FileManager &FileMgr, 1075 SmallVectorImpl<char> &Path) { 1076 bool Changed = FileMgr.makeAbsolutePath(Path); 1077 return Changed | FileMgr.removeDotPaths(Path); 1078 } 1079 1080 /// \brief Adjusts the given filename to only write out the portion of the 1081 /// filename that is not part of the system root directory. 1082 /// 1083 /// \param Filename the file name to adjust. 1084 /// 1085 /// \param BaseDir When non-NULL, the PCH file is a relocatable AST file and 1086 /// the returned filename will be adjusted by this root directory. 1087 /// 1088 /// \returns either the original filename (if it needs no adjustment) or the 1089 /// adjusted filename (which points into the @p Filename parameter). 1090 static const char * 1091 adjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir) { 1092 assert(Filename && "No file name to adjust?"); 1093 1094 if (BaseDir.empty()) 1095 return Filename; 1096 1097 // Verify that the filename and the system root have the same prefix. 1098 unsigned Pos = 0; 1099 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos) 1100 if (Filename[Pos] != BaseDir[Pos]) 1101 return Filename; // Prefixes don't match. 1102 1103 // We hit the end of the filename before we hit the end of the system root. 1104 if (!Filename[Pos]) 1105 return Filename; 1106 1107 // If there's not a path separator at the end of the base directory nor 1108 // immediately after it, then this isn't within the base directory. 1109 if (!llvm::sys::path::is_separator(Filename[Pos])) { 1110 if (!llvm::sys::path::is_separator(BaseDir.back())) 1111 return Filename; 1112 } else { 1113 // If the file name has a '/' at the current position, skip over the '/'. 1114 // We distinguish relative paths from absolute paths by the 1115 // absence of '/' at the beginning of relative paths. 1116 // 1117 // FIXME: This is wrong. We distinguish them by asking if the path is 1118 // absolute, which isn't the same thing. And there might be multiple '/'s 1119 // in a row. Use a better mechanism to indicate whether we have emitted an 1120 // absolute or relative path. 1121 ++Pos; 1122 } 1123 1124 return Filename + Pos; 1125 } 1126 1127 static ASTFileSignature getSignature() { 1128 while (1) { 1129 if (ASTFileSignature S = llvm::sys::Process::GetRandomNumber()) 1130 return S; 1131 // Rely on GetRandomNumber to eventually return non-zero... 1132 } 1133 } 1134 1135 /// \brief Write the control block. 1136 void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, 1137 StringRef isysroot, 1138 const std::string &OutputFile) { 1139 using namespace llvm; 1140 Stream.EnterSubblock(CONTROL_BLOCK_ID, 5); 1141 RecordData Record; 1142 1143 // Metadata 1144 BitCodeAbbrev *MetadataAbbrev = new BitCodeAbbrev(); 1145 MetadataAbbrev->Add(BitCodeAbbrevOp(METADATA)); 1146 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Major 1147 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Minor 1148 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang maj. 1149 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang min. 1150 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Relocatable 1151 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors 1152 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag 1153 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev); 1154 Record.push_back(METADATA); 1155 Record.push_back(VERSION_MAJOR); 1156 Record.push_back(VERSION_MINOR); 1157 Record.push_back(CLANG_VERSION_MAJOR); 1158 Record.push_back(CLANG_VERSION_MINOR); 1159 assert((!WritingModule || isysroot.empty()) && 1160 "writing module as a relocatable PCH?"); 1161 Record.push_back(!isysroot.empty()); 1162 Record.push_back(ASTHasCompilerErrors); 1163 Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record, 1164 getClangFullRepositoryVersion()); 1165 1166 if (WritingModule) { 1167 // For implicit modules we output a signature that we can use to ensure 1168 // duplicate module builds don't collide in the cache as their output order 1169 // is non-deterministic. 1170 // FIXME: Remove this when output is deterministic. 1171 if (Context.getLangOpts().ImplicitModules) { 1172 Record.clear(); 1173 Record.push_back(getSignature()); 1174 Stream.EmitRecord(SIGNATURE, Record); 1175 } 1176 1177 // Module name 1178 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1179 Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME)); 1180 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 1181 unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 1182 RecordData Record; 1183 Record.push_back(MODULE_NAME); 1184 Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name); 1185 } 1186 1187 if (WritingModule && WritingModule->Directory) { 1188 SmallString<128> BaseDir(WritingModule->Directory->getName()); 1189 cleanPathForOutput(Context.getSourceManager().getFileManager(), BaseDir); 1190 1191 // If the home of the module is the current working directory, then we 1192 // want to pick up the cwd of the build process loading the module, not 1193 // our cwd, when we load this module. 1194 if (!PP.getHeaderSearchInfo() 1195 .getHeaderSearchOpts() 1196 .ModuleMapFileHomeIsCwd || 1197 WritingModule->Directory->getName() != StringRef(".")) { 1198 // Module directory. 1199 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1200 Abbrev->Add(BitCodeAbbrevOp(MODULE_DIRECTORY)); 1201 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory 1202 unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 1203 1204 RecordData Record; 1205 Record.push_back(MODULE_DIRECTORY); 1206 Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir); 1207 } 1208 1209 // Write out all other paths relative to the base directory if possible. 1210 BaseDirectory.assign(BaseDir.begin(), BaseDir.end()); 1211 } else if (!isysroot.empty()) { 1212 // Write out paths relative to the sysroot if possible. 1213 BaseDirectory = isysroot; 1214 } 1215 1216 // Module map file 1217 if (WritingModule) { 1218 Record.clear(); 1219 1220 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 1221 1222 // Primary module map file. 1223 AddPath(Map.getModuleMapFileForUniquing(WritingModule)->getName(), Record); 1224 1225 // Additional module map files. 1226 if (auto *AdditionalModMaps = 1227 Map.getAdditionalModuleMapFiles(WritingModule)) { 1228 Record.push_back(AdditionalModMaps->size()); 1229 for (const FileEntry *F : *AdditionalModMaps) 1230 AddPath(F->getName(), Record); 1231 } else { 1232 Record.push_back(0); 1233 } 1234 1235 Stream.EmitRecord(MODULE_MAP_FILE, Record); 1236 } 1237 1238 // Imports 1239 if (Chain) { 1240 serialization::ModuleManager &Mgr = Chain->getModuleManager(); 1241 Record.clear(); 1242 1243 for (auto *M : Mgr) { 1244 // Skip modules that weren't directly imported. 1245 if (!M->isDirectlyImported()) 1246 continue; 1247 1248 Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding 1249 AddSourceLocation(M->ImportLoc, Record); 1250 Record.push_back(M->File->getSize()); 1251 Record.push_back(M->File->getModificationTime()); 1252 Record.push_back(M->Signature); 1253 AddPath(M->FileName, Record); 1254 } 1255 Stream.EmitRecord(IMPORTS, Record); 1256 } 1257 1258 // Language options. 1259 Record.clear(); 1260 const LangOptions &LangOpts = Context.getLangOpts(); 1261 #define LANGOPT(Name, Bits, Default, Description) \ 1262 Record.push_back(LangOpts.Name); 1263 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 1264 Record.push_back(static_cast<unsigned>(LangOpts.get##Name())); 1265 #include "clang/Basic/LangOptions.def" 1266 #define SANITIZER(NAME, ID) \ 1267 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID)); 1268 #include "clang/Basic/Sanitizers.def" 1269 1270 Record.push_back(LangOpts.ModuleFeatures.size()); 1271 for (StringRef Feature : LangOpts.ModuleFeatures) 1272 AddString(Feature, Record); 1273 1274 Record.push_back((unsigned) LangOpts.ObjCRuntime.getKind()); 1275 AddVersionTuple(LangOpts.ObjCRuntime.getVersion(), Record); 1276 1277 AddString(LangOpts.CurrentModule, Record); 1278 1279 // Comment options. 1280 Record.push_back(LangOpts.CommentOpts.BlockCommandNames.size()); 1281 for (CommentOptions::BlockCommandNamesTy::const_iterator 1282 I = LangOpts.CommentOpts.BlockCommandNames.begin(), 1283 IEnd = LangOpts.CommentOpts.BlockCommandNames.end(); 1284 I != IEnd; ++I) { 1285 AddString(*I, Record); 1286 } 1287 Record.push_back(LangOpts.CommentOpts.ParseAllComments); 1288 1289 Stream.EmitRecord(LANGUAGE_OPTIONS, Record); 1290 1291 // Target options. 1292 Record.clear(); 1293 const TargetInfo &Target = Context.getTargetInfo(); 1294 const TargetOptions &TargetOpts = Target.getTargetOpts(); 1295 AddString(TargetOpts.Triple, Record); 1296 AddString(TargetOpts.CPU, Record); 1297 AddString(TargetOpts.ABI, Record); 1298 Record.push_back(TargetOpts.FeaturesAsWritten.size()); 1299 for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size(); I != N; ++I) { 1300 AddString(TargetOpts.FeaturesAsWritten[I], Record); 1301 } 1302 Record.push_back(TargetOpts.Features.size()); 1303 for (unsigned I = 0, N = TargetOpts.Features.size(); I != N; ++I) { 1304 AddString(TargetOpts.Features[I], Record); 1305 } 1306 Stream.EmitRecord(TARGET_OPTIONS, Record); 1307 1308 // Diagnostic options. 1309 Record.clear(); 1310 const DiagnosticOptions &DiagOpts 1311 = Context.getDiagnostics().getDiagnosticOptions(); 1312 #define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name); 1313 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 1314 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name())); 1315 #include "clang/Basic/DiagnosticOptions.def" 1316 Record.push_back(DiagOpts.Warnings.size()); 1317 for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I) 1318 AddString(DiagOpts.Warnings[I], Record); 1319 Record.push_back(DiagOpts.Remarks.size()); 1320 for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I) 1321 AddString(DiagOpts.Remarks[I], Record); 1322 // Note: we don't serialize the log or serialization file names, because they 1323 // are generally transient files and will almost always be overridden. 1324 Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record); 1325 1326 // File system options. 1327 Record.clear(); 1328 const FileSystemOptions &FSOpts 1329 = Context.getSourceManager().getFileManager().getFileSystemOptions(); 1330 AddString(FSOpts.WorkingDir, Record); 1331 Stream.EmitRecord(FILE_SYSTEM_OPTIONS, Record); 1332 1333 // Header search options. 1334 Record.clear(); 1335 const HeaderSearchOptions &HSOpts 1336 = PP.getHeaderSearchInfo().getHeaderSearchOpts(); 1337 AddString(HSOpts.Sysroot, Record); 1338 1339 // Include entries. 1340 Record.push_back(HSOpts.UserEntries.size()); 1341 for (unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) { 1342 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I]; 1343 AddString(Entry.Path, Record); 1344 Record.push_back(static_cast<unsigned>(Entry.Group)); 1345 Record.push_back(Entry.IsFramework); 1346 Record.push_back(Entry.IgnoreSysRoot); 1347 } 1348 1349 // System header prefixes. 1350 Record.push_back(HSOpts.SystemHeaderPrefixes.size()); 1351 for (unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) { 1352 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix, Record); 1353 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader); 1354 } 1355 1356 AddString(HSOpts.ResourceDir, Record); 1357 AddString(HSOpts.ModuleCachePath, Record); 1358 AddString(HSOpts.ModuleUserBuildPath, Record); 1359 Record.push_back(HSOpts.DisableModuleHash); 1360 Record.push_back(HSOpts.UseBuiltinIncludes); 1361 Record.push_back(HSOpts.UseStandardSystemIncludes); 1362 Record.push_back(HSOpts.UseStandardCXXIncludes); 1363 Record.push_back(HSOpts.UseLibcxx); 1364 // Write out the specific module cache path that contains the module files. 1365 AddString(PP.getHeaderSearchInfo().getModuleCachePath(), Record); 1366 Stream.EmitRecord(HEADER_SEARCH_OPTIONS, Record); 1367 1368 // Preprocessor options. 1369 Record.clear(); 1370 const PreprocessorOptions &PPOpts = PP.getPreprocessorOpts(); 1371 1372 // Macro definitions. 1373 Record.push_back(PPOpts.Macros.size()); 1374 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 1375 AddString(PPOpts.Macros[I].first, Record); 1376 Record.push_back(PPOpts.Macros[I].second); 1377 } 1378 1379 // Includes 1380 Record.push_back(PPOpts.Includes.size()); 1381 for (unsigned I = 0, N = PPOpts.Includes.size(); I != N; ++I) 1382 AddString(PPOpts.Includes[I], Record); 1383 1384 // Macro includes 1385 Record.push_back(PPOpts.MacroIncludes.size()); 1386 for (unsigned I = 0, N = PPOpts.MacroIncludes.size(); I != N; ++I) 1387 AddString(PPOpts.MacroIncludes[I], Record); 1388 1389 Record.push_back(PPOpts.UsePredefines); 1390 // Detailed record is important since it is used for the module cache hash. 1391 Record.push_back(PPOpts.DetailedRecord); 1392 AddString(PPOpts.ImplicitPCHInclude, Record); 1393 AddString(PPOpts.ImplicitPTHInclude, Record); 1394 Record.push_back(static_cast<unsigned>(PPOpts.ObjCXXARCStandardLibrary)); 1395 Stream.EmitRecord(PREPROCESSOR_OPTIONS, Record); 1396 1397 // Original file name and file ID 1398 SourceManager &SM = Context.getSourceManager(); 1399 if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 1400 BitCodeAbbrev *FileAbbrev = new BitCodeAbbrev(); 1401 FileAbbrev->Add(BitCodeAbbrevOp(ORIGINAL_FILE)); 1402 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // File ID 1403 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 1404 unsigned FileAbbrevCode = Stream.EmitAbbrev(FileAbbrev); 1405 1406 Record.clear(); 1407 Record.push_back(ORIGINAL_FILE); 1408 Record.push_back(SM.getMainFileID().getOpaqueValue()); 1409 EmitRecordWithPath(FileAbbrevCode, Record, MainFile->getName()); 1410 } 1411 1412 Record.clear(); 1413 Record.push_back(SM.getMainFileID().getOpaqueValue()); 1414 Stream.EmitRecord(ORIGINAL_FILE_ID, Record); 1415 1416 // Original PCH directory 1417 if (!OutputFile.empty() && OutputFile != "-") { 1418 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1419 Abbrev->Add(BitCodeAbbrevOp(ORIGINAL_PCH_DIR)); 1420 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 1421 unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 1422 1423 SmallString<128> OutputPath(OutputFile); 1424 1425 SM.getFileManager().makeAbsolutePath(OutputPath); 1426 StringRef origDir = llvm::sys::path::parent_path(OutputPath); 1427 1428 RecordData Record; 1429 Record.push_back(ORIGINAL_PCH_DIR); 1430 Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir); 1431 } 1432 1433 WriteInputFiles(Context.SourceMgr, 1434 PP.getHeaderSearchInfo().getHeaderSearchOpts(), 1435 PP.getLangOpts().Modules); 1436 Stream.ExitBlock(); 1437 } 1438 1439 namespace { 1440 /// \brief An input file. 1441 struct InputFileEntry { 1442 const FileEntry *File; 1443 bool IsSystemFile; 1444 bool BufferOverridden; 1445 }; 1446 } 1447 1448 void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, 1449 HeaderSearchOptions &HSOpts, 1450 bool Modules) { 1451 using namespace llvm; 1452 Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4); 1453 RecordData Record; 1454 1455 // Create input-file abbreviation. 1456 BitCodeAbbrev *IFAbbrev = new BitCodeAbbrev(); 1457 IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE)); 1458 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID 1459 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12)); // Size 1460 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32)); // Modification time 1461 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Overridden 1462 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 1463 unsigned IFAbbrevCode = Stream.EmitAbbrev(IFAbbrev); 1464 1465 // Get all ContentCache objects for files, sorted by whether the file is a 1466 // system one or not. System files go at the back, users files at the front. 1467 std::deque<InputFileEntry> SortedFiles; 1468 for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); I != N; ++I) { 1469 // Get this source location entry. 1470 const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I); 1471 assert(&SourceMgr.getSLocEntry(FileID::get(I)) == SLoc); 1472 1473 // We only care about file entries that were not overridden. 1474 if (!SLoc->isFile()) 1475 continue; 1476 const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache(); 1477 if (!Cache->OrigEntry) 1478 continue; 1479 1480 InputFileEntry Entry; 1481 Entry.File = Cache->OrigEntry; 1482 Entry.IsSystemFile = Cache->IsSystemFile; 1483 Entry.BufferOverridden = Cache->BufferOverridden; 1484 if (Cache->IsSystemFile) 1485 SortedFiles.push_back(Entry); 1486 else 1487 SortedFiles.push_front(Entry); 1488 } 1489 1490 unsigned UserFilesNum = 0; 1491 // Write out all of the input files. 1492 std::vector<uint64_t> InputFileOffsets; 1493 for (std::deque<InputFileEntry>::iterator 1494 I = SortedFiles.begin(), E = SortedFiles.end(); I != E; ++I) { 1495 const InputFileEntry &Entry = *I; 1496 1497 uint32_t &InputFileID = InputFileIDs[Entry.File]; 1498 if (InputFileID != 0) 1499 continue; // already recorded this file. 1500 1501 // Record this entry's offset. 1502 InputFileOffsets.push_back(Stream.GetCurrentBitNo()); 1503 1504 InputFileID = InputFileOffsets.size(); 1505 1506 if (!Entry.IsSystemFile) 1507 ++UserFilesNum; 1508 1509 Record.clear(); 1510 Record.push_back(INPUT_FILE); 1511 Record.push_back(InputFileOffsets.size()); 1512 1513 // Emit size/modification time for this file. 1514 Record.push_back(Entry.File->getSize()); 1515 Record.push_back(Entry.File->getModificationTime()); 1516 1517 // Whether this file was overridden. 1518 Record.push_back(Entry.BufferOverridden); 1519 1520 EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName()); 1521 } 1522 1523 Stream.ExitBlock(); 1524 1525 // Create input file offsets abbreviation. 1526 BitCodeAbbrev *OffsetsAbbrev = new BitCodeAbbrev(); 1527 OffsetsAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE_OFFSETS)); 1528 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # input files 1529 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # non-system 1530 // input files 1531 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Array 1532 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev); 1533 1534 // Write input file offsets. 1535 Record.clear(); 1536 Record.push_back(INPUT_FILE_OFFSETS); 1537 Record.push_back(InputFileOffsets.size()); 1538 Record.push_back(UserFilesNum); 1539 Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets)); 1540 } 1541 1542 //===----------------------------------------------------------------------===// 1543 // Source Manager Serialization 1544 //===----------------------------------------------------------------------===// 1545 1546 /// \brief Create an abbreviation for the SLocEntry that refers to a 1547 /// file. 1548 static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream) { 1549 using namespace llvm; 1550 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1551 Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_FILE_ENTRY)); 1552 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 1553 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location 1554 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic 1555 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives 1556 // FileEntry fields. 1557 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Input File ID 1558 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumCreatedFIDs 1559 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24)); // FirstDeclIndex 1560 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumDecls 1561 return Stream.EmitAbbrev(Abbrev); 1562 } 1563 1564 /// \brief Create an abbreviation for the SLocEntry that refers to a 1565 /// buffer. 1566 static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream) { 1567 using namespace llvm; 1568 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1569 Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_ENTRY)); 1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location 1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic 1573 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives 1574 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Buffer name blob 1575 return Stream.EmitAbbrev(Abbrev); 1576 } 1577 1578 /// \brief Create an abbreviation for the SLocEntry that refers to a 1579 /// buffer's blob. 1580 static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream) { 1581 using namespace llvm; 1582 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1583 Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_BLOB)); 1584 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Blob 1585 return Stream.EmitAbbrev(Abbrev); 1586 } 1587 1588 /// \brief Create an abbreviation for the SLocEntry that refers to a macro 1589 /// expansion. 1590 static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) { 1591 using namespace llvm; 1592 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1593 Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY)); 1594 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 1595 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location 1596 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location 1597 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // End location 1598 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Token length 1599 return Stream.EmitAbbrev(Abbrev); 1600 } 1601 1602 namespace { 1603 // Trait used for the on-disk hash table of header search information. 1604 class HeaderFileInfoTrait { 1605 ASTWriter &Writer; 1606 const HeaderSearch &HS; 1607 1608 // Keep track of the framework names we've used during serialization. 1609 SmallVector<char, 128> FrameworkStringData; 1610 llvm::StringMap<unsigned> FrameworkNameOffset; 1611 1612 public: 1613 HeaderFileInfoTrait(ASTWriter &Writer, const HeaderSearch &HS) 1614 : Writer(Writer), HS(HS) { } 1615 1616 struct key_type { 1617 const FileEntry *FE; 1618 const char *Filename; 1619 }; 1620 typedef const key_type &key_type_ref; 1621 1622 typedef HeaderFileInfo data_type; 1623 typedef const data_type &data_type_ref; 1624 typedef unsigned hash_value_type; 1625 typedef unsigned offset_type; 1626 1627 static hash_value_type ComputeHash(key_type_ref key) { 1628 // The hash is based only on size/time of the file, so that the reader can 1629 // match even when symlinking or excess path elements ("foo/../", "../") 1630 // change the form of the name. However, complete path is still the key. 1631 // 1632 // FIXME: Using the mtime here will cause problems for explicit module 1633 // imports. 1634 return llvm::hash_combine(key.FE->getSize(), 1635 key.FE->getModificationTime()); 1636 } 1637 1638 std::pair<unsigned,unsigned> 1639 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref Data) { 1640 using namespace llvm::support; 1641 endian::Writer<little> Writer(Out); 1642 unsigned KeyLen = strlen(key.Filename) + 1 + 8 + 8; 1643 Writer.write<uint16_t>(KeyLen); 1644 unsigned DataLen = 1 + 2 + 4 + 4; 1645 if (Data.isModuleHeader) 1646 DataLen += 4; 1647 Writer.write<uint8_t>(DataLen); 1648 return std::make_pair(KeyLen, DataLen); 1649 } 1650 1651 void EmitKey(raw_ostream& Out, key_type_ref key, unsigned KeyLen) { 1652 using namespace llvm::support; 1653 endian::Writer<little> LE(Out); 1654 LE.write<uint64_t>(key.FE->getSize()); 1655 KeyLen -= 8; 1656 LE.write<uint64_t>(key.FE->getModificationTime()); 1657 KeyLen -= 8; 1658 Out.write(key.Filename, KeyLen); 1659 } 1660 1661 void EmitData(raw_ostream &Out, key_type_ref key, 1662 data_type_ref Data, unsigned DataLen) { 1663 using namespace llvm::support; 1664 endian::Writer<little> LE(Out); 1665 uint64_t Start = Out.tell(); (void)Start; 1666 1667 unsigned char Flags = (Data.HeaderRole << 6) 1668 | (Data.isImport << 5) 1669 | (Data.isPragmaOnce << 4) 1670 | (Data.DirInfo << 2) 1671 | (Data.Resolved << 1) 1672 | Data.IndexHeaderMapHeader; 1673 LE.write<uint8_t>(Flags); 1674 LE.write<uint16_t>(Data.NumIncludes); 1675 1676 if (!Data.ControllingMacro) 1677 LE.write<uint32_t>(Data.ControllingMacroID); 1678 else 1679 LE.write<uint32_t>(Writer.getIdentifierRef(Data.ControllingMacro)); 1680 1681 unsigned Offset = 0; 1682 if (!Data.Framework.empty()) { 1683 // If this header refers into a framework, save the framework name. 1684 llvm::StringMap<unsigned>::iterator Pos 1685 = FrameworkNameOffset.find(Data.Framework); 1686 if (Pos == FrameworkNameOffset.end()) { 1687 Offset = FrameworkStringData.size() + 1; 1688 FrameworkStringData.append(Data.Framework.begin(), 1689 Data.Framework.end()); 1690 FrameworkStringData.push_back(0); 1691 1692 FrameworkNameOffset[Data.Framework] = Offset; 1693 } else 1694 Offset = Pos->second; 1695 } 1696 LE.write<uint32_t>(Offset); 1697 1698 if (Data.isModuleHeader) { 1699 Module *Mod = HS.findModuleForHeader(key.FE).getModule(); 1700 LE.write<uint32_t>(Writer.getExistingSubmoduleID(Mod)); 1701 } 1702 1703 assert(Out.tell() - Start == DataLen && "Wrong data length"); 1704 } 1705 1706 const char *strings_begin() const { return FrameworkStringData.begin(); } 1707 const char *strings_end() const { return FrameworkStringData.end(); } 1708 }; 1709 } // end anonymous namespace 1710 1711 /// \brief Write the header search block for the list of files that 1712 /// 1713 /// \param HS The header search structure to save. 1714 void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) { 1715 SmallVector<const FileEntry *, 16> FilesByUID; 1716 HS.getFileMgr().GetUniqueIDMapping(FilesByUID); 1717 1718 if (FilesByUID.size() > HS.header_file_size()) 1719 FilesByUID.resize(HS.header_file_size()); 1720 1721 HeaderFileInfoTrait GeneratorTrait(*this, HS); 1722 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait> Generator; 1723 SmallVector<const char *, 4> SavedStrings; 1724 unsigned NumHeaderSearchEntries = 0; 1725 for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) { 1726 const FileEntry *File = FilesByUID[UID]; 1727 if (!File) 1728 continue; 1729 1730 // Use HeaderSearch's getFileInfo to make sure we get the HeaderFileInfo 1731 // from the external source if it was not provided already. 1732 HeaderFileInfo HFI; 1733 if (!HS.tryGetFileInfo(File, HFI) || 1734 (HFI.External && Chain) || 1735 (HFI.isModuleHeader && !HFI.isCompilingModuleHeader)) 1736 continue; 1737 1738 // Massage the file path into an appropriate form. 1739 const char *Filename = File->getName(); 1740 SmallString<128> FilenameTmp(Filename); 1741 if (PreparePathForOutput(FilenameTmp)) { 1742 // If we performed any translation on the file name at all, we need to 1743 // save this string, since the generator will refer to it later. 1744 Filename = strdup(FilenameTmp.c_str()); 1745 SavedStrings.push_back(Filename); 1746 } 1747 1748 HeaderFileInfoTrait::key_type key = { File, Filename }; 1749 Generator.insert(key, HFI, GeneratorTrait); 1750 ++NumHeaderSearchEntries; 1751 } 1752 1753 // Create the on-disk hash table in a buffer. 1754 SmallString<4096> TableData; 1755 uint32_t BucketOffset; 1756 { 1757 using namespace llvm::support; 1758 llvm::raw_svector_ostream Out(TableData); 1759 // Make sure that no bucket is at offset 0 1760 endian::Writer<little>(Out).write<uint32_t>(0); 1761 BucketOffset = Generator.Emit(Out, GeneratorTrait); 1762 } 1763 1764 // Create a blob abbreviation 1765 using namespace llvm; 1766 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1767 Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_TABLE)); 1768 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1769 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1770 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1771 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 1772 unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev); 1773 1774 // Write the header search table 1775 RecordData Record; 1776 Record.push_back(HEADER_SEARCH_TABLE); 1777 Record.push_back(BucketOffset); 1778 Record.push_back(NumHeaderSearchEntries); 1779 Record.push_back(TableData.size()); 1780 TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end()); 1781 Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData); 1782 1783 // Free all of the strings we had to duplicate. 1784 for (unsigned I = 0, N = SavedStrings.size(); I != N; ++I) 1785 free(const_cast<char *>(SavedStrings[I])); 1786 } 1787 1788 /// \brief Writes the block containing the serialized form of the 1789 /// source manager. 1790 /// 1791 /// TODO: We should probably use an on-disk hash table (stored in a 1792 /// blob), indexed based on the file name, so that we only create 1793 /// entries for files that we actually need. In the common case (no 1794 /// errors), we probably won't have to create file entries for any of 1795 /// the files in the AST. 1796 void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, 1797 const Preprocessor &PP) { 1798 RecordData Record; 1799 1800 // Enter the source manager block. 1801 Stream.EnterSubblock(SOURCE_MANAGER_BLOCK_ID, 3); 1802 1803 // Abbreviations for the various kinds of source-location entries. 1804 unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream); 1805 unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream); 1806 unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream); 1807 unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream); 1808 1809 // Write out the source location entry table. We skip the first 1810 // entry, which is always the same dummy entry. 1811 std::vector<uint32_t> SLocEntryOffsets; 1812 RecordData PreloadSLocs; 1813 SLocEntryOffsets.reserve(SourceMgr.local_sloc_entry_size() - 1); 1814 for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); 1815 I != N; ++I) { 1816 // Get this source location entry. 1817 const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I); 1818 FileID FID = FileID::get(I); 1819 assert(&SourceMgr.getSLocEntry(FID) == SLoc); 1820 1821 // Record the offset of this source-location entry. 1822 SLocEntryOffsets.push_back(Stream.GetCurrentBitNo()); 1823 1824 // Figure out which record code to use. 1825 unsigned Code; 1826 if (SLoc->isFile()) { 1827 const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache(); 1828 if (Cache->OrigEntry) { 1829 Code = SM_SLOC_FILE_ENTRY; 1830 } else 1831 Code = SM_SLOC_BUFFER_ENTRY; 1832 } else 1833 Code = SM_SLOC_EXPANSION_ENTRY; 1834 Record.clear(); 1835 Record.push_back(Code); 1836 1837 // Starting offset of this entry within this module, so skip the dummy. 1838 Record.push_back(SLoc->getOffset() - 2); 1839 if (SLoc->isFile()) { 1840 const SrcMgr::FileInfo &File = SLoc->getFile(); 1841 Record.push_back(File.getIncludeLoc().getRawEncoding()); 1842 Record.push_back(File.getFileCharacteristic()); // FIXME: stable encoding 1843 Record.push_back(File.hasLineDirectives()); 1844 1845 const SrcMgr::ContentCache *Content = File.getContentCache(); 1846 if (Content->OrigEntry) { 1847 assert(Content->OrigEntry == Content->ContentsEntry && 1848 "Writing to AST an overridden file is not supported"); 1849 1850 // The source location entry is a file. Emit input file ID. 1851 assert(InputFileIDs[Content->OrigEntry] != 0 && "Missed file entry"); 1852 Record.push_back(InputFileIDs[Content->OrigEntry]); 1853 1854 Record.push_back(File.NumCreatedFIDs); 1855 1856 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID); 1857 if (FDI != FileDeclIDs.end()) { 1858 Record.push_back(FDI->second->FirstDeclIndex); 1859 Record.push_back(FDI->second->DeclIDs.size()); 1860 } else { 1861 Record.push_back(0); 1862 Record.push_back(0); 1863 } 1864 1865 Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record); 1866 1867 if (Content->BufferOverridden) { 1868 Record.clear(); 1869 Record.push_back(SM_SLOC_BUFFER_BLOB); 1870 const llvm::MemoryBuffer *Buffer 1871 = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager()); 1872 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, 1873 StringRef(Buffer->getBufferStart(), 1874 Buffer->getBufferSize() + 1)); 1875 } 1876 } else { 1877 // The source location entry is a buffer. The blob associated 1878 // with this entry contains the contents of the buffer. 1879 1880 // We add one to the size so that we capture the trailing NULL 1881 // that is required by llvm::MemoryBuffer::getMemBuffer (on 1882 // the reader side). 1883 const llvm::MemoryBuffer *Buffer 1884 = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager()); 1885 const char *Name = Buffer->getBufferIdentifier(); 1886 Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record, 1887 StringRef(Name, strlen(Name) + 1)); 1888 Record.clear(); 1889 Record.push_back(SM_SLOC_BUFFER_BLOB); 1890 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, 1891 StringRef(Buffer->getBufferStart(), 1892 Buffer->getBufferSize() + 1)); 1893 1894 if (strcmp(Name, "<built-in>") == 0) { 1895 PreloadSLocs.push_back(SLocEntryOffsets.size()); 1896 } 1897 } 1898 } else { 1899 // The source location entry is a macro expansion. 1900 const SrcMgr::ExpansionInfo &Expansion = SLoc->getExpansion(); 1901 Record.push_back(Expansion.getSpellingLoc().getRawEncoding()); 1902 Record.push_back(Expansion.getExpansionLocStart().getRawEncoding()); 1903 Record.push_back(Expansion.isMacroArgExpansion() ? 0 1904 : Expansion.getExpansionLocEnd().getRawEncoding()); 1905 1906 // Compute the token length for this macro expansion. 1907 unsigned NextOffset = SourceMgr.getNextLocalOffset(); 1908 if (I + 1 != N) 1909 NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset(); 1910 Record.push_back(NextOffset - SLoc->getOffset() - 1); 1911 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record); 1912 } 1913 } 1914 1915 Stream.ExitBlock(); 1916 1917 if (SLocEntryOffsets.empty()) 1918 return; 1919 1920 // Write the source-location offsets table into the AST block. This 1921 // table is used for lazily loading source-location information. 1922 using namespace llvm; 1923 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 1924 Abbrev->Add(BitCodeAbbrevOp(SOURCE_LOCATION_OFFSETS)); 1925 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // # of slocs 1926 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size 1927 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets 1928 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev); 1929 1930 Record.clear(); 1931 Record.push_back(SOURCE_LOCATION_OFFSETS); 1932 Record.push_back(SLocEntryOffsets.size()); 1933 Record.push_back(SourceMgr.getNextLocalOffset() - 1); // skip dummy 1934 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, bytes(SLocEntryOffsets)); 1935 1936 // Write the source location entry preloads array, telling the AST 1937 // reader which source locations entries it should load eagerly. 1938 Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs); 1939 1940 // Write the line table. It depends on remapping working, so it must come 1941 // after the source location offsets. 1942 if (SourceMgr.hasLineTable()) { 1943 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1944 1945 Record.clear(); 1946 // Emit the file names. 1947 Record.push_back(LineTable.getNumFilenames()); 1948 for (unsigned I = 0, N = LineTable.getNumFilenames(); I != N; ++I) 1949 AddPath(LineTable.getFilename(I), Record); 1950 1951 // Emit the line entries 1952 for (LineTableInfo::iterator L = LineTable.begin(), LEnd = LineTable.end(); 1953 L != LEnd; ++L) { 1954 // Only emit entries for local files. 1955 if (L->first.ID < 0) 1956 continue; 1957 1958 // Emit the file ID 1959 Record.push_back(L->first.ID); 1960 1961 // Emit the line entries 1962 Record.push_back(L->second.size()); 1963 for (std::vector<LineEntry>::iterator LE = L->second.begin(), 1964 LEEnd = L->second.end(); 1965 LE != LEEnd; ++LE) { 1966 Record.push_back(LE->FileOffset); 1967 Record.push_back(LE->LineNo); 1968 Record.push_back(LE->FilenameID); 1969 Record.push_back((unsigned)LE->FileKind); 1970 Record.push_back(LE->IncludeOffset); 1971 } 1972 } 1973 Stream.EmitRecord(SOURCE_MANAGER_LINE_TABLE, Record); 1974 } 1975 } 1976 1977 //===----------------------------------------------------------------------===// 1978 // Preprocessor Serialization 1979 //===----------------------------------------------------------------------===// 1980 1981 static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule, 1982 const Preprocessor &PP) { 1983 if (MacroInfo *MI = MD->getMacroInfo()) 1984 if (MI->isBuiltinMacro()) 1985 return true; 1986 1987 if (IsModule) { 1988 SourceLocation Loc = MD->getLocation(); 1989 if (Loc.isInvalid()) 1990 return true; 1991 if (PP.getSourceManager().getFileID(Loc) == PP.getPredefinesFileID()) 1992 return true; 1993 } 1994 1995 return false; 1996 } 1997 1998 /// \brief Writes the block containing the serialized form of the 1999 /// preprocessor. 2000 /// 2001 void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { 2002 PreprocessingRecord *PPRec = PP.getPreprocessingRecord(); 2003 if (PPRec) 2004 WritePreprocessorDetail(*PPRec); 2005 2006 RecordData Record; 2007 RecordData ModuleMacroRecord; 2008 2009 // If the preprocessor __COUNTER__ value has been bumped, remember it. 2010 if (PP.getCounterValue() != 0) { 2011 Record.push_back(PP.getCounterValue()); 2012 Stream.EmitRecord(PP_COUNTER_VALUE, Record); 2013 Record.clear(); 2014 } 2015 2016 // Enter the preprocessor block. 2017 Stream.EnterSubblock(PREPROCESSOR_BLOCK_ID, 3); 2018 2019 // If the AST file contains __DATE__ or __TIME__ emit a warning about this. 2020 // FIXME: use diagnostics subsystem for localization etc. 2021 if (PP.SawDateOrTime()) 2022 fprintf(stderr, "warning: precompiled header used __DATE__ or __TIME__.\n"); 2023 2024 2025 // Loop over all the macro directives that are live at the end of the file, 2026 // emitting each to the PP section. 2027 2028 // Construct the list of identifiers with macro directives that need to be 2029 // serialized. 2030 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers; 2031 for (auto &Id : PP.getIdentifierTable()) 2032 if (Id.second->hadMacroDefinition() && 2033 (!Id.second->isFromAST() || 2034 Id.second->hasChangedSinceDeserialization())) 2035 MacroIdentifiers.push_back(Id.second); 2036 // Sort the set of macro definitions that need to be serialized by the 2037 // name of the macro, to provide a stable ordering. 2038 std::sort(MacroIdentifiers.begin(), MacroIdentifiers.end(), 2039 llvm::less_ptr<IdentifierInfo>()); 2040 2041 // Emit the macro directives as a list and associate the offset with the 2042 // identifier they belong to. 2043 for (const IdentifierInfo *Name : MacroIdentifiers) { 2044 MacroDirective *MD = PP.getLocalMacroDirectiveHistory(Name); 2045 auto StartOffset = Stream.GetCurrentBitNo(); 2046 2047 // Emit the macro directives in reverse source order. 2048 for (; MD; MD = MD->getPrevious()) { 2049 // Once we hit an ignored macro, we're done: the rest of the chain 2050 // will all be ignored macros. 2051 if (shouldIgnoreMacro(MD, IsModule, PP)) 2052 break; 2053 2054 AddSourceLocation(MD->getLocation(), Record); 2055 Record.push_back(MD->getKind()); 2056 if (auto *DefMD = dyn_cast<DefMacroDirective>(MD)) { 2057 Record.push_back(getMacroRef(DefMD->getInfo(), Name)); 2058 } else if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) { 2059 Record.push_back(VisMD->isPublic()); 2060 } 2061 } 2062 2063 // Write out any exported module macros. 2064 bool EmittedModuleMacros = false; 2065 if (IsModule) { 2066 auto Leafs = PP.getLeafModuleMacros(Name); 2067 SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end()); 2068 llvm::DenseMap<ModuleMacro*, unsigned> Visits; 2069 while (!Worklist.empty()) { 2070 auto *Macro = Worklist.pop_back_val(); 2071 2072 // Emit a record indicating this submodule exports this macro. 2073 ModuleMacroRecord.push_back( 2074 getSubmoduleID(Macro->getOwningModule())); 2075 ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); 2076 for (auto *M : Macro->overrides()) 2077 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); 2078 2079 Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); 2080 ModuleMacroRecord.clear(); 2081 2082 // Enqueue overridden macros once we've visited all their ancestors. 2083 for (auto *M : Macro->overrides()) 2084 if (++Visits[M] == M->getNumOverridingMacros()) 2085 Worklist.push_back(M); 2086 2087 EmittedModuleMacros = true; 2088 } 2089 } 2090 2091 if (Record.empty() && !EmittedModuleMacros) 2092 continue; 2093 2094 IdentMacroDirectivesOffsetMap[Name] = StartOffset; 2095 Stream.EmitRecord(PP_MACRO_DIRECTIVE_HISTORY, Record); 2096 Record.clear(); 2097 } 2098 2099 /// \brief Offsets of each of the macros into the bitstream, indexed by 2100 /// the local macro ID 2101 /// 2102 /// For each identifier that is associated with a macro, this map 2103 /// provides the offset into the bitstream where that macro is 2104 /// defined. 2105 std::vector<uint32_t> MacroOffsets; 2106 2107 for (unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) { 2108 const IdentifierInfo *Name = MacroInfosToEmit[I].Name; 2109 MacroInfo *MI = MacroInfosToEmit[I].MI; 2110 MacroID ID = MacroInfosToEmit[I].ID; 2111 2112 if (ID < FirstMacroID) { 2113 assert(0 && "Loaded MacroInfo entered MacroInfosToEmit ?"); 2114 continue; 2115 } 2116 2117 // Record the local offset of this macro. 2118 unsigned Index = ID - FirstMacroID; 2119 if (Index == MacroOffsets.size()) 2120 MacroOffsets.push_back(Stream.GetCurrentBitNo()); 2121 else { 2122 if (Index > MacroOffsets.size()) 2123 MacroOffsets.resize(Index + 1); 2124 2125 MacroOffsets[Index] = Stream.GetCurrentBitNo(); 2126 } 2127 2128 AddIdentifierRef(Name, Record); 2129 Record.push_back(inferSubmoduleIDFromLocation(MI->getDefinitionLoc())); 2130 AddSourceLocation(MI->getDefinitionLoc(), Record); 2131 AddSourceLocation(MI->getDefinitionEndLoc(), Record); 2132 Record.push_back(MI->isUsed()); 2133 Record.push_back(MI->isUsedForHeaderGuard()); 2134 unsigned Code; 2135 if (MI->isObjectLike()) { 2136 Code = PP_MACRO_OBJECT_LIKE; 2137 } else { 2138 Code = PP_MACRO_FUNCTION_LIKE; 2139 2140 Record.push_back(MI->isC99Varargs()); 2141 Record.push_back(MI->isGNUVarargs()); 2142 Record.push_back(MI->hasCommaPasting()); 2143 Record.push_back(MI->getNumArgs()); 2144 for (const IdentifierInfo *Arg : MI->args()) 2145 AddIdentifierRef(Arg, Record); 2146 } 2147 2148 // If we have a detailed preprocessing record, record the macro definition 2149 // ID that corresponds to this macro. 2150 if (PPRec) 2151 Record.push_back(MacroDefinitions[PPRec->findMacroDefinition(MI)]); 2152 2153 Stream.EmitRecord(Code, Record); 2154 Record.clear(); 2155 2156 // Emit the tokens array. 2157 for (unsigned TokNo = 0, e = MI->getNumTokens(); TokNo != e; ++TokNo) { 2158 // Note that we know that the preprocessor does not have any annotation 2159 // tokens in it because they are created by the parser, and thus can't 2160 // be in a macro definition. 2161 const Token &Tok = MI->getReplacementToken(TokNo); 2162 AddToken(Tok, Record); 2163 Stream.EmitRecord(PP_TOKEN, Record); 2164 Record.clear(); 2165 } 2166 ++NumMacros; 2167 } 2168 2169 Stream.ExitBlock(); 2170 2171 // Write the offsets table for macro IDs. 2172 using namespace llvm; 2173 auto *Abbrev = new BitCodeAbbrev(); 2174 Abbrev->Add(BitCodeAbbrevOp(MACRO_OFFSET)); 2175 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of macros 2176 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 2177 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2178 2179 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2180 Record.clear(); 2181 Record.push_back(MACRO_OFFSET); 2182 Record.push_back(MacroOffsets.size()); 2183 Record.push_back(FirstMacroID - NUM_PREDEF_MACRO_IDS); 2184 Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, 2185 bytes(MacroOffsets)); 2186 } 2187 2188 void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) { 2189 if (PPRec.local_begin() == PPRec.local_end()) 2190 return; 2191 2192 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets; 2193 2194 // Enter the preprocessor block. 2195 Stream.EnterSubblock(PREPROCESSOR_DETAIL_BLOCK_ID, 3); 2196 2197 // If the preprocessor has a preprocessing record, emit it. 2198 unsigned NumPreprocessingRecords = 0; 2199 using namespace llvm; 2200 2201 // Set up the abbreviation for 2202 unsigned InclusionAbbrev = 0; 2203 { 2204 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2205 Abbrev->Add(BitCodeAbbrevOp(PPD_INCLUSION_DIRECTIVE)); 2206 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // filename length 2207 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // in quotes 2208 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // kind 2209 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // imported module 2210 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2211 InclusionAbbrev = Stream.EmitAbbrev(Abbrev); 2212 } 2213 2214 unsigned FirstPreprocessorEntityID 2215 = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0) 2216 + NUM_PREDEF_PP_ENTITY_IDS; 2217 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID; 2218 RecordData Record; 2219 for (PreprocessingRecord::iterator E = PPRec.local_begin(), 2220 EEnd = PPRec.local_end(); 2221 E != EEnd; 2222 (void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) { 2223 Record.clear(); 2224 2225 PreprocessedEntityOffsets.push_back( 2226 PPEntityOffset((*E)->getSourceRange(), Stream.GetCurrentBitNo())); 2227 2228 if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(*E)) { 2229 // Record this macro definition's ID. 2230 MacroDefinitions[MD] = NextPreprocessorEntityID; 2231 2232 AddIdentifierRef(MD->getName(), Record); 2233 Stream.EmitRecord(PPD_MACRO_DEFINITION, Record); 2234 continue; 2235 } 2236 2237 if (MacroExpansion *ME = dyn_cast<MacroExpansion>(*E)) { 2238 Record.push_back(ME->isBuiltinMacro()); 2239 if (ME->isBuiltinMacro()) 2240 AddIdentifierRef(ME->getName(), Record); 2241 else 2242 Record.push_back(MacroDefinitions[ME->getDefinition()]); 2243 Stream.EmitRecord(PPD_MACRO_EXPANSION, Record); 2244 continue; 2245 } 2246 2247 if (InclusionDirective *ID = dyn_cast<InclusionDirective>(*E)) { 2248 Record.push_back(PPD_INCLUSION_DIRECTIVE); 2249 Record.push_back(ID->getFileName().size()); 2250 Record.push_back(ID->wasInQuotes()); 2251 Record.push_back(static_cast<unsigned>(ID->getKind())); 2252 Record.push_back(ID->importedModule()); 2253 SmallString<64> Buffer; 2254 Buffer += ID->getFileName(); 2255 // Check that the FileEntry is not null because it was not resolved and 2256 // we create a PCH even with compiler errors. 2257 if (ID->getFile()) 2258 Buffer += ID->getFile()->getName(); 2259 Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer); 2260 continue; 2261 } 2262 2263 llvm_unreachable("Unhandled PreprocessedEntity in ASTWriter"); 2264 } 2265 Stream.ExitBlock(); 2266 2267 // Write the offsets table for the preprocessing record. 2268 if (NumPreprocessingRecords > 0) { 2269 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords); 2270 2271 // Write the offsets table for identifier IDs. 2272 using namespace llvm; 2273 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2274 Abbrev->Add(BitCodeAbbrevOp(PPD_ENTITIES_OFFSETS)); 2275 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first pp entity 2276 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2277 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2278 2279 Record.clear(); 2280 Record.push_back(PPD_ENTITIES_OFFSETS); 2281 Record.push_back(FirstPreprocessorEntityID - NUM_PREDEF_PP_ENTITY_IDS); 2282 Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record, 2283 bytes(PreprocessedEntityOffsets)); 2284 } 2285 } 2286 2287 unsigned ASTWriter::getSubmoduleID(Module *Mod) { 2288 llvm::DenseMap<Module *, unsigned>::iterator Known = SubmoduleIDs.find(Mod); 2289 if (Known != SubmoduleIDs.end()) 2290 return Known->second; 2291 2292 return SubmoduleIDs[Mod] = NextSubmoduleID++; 2293 } 2294 2295 unsigned ASTWriter::getExistingSubmoduleID(Module *Mod) const { 2296 if (!Mod) 2297 return 0; 2298 2299 llvm::DenseMap<Module *, unsigned>::const_iterator 2300 Known = SubmoduleIDs.find(Mod); 2301 if (Known != SubmoduleIDs.end()) 2302 return Known->second; 2303 2304 return 0; 2305 } 2306 2307 /// \brief Compute the number of modules within the given tree (including the 2308 /// given module). 2309 static unsigned getNumberOfModules(Module *Mod) { 2310 unsigned ChildModules = 0; 2311 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 2312 SubEnd = Mod->submodule_end(); 2313 Sub != SubEnd; ++Sub) 2314 ChildModules += getNumberOfModules(*Sub); 2315 2316 return ChildModules + 1; 2317 } 2318 2319 void ASTWriter::WriteSubmodules(Module *WritingModule) { 2320 // Enter the submodule description block. 2321 Stream.EnterSubblock(SUBMODULE_BLOCK_ID, /*bits for abbreviations*/5); 2322 2323 // Write the abbreviations needed for the submodules block. 2324 using namespace llvm; 2325 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2326 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_DEFINITION)); 2327 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID 2328 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Parent 2329 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework 2330 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExplicit 2331 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem 2332 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExternC 2333 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferSubmodules... 2334 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExplicit... 2335 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExportWild... 2336 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ConfigMacrosExh... 2337 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2338 unsigned DefinitionAbbrev = Stream.EmitAbbrev(Abbrev); 2339 2340 Abbrev = new BitCodeAbbrev(); 2341 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_HEADER)); 2342 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2343 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(Abbrev); 2344 2345 Abbrev = new BitCodeAbbrev(); 2346 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_HEADER)); 2347 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2348 unsigned HeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2349 2350 Abbrev = new BitCodeAbbrev(); 2351 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TOPHEADER)); 2352 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2353 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2354 2355 Abbrev = new BitCodeAbbrev(); 2356 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_DIR)); 2357 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2358 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(Abbrev); 2359 2360 Abbrev = new BitCodeAbbrev(); 2361 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_REQUIRES)); 2362 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // State 2363 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Feature 2364 unsigned RequiresAbbrev = Stream.EmitAbbrev(Abbrev); 2365 2366 Abbrev = new BitCodeAbbrev(); 2367 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_EXCLUDED_HEADER)); 2368 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2369 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2370 2371 Abbrev = new BitCodeAbbrev(); 2372 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TEXTUAL_HEADER)); 2373 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2374 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2375 2376 Abbrev = new BitCodeAbbrev(); 2377 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_HEADER)); 2378 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2379 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2380 2381 Abbrev = new BitCodeAbbrev(); 2382 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_TEXTUAL_HEADER)); 2383 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2384 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2385 2386 Abbrev = new BitCodeAbbrev(); 2387 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_LINK_LIBRARY)); 2388 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework 2389 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2390 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(Abbrev); 2391 2392 Abbrev = new BitCodeAbbrev(); 2393 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFIG_MACRO)); 2394 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Macro name 2395 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(Abbrev); 2396 2397 Abbrev = new BitCodeAbbrev(); 2398 Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFLICT)); 2399 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Other module 2400 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Message 2401 unsigned ConflictAbbrev = Stream.EmitAbbrev(Abbrev); 2402 2403 // Write the submodule metadata block. 2404 RecordData Record; 2405 Record.push_back(getNumberOfModules(WritingModule)); 2406 Record.push_back(FirstSubmoduleID - NUM_PREDEF_SUBMODULE_IDS); 2407 Stream.EmitRecord(SUBMODULE_METADATA, Record); 2408 2409 // Write all of the submodules. 2410 std::queue<Module *> Q; 2411 Q.push(WritingModule); 2412 while (!Q.empty()) { 2413 Module *Mod = Q.front(); 2414 Q.pop(); 2415 unsigned ID = getSubmoduleID(Mod); 2416 2417 // Emit the definition of the block. 2418 Record.clear(); 2419 Record.push_back(SUBMODULE_DEFINITION); 2420 Record.push_back(ID); 2421 if (Mod->Parent) { 2422 assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?"); 2423 Record.push_back(SubmoduleIDs[Mod->Parent]); 2424 } else { 2425 Record.push_back(0); 2426 } 2427 Record.push_back(Mod->IsFramework); 2428 Record.push_back(Mod->IsExplicit); 2429 Record.push_back(Mod->IsSystem); 2430 Record.push_back(Mod->IsExternC); 2431 Record.push_back(Mod->InferSubmodules); 2432 Record.push_back(Mod->InferExplicitSubmodules); 2433 Record.push_back(Mod->InferExportWildcard); 2434 Record.push_back(Mod->ConfigMacrosExhaustive); 2435 Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name); 2436 2437 // Emit the requirements. 2438 for (unsigned I = 0, N = Mod->Requirements.size(); I != N; ++I) { 2439 Record.clear(); 2440 Record.push_back(SUBMODULE_REQUIRES); 2441 Record.push_back(Mod->Requirements[I].second); 2442 Stream.EmitRecordWithBlob(RequiresAbbrev, Record, 2443 Mod->Requirements[I].first); 2444 } 2445 2446 // Emit the umbrella header, if there is one. 2447 if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) { 2448 Record.clear(); 2449 Record.push_back(SUBMODULE_UMBRELLA_HEADER); 2450 Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record, 2451 UmbrellaHeader.NameAsWritten); 2452 } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) { 2453 Record.clear(); 2454 Record.push_back(SUBMODULE_UMBRELLA_DIR); 2455 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record, 2456 UmbrellaDir.NameAsWritten); 2457 } 2458 2459 // Emit the headers. 2460 struct { 2461 unsigned RecordKind; 2462 unsigned Abbrev; 2463 Module::HeaderKind HeaderKind; 2464 } HeaderLists[] = { 2465 {SUBMODULE_HEADER, HeaderAbbrev, Module::HK_Normal}, 2466 {SUBMODULE_TEXTUAL_HEADER, TextualHeaderAbbrev, Module::HK_Textual}, 2467 {SUBMODULE_PRIVATE_HEADER, PrivateHeaderAbbrev, Module::HK_Private}, 2468 {SUBMODULE_PRIVATE_TEXTUAL_HEADER, PrivateTextualHeaderAbbrev, 2469 Module::HK_PrivateTextual}, 2470 {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded} 2471 }; 2472 for (auto &HL : HeaderLists) { 2473 Record.clear(); 2474 Record.push_back(HL.RecordKind); 2475 for (auto &H : Mod->Headers[HL.HeaderKind]) 2476 Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten); 2477 } 2478 2479 // Emit the top headers. 2480 { 2481 auto TopHeaders = Mod->getTopHeaders(PP->getFileManager()); 2482 Record.clear(); 2483 Record.push_back(SUBMODULE_TOPHEADER); 2484 for (auto *H : TopHeaders) 2485 Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName()); 2486 } 2487 2488 // Emit the imports. 2489 if (!Mod->Imports.empty()) { 2490 Record.clear(); 2491 for (unsigned I = 0, N = Mod->Imports.size(); I != N; ++I) { 2492 unsigned ImportedID = getSubmoduleID(Mod->Imports[I]); 2493 assert(ImportedID && "Unknown submodule!"); 2494 Record.push_back(ImportedID); 2495 } 2496 Stream.EmitRecord(SUBMODULE_IMPORTS, Record); 2497 } 2498 2499 // Emit the exports. 2500 if (!Mod->Exports.empty()) { 2501 Record.clear(); 2502 for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) { 2503 if (Module *Exported = Mod->Exports[I].getPointer()) { 2504 unsigned ExportedID = getSubmoduleID(Exported); 2505 Record.push_back(ExportedID); 2506 } else { 2507 Record.push_back(0); 2508 } 2509 2510 Record.push_back(Mod->Exports[I].getInt()); 2511 } 2512 Stream.EmitRecord(SUBMODULE_EXPORTS, Record); 2513 } 2514 2515 //FIXME: How do we emit the 'use'd modules? They may not be submodules. 2516 // Might be unnecessary as use declarations are only used to build the 2517 // module itself. 2518 2519 // Emit the link libraries. 2520 for (unsigned I = 0, N = Mod->LinkLibraries.size(); I != N; ++I) { 2521 Record.clear(); 2522 Record.push_back(SUBMODULE_LINK_LIBRARY); 2523 Record.push_back(Mod->LinkLibraries[I].IsFramework); 2524 Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record, 2525 Mod->LinkLibraries[I].Library); 2526 } 2527 2528 // Emit the conflicts. 2529 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 2530 Record.clear(); 2531 Record.push_back(SUBMODULE_CONFLICT); 2532 unsigned OtherID = getSubmoduleID(Mod->Conflicts[I].Other); 2533 assert(OtherID && "Unknown submodule!"); 2534 Record.push_back(OtherID); 2535 Stream.EmitRecordWithBlob(ConflictAbbrev, Record, 2536 Mod->Conflicts[I].Message); 2537 } 2538 2539 // Emit the configuration macros. 2540 for (unsigned I = 0, N = Mod->ConfigMacros.size(); I != N; ++I) { 2541 Record.clear(); 2542 Record.push_back(SUBMODULE_CONFIG_MACRO); 2543 Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record, 2544 Mod->ConfigMacros[I]); 2545 } 2546 2547 // Queue up the submodules of this module. 2548 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 2549 SubEnd = Mod->submodule_end(); 2550 Sub != SubEnd; ++Sub) 2551 Q.push(*Sub); 2552 } 2553 2554 Stream.ExitBlock(); 2555 2556 // FIXME: This can easily happen, if we have a reference to a submodule that 2557 // did not result in us loading a module file for that submodule. For 2558 // instance, a cross-top-level-module 'conflict' declaration will hit this. 2559 assert((NextSubmoduleID - FirstSubmoduleID == 2560 getNumberOfModules(WritingModule)) && 2561 "Wrong # of submodules; found a reference to a non-local, " 2562 "non-imported submodule?"); 2563 } 2564 2565 serialization::SubmoduleID 2566 ASTWriter::inferSubmoduleIDFromLocation(SourceLocation Loc) { 2567 if (Loc.isInvalid() || !WritingModule) 2568 return 0; // No submodule 2569 2570 // Find the module that owns this location. 2571 ModuleMap &ModMap = PP->getHeaderSearchInfo().getModuleMap(); 2572 Module *OwningMod 2573 = ModMap.inferModuleFromLocation(FullSourceLoc(Loc,PP->getSourceManager())); 2574 if (!OwningMod) 2575 return 0; 2576 2577 // Check whether this submodule is part of our own module. 2578 if (WritingModule != OwningMod && !OwningMod->isSubModuleOf(WritingModule)) 2579 return 0; 2580 2581 return getSubmoduleID(OwningMod); 2582 } 2583 2584 void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, 2585 bool isModule) { 2586 // Make sure set diagnostic pragmas don't affect the translation unit that 2587 // imports the module. 2588 // FIXME: Make diagnostic pragma sections work properly with modules. 2589 if (isModule) 2590 return; 2591 2592 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64> 2593 DiagStateIDMap; 2594 unsigned CurrID = 0; 2595 DiagStateIDMap[&Diag.DiagStates.front()] = ++CurrID; // the command-line one. 2596 RecordData Record; 2597 for (DiagnosticsEngine::DiagStatePointsTy::const_iterator 2598 I = Diag.DiagStatePoints.begin(), E = Diag.DiagStatePoints.end(); 2599 I != E; ++I) { 2600 const DiagnosticsEngine::DiagStatePoint &point = *I; 2601 if (point.Loc.isInvalid()) 2602 continue; 2603 2604 Record.push_back(point.Loc.getRawEncoding()); 2605 unsigned &DiagStateID = DiagStateIDMap[point.State]; 2606 Record.push_back(DiagStateID); 2607 2608 if (DiagStateID == 0) { 2609 DiagStateID = ++CurrID; 2610 for (DiagnosticsEngine::DiagState::const_iterator 2611 I = point.State->begin(), E = point.State->end(); I != E; ++I) { 2612 if (I->second.isPragma()) { 2613 Record.push_back(I->first); 2614 Record.push_back((unsigned)I->second.getSeverity()); 2615 } 2616 } 2617 Record.push_back(-1); // mark the end of the diag/map pairs for this 2618 // location. 2619 } 2620 } 2621 2622 if (!Record.empty()) 2623 Stream.EmitRecord(DIAG_PRAGMA_MAPPINGS, Record); 2624 } 2625 2626 void ASTWriter::WriteCXXCtorInitializersOffsets() { 2627 if (CXXCtorInitializersOffsets.empty()) 2628 return; 2629 2630 RecordData Record; 2631 2632 // Create a blob abbreviation for the C++ ctor initializer offsets. 2633 using namespace llvm; 2634 2635 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2636 Abbrev->Add(BitCodeAbbrevOp(CXX_CTOR_INITIALIZERS_OFFSETS)); 2637 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size 2638 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2639 unsigned CtorInitializersOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2640 2641 // Write the base specifier offsets table. 2642 Record.clear(); 2643 Record.push_back(CXX_CTOR_INITIALIZERS_OFFSETS); 2644 Record.push_back(CXXCtorInitializersOffsets.size()); 2645 Stream.EmitRecordWithBlob(CtorInitializersOffsetAbbrev, Record, 2646 bytes(CXXCtorInitializersOffsets)); 2647 } 2648 2649 void ASTWriter::WriteCXXBaseSpecifiersOffsets() { 2650 if (CXXBaseSpecifiersOffsets.empty()) 2651 return; 2652 2653 RecordData Record; 2654 2655 // Create a blob abbreviation for the C++ base specifiers offsets. 2656 using namespace llvm; 2657 2658 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2659 Abbrev->Add(BitCodeAbbrevOp(CXX_BASE_SPECIFIER_OFFSETS)); 2660 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size 2661 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2662 unsigned BaseSpecifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2663 2664 // Write the base specifier offsets table. 2665 Record.clear(); 2666 Record.push_back(CXX_BASE_SPECIFIER_OFFSETS); 2667 Record.push_back(CXXBaseSpecifiersOffsets.size()); 2668 Stream.EmitRecordWithBlob(BaseSpecifierOffsetAbbrev, Record, 2669 bytes(CXXBaseSpecifiersOffsets)); 2670 } 2671 2672 //===----------------------------------------------------------------------===// 2673 // Type Serialization 2674 //===----------------------------------------------------------------------===// 2675 2676 /// \brief Write the representation of a type to the AST stream. 2677 void ASTWriter::WriteType(QualType T) { 2678 TypeIdx &Idx = TypeIdxs[T]; 2679 if (Idx.getIndex() == 0) // we haven't seen this type before. 2680 Idx = TypeIdx(NextTypeID++); 2681 2682 assert(Idx.getIndex() >= FirstTypeID && "Re-writing a type from a prior AST"); 2683 2684 // Record the offset for this type. 2685 unsigned Index = Idx.getIndex() - FirstTypeID; 2686 if (TypeOffsets.size() == Index) 2687 TypeOffsets.push_back(Stream.GetCurrentBitNo()); 2688 else if (TypeOffsets.size() < Index) { 2689 TypeOffsets.resize(Index + 1); 2690 TypeOffsets[Index] = Stream.GetCurrentBitNo(); 2691 } 2692 2693 RecordData Record; 2694 2695 // Emit the type's representation. 2696 ASTTypeWriter W(*this, Record); 2697 W.AbbrevToUse = 0; 2698 2699 if (T.hasLocalNonFastQualifiers()) { 2700 Qualifiers Qs = T.getLocalQualifiers(); 2701 AddTypeRef(T.getLocalUnqualifiedType(), Record); 2702 Record.push_back(Qs.getAsOpaqueValue()); 2703 W.Code = TYPE_EXT_QUAL; 2704 W.AbbrevToUse = TypeExtQualAbbrev; 2705 } else { 2706 switch (T->getTypeClass()) { 2707 // For all of the concrete, non-dependent types, call the 2708 // appropriate visitor function. 2709 #define TYPE(Class, Base) \ 2710 case Type::Class: W.Visit##Class##Type(cast<Class##Type>(T)); break; 2711 #define ABSTRACT_TYPE(Class, Base) 2712 #include "clang/AST/TypeNodes.def" 2713 } 2714 } 2715 2716 // Emit the serialized record. 2717 Stream.EmitRecord(W.Code, Record, W.AbbrevToUse); 2718 2719 // Flush any expressions that were written as part of this type. 2720 FlushStmts(); 2721 } 2722 2723 //===----------------------------------------------------------------------===// 2724 // Declaration Serialization 2725 //===----------------------------------------------------------------------===// 2726 2727 /// \brief Write the block containing all of the declaration IDs 2728 /// lexically declared within the given DeclContext. 2729 /// 2730 /// \returns the offset of the DECL_CONTEXT_LEXICAL block within the 2731 /// bistream, or 0 if no block was written. 2732 uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, 2733 DeclContext *DC) { 2734 if (DC->decls_empty()) 2735 return 0; 2736 2737 uint64_t Offset = Stream.GetCurrentBitNo(); 2738 RecordData Record; 2739 Record.push_back(DECL_CONTEXT_LEXICAL); 2740 SmallVector<uint32_t, 128> KindDeclPairs; 2741 for (const auto *D : DC->decls()) { 2742 KindDeclPairs.push_back(D->getKind()); 2743 KindDeclPairs.push_back(GetDeclRef(D)); 2744 } 2745 2746 ++NumLexicalDeclContexts; 2747 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record, 2748 bytes(KindDeclPairs)); 2749 return Offset; 2750 } 2751 2752 void ASTWriter::WriteTypeDeclOffsets() { 2753 using namespace llvm; 2754 RecordData Record; 2755 2756 // Write the type offsets array 2757 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2758 Abbrev->Add(BitCodeAbbrevOp(TYPE_OFFSET)); 2759 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of types 2760 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index 2761 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block 2762 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2763 Record.clear(); 2764 Record.push_back(TYPE_OFFSET); 2765 Record.push_back(TypeOffsets.size()); 2766 Record.push_back(FirstTypeID - NUM_PREDEF_TYPE_IDS); 2767 Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets)); 2768 2769 // Write the declaration offsets array 2770 Abbrev = new BitCodeAbbrev(); 2771 Abbrev->Add(BitCodeAbbrevOp(DECL_OFFSET)); 2772 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of declarations 2773 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID 2774 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block 2775 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 2776 Record.clear(); 2777 Record.push_back(DECL_OFFSET); 2778 Record.push_back(DeclOffsets.size()); 2779 Record.push_back(FirstDeclID - NUM_PREDEF_DECL_IDS); 2780 Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets)); 2781 } 2782 2783 void ASTWriter::WriteFileDeclIDsMap() { 2784 using namespace llvm; 2785 RecordData Record; 2786 2787 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs( 2788 FileDeclIDs.begin(), FileDeclIDs.end()); 2789 std::sort(SortedFileDeclIDs.begin(), SortedFileDeclIDs.end(), 2790 llvm::less_first()); 2791 2792 // Join the vectors of DeclIDs from all files. 2793 SmallVector<DeclID, 256> FileGroupedDeclIDs; 2794 for (auto &FileDeclEntry : SortedFileDeclIDs) { 2795 DeclIDInFileInfo &Info = *FileDeclEntry.second; 2796 Info.FirstDeclIndex = FileGroupedDeclIDs.size(); 2797 for (auto &LocDeclEntry : Info.DeclIDs) 2798 FileGroupedDeclIDs.push_back(LocDeclEntry.second); 2799 } 2800 2801 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 2802 Abbrev->Add(BitCodeAbbrevOp(FILE_SORTED_DECLS)); 2803 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 2804 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2805 unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 2806 Record.push_back(FILE_SORTED_DECLS); 2807 Record.push_back(FileGroupedDeclIDs.size()); 2808 Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs)); 2809 } 2810 2811 void ASTWriter::WriteComments() { 2812 Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3); 2813 ArrayRef<RawComment *> RawComments = Context->Comments.getComments(); 2814 RecordData Record; 2815 for (ArrayRef<RawComment *>::iterator I = RawComments.begin(), 2816 E = RawComments.end(); 2817 I != E; ++I) { 2818 Record.clear(); 2819 AddSourceRange((*I)->getSourceRange(), Record); 2820 Record.push_back((*I)->getKind()); 2821 Record.push_back((*I)->isTrailingComment()); 2822 Record.push_back((*I)->isAlmostTrailingComment()); 2823 Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record); 2824 } 2825 Stream.ExitBlock(); 2826 } 2827 2828 //===----------------------------------------------------------------------===// 2829 // Global Method Pool and Selector Serialization 2830 //===----------------------------------------------------------------------===// 2831 2832 namespace { 2833 // Trait used for the on-disk hash table used in the method pool. 2834 class ASTMethodPoolTrait { 2835 ASTWriter &Writer; 2836 2837 public: 2838 typedef Selector key_type; 2839 typedef key_type key_type_ref; 2840 2841 struct data_type { 2842 SelectorID ID; 2843 ObjCMethodList Instance, Factory; 2844 }; 2845 typedef const data_type& data_type_ref; 2846 2847 typedef unsigned hash_value_type; 2848 typedef unsigned offset_type; 2849 2850 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) { } 2851 2852 static hash_value_type ComputeHash(Selector Sel) { 2853 return serialization::ComputeHash(Sel); 2854 } 2855 2856 std::pair<unsigned,unsigned> 2857 EmitKeyDataLength(raw_ostream& Out, Selector Sel, 2858 data_type_ref Methods) { 2859 using namespace llvm::support; 2860 endian::Writer<little> LE(Out); 2861 unsigned KeyLen = 2 + (Sel.getNumArgs()? Sel.getNumArgs() * 4 : 4); 2862 LE.write<uint16_t>(KeyLen); 2863 unsigned DataLen = 4 + 2 + 2; // 2 bytes for each of the method counts 2864 for (const ObjCMethodList *Method = &Methods.Instance; Method; 2865 Method = Method->getNext()) 2866 if (Method->getMethod()) 2867 DataLen += 4; 2868 for (const ObjCMethodList *Method = &Methods.Factory; Method; 2869 Method = Method->getNext()) 2870 if (Method->getMethod()) 2871 DataLen += 4; 2872 LE.write<uint16_t>(DataLen); 2873 return std::make_pair(KeyLen, DataLen); 2874 } 2875 2876 void EmitKey(raw_ostream& Out, Selector Sel, unsigned) { 2877 using namespace llvm::support; 2878 endian::Writer<little> LE(Out); 2879 uint64_t Start = Out.tell(); 2880 assert((Start >> 32) == 0 && "Selector key offset too large"); 2881 Writer.SetSelectorOffset(Sel, Start); 2882 unsigned N = Sel.getNumArgs(); 2883 LE.write<uint16_t>(N); 2884 if (N == 0) 2885 N = 1; 2886 for (unsigned I = 0; I != N; ++I) 2887 LE.write<uint32_t>( 2888 Writer.getIdentifierRef(Sel.getIdentifierInfoForSlot(I))); 2889 } 2890 2891 void EmitData(raw_ostream& Out, key_type_ref, 2892 data_type_ref Methods, unsigned DataLen) { 2893 using namespace llvm::support; 2894 endian::Writer<little> LE(Out); 2895 uint64_t Start = Out.tell(); (void)Start; 2896 LE.write<uint32_t>(Methods.ID); 2897 unsigned NumInstanceMethods = 0; 2898 for (const ObjCMethodList *Method = &Methods.Instance; Method; 2899 Method = Method->getNext()) 2900 if (Method->getMethod()) 2901 ++NumInstanceMethods; 2902 2903 unsigned NumFactoryMethods = 0; 2904 for (const ObjCMethodList *Method = &Methods.Factory; Method; 2905 Method = Method->getNext()) 2906 if (Method->getMethod()) 2907 ++NumFactoryMethods; 2908 2909 unsigned InstanceBits = Methods.Instance.getBits(); 2910 assert(InstanceBits < 4); 2911 unsigned InstanceHasMoreThanOneDeclBit = 2912 Methods.Instance.hasMoreThanOneDecl(); 2913 unsigned FullInstanceBits = (NumInstanceMethods << 3) | 2914 (InstanceHasMoreThanOneDeclBit << 2) | 2915 InstanceBits; 2916 unsigned FactoryBits = Methods.Factory.getBits(); 2917 assert(FactoryBits < 4); 2918 unsigned FactoryHasMoreThanOneDeclBit = 2919 Methods.Factory.hasMoreThanOneDecl(); 2920 unsigned FullFactoryBits = (NumFactoryMethods << 3) | 2921 (FactoryHasMoreThanOneDeclBit << 2) | 2922 FactoryBits; 2923 LE.write<uint16_t>(FullInstanceBits); 2924 LE.write<uint16_t>(FullFactoryBits); 2925 for (const ObjCMethodList *Method = &Methods.Instance; Method; 2926 Method = Method->getNext()) 2927 if (Method->getMethod()) 2928 LE.write<uint32_t>(Writer.getDeclID(Method->getMethod())); 2929 for (const ObjCMethodList *Method = &Methods.Factory; Method; 2930 Method = Method->getNext()) 2931 if (Method->getMethod()) 2932 LE.write<uint32_t>(Writer.getDeclID(Method->getMethod())); 2933 2934 assert(Out.tell() - Start == DataLen && "Data length is wrong"); 2935 } 2936 }; 2937 } // end anonymous namespace 2938 2939 /// \brief Write ObjC data: selectors and the method pool. 2940 /// 2941 /// The method pool contains both instance and factory methods, stored 2942 /// in an on-disk hash table indexed by the selector. The hash table also 2943 /// contains an empty entry for every other selector known to Sema. 2944 void ASTWriter::WriteSelectors(Sema &SemaRef) { 2945 using namespace llvm; 2946 2947 // Do we have to do anything at all? 2948 if (SemaRef.MethodPool.empty() && SelectorIDs.empty()) 2949 return; 2950 unsigned NumTableEntries = 0; 2951 // Create and write out the blob that contains selectors and the method pool. 2952 { 2953 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait> Generator; 2954 ASTMethodPoolTrait Trait(*this); 2955 2956 // Create the on-disk hash table representation. We walk through every 2957 // selector we've seen and look it up in the method pool. 2958 SelectorOffsets.resize(NextSelectorID - FirstSelectorID); 2959 for (auto &SelectorAndID : SelectorIDs) { 2960 Selector S = SelectorAndID.first; 2961 SelectorID ID = SelectorAndID.second; 2962 Sema::GlobalMethodPool::iterator F = SemaRef.MethodPool.find(S); 2963 ASTMethodPoolTrait::data_type Data = { 2964 ID, 2965 ObjCMethodList(), 2966 ObjCMethodList() 2967 }; 2968 if (F != SemaRef.MethodPool.end()) { 2969 Data.Instance = F->second.first; 2970 Data.Factory = F->second.second; 2971 } 2972 // Only write this selector if it's not in an existing AST or something 2973 // changed. 2974 if (Chain && ID < FirstSelectorID) { 2975 // Selector already exists. Did it change? 2976 bool changed = false; 2977 for (ObjCMethodList *M = &Data.Instance; 2978 !changed && M && M->getMethod(); M = M->getNext()) { 2979 if (!M->getMethod()->isFromASTFile()) 2980 changed = true; 2981 } 2982 for (ObjCMethodList *M = &Data.Factory; !changed && M && M->getMethod(); 2983 M = M->getNext()) { 2984 if (!M->getMethod()->isFromASTFile()) 2985 changed = true; 2986 } 2987 if (!changed) 2988 continue; 2989 } else if (Data.Instance.getMethod() || Data.Factory.getMethod()) { 2990 // A new method pool entry. 2991 ++NumTableEntries; 2992 } 2993 Generator.insert(S, Data, Trait); 2994 } 2995 2996 // Create the on-disk hash table in a buffer. 2997 SmallString<4096> MethodPool; 2998 uint32_t BucketOffset; 2999 { 3000 using namespace llvm::support; 3001 ASTMethodPoolTrait Trait(*this); 3002 llvm::raw_svector_ostream Out(MethodPool); 3003 // Make sure that no bucket is at offset 0 3004 endian::Writer<little>(Out).write<uint32_t>(0); 3005 BucketOffset = Generator.Emit(Out, Trait); 3006 } 3007 3008 // Create a blob abbreviation 3009 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 3010 Abbrev->Add(BitCodeAbbrevOp(METHOD_POOL)); 3011 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 3012 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 3013 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3014 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev); 3015 3016 // Write the method pool 3017 RecordData Record; 3018 Record.push_back(METHOD_POOL); 3019 Record.push_back(BucketOffset); 3020 Record.push_back(NumTableEntries); 3021 Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool); 3022 3023 // Create a blob abbreviation for the selector table offsets. 3024 Abbrev = new BitCodeAbbrev(); 3025 Abbrev->Add(BitCodeAbbrevOp(SELECTOR_OFFSETS)); 3026 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size 3027 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 3028 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3029 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 3030 3031 // Write the selector offsets table. 3032 Record.clear(); 3033 Record.push_back(SELECTOR_OFFSETS); 3034 Record.push_back(SelectorOffsets.size()); 3035 Record.push_back(FirstSelectorID - NUM_PREDEF_SELECTOR_IDS); 3036 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record, 3037 bytes(SelectorOffsets)); 3038 } 3039 } 3040 3041 /// \brief Write the selectors referenced in @selector expression into AST file. 3042 void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) { 3043 using namespace llvm; 3044 if (SemaRef.ReferencedSelectors.empty()) 3045 return; 3046 3047 RecordData Record; 3048 3049 // Note: this writes out all references even for a dependent AST. But it is 3050 // very tricky to fix, and given that @selector shouldn't really appear in 3051 // headers, probably not worth it. It's not a correctness issue. 3052 for (auto &SelectorAndLocation : SemaRef.ReferencedSelectors) { 3053 Selector Sel = SelectorAndLocation.first; 3054 SourceLocation Loc = SelectorAndLocation.second; 3055 AddSelectorRef(Sel, Record); 3056 AddSourceLocation(Loc, Record); 3057 } 3058 Stream.EmitRecord(REFERENCED_SELECTOR_POOL, Record); 3059 } 3060 3061 //===----------------------------------------------------------------------===// 3062 // Identifier Table Serialization 3063 //===----------------------------------------------------------------------===// 3064 3065 /// Determine the declaration that should be put into the name lookup table to 3066 /// represent the given declaration in this module. This is usually D itself, 3067 /// but if D was imported and merged into a local declaration, we want the most 3068 /// recent local declaration instead. The chosen declaration will be the most 3069 /// recent declaration in any module that imports this one. 3070 static NamedDecl *getDeclForLocalLookup(const LangOptions &LangOpts, 3071 NamedDecl *D) { 3072 if (!LangOpts.Modules || !D->isFromASTFile()) 3073 return D; 3074 3075 if (Decl *Redecl = D->getPreviousDecl()) { 3076 // For Redeclarable decls, a prior declaration might be local. 3077 for (; Redecl; Redecl = Redecl->getPreviousDecl()) { 3078 if (!Redecl->isFromASTFile()) 3079 return cast<NamedDecl>(Redecl); 3080 // If we find a decl from a (chained-)PCH stop since we won't find a 3081 // local one. 3082 if (D->getOwningModuleID() == 0) 3083 break; 3084 } 3085 } else if (Decl *First = D->getCanonicalDecl()) { 3086 // For Mergeable decls, the first decl might be local. 3087 if (!First->isFromASTFile()) 3088 return cast<NamedDecl>(First); 3089 } 3090 3091 // All declarations are imported. Our most recent declaration will also be 3092 // the most recent one in anyone who imports us. 3093 return D; 3094 } 3095 3096 namespace { 3097 class ASTIdentifierTableTrait { 3098 ASTWriter &Writer; 3099 Preprocessor &PP; 3100 IdentifierResolver &IdResolver; 3101 bool IsModule; 3102 bool NeedDecls; 3103 ASTWriter::RecordData *InterestingIdentifierOffsets; 3104 3105 /// \brief Determines whether this is an "interesting" identifier that needs a 3106 /// full IdentifierInfo structure written into the hash table. Notably, this 3107 /// doesn't check whether the name has macros defined; use PublicMacroIterator 3108 /// to check that. 3109 bool isInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset) { 3110 if (MacroOffset || 3111 II->isPoisoned() || 3112 (IsModule ? II->hasRevertedBuiltin() : II->getObjCOrBuiltinID()) || 3113 II->hasRevertedTokenIDToIdentifier() || 3114 (NeedDecls && II->getFETokenInfo<void>())) 3115 return true; 3116 3117 return false; 3118 } 3119 3120 public: 3121 typedef IdentifierInfo* key_type; 3122 typedef key_type key_type_ref; 3123 3124 typedef IdentID data_type; 3125 typedef data_type data_type_ref; 3126 3127 typedef unsigned hash_value_type; 3128 typedef unsigned offset_type; 3129 3130 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP, 3131 IdentifierResolver &IdResolver, bool IsModule, 3132 ASTWriter::RecordData *InterestingIdentifierOffsets) 3133 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule), 3134 NeedDecls(!IsModule || !Writer.getLangOpts().CPlusPlus), 3135 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {} 3136 3137 static hash_value_type ComputeHash(const IdentifierInfo* II) { 3138 return llvm::HashString(II->getName()); 3139 } 3140 3141 bool isInterestingIdentifier(const IdentifierInfo *II) { 3142 auto MacroOffset = Writer.getMacroDirectivesOffset(II); 3143 return isInterestingIdentifier(II, MacroOffset); 3144 } 3145 bool isInterestingNonMacroIdentifier(const IdentifierInfo *II) { 3146 return isInterestingIdentifier(II, 0); 3147 } 3148 3149 std::pair<unsigned,unsigned> 3150 EmitKeyDataLength(raw_ostream& Out, IdentifierInfo* II, IdentID ID) { 3151 unsigned KeyLen = II->getLength() + 1; 3152 unsigned DataLen = 4; // 4 bytes for the persistent ID << 1 3153 auto MacroOffset = Writer.getMacroDirectivesOffset(II); 3154 if (isInterestingIdentifier(II, MacroOffset)) { 3155 DataLen += 2; // 2 bytes for builtin ID 3156 DataLen += 2; // 2 bytes for flags 3157 if (MacroOffset) 3158 DataLen += 4; // MacroDirectives offset. 3159 3160 if (NeedDecls) { 3161 for (IdentifierResolver::iterator D = IdResolver.begin(II), 3162 DEnd = IdResolver.end(); 3163 D != DEnd; ++D) 3164 DataLen += 4; 3165 } 3166 } 3167 using namespace llvm::support; 3168 endian::Writer<little> LE(Out); 3169 3170 assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen); 3171 LE.write<uint16_t>(DataLen); 3172 // We emit the key length after the data length so that every 3173 // string is preceded by a 16-bit length. This matches the PTH 3174 // format for storing identifiers. 3175 LE.write<uint16_t>(KeyLen); 3176 return std::make_pair(KeyLen, DataLen); 3177 } 3178 3179 void EmitKey(raw_ostream& Out, const IdentifierInfo* II, 3180 unsigned KeyLen) { 3181 // Record the location of the key data. This is used when generating 3182 // the mapping from persistent IDs to strings. 3183 Writer.SetIdentifierOffset(II, Out.tell()); 3184 3185 // Emit the offset of the key/data length information to the interesting 3186 // identifiers table if necessary. 3187 if (InterestingIdentifierOffsets && isInterestingIdentifier(II)) 3188 InterestingIdentifierOffsets->push_back(Out.tell() - 4); 3189 3190 Out.write(II->getNameStart(), KeyLen); 3191 } 3192 3193 void EmitData(raw_ostream& Out, IdentifierInfo* II, 3194 IdentID ID, unsigned) { 3195 using namespace llvm::support; 3196 endian::Writer<little> LE(Out); 3197 3198 auto MacroOffset = Writer.getMacroDirectivesOffset(II); 3199 if (!isInterestingIdentifier(II, MacroOffset)) { 3200 LE.write<uint32_t>(ID << 1); 3201 return; 3202 } 3203 3204 LE.write<uint32_t>((ID << 1) | 0x01); 3205 uint32_t Bits = (uint32_t)II->getObjCOrBuiltinID(); 3206 assert((Bits & 0xffff) == Bits && "ObjCOrBuiltinID too big for ASTReader."); 3207 LE.write<uint16_t>(Bits); 3208 Bits = 0; 3209 bool HadMacroDefinition = MacroOffset != 0; 3210 Bits = (Bits << 1) | unsigned(HadMacroDefinition); 3211 Bits = (Bits << 1) | unsigned(II->isExtensionToken()); 3212 Bits = (Bits << 1) | unsigned(II->isPoisoned()); 3213 Bits = (Bits << 1) | unsigned(II->hasRevertedBuiltin()); 3214 Bits = (Bits << 1) | unsigned(II->hasRevertedTokenIDToIdentifier()); 3215 Bits = (Bits << 1) | unsigned(II->isCPlusPlusOperatorKeyword()); 3216 LE.write<uint16_t>(Bits); 3217 3218 if (HadMacroDefinition) 3219 LE.write<uint32_t>(MacroOffset); 3220 3221 if (NeedDecls) { 3222 // Emit the declaration IDs in reverse order, because the 3223 // IdentifierResolver provides the declarations as they would be 3224 // visible (e.g., the function "stat" would come before the struct 3225 // "stat"), but the ASTReader adds declarations to the end of the list 3226 // (so we need to see the struct "stat" before the function "stat"). 3227 // Only emit declarations that aren't from a chained PCH, though. 3228 SmallVector<NamedDecl *, 16> Decls(IdResolver.begin(II), 3229 IdResolver.end()); 3230 for (SmallVectorImpl<NamedDecl *>::reverse_iterator D = Decls.rbegin(), 3231 DEnd = Decls.rend(); 3232 D != DEnd; ++D) 3233 LE.write<uint32_t>( 3234 Writer.getDeclID(getDeclForLocalLookup(PP.getLangOpts(), *D))); 3235 } 3236 } 3237 }; 3238 } // end anonymous namespace 3239 3240 /// \brief Write the identifier table into the AST file. 3241 /// 3242 /// The identifier table consists of a blob containing string data 3243 /// (the actual identifiers themselves) and a separate "offsets" index 3244 /// that maps identifier IDs to locations within the blob. 3245 void ASTWriter::WriteIdentifierTable(Preprocessor &PP, 3246 IdentifierResolver &IdResolver, 3247 bool IsModule) { 3248 using namespace llvm; 3249 3250 RecordData InterestingIdents; 3251 3252 // Create and write out the blob that contains the identifier 3253 // strings. 3254 { 3255 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait> Generator; 3256 ASTIdentifierTableTrait Trait( 3257 *this, PP, IdResolver, IsModule, 3258 (getLangOpts().CPlusPlus && IsModule) ? &InterestingIdents : nullptr); 3259 3260 // Look for any identifiers that were named while processing the 3261 // headers, but are otherwise not needed. We add these to the hash 3262 // table to enable checking of the predefines buffer in the case 3263 // where the user adds new macro definitions when building the AST 3264 // file. 3265 SmallVector<const IdentifierInfo *, 128> IIs; 3266 for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), 3267 IDEnd = PP.getIdentifierTable().end(); 3268 ID != IDEnd; ++ID) 3269 IIs.push_back(ID->second); 3270 // Sort the identifiers lexicographically before getting them references so 3271 // that their order is stable. 3272 std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); 3273 for (const IdentifierInfo *II : IIs) 3274 if (Trait.isInterestingNonMacroIdentifier(II)) 3275 getIdentifierRef(II); 3276 3277 // Create the on-disk hash table representation. We only store offsets 3278 // for identifiers that appear here for the first time. 3279 IdentifierOffsets.resize(NextIdentID - FirstIdentID); 3280 for (auto IdentIDPair : IdentifierIDs) { 3281 IdentifierInfo *II = const_cast<IdentifierInfo *>(IdentIDPair.first); 3282 IdentID ID = IdentIDPair.second; 3283 assert(II && "NULL identifier in identifier table"); 3284 if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) 3285 Generator.insert(II, ID, Trait); 3286 } 3287 3288 // Create the on-disk hash table in a buffer. 3289 SmallString<4096> IdentifierTable; 3290 uint32_t BucketOffset; 3291 { 3292 using namespace llvm::support; 3293 llvm::raw_svector_ostream Out(IdentifierTable); 3294 // Make sure that no bucket is at offset 0 3295 endian::Writer<little>(Out).write<uint32_t>(0); 3296 BucketOffset = Generator.Emit(Out, Trait); 3297 } 3298 3299 // Create a blob abbreviation 3300 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 3301 Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_TABLE)); 3302 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 3303 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3304 unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev); 3305 3306 // Write the identifier table 3307 RecordData Record; 3308 Record.push_back(IDENTIFIER_TABLE); 3309 Record.push_back(BucketOffset); 3310 Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable); 3311 } 3312 3313 // Write the offsets table for identifier IDs. 3314 BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 3315 Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_OFFSET)); 3316 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of identifiers 3317 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 3318 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3319 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 3320 3321 #ifndef NDEBUG 3322 for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I) 3323 assert(IdentifierOffsets[I] && "Missing identifier offset?"); 3324 #endif 3325 3326 RecordData Record; 3327 Record.push_back(IDENTIFIER_OFFSET); 3328 Record.push_back(IdentifierOffsets.size()); 3329 Record.push_back(FirstIdentID - NUM_PREDEF_IDENT_IDS); 3330 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record, 3331 bytes(IdentifierOffsets)); 3332 3333 // In C++, write the list of interesting identifiers (those that are 3334 // defined as macros, poisoned, or similar unusual things). 3335 if (!InterestingIdents.empty()) 3336 Stream.EmitRecord(INTERESTING_IDENTIFIERS, InterestingIdents); 3337 } 3338 3339 //===----------------------------------------------------------------------===// 3340 // DeclContext's Name Lookup Table Serialization 3341 //===----------------------------------------------------------------------===// 3342 3343 namespace { 3344 // Trait used for the on-disk hash table used in the method pool. 3345 class ASTDeclContextNameLookupTrait { 3346 ASTWriter &Writer; 3347 3348 public: 3349 typedef DeclarationName key_type; 3350 typedef key_type key_type_ref; 3351 3352 typedef DeclContext::lookup_result data_type; 3353 typedef const data_type& data_type_ref; 3354 3355 typedef unsigned hash_value_type; 3356 typedef unsigned offset_type; 3357 3358 explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) : Writer(Writer) { } 3359 3360 hash_value_type ComputeHash(DeclarationName Name) { 3361 llvm::FoldingSetNodeID ID; 3362 ID.AddInteger(Name.getNameKind()); 3363 3364 switch (Name.getNameKind()) { 3365 case DeclarationName::Identifier: 3366 ID.AddString(Name.getAsIdentifierInfo()->getName()); 3367 break; 3368 case DeclarationName::ObjCZeroArgSelector: 3369 case DeclarationName::ObjCOneArgSelector: 3370 case DeclarationName::ObjCMultiArgSelector: 3371 ID.AddInteger(serialization::ComputeHash(Name.getObjCSelector())); 3372 break; 3373 case DeclarationName::CXXConstructorName: 3374 case DeclarationName::CXXDestructorName: 3375 case DeclarationName::CXXConversionFunctionName: 3376 break; 3377 case DeclarationName::CXXOperatorName: 3378 ID.AddInteger(Name.getCXXOverloadedOperator()); 3379 break; 3380 case DeclarationName::CXXLiteralOperatorName: 3381 ID.AddString(Name.getCXXLiteralIdentifier()->getName()); 3382 case DeclarationName::CXXUsingDirective: 3383 break; 3384 } 3385 3386 return ID.ComputeHash(); 3387 } 3388 3389 std::pair<unsigned,unsigned> 3390 EmitKeyDataLength(raw_ostream& Out, DeclarationName Name, 3391 data_type_ref Lookup) { 3392 using namespace llvm::support; 3393 endian::Writer<little> LE(Out); 3394 unsigned KeyLen = 1; 3395 switch (Name.getNameKind()) { 3396 case DeclarationName::Identifier: 3397 case DeclarationName::ObjCZeroArgSelector: 3398 case DeclarationName::ObjCOneArgSelector: 3399 case DeclarationName::ObjCMultiArgSelector: 3400 case DeclarationName::CXXLiteralOperatorName: 3401 KeyLen += 4; 3402 break; 3403 case DeclarationName::CXXOperatorName: 3404 KeyLen += 1; 3405 break; 3406 case DeclarationName::CXXConstructorName: 3407 case DeclarationName::CXXDestructorName: 3408 case DeclarationName::CXXConversionFunctionName: 3409 case DeclarationName::CXXUsingDirective: 3410 break; 3411 } 3412 LE.write<uint16_t>(KeyLen); 3413 3414 // 4 bytes for each DeclID. 3415 unsigned DataLen = 4 * Lookup.size(); 3416 LE.write<uint16_t>(DataLen); 3417 3418 return std::make_pair(KeyLen, DataLen); 3419 } 3420 3421 void EmitKey(raw_ostream& Out, DeclarationName Name, unsigned) { 3422 using namespace llvm::support; 3423 endian::Writer<little> LE(Out); 3424 LE.write<uint8_t>(Name.getNameKind()); 3425 switch (Name.getNameKind()) { 3426 case DeclarationName::Identifier: 3427 LE.write<uint32_t>(Writer.getIdentifierRef(Name.getAsIdentifierInfo())); 3428 return; 3429 case DeclarationName::ObjCZeroArgSelector: 3430 case DeclarationName::ObjCOneArgSelector: 3431 case DeclarationName::ObjCMultiArgSelector: 3432 LE.write<uint32_t>(Writer.getSelectorRef(Name.getObjCSelector())); 3433 return; 3434 case DeclarationName::CXXOperatorName: 3435 assert(Name.getCXXOverloadedOperator() < NUM_OVERLOADED_OPERATORS && 3436 "Invalid operator?"); 3437 LE.write<uint8_t>(Name.getCXXOverloadedOperator()); 3438 return; 3439 case DeclarationName::CXXLiteralOperatorName: 3440 LE.write<uint32_t>(Writer.getIdentifierRef(Name.getCXXLiteralIdentifier())); 3441 return; 3442 case DeclarationName::CXXConstructorName: 3443 case DeclarationName::CXXDestructorName: 3444 case DeclarationName::CXXConversionFunctionName: 3445 case DeclarationName::CXXUsingDirective: 3446 return; 3447 } 3448 3449 llvm_unreachable("Invalid name kind?"); 3450 } 3451 3452 void EmitData(raw_ostream& Out, key_type_ref, 3453 data_type Lookup, unsigned DataLen) { 3454 using namespace llvm::support; 3455 endian::Writer<little> LE(Out); 3456 uint64_t Start = Out.tell(); (void)Start; 3457 for (DeclContext::lookup_iterator I = Lookup.begin(), E = Lookup.end(); 3458 I != E; ++I) 3459 LE.write<uint32_t>( 3460 Writer.GetDeclRef(getDeclForLocalLookup(Writer.getLangOpts(), *I))); 3461 3462 assert(Out.tell() - Start == DataLen && "Data length is wrong"); 3463 } 3464 }; 3465 } // end anonymous namespace 3466 3467 bool ASTWriter::isLookupResultExternal(StoredDeclsList &Result, 3468 DeclContext *DC) { 3469 return Result.hasExternalDecls() && DC->NeedToReconcileExternalVisibleStorage; 3470 } 3471 3472 bool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result, 3473 DeclContext *DC) { 3474 for (auto *D : Result.getLookupResult()) 3475 if (!getDeclForLocalLookup(getLangOpts(), D)->isFromASTFile()) 3476 return false; 3477 3478 return true; 3479 } 3480 3481 uint32_t 3482 ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC, 3483 llvm::SmallVectorImpl<char> &LookupTable) { 3484 assert(!ConstDC->HasLazyLocalLexicalLookups && 3485 !ConstDC->HasLazyExternalLexicalLookups && 3486 "must call buildLookups first"); 3487 3488 // FIXME: We need to build the lookups table, which is logically const. 3489 DeclContext *DC = const_cast<DeclContext*>(ConstDC); 3490 assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); 3491 3492 // Create the on-disk hash table representation. 3493 llvm::OnDiskChainedHashTableGenerator<ASTDeclContextNameLookupTrait> 3494 Generator; 3495 ASTDeclContextNameLookupTrait Trait(*this); 3496 3497 // The first step is to collect the declaration names which we need to 3498 // serialize into the name lookup table, and to collect them in a stable 3499 // order. 3500 SmallVector<DeclarationName, 16> Names; 3501 3502 // We also build up small sets of the constructor and conversion function 3503 // names which are visible. 3504 llvm::SmallSet<DeclarationName, 8> ConstructorNameSet, ConversionNameSet; 3505 3506 for (auto &Lookup : *DC->buildLookup()) { 3507 auto &Name = Lookup.first; 3508 auto &Result = Lookup.second; 3509 3510 // If there are no local declarations in our lookup result, we don't 3511 // need to write an entry for the name at all unless we're rewriting 3512 // the decl context. If we can't write out a lookup set without 3513 // performing more deserialization, just skip this entry. 3514 if (isLookupResultExternal(Result, DC) && !isRewritten(cast<Decl>(DC)) && 3515 isLookupResultEntirelyExternal(Result, DC)) 3516 continue; 3517 3518 // We also skip empty results. If any of the results could be external and 3519 // the currently available results are empty, then all of the results are 3520 // external and we skip it above. So the only way we get here with an empty 3521 // results is when no results could have been external *and* we have 3522 // external results. 3523 // 3524 // FIXME: While we might want to start emitting on-disk entries for negative 3525 // lookups into a decl context as an optimization, today we *have* to skip 3526 // them because there are names with empty lookup results in decl contexts 3527 // which we can't emit in any stable ordering: we lookup constructors and 3528 // conversion functions in the enclosing namespace scope creating empty 3529 // results for them. This in almost certainly a bug in Clang's name lookup, 3530 // but that is likely to be hard or impossible to fix and so we tolerate it 3531 // here by omitting lookups with empty results. 3532 if (Lookup.second.getLookupResult().empty()) 3533 continue; 3534 3535 switch (Lookup.first.getNameKind()) { 3536 default: 3537 Names.push_back(Lookup.first); 3538 break; 3539 3540 case DeclarationName::CXXConstructorName: 3541 assert(isa<CXXRecordDecl>(DC) && 3542 "Cannot have a constructor name outside of a class!"); 3543 ConstructorNameSet.insert(Name); 3544 break; 3545 3546 case DeclarationName::CXXConversionFunctionName: 3547 assert(isa<CXXRecordDecl>(DC) && 3548 "Cannot have a conversion function name outside of a class!"); 3549 ConversionNameSet.insert(Name); 3550 break; 3551 } 3552 } 3553 3554 // Sort the names into a stable order. 3555 std::sort(Names.begin(), Names.end()); 3556 3557 if (auto *D = dyn_cast<CXXRecordDecl>(DC)) { 3558 // We need to establish an ordering of constructor and conversion function 3559 // names, and they don't have an intrinsic ordering. 3560 3561 // First we try the easy case by forming the current context's constructor 3562 // name and adding that name first. This is a very useful optimization to 3563 // avoid walking the lexical declarations in many cases, and it also 3564 // handles the only case where a constructor name can come from some other 3565 // lexical context -- when that name is an implicit constructor merged from 3566 // another declaration in the redecl chain. Any non-implicit constructor or 3567 // conversion function which doesn't occur in all the lexical contexts 3568 // would be an ODR violation. 3569 auto ImplicitCtorName = Context->DeclarationNames.getCXXConstructorName( 3570 Context->getCanonicalType(Context->getRecordType(D))); 3571 if (ConstructorNameSet.erase(ImplicitCtorName)) 3572 Names.push_back(ImplicitCtorName); 3573 3574 // If we still have constructors or conversion functions, we walk all the 3575 // names in the decl and add the constructors and conversion functions 3576 // which are visible in the order they lexically occur within the context. 3577 if (!ConstructorNameSet.empty() || !ConversionNameSet.empty()) 3578 for (Decl *ChildD : cast<CXXRecordDecl>(DC)->decls()) 3579 if (auto *ChildND = dyn_cast<NamedDecl>(ChildD)) { 3580 auto Name = ChildND->getDeclName(); 3581 switch (Name.getNameKind()) { 3582 default: 3583 continue; 3584 3585 case DeclarationName::CXXConstructorName: 3586 if (ConstructorNameSet.erase(Name)) 3587 Names.push_back(Name); 3588 break; 3589 3590 case DeclarationName::CXXConversionFunctionName: 3591 if (ConversionNameSet.erase(Name)) 3592 Names.push_back(Name); 3593 break; 3594 } 3595 3596 if (ConstructorNameSet.empty() && ConversionNameSet.empty()) 3597 break; 3598 } 3599 3600 assert(ConstructorNameSet.empty() && "Failed to find all of the visible " 3601 "constructors by walking all the " 3602 "lexical members of the context."); 3603 assert(ConversionNameSet.empty() && "Failed to find all of the visible " 3604 "conversion functions by walking all " 3605 "the lexical members of the context."); 3606 } 3607 3608 // Next we need to do a lookup with each name into this decl context to fully 3609 // populate any results from external sources. We don't actually use the 3610 // results of these lookups because we only want to use the results after all 3611 // results have been loaded and the pointers into them will be stable. 3612 for (auto &Name : Names) 3613 DC->lookup(Name); 3614 3615 // Now we need to insert the results for each name into the hash table. For 3616 // constructor names and conversion function names, we actually need to merge 3617 // all of the results for them into one list of results each and insert 3618 // those. 3619 SmallVector<NamedDecl *, 8> ConstructorDecls; 3620 SmallVector<NamedDecl *, 8> ConversionDecls; 3621 3622 // Now loop over the names, either inserting them or appending for the two 3623 // special cases. 3624 for (auto &Name : Names) { 3625 DeclContext::lookup_result Result = DC->noload_lookup(Name); 3626 3627 switch (Name.getNameKind()) { 3628 default: 3629 Generator.insert(Name, Result, Trait); 3630 break; 3631 3632 case DeclarationName::CXXConstructorName: 3633 ConstructorDecls.append(Result.begin(), Result.end()); 3634 break; 3635 3636 case DeclarationName::CXXConversionFunctionName: 3637 ConversionDecls.append(Result.begin(), Result.end()); 3638 break; 3639 } 3640 } 3641 3642 // Handle our two special cases if we ended up having any. We arbitrarily use 3643 // the first declaration's name here because the name itself isn't part of 3644 // the key, only the kind of name is used. 3645 if (!ConstructorDecls.empty()) 3646 Generator.insert(ConstructorDecls.front()->getDeclName(), 3647 DeclContext::lookup_result(ConstructorDecls), Trait); 3648 if (!ConversionDecls.empty()) 3649 Generator.insert(ConversionDecls.front()->getDeclName(), 3650 DeclContext::lookup_result(ConversionDecls), Trait); 3651 3652 // Create the on-disk hash table in a buffer. 3653 llvm::raw_svector_ostream Out(LookupTable); 3654 // Make sure that no bucket is at offset 0 3655 using namespace llvm::support; 3656 endian::Writer<little>(Out).write<uint32_t>(0); 3657 return Generator.Emit(Out, Trait); 3658 } 3659 3660 /// \brief Write the block containing all of the declaration IDs 3661 /// visible from the given DeclContext. 3662 /// 3663 /// \returns the offset of the DECL_CONTEXT_VISIBLE block within the 3664 /// bitstream, or 0 if no block was written. 3665 uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, 3666 DeclContext *DC) { 3667 // If we imported a key declaration of this namespace, write the visible 3668 // lookup results as an update record for it rather than including them 3669 // on this declaration. We will only look at key declarations on reload. 3670 if (isa<NamespaceDecl>(DC) && Chain && 3671 Chain->getKeyDeclaration(cast<Decl>(DC))->isFromASTFile()) { 3672 // Only do this once, for the first local declaration of the namespace. 3673 for (NamespaceDecl *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev; 3674 Prev = Prev->getPreviousDecl()) 3675 if (!Prev->isFromASTFile()) 3676 return 0; 3677 3678 // Note that we need to emit an update record for the primary context. 3679 UpdatedDeclContexts.insert(DC->getPrimaryContext()); 3680 3681 // Make sure all visible decls are written. They will be recorded later. We 3682 // do this using a side data structure so we can sort the names into 3683 // a deterministic order. 3684 StoredDeclsMap *Map = DC->getPrimaryContext()->buildLookup(); 3685 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16> 3686 LookupResults; 3687 if (Map) { 3688 LookupResults.reserve(Map->size()); 3689 for (auto &Entry : *Map) 3690 LookupResults.push_back( 3691 std::make_pair(Entry.first, Entry.second.getLookupResult())); 3692 } 3693 3694 std::sort(LookupResults.begin(), LookupResults.end(), llvm::less_first()); 3695 for (auto &NameAndResult : LookupResults) { 3696 DeclarationName Name = NameAndResult.first; 3697 DeclContext::lookup_result Result = NameAndResult.second; 3698 if (Name.getNameKind() == DeclarationName::CXXConstructorName || 3699 Name.getNameKind() == DeclarationName::CXXConversionFunctionName) { 3700 // We have to work around a name lookup bug here where negative lookup 3701 // results for these names get cached in namespace lookup tables (these 3702 // names should never be looked up in a namespace). 3703 assert(Result.empty() && "Cannot have a constructor or conversion " 3704 "function name in a namespace!"); 3705 continue; 3706 } 3707 3708 for (NamedDecl *ND : Result) 3709 if (!ND->isFromASTFile()) 3710 GetDeclRef(ND); 3711 } 3712 3713 return 0; 3714 } 3715 3716 if (DC->getPrimaryContext() != DC) 3717 return 0; 3718 3719 // Skip contexts which don't support name lookup. 3720 if (!DC->isLookupContext()) 3721 return 0; 3722 3723 // If not in C++, we perform name lookup for the translation unit via the 3724 // IdentifierInfo chains, don't bother to build a visible-declarations table. 3725 if (DC->isTranslationUnit() && !Context.getLangOpts().CPlusPlus) 3726 return 0; 3727 3728 // Serialize the contents of the mapping used for lookup. Note that, 3729 // although we have two very different code paths, the serialized 3730 // representation is the same for both cases: a declaration name, 3731 // followed by a size, followed by references to the visible 3732 // declarations that have that name. 3733 uint64_t Offset = Stream.GetCurrentBitNo(); 3734 StoredDeclsMap *Map = DC->buildLookup(); 3735 if (!Map || Map->empty()) 3736 return 0; 3737 3738 // Create the on-disk hash table in a buffer. 3739 SmallString<4096> LookupTable; 3740 uint32_t BucketOffset = GenerateNameLookupTable(DC, LookupTable); 3741 3742 // Write the lookup table 3743 RecordData Record; 3744 Record.push_back(DECL_CONTEXT_VISIBLE); 3745 Record.push_back(BucketOffset); 3746 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record, 3747 LookupTable); 3748 ++NumVisibleDeclContexts; 3749 return Offset; 3750 } 3751 3752 /// \brief Write an UPDATE_VISIBLE block for the given context. 3753 /// 3754 /// UPDATE_VISIBLE blocks contain the declarations that are added to an existing 3755 /// DeclContext in a dependent AST file. As such, they only exist for the TU 3756 /// (in C++), for namespaces, and for classes with forward-declared unscoped 3757 /// enumeration members (in C++11). 3758 void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { 3759 if (isRewritten(cast<Decl>(DC))) 3760 return; 3761 3762 StoredDeclsMap *Map = DC->getLookupPtr(); 3763 if (!Map || Map->empty()) 3764 return; 3765 3766 // Create the on-disk hash table in a buffer. 3767 SmallString<4096> LookupTable; 3768 uint32_t BucketOffset = GenerateNameLookupTable(DC, LookupTable); 3769 3770 // If we're updating a namespace, select a key declaration as the key for the 3771 // update record; those are the only ones that will be checked on reload. 3772 if (isa<NamespaceDecl>(DC)) 3773 DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC))); 3774 3775 // Write the lookup table 3776 RecordData Record; 3777 Record.push_back(UPDATE_VISIBLE); 3778 Record.push_back(getDeclID(cast<Decl>(DC))); 3779 Record.push_back(BucketOffset); 3780 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable); 3781 } 3782 3783 /// \brief Write an FP_PRAGMA_OPTIONS block for the given FPOptions. 3784 void ASTWriter::WriteFPPragmaOptions(const FPOptions &Opts) { 3785 RecordData Record; 3786 Record.push_back(Opts.fp_contract); 3787 Stream.EmitRecord(FP_PRAGMA_OPTIONS, Record); 3788 } 3789 3790 /// \brief Write an OPENCL_EXTENSIONS block for the given OpenCLOptions. 3791 void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) { 3792 if (!SemaRef.Context.getLangOpts().OpenCL) 3793 return; 3794 3795 const OpenCLOptions &Opts = SemaRef.getOpenCLOptions(); 3796 RecordData Record; 3797 #define OPENCLEXT(nm) Record.push_back(Opts.nm); 3798 #include "clang/Basic/OpenCLExtensions.def" 3799 Stream.EmitRecord(OPENCL_EXTENSIONS, Record); 3800 } 3801 3802 void ASTWriter::WriteRedeclarations() { 3803 RecordData LocalRedeclChains; 3804 SmallVector<serialization::LocalRedeclarationsInfo, 2> LocalRedeclsMap; 3805 3806 for (unsigned I = 0, N = Redeclarations.size(); I != N; ++I) { 3807 const Decl *Key = Redeclarations[I]; 3808 assert((Chain ? Chain->getKeyDeclaration(Key) == Key 3809 : Key->isFirstDecl()) && 3810 "not the key declaration"); 3811 3812 const Decl *First = Key->getCanonicalDecl(); 3813 const Decl *MostRecent = First->getMostRecentDecl(); 3814 3815 assert((getDeclID(First) >= NUM_PREDEF_DECL_IDS || First == Key) && 3816 "should not have imported key decls for predefined decl"); 3817 3818 // If we only have a single declaration, there is no point in storing 3819 // a redeclaration chain. 3820 if (First == MostRecent) 3821 continue; 3822 3823 unsigned Offset = LocalRedeclChains.size(); 3824 unsigned Size = 0; 3825 LocalRedeclChains.push_back(0); // Placeholder for the size. 3826 3827 // Collect the set of local redeclarations of this declaration, from newest 3828 // to oldest. 3829 for (const Decl *Prev = MostRecent; Prev; 3830 Prev = Prev->getPreviousDecl()) { 3831 if (!Prev->isFromASTFile() && Prev != Key) { 3832 AddDeclRef(Prev, LocalRedeclChains); 3833 ++Size; 3834 } 3835 } 3836 3837 LocalRedeclChains[Offset] = Size; 3838 3839 // Add the mapping from the first ID from the AST to the set of local 3840 // declarations. 3841 LocalRedeclarationsInfo Info = { getDeclID(Key), Offset }; 3842 LocalRedeclsMap.push_back(Info); 3843 3844 assert(N == Redeclarations.size() && 3845 "Deserialized a declaration we shouldn't have"); 3846 } 3847 3848 if (LocalRedeclChains.empty()) 3849 return; 3850 3851 // Sort the local redeclarations map by the first declaration ID, 3852 // since the reader will be performing binary searches on this information. 3853 llvm::array_pod_sort(LocalRedeclsMap.begin(), LocalRedeclsMap.end()); 3854 3855 // Emit the local redeclarations map. 3856 using namespace llvm; 3857 llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 3858 Abbrev->Add(BitCodeAbbrevOp(LOCAL_REDECLARATIONS_MAP)); 3859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries 3860 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3861 unsigned AbbrevID = Stream.EmitAbbrev(Abbrev); 3862 3863 RecordData Record; 3864 Record.push_back(LOCAL_REDECLARATIONS_MAP); 3865 Record.push_back(LocalRedeclsMap.size()); 3866 Stream.EmitRecordWithBlob(AbbrevID, Record, 3867 reinterpret_cast<char*>(LocalRedeclsMap.data()), 3868 LocalRedeclsMap.size() * sizeof(LocalRedeclarationsInfo)); 3869 3870 // Emit the redeclaration chains. 3871 Stream.EmitRecord(LOCAL_REDECLARATIONS, LocalRedeclChains); 3872 } 3873 3874 void ASTWriter::WriteObjCCategories() { 3875 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap; 3876 RecordData Categories; 3877 3878 for (unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) { 3879 unsigned Size = 0; 3880 unsigned StartIndex = Categories.size(); 3881 3882 ObjCInterfaceDecl *Class = ObjCClassesWithCategories[I]; 3883 3884 // Allocate space for the size. 3885 Categories.push_back(0); 3886 3887 // Add the categories. 3888 for (ObjCInterfaceDecl::known_categories_iterator 3889 Cat = Class->known_categories_begin(), 3890 CatEnd = Class->known_categories_end(); 3891 Cat != CatEnd; ++Cat, ++Size) { 3892 assert(getDeclID(*Cat) != 0 && "Bogus category"); 3893 AddDeclRef(*Cat, Categories); 3894 } 3895 3896 // Update the size. 3897 Categories[StartIndex] = Size; 3898 3899 // Record this interface -> category map. 3900 ObjCCategoriesInfo CatInfo = { getDeclID(Class), StartIndex }; 3901 CategoriesMap.push_back(CatInfo); 3902 } 3903 3904 // Sort the categories map by the definition ID, since the reader will be 3905 // performing binary searches on this information. 3906 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end()); 3907 3908 // Emit the categories map. 3909 using namespace llvm; 3910 llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 3911 Abbrev->Add(BitCodeAbbrevOp(OBJC_CATEGORIES_MAP)); 3912 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries 3913 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3914 unsigned AbbrevID = Stream.EmitAbbrev(Abbrev); 3915 3916 RecordData Record; 3917 Record.push_back(OBJC_CATEGORIES_MAP); 3918 Record.push_back(CategoriesMap.size()); 3919 Stream.EmitRecordWithBlob(AbbrevID, Record, 3920 reinterpret_cast<char*>(CategoriesMap.data()), 3921 CategoriesMap.size() * sizeof(ObjCCategoriesInfo)); 3922 3923 // Emit the category lists. 3924 Stream.EmitRecord(OBJC_CATEGORIES, Categories); 3925 } 3926 3927 void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) { 3928 Sema::LateParsedTemplateMapT &LPTMap = SemaRef.LateParsedTemplateMap; 3929 3930 if (LPTMap.empty()) 3931 return; 3932 3933 RecordData Record; 3934 for (auto LPTMapEntry : LPTMap) { 3935 const FunctionDecl *FD = LPTMapEntry.first; 3936 LateParsedTemplate *LPT = LPTMapEntry.second; 3937 AddDeclRef(FD, Record); 3938 AddDeclRef(LPT->D, Record); 3939 Record.push_back(LPT->Toks.size()); 3940 3941 for (CachedTokens::iterator TokIt = LPT->Toks.begin(), 3942 TokEnd = LPT->Toks.end(); 3943 TokIt != TokEnd; ++TokIt) { 3944 AddToken(*TokIt, Record); 3945 } 3946 } 3947 Stream.EmitRecord(LATE_PARSED_TEMPLATE, Record); 3948 } 3949 3950 /// \brief Write the state of 'pragma clang optimize' at the end of the module. 3951 void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) { 3952 RecordData Record; 3953 SourceLocation PragmaLoc = SemaRef.getOptimizeOffPragmaLocation(); 3954 AddSourceLocation(PragmaLoc, Record); 3955 Stream.EmitRecord(OPTIMIZE_PRAGMA_OPTIONS, Record); 3956 } 3957 3958 //===----------------------------------------------------------------------===// 3959 // General Serialization Routines 3960 //===----------------------------------------------------------------------===// 3961 3962 /// \brief Write a record containing the given attributes. 3963 void ASTWriter::WriteAttributes(ArrayRef<const Attr*> Attrs, 3964 RecordDataImpl &Record) { 3965 Record.push_back(Attrs.size()); 3966 for (ArrayRef<const Attr *>::iterator i = Attrs.begin(), 3967 e = Attrs.end(); i != e; ++i){ 3968 const Attr *A = *i; 3969 Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs 3970 AddSourceRange(A->getRange(), Record); 3971 3972 #include "clang/Serialization/AttrPCHWrite.inc" 3973 3974 } 3975 } 3976 3977 void ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) { 3978 AddSourceLocation(Tok.getLocation(), Record); 3979 Record.push_back(Tok.getLength()); 3980 3981 // FIXME: When reading literal tokens, reconstruct the literal pointer 3982 // if it is needed. 3983 AddIdentifierRef(Tok.getIdentifierInfo(), Record); 3984 // FIXME: Should translate token kind to a stable encoding. 3985 Record.push_back(Tok.getKind()); 3986 // FIXME: Should translate token flags to a stable encoding. 3987 Record.push_back(Tok.getFlags()); 3988 } 3989 3990 void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) { 3991 Record.push_back(Str.size()); 3992 Record.insert(Record.end(), Str.begin(), Str.end()); 3993 } 3994 3995 bool ASTWriter::PreparePathForOutput(SmallVectorImpl<char> &Path) { 3996 assert(Context && "should have context when outputting path"); 3997 3998 bool Changed = 3999 cleanPathForOutput(Context->getSourceManager().getFileManager(), Path); 4000 4001 // Remove a prefix to make the path relative, if relevant. 4002 const char *PathBegin = Path.data(); 4003 const char *PathPtr = 4004 adjustFilenameForRelocatableAST(PathBegin, BaseDirectory); 4005 if (PathPtr != PathBegin) { 4006 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin)); 4007 Changed = true; 4008 } 4009 4010 return Changed; 4011 } 4012 4013 void ASTWriter::AddPath(StringRef Path, RecordDataImpl &Record) { 4014 SmallString<128> FilePath(Path); 4015 PreparePathForOutput(FilePath); 4016 AddString(FilePath, Record); 4017 } 4018 4019 void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record, 4020 StringRef Path) { 4021 SmallString<128> FilePath(Path); 4022 PreparePathForOutput(FilePath); 4023 Stream.EmitRecordWithBlob(Abbrev, Record, FilePath); 4024 } 4025 4026 void ASTWriter::AddVersionTuple(const VersionTuple &Version, 4027 RecordDataImpl &Record) { 4028 Record.push_back(Version.getMajor()); 4029 if (Optional<unsigned> Minor = Version.getMinor()) 4030 Record.push_back(*Minor + 1); 4031 else 4032 Record.push_back(0); 4033 if (Optional<unsigned> Subminor = Version.getSubminor()) 4034 Record.push_back(*Subminor + 1); 4035 else 4036 Record.push_back(0); 4037 } 4038 4039 /// \brief Note that the identifier II occurs at the given offset 4040 /// within the identifier table. 4041 void ASTWriter::SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset) { 4042 IdentID ID = IdentifierIDs[II]; 4043 // Only store offsets new to this AST file. Other identifier names are looked 4044 // up earlier in the chain and thus don't need an offset. 4045 if (ID >= FirstIdentID) 4046 IdentifierOffsets[ID - FirstIdentID] = Offset; 4047 } 4048 4049 /// \brief Note that the selector Sel occurs at the given offset 4050 /// within the method pool/selector table. 4051 void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) { 4052 unsigned ID = SelectorIDs[Sel]; 4053 assert(ID && "Unknown selector"); 4054 // Don't record offsets for selectors that are also available in a different 4055 // file. 4056 if (ID < FirstSelectorID) 4057 return; 4058 SelectorOffsets[ID - FirstSelectorID] = Offset; 4059 } 4060 4061 ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream) 4062 : Stream(Stream), Context(nullptr), PP(nullptr), Chain(nullptr), 4063 WritingModule(nullptr), WritingAST(false), 4064 DoneWritingDeclsAndTypes(false), ASTHasCompilerErrors(false), 4065 FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID), 4066 FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID), 4067 FirstIdentID(NUM_PREDEF_IDENT_IDS), NextIdentID(FirstIdentID), 4068 FirstMacroID(NUM_PREDEF_MACRO_IDS), NextMacroID(FirstMacroID), 4069 FirstSubmoduleID(NUM_PREDEF_SUBMODULE_IDS), 4070 NextSubmoduleID(FirstSubmoduleID), 4071 FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID), 4072 CollectedStmts(&StmtsToEmit), NumStatements(0), NumMacros(0), 4073 NumLexicalDeclContexts(0), NumVisibleDeclContexts(0), 4074 NextCXXBaseSpecifiersID(1), NextCXXCtorInitializersID(1), 4075 TypeExtQualAbbrev(0), 4076 TypeFunctionProtoAbbrev(0), DeclParmVarAbbrev(0), 4077 DeclContextLexicalAbbrev(0), DeclContextVisibleLookupAbbrev(0), 4078 UpdateVisibleAbbrev(0), DeclRecordAbbrev(0), DeclTypedefAbbrev(0), 4079 DeclVarAbbrev(0), DeclFieldAbbrev(0), DeclEnumAbbrev(0), 4080 DeclObjCIvarAbbrev(0), DeclCXXMethodAbbrev(0), DeclRefExprAbbrev(0), 4081 CharacterLiteralAbbrev(0), IntegerLiteralAbbrev(0), 4082 ExprImplicitCastAbbrev(0) {} 4083 4084 ASTWriter::~ASTWriter() { 4085 llvm::DeleteContainerSeconds(FileDeclIDs); 4086 } 4087 4088 const LangOptions &ASTWriter::getLangOpts() const { 4089 assert(WritingAST && "can't determine lang opts when not writing AST"); 4090 return Context->getLangOpts(); 4091 } 4092 4093 void ASTWriter::WriteAST(Sema &SemaRef, 4094 const std::string &OutputFile, 4095 Module *WritingModule, StringRef isysroot, 4096 bool hasErrors) { 4097 WritingAST = true; 4098 4099 ASTHasCompilerErrors = hasErrors; 4100 4101 // Emit the file header. 4102 Stream.Emit((unsigned)'C', 8); 4103 Stream.Emit((unsigned)'P', 8); 4104 Stream.Emit((unsigned)'C', 8); 4105 Stream.Emit((unsigned)'H', 8); 4106 4107 WriteBlockInfoBlock(); 4108 4109 Context = &SemaRef.Context; 4110 PP = &SemaRef.PP; 4111 this->WritingModule = WritingModule; 4112 WriteASTCore(SemaRef, isysroot, OutputFile, WritingModule); 4113 Context = nullptr; 4114 PP = nullptr; 4115 this->WritingModule = nullptr; 4116 this->BaseDirectory.clear(); 4117 4118 WritingAST = false; 4119 } 4120 4121 template<typename Vector> 4122 static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec, 4123 ASTWriter::RecordData &Record) { 4124 for (typename Vector::iterator I = Vec.begin(nullptr, true), E = Vec.end(); 4125 I != E; ++I) { 4126 Writer.AddDeclRef(*I, Record); 4127 } 4128 } 4129 4130 void ASTWriter::WriteASTCore(Sema &SemaRef, 4131 StringRef isysroot, 4132 const std::string &OutputFile, 4133 Module *WritingModule) { 4134 using namespace llvm; 4135 4136 bool isModule = WritingModule != nullptr; 4137 4138 // Make sure that the AST reader knows to finalize itself. 4139 if (Chain) 4140 Chain->finalizeForWriting(); 4141 4142 ASTContext &Context = SemaRef.Context; 4143 Preprocessor &PP = SemaRef.PP; 4144 4145 // Set up predefined declaration IDs. 4146 auto RegisterPredefDecl = [&] (Decl *D, PredefinedDeclIDs ID) { 4147 if (D) { 4148 assert(D->isCanonicalDecl() && "predefined decl is not canonical"); 4149 DeclIDs[D] = ID; 4150 if (D->getMostRecentDecl() != D) 4151 Redeclarations.push_back(D); 4152 } 4153 }; 4154 RegisterPredefDecl(Context.getTranslationUnitDecl(), 4155 PREDEF_DECL_TRANSLATION_UNIT_ID); 4156 RegisterPredefDecl(Context.ObjCIdDecl, PREDEF_DECL_OBJC_ID_ID); 4157 RegisterPredefDecl(Context.ObjCSelDecl, PREDEF_DECL_OBJC_SEL_ID); 4158 RegisterPredefDecl(Context.ObjCClassDecl, PREDEF_DECL_OBJC_CLASS_ID); 4159 RegisterPredefDecl(Context.ObjCProtocolClassDecl, 4160 PREDEF_DECL_OBJC_PROTOCOL_ID); 4161 RegisterPredefDecl(Context.Int128Decl, PREDEF_DECL_INT_128_ID); 4162 RegisterPredefDecl(Context.UInt128Decl, PREDEF_DECL_UNSIGNED_INT_128_ID); 4163 RegisterPredefDecl(Context.ObjCInstanceTypeDecl, 4164 PREDEF_DECL_OBJC_INSTANCETYPE_ID); 4165 RegisterPredefDecl(Context.BuiltinVaListDecl, PREDEF_DECL_BUILTIN_VA_LIST_ID); 4166 RegisterPredefDecl(Context.VaListTagDecl, PREDEF_DECL_VA_LIST_TAG); 4167 RegisterPredefDecl(Context.ExternCContext, PREDEF_DECL_EXTERN_C_CONTEXT_ID); 4168 4169 // Build a record containing all of the tentative definitions in this file, in 4170 // TentativeDefinitions order. Generally, this record will be empty for 4171 // headers. 4172 RecordData TentativeDefinitions; 4173 AddLazyVectorDecls(*this, SemaRef.TentativeDefinitions, TentativeDefinitions); 4174 4175 // Build a record containing all of the file scoped decls in this file. 4176 RecordData UnusedFileScopedDecls; 4177 if (!isModule) 4178 AddLazyVectorDecls(*this, SemaRef.UnusedFileScopedDecls, 4179 UnusedFileScopedDecls); 4180 4181 // Build a record containing all of the delegating constructors we still need 4182 // to resolve. 4183 RecordData DelegatingCtorDecls; 4184 if (!isModule) 4185 AddLazyVectorDecls(*this, SemaRef.DelegatingCtorDecls, DelegatingCtorDecls); 4186 4187 // Write the set of weak, undeclared identifiers. We always write the 4188 // entire table, since later PCH files in a PCH chain are only interested in 4189 // the results at the end of the chain. 4190 RecordData WeakUndeclaredIdentifiers; 4191 for (auto &WeakUndeclaredIdentifier : SemaRef.WeakUndeclaredIdentifiers) { 4192 IdentifierInfo *II = WeakUndeclaredIdentifier.first; 4193 WeakInfo &WI = WeakUndeclaredIdentifier.second; 4194 AddIdentifierRef(II, WeakUndeclaredIdentifiers); 4195 AddIdentifierRef(WI.getAlias(), WeakUndeclaredIdentifiers); 4196 AddSourceLocation(WI.getLocation(), WeakUndeclaredIdentifiers); 4197 WeakUndeclaredIdentifiers.push_back(WI.getUsed()); 4198 } 4199 4200 // Build a record containing all of the ext_vector declarations. 4201 RecordData ExtVectorDecls; 4202 AddLazyVectorDecls(*this, SemaRef.ExtVectorDecls, ExtVectorDecls); 4203 4204 // Build a record containing all of the VTable uses information. 4205 RecordData VTableUses; 4206 if (!SemaRef.VTableUses.empty()) { 4207 for (unsigned I = 0, N = SemaRef.VTableUses.size(); I != N; ++I) { 4208 AddDeclRef(SemaRef.VTableUses[I].first, VTableUses); 4209 AddSourceLocation(SemaRef.VTableUses[I].second, VTableUses); 4210 VTableUses.push_back(SemaRef.VTablesUsed[SemaRef.VTableUses[I].first]); 4211 } 4212 } 4213 4214 // Build a record containing all of the UnusedLocalTypedefNameCandidates. 4215 RecordData UnusedLocalTypedefNameCandidates; 4216 for (const TypedefNameDecl *TD : SemaRef.UnusedLocalTypedefNameCandidates) 4217 AddDeclRef(TD, UnusedLocalTypedefNameCandidates); 4218 4219 // Build a record containing all of pending implicit instantiations. 4220 RecordData PendingInstantiations; 4221 for (std::deque<Sema::PendingImplicitInstantiation>::iterator 4222 I = SemaRef.PendingInstantiations.begin(), 4223 N = SemaRef.PendingInstantiations.end(); I != N; ++I) { 4224 AddDeclRef(I->first, PendingInstantiations); 4225 AddSourceLocation(I->second, PendingInstantiations); 4226 } 4227 assert(SemaRef.PendingLocalImplicitInstantiations.empty() && 4228 "There are local ones at end of translation unit!"); 4229 4230 // Build a record containing some declaration references. 4231 RecordData SemaDeclRefs; 4232 if (SemaRef.StdNamespace || SemaRef.StdBadAlloc) { 4233 AddDeclRef(SemaRef.getStdNamespace(), SemaDeclRefs); 4234 AddDeclRef(SemaRef.getStdBadAlloc(), SemaDeclRefs); 4235 } 4236 4237 RecordData CUDASpecialDeclRefs; 4238 if (Context.getcudaConfigureCallDecl()) { 4239 AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs); 4240 } 4241 4242 // Build a record containing all of the known namespaces. 4243 RecordData KnownNamespaces; 4244 for (llvm::MapVector<NamespaceDecl*, bool>::iterator 4245 I = SemaRef.KnownNamespaces.begin(), 4246 IEnd = SemaRef.KnownNamespaces.end(); 4247 I != IEnd; ++I) { 4248 if (!I->second) 4249 AddDeclRef(I->first, KnownNamespaces); 4250 } 4251 4252 // Build a record of all used, undefined objects that require definitions. 4253 RecordData UndefinedButUsed; 4254 4255 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined; 4256 SemaRef.getUndefinedButUsed(Undefined); 4257 for (SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> >::iterator 4258 I = Undefined.begin(), E = Undefined.end(); I != E; ++I) { 4259 AddDeclRef(I->first, UndefinedButUsed); 4260 AddSourceLocation(I->second, UndefinedButUsed); 4261 } 4262 4263 // Build a record containing all delete-expressions that we would like to 4264 // analyze later in AST. 4265 RecordData DeleteExprsToAnalyze; 4266 4267 for (const auto &DeleteExprsInfo : 4268 SemaRef.getMismatchingDeleteExpressions()) { 4269 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze); 4270 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size()); 4271 for (const auto &DeleteLoc : DeleteExprsInfo.second) { 4272 AddSourceLocation(DeleteLoc.first, DeleteExprsToAnalyze); 4273 DeleteExprsToAnalyze.push_back(DeleteLoc.second); 4274 } 4275 } 4276 4277 // Write the control block 4278 WriteControlBlock(PP, Context, isysroot, OutputFile); 4279 4280 // Write the remaining AST contents. 4281 RecordData Record; 4282 Stream.EnterSubblock(AST_BLOCK_ID, 5); 4283 4284 // This is so that older clang versions, before the introduction 4285 // of the control block, can read and reject the newer PCH format. 4286 Record.clear(); 4287 Record.push_back(VERSION_MAJOR); 4288 Stream.EmitRecord(METADATA_OLD_FORMAT, Record); 4289 4290 // Create a lexical update block containing all of the declarations in the 4291 // translation unit that do not come from other AST files. 4292 const TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 4293 SmallVector<uint32_t, 128> NewGlobalKindDeclPairs; 4294 for (const auto *D : TU->noload_decls()) { 4295 if (!D->isFromASTFile()) { 4296 NewGlobalKindDeclPairs.push_back(D->getKind()); 4297 NewGlobalKindDeclPairs.push_back(GetDeclRef(D)); 4298 } 4299 } 4300 4301 llvm::BitCodeAbbrev *Abv = new llvm::BitCodeAbbrev(); 4302 Abv->Add(llvm::BitCodeAbbrevOp(TU_UPDATE_LEXICAL)); 4303 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); 4304 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(Abv); 4305 Record.clear(); 4306 Record.push_back(TU_UPDATE_LEXICAL); 4307 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record, 4308 bytes(NewGlobalKindDeclPairs)); 4309 4310 // And a visible updates block for the translation unit. 4311 Abv = new llvm::BitCodeAbbrev(); 4312 Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE)); 4313 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 4314 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed, 32)); 4315 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); 4316 UpdateVisibleAbbrev = Stream.EmitAbbrev(Abv); 4317 WriteDeclContextVisibleUpdate(TU); 4318 4319 // If we have any extern "C" names, write out a visible update for them. 4320 if (Context.ExternCContext) 4321 WriteDeclContextVisibleUpdate(Context.ExternCContext); 4322 4323 // If the translation unit has an anonymous namespace, and we don't already 4324 // have an update block for it, write it as an update block. 4325 // FIXME: Why do we not do this if there's already an update block? 4326 if (NamespaceDecl *NS = TU->getAnonymousNamespace()) { 4327 ASTWriter::UpdateRecord &Record = DeclUpdates[TU]; 4328 if (Record.empty()) 4329 Record.push_back(DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, NS)); 4330 } 4331 4332 // Add update records for all mangling numbers and static local numbers. 4333 // These aren't really update records, but this is a convenient way of 4334 // tagging this rare extra data onto the declarations. 4335 for (const auto &Number : Context.MangleNumbers) 4336 if (!Number.first->isFromASTFile()) 4337 DeclUpdates[Number.first].push_back(DeclUpdate(UPD_MANGLING_NUMBER, 4338 Number.second)); 4339 for (const auto &Number : Context.StaticLocalNumbers) 4340 if (!Number.first->isFromASTFile()) 4341 DeclUpdates[Number.first].push_back(DeclUpdate(UPD_STATIC_LOCAL_NUMBER, 4342 Number.second)); 4343 4344 // Make sure visible decls, added to DeclContexts previously loaded from 4345 // an AST file, are registered for serialization. 4346 for (SmallVectorImpl<const Decl *>::iterator 4347 I = UpdatingVisibleDecls.begin(), 4348 E = UpdatingVisibleDecls.end(); I != E; ++I) { 4349 GetDeclRef(*I); 4350 } 4351 4352 // Make sure all decls associated with an identifier are registered for 4353 // serialization. 4354 llvm::SmallVector<const IdentifierInfo*, 256> IIs; 4355 for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), 4356 IDEnd = PP.getIdentifierTable().end(); 4357 ID != IDEnd; ++ID) { 4358 const IdentifierInfo *II = ID->second; 4359 if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) 4360 IIs.push_back(II); 4361 } 4362 // Sort the identifiers to visit based on their name. 4363 std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); 4364 for (const IdentifierInfo *II : IIs) { 4365 for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II), 4366 DEnd = SemaRef.IdResolver.end(); 4367 D != DEnd; ++D) { 4368 GetDeclRef(*D); 4369 } 4370 } 4371 4372 // Form the record of special types. 4373 RecordData SpecialTypes; 4374 AddTypeRef(Context.getRawCFConstantStringType(), SpecialTypes); 4375 AddTypeRef(Context.getFILEType(), SpecialTypes); 4376 AddTypeRef(Context.getjmp_bufType(), SpecialTypes); 4377 AddTypeRef(Context.getsigjmp_bufType(), SpecialTypes); 4378 AddTypeRef(Context.ObjCIdRedefinitionType, SpecialTypes); 4379 AddTypeRef(Context.ObjCClassRedefinitionType, SpecialTypes); 4380 AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes); 4381 AddTypeRef(Context.getucontext_tType(), SpecialTypes); 4382 4383 if (Chain) { 4384 // Write the mapping information describing our module dependencies and how 4385 // each of those modules were mapped into our own offset/ID space, so that 4386 // the reader can build the appropriate mapping to its own offset/ID space. 4387 // The map consists solely of a blob with the following format: 4388 // *(module-name-len:i16 module-name:len*i8 4389 // source-location-offset:i32 4390 // identifier-id:i32 4391 // preprocessed-entity-id:i32 4392 // macro-definition-id:i32 4393 // submodule-id:i32 4394 // selector-id:i32 4395 // declaration-id:i32 4396 // c++-base-specifiers-id:i32 4397 // type-id:i32) 4398 // 4399 llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); 4400 Abbrev->Add(BitCodeAbbrevOp(MODULE_OFFSET_MAP)); 4401 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 4402 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(Abbrev); 4403 SmallString<2048> Buffer; 4404 { 4405 llvm::raw_svector_ostream Out(Buffer); 4406 for (ModuleFile *M : Chain->ModuleMgr) { 4407 using namespace llvm::support; 4408 endian::Writer<little> LE(Out); 4409 StringRef FileName = M->FileName; 4410 LE.write<uint16_t>(FileName.size()); 4411 Out.write(FileName.data(), FileName.size()); 4412 4413 // Note: if a base ID was uint max, it would not be possible to load 4414 // another module after it or have more than one entity inside it. 4415 uint32_t None = std::numeric_limits<uint32_t>::max(); 4416 4417 auto writeBaseIDOrNone = [&](uint32_t BaseID, bool ShouldWrite) { 4418 assert(BaseID < std::numeric_limits<uint32_t>::max() && "base id too high"); 4419 if (ShouldWrite) 4420 LE.write<uint32_t>(BaseID); 4421 else 4422 LE.write<uint32_t>(None); 4423 }; 4424 4425 // These values should be unique within a chain, since they will be read 4426 // as keys into ContinuousRangeMaps. 4427 writeBaseIDOrNone(M->SLocEntryBaseOffset, M->LocalNumSLocEntries); 4428 writeBaseIDOrNone(M->BaseIdentifierID, M->LocalNumIdentifiers); 4429 writeBaseIDOrNone(M->BaseMacroID, M->LocalNumMacros); 4430 writeBaseIDOrNone(M->BasePreprocessedEntityID, 4431 M->NumPreprocessedEntities); 4432 writeBaseIDOrNone(M->BaseSubmoduleID, M->LocalNumSubmodules); 4433 writeBaseIDOrNone(M->BaseSelectorID, M->LocalNumSelectors); 4434 writeBaseIDOrNone(M->BaseDeclID, M->LocalNumDecls); 4435 writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes); 4436 } 4437 } 4438 Record.clear(); 4439 Record.push_back(MODULE_OFFSET_MAP); 4440 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev, Record, 4441 Buffer.data(), Buffer.size()); 4442 } 4443 4444 RecordData DeclUpdatesOffsetsRecord; 4445 4446 // Keep writing types, declarations, and declaration update records 4447 // until we've emitted all of them. 4448 Stream.EnterSubblock(DECLTYPES_BLOCK_ID, /*bits for abbreviations*/5); 4449 WriteTypeAbbrevs(); 4450 WriteDeclAbbrevs(); 4451 for (DeclsToRewriteTy::iterator I = DeclsToRewrite.begin(), 4452 E = DeclsToRewrite.end(); 4453 I != E; ++I) 4454 DeclTypesToEmit.push(const_cast<Decl*>(*I)); 4455 do { 4456 WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord); 4457 while (!DeclTypesToEmit.empty()) { 4458 DeclOrType DOT = DeclTypesToEmit.front(); 4459 DeclTypesToEmit.pop(); 4460 if (DOT.isType()) 4461 WriteType(DOT.getType()); 4462 else 4463 WriteDecl(Context, DOT.getDecl()); 4464 } 4465 } while (!DeclUpdates.empty()); 4466 Stream.ExitBlock(); 4467 4468 DoneWritingDeclsAndTypes = true; 4469 4470 // These things can only be done once we've written out decls and types. 4471 WriteTypeDeclOffsets(); 4472 if (!DeclUpdatesOffsetsRecord.empty()) 4473 Stream.EmitRecord(DECL_UPDATE_OFFSETS, DeclUpdatesOffsetsRecord); 4474 WriteCXXBaseSpecifiersOffsets(); 4475 WriteCXXCtorInitializersOffsets(); 4476 WriteFileDeclIDsMap(); 4477 WriteSourceManagerBlock(Context.getSourceManager(), PP); 4478 4479 WriteComments(); 4480 WritePreprocessor(PP, isModule); 4481 WriteHeaderSearch(PP.getHeaderSearchInfo()); 4482 WriteSelectors(SemaRef); 4483 WriteReferencedSelectorsPool(SemaRef); 4484 WriteLateParsedTemplates(SemaRef); 4485 WriteIdentifierTable(PP, SemaRef.IdResolver, isModule); 4486 WriteFPPragmaOptions(SemaRef.getFPOptions()); 4487 WriteOpenCLExtensions(SemaRef); 4488 WritePragmaDiagnosticMappings(Context.getDiagnostics(), isModule); 4489 4490 // If we're emitting a module, write out the submodule information. 4491 if (WritingModule) 4492 WriteSubmodules(WritingModule); 4493 4494 Stream.EmitRecord(SPECIAL_TYPES, SpecialTypes); 4495 4496 // Write the record containing external, unnamed definitions. 4497 if (!EagerlyDeserializedDecls.empty()) 4498 Stream.EmitRecord(EAGERLY_DESERIALIZED_DECLS, EagerlyDeserializedDecls); 4499 4500 // Write the record containing tentative definitions. 4501 if (!TentativeDefinitions.empty()) 4502 Stream.EmitRecord(TENTATIVE_DEFINITIONS, TentativeDefinitions); 4503 4504 // Write the record containing unused file scoped decls. 4505 if (!UnusedFileScopedDecls.empty()) 4506 Stream.EmitRecord(UNUSED_FILESCOPED_DECLS, UnusedFileScopedDecls); 4507 4508 // Write the record containing weak undeclared identifiers. 4509 if (!WeakUndeclaredIdentifiers.empty()) 4510 Stream.EmitRecord(WEAK_UNDECLARED_IDENTIFIERS, 4511 WeakUndeclaredIdentifiers); 4512 4513 // Write the record containing ext_vector type names. 4514 if (!ExtVectorDecls.empty()) 4515 Stream.EmitRecord(EXT_VECTOR_DECLS, ExtVectorDecls); 4516 4517 // Write the record containing VTable uses information. 4518 if (!VTableUses.empty()) 4519 Stream.EmitRecord(VTABLE_USES, VTableUses); 4520 4521 // Write the record containing potentially unused local typedefs. 4522 if (!UnusedLocalTypedefNameCandidates.empty()) 4523 Stream.EmitRecord(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES, 4524 UnusedLocalTypedefNameCandidates); 4525 4526 // Write the record containing pending implicit instantiations. 4527 if (!PendingInstantiations.empty()) 4528 Stream.EmitRecord(PENDING_IMPLICIT_INSTANTIATIONS, PendingInstantiations); 4529 4530 // Write the record containing declaration references of Sema. 4531 if (!SemaDeclRefs.empty()) 4532 Stream.EmitRecord(SEMA_DECL_REFS, SemaDeclRefs); 4533 4534 // Write the record containing CUDA-specific declaration references. 4535 if (!CUDASpecialDeclRefs.empty()) 4536 Stream.EmitRecord(CUDA_SPECIAL_DECL_REFS, CUDASpecialDeclRefs); 4537 4538 // Write the delegating constructors. 4539 if (!DelegatingCtorDecls.empty()) 4540 Stream.EmitRecord(DELEGATING_CTORS, DelegatingCtorDecls); 4541 4542 // Write the known namespaces. 4543 if (!KnownNamespaces.empty()) 4544 Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces); 4545 4546 // Write the undefined internal functions and variables, and inline functions. 4547 if (!UndefinedButUsed.empty()) 4548 Stream.EmitRecord(UNDEFINED_BUT_USED, UndefinedButUsed); 4549 4550 if (!DeleteExprsToAnalyze.empty()) 4551 Stream.EmitRecord(DELETE_EXPRS_TO_ANALYZE, DeleteExprsToAnalyze); 4552 4553 // Write the visible updates to DeclContexts. 4554 for (auto *DC : UpdatedDeclContexts) 4555 WriteDeclContextVisibleUpdate(DC); 4556 4557 if (!WritingModule) { 4558 // Write the submodules that were imported, if any. 4559 struct ModuleInfo { 4560 uint64_t ID; 4561 Module *M; 4562 ModuleInfo(uint64_t ID, Module *M) : ID(ID), M(M) {} 4563 }; 4564 llvm::SmallVector<ModuleInfo, 64> Imports; 4565 for (const auto *I : Context.local_imports()) { 4566 assert(SubmoduleIDs.find(I->getImportedModule()) != SubmoduleIDs.end()); 4567 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()], 4568 I->getImportedModule())); 4569 } 4570 4571 if (!Imports.empty()) { 4572 auto Cmp = [](const ModuleInfo &A, const ModuleInfo &B) { 4573 return A.ID < B.ID; 4574 }; 4575 auto Eq = [](const ModuleInfo &A, const ModuleInfo &B) { 4576 return A.ID == B.ID; 4577 }; 4578 4579 // Sort and deduplicate module IDs. 4580 std::sort(Imports.begin(), Imports.end(), Cmp); 4581 Imports.erase(std::unique(Imports.begin(), Imports.end(), Eq), 4582 Imports.end()); 4583 4584 RecordData ImportedModules; 4585 for (const auto &Import : Imports) { 4586 ImportedModules.push_back(Import.ID); 4587 // FIXME: If the module has macros imported then later has declarations 4588 // imported, this location won't be the right one as a location for the 4589 // declaration imports. 4590 AddSourceLocation(PP.getModuleImportLoc(Import.M), ImportedModules); 4591 } 4592 4593 Stream.EmitRecord(IMPORTED_MODULES, ImportedModules); 4594 } 4595 } 4596 4597 WriteDeclReplacementsBlock(); 4598 WriteRedeclarations(); 4599 WriteObjCCategories(); 4600 if(!WritingModule) 4601 WriteOptimizePragmaOptions(SemaRef); 4602 4603 // Some simple statistics 4604 Record.clear(); 4605 Record.push_back(NumStatements); 4606 Record.push_back(NumMacros); 4607 Record.push_back(NumLexicalDeclContexts); 4608 Record.push_back(NumVisibleDeclContexts); 4609 Stream.EmitRecord(STATISTICS, Record); 4610 Stream.ExitBlock(); 4611 } 4612 4613 void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { 4614 if (DeclUpdates.empty()) 4615 return; 4616 4617 DeclUpdateMap LocalUpdates; 4618 LocalUpdates.swap(DeclUpdates); 4619 4620 for (auto &DeclUpdate : LocalUpdates) { 4621 const Decl *D = DeclUpdate.first; 4622 if (isRewritten(D)) 4623 continue; // The decl will be written completely,no need to store updates. 4624 4625 bool HasUpdatedBody = false; 4626 RecordData Record; 4627 for (auto &Update : DeclUpdate.second) { 4628 DeclUpdateKind Kind = (DeclUpdateKind)Update.getKind(); 4629 4630 Record.push_back(Kind); 4631 switch (Kind) { 4632 case UPD_CXX_ADDED_IMPLICIT_MEMBER: 4633 case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: 4634 case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE: 4635 assert(Update.getDecl() && "no decl to add?"); 4636 Record.push_back(GetDeclRef(Update.getDecl())); 4637 break; 4638 4639 case UPD_CXX_ADDED_FUNCTION_DEFINITION: 4640 // An updated body is emitted last, so that the reader doesn't need 4641 // to skip over the lazy body to reach statements for other records. 4642 Record.pop_back(); 4643 HasUpdatedBody = true; 4644 break; 4645 4646 case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER: 4647 AddSourceLocation(Update.getLoc(), Record); 4648 break; 4649 4650 case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: { 4651 auto *RD = cast<CXXRecordDecl>(D); 4652 UpdatedDeclContexts.insert(RD->getPrimaryContext()); 4653 AddCXXDefinitionData(RD, Record); 4654 Record.push_back(WriteDeclContextLexicalBlock( 4655 *Context, const_cast<CXXRecordDecl *>(RD))); 4656 4657 // This state is sometimes updated by template instantiation, when we 4658 // switch from the specialization referring to the template declaration 4659 // to it referring to the template definition. 4660 if (auto *MSInfo = RD->getMemberSpecializationInfo()) { 4661 Record.push_back(MSInfo->getTemplateSpecializationKind()); 4662 AddSourceLocation(MSInfo->getPointOfInstantiation(), Record); 4663 } else { 4664 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD); 4665 Record.push_back(Spec->getTemplateSpecializationKind()); 4666 AddSourceLocation(Spec->getPointOfInstantiation(), Record); 4667 4668 // The instantiation might have been resolved to a partial 4669 // specialization. If so, record which one. 4670 auto From = Spec->getInstantiatedFrom(); 4671 if (auto PartialSpec = 4672 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) { 4673 Record.push_back(true); 4674 AddDeclRef(PartialSpec, Record); 4675 AddTemplateArgumentList(&Spec->getTemplateInstantiationArgs(), 4676 Record); 4677 } else { 4678 Record.push_back(false); 4679 } 4680 } 4681 Record.push_back(RD->getTagKind()); 4682 AddSourceLocation(RD->getLocation(), Record); 4683 AddSourceLocation(RD->getLocStart(), Record); 4684 AddSourceLocation(RD->getRBraceLoc(), Record); 4685 4686 // Instantiation may change attributes; write them all out afresh. 4687 Record.push_back(D->hasAttrs()); 4688 if (Record.back()) 4689 WriteAttributes(llvm::makeArrayRef(D->getAttrs().begin(), 4690 D->getAttrs().size()), Record); 4691 4692 // FIXME: Ensure we don't get here for explicit instantiations. 4693 break; 4694 } 4695 4696 case UPD_CXX_RESOLVED_DTOR_DELETE: 4697 AddDeclRef(Update.getDecl(), Record); 4698 break; 4699 4700 case UPD_CXX_RESOLVED_EXCEPTION_SPEC: 4701 addExceptionSpec( 4702 *this, 4703 cast<FunctionDecl>(D)->getType()->castAs<FunctionProtoType>(), 4704 Record); 4705 break; 4706 4707 case UPD_CXX_DEDUCED_RETURN_TYPE: 4708 Record.push_back(GetOrCreateTypeID(Update.getType())); 4709 break; 4710 4711 case UPD_DECL_MARKED_USED: 4712 break; 4713 4714 case UPD_MANGLING_NUMBER: 4715 case UPD_STATIC_LOCAL_NUMBER: 4716 Record.push_back(Update.getNumber()); 4717 break; 4718 4719 case UPD_DECL_MARKED_OPENMP_THREADPRIVATE: 4720 AddSourceRange(D->getAttr<OMPThreadPrivateDeclAttr>()->getRange(), 4721 Record); 4722 break; 4723 4724 case UPD_DECL_EXPORTED: 4725 Record.push_back(getSubmoduleID(Update.getModule())); 4726 break; 4727 4728 case UPD_ADDED_ATTR_TO_RECORD: 4729 WriteAttributes(llvm::makeArrayRef(Update.getAttr()), Record); 4730 break; 4731 } 4732 } 4733 4734 if (HasUpdatedBody) { 4735 const FunctionDecl *Def = cast<FunctionDecl>(D); 4736 Record.push_back(UPD_CXX_ADDED_FUNCTION_DEFINITION); 4737 Record.push_back(Def->isInlined()); 4738 AddSourceLocation(Def->getInnerLocStart(), Record); 4739 AddFunctionDefinition(Def, Record); 4740 } 4741 4742 OffsetsRecord.push_back(GetDeclRef(D)); 4743 OffsetsRecord.push_back(Stream.GetCurrentBitNo()); 4744 4745 Stream.EmitRecord(DECL_UPDATES, Record); 4746 4747 FlushPendingAfterDecl(); 4748 } 4749 } 4750 4751 void ASTWriter::WriteDeclReplacementsBlock() { 4752 if (ReplacedDecls.empty()) 4753 return; 4754 4755 RecordData Record; 4756 for (SmallVectorImpl<ReplacedDeclInfo>::iterator 4757 I = ReplacedDecls.begin(), E = ReplacedDecls.end(); I != E; ++I) { 4758 Record.push_back(I->ID); 4759 Record.push_back(I->Offset); 4760 Record.push_back(I->Loc); 4761 } 4762 Stream.EmitRecord(DECL_REPLACEMENTS, Record); 4763 } 4764 4765 void ASTWriter::AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record) { 4766 Record.push_back(Loc.getRawEncoding()); 4767 } 4768 4769 void ASTWriter::AddSourceRange(SourceRange Range, RecordDataImpl &Record) { 4770 AddSourceLocation(Range.getBegin(), Record); 4771 AddSourceLocation(Range.getEnd(), Record); 4772 } 4773 4774 void ASTWriter::AddAPInt(const llvm::APInt &Value, RecordDataImpl &Record) { 4775 Record.push_back(Value.getBitWidth()); 4776 const uint64_t *Words = Value.getRawData(); 4777 Record.append(Words, Words + Value.getNumWords()); 4778 } 4779 4780 void ASTWriter::AddAPSInt(const llvm::APSInt &Value, RecordDataImpl &Record) { 4781 Record.push_back(Value.isUnsigned()); 4782 AddAPInt(Value, Record); 4783 } 4784 4785 void ASTWriter::AddAPFloat(const llvm::APFloat &Value, RecordDataImpl &Record) { 4786 AddAPInt(Value.bitcastToAPInt(), Record); 4787 } 4788 4789 void ASTWriter::AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record) { 4790 Record.push_back(getIdentifierRef(II)); 4791 } 4792 4793 IdentID ASTWriter::getIdentifierRef(const IdentifierInfo *II) { 4794 if (!II) 4795 return 0; 4796 4797 IdentID &ID = IdentifierIDs[II]; 4798 if (ID == 0) 4799 ID = NextIdentID++; 4800 return ID; 4801 } 4802 4803 MacroID ASTWriter::getMacroRef(MacroInfo *MI, const IdentifierInfo *Name) { 4804 // Don't emit builtin macros like __LINE__ to the AST file unless they 4805 // have been redefined by the header (in which case they are not 4806 // isBuiltinMacro). 4807 if (!MI || MI->isBuiltinMacro()) 4808 return 0; 4809 4810 MacroID &ID = MacroIDs[MI]; 4811 if (ID == 0) { 4812 ID = NextMacroID++; 4813 MacroInfoToEmitData Info = { Name, MI, ID }; 4814 MacroInfosToEmit.push_back(Info); 4815 } 4816 return ID; 4817 } 4818 4819 MacroID ASTWriter::getMacroID(MacroInfo *MI) { 4820 if (!MI || MI->isBuiltinMacro()) 4821 return 0; 4822 4823 assert(MacroIDs.find(MI) != MacroIDs.end() && "Macro not emitted!"); 4824 return MacroIDs[MI]; 4825 } 4826 4827 uint64_t ASTWriter::getMacroDirectivesOffset(const IdentifierInfo *Name) { 4828 return IdentMacroDirectivesOffsetMap.lookup(Name); 4829 } 4830 4831 void ASTWriter::AddSelectorRef(const Selector SelRef, RecordDataImpl &Record) { 4832 Record.push_back(getSelectorRef(SelRef)); 4833 } 4834 4835 SelectorID ASTWriter::getSelectorRef(Selector Sel) { 4836 if (Sel.getAsOpaquePtr() == nullptr) { 4837 return 0; 4838 } 4839 4840 SelectorID SID = SelectorIDs[Sel]; 4841 if (SID == 0 && Chain) { 4842 // This might trigger a ReadSelector callback, which will set the ID for 4843 // this selector. 4844 Chain->LoadSelector(Sel); 4845 SID = SelectorIDs[Sel]; 4846 } 4847 if (SID == 0) { 4848 SID = NextSelectorID++; 4849 SelectorIDs[Sel] = SID; 4850 } 4851 return SID; 4852 } 4853 4854 void ASTWriter::AddCXXTemporary(const CXXTemporary *Temp, RecordDataImpl &Record) { 4855 AddDeclRef(Temp->getDestructor(), Record); 4856 } 4857 4858 void ASTWriter::AddCXXCtorInitializersRef(ArrayRef<CXXCtorInitializer *> Inits, 4859 RecordDataImpl &Record) { 4860 assert(!Inits.empty() && "Empty ctor initializer sets are not recorded"); 4861 CXXCtorInitializersToWrite.push_back( 4862 QueuedCXXCtorInitializers(NextCXXCtorInitializersID, Inits)); 4863 Record.push_back(NextCXXCtorInitializersID++); 4864 } 4865 4866 void ASTWriter::AddCXXBaseSpecifiersRef(CXXBaseSpecifier const *Bases, 4867 CXXBaseSpecifier const *BasesEnd, 4868 RecordDataImpl &Record) { 4869 assert(Bases != BasesEnd && "Empty base-specifier sets are not recorded"); 4870 CXXBaseSpecifiersToWrite.push_back( 4871 QueuedCXXBaseSpecifiers(NextCXXBaseSpecifiersID, 4872 Bases, BasesEnd)); 4873 Record.push_back(NextCXXBaseSpecifiersID++); 4874 } 4875 4876 void ASTWriter::AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, 4877 const TemplateArgumentLocInfo &Arg, 4878 RecordDataImpl &Record) { 4879 switch (Kind) { 4880 case TemplateArgument::Expression: 4881 AddStmt(Arg.getAsExpr()); 4882 break; 4883 case TemplateArgument::Type: 4884 AddTypeSourceInfo(Arg.getAsTypeSourceInfo(), Record); 4885 break; 4886 case TemplateArgument::Template: 4887 AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc(), Record); 4888 AddSourceLocation(Arg.getTemplateNameLoc(), Record); 4889 break; 4890 case TemplateArgument::TemplateExpansion: 4891 AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc(), Record); 4892 AddSourceLocation(Arg.getTemplateNameLoc(), Record); 4893 AddSourceLocation(Arg.getTemplateEllipsisLoc(), Record); 4894 break; 4895 case TemplateArgument::Null: 4896 case TemplateArgument::Integral: 4897 case TemplateArgument::Declaration: 4898 case TemplateArgument::NullPtr: 4899 case TemplateArgument::Pack: 4900 // FIXME: Is this right? 4901 break; 4902 } 4903 } 4904 4905 void ASTWriter::AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg, 4906 RecordDataImpl &Record) { 4907 AddTemplateArgument(Arg.getArgument(), Record); 4908 4909 if (Arg.getArgument().getKind() == TemplateArgument::Expression) { 4910 bool InfoHasSameExpr 4911 = Arg.getArgument().getAsExpr() == Arg.getLocInfo().getAsExpr(); 4912 Record.push_back(InfoHasSameExpr); 4913 if (InfoHasSameExpr) 4914 return; // Avoid storing the same expr twice. 4915 } 4916 AddTemplateArgumentLocInfo(Arg.getArgument().getKind(), Arg.getLocInfo(), 4917 Record); 4918 } 4919 4920 void ASTWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo, 4921 RecordDataImpl &Record) { 4922 if (!TInfo) { 4923 AddTypeRef(QualType(), Record); 4924 return; 4925 } 4926 4927 AddTypeLoc(TInfo->getTypeLoc(), Record); 4928 } 4929 4930 void ASTWriter::AddTypeLoc(TypeLoc TL, RecordDataImpl &Record) { 4931 AddTypeRef(TL.getType(), Record); 4932 4933 TypeLocWriter TLW(*this, Record); 4934 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 4935 TLW.Visit(TL); 4936 } 4937 4938 void ASTWriter::AddTypeRef(QualType T, RecordDataImpl &Record) { 4939 Record.push_back(GetOrCreateTypeID(T)); 4940 } 4941 4942 TypeID ASTWriter::GetOrCreateTypeID(QualType T) { 4943 assert(Context); 4944 return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx { 4945 if (T.isNull()) 4946 return TypeIdx(); 4947 assert(!T.getLocalFastQualifiers()); 4948 4949 TypeIdx &Idx = TypeIdxs[T]; 4950 if (Idx.getIndex() == 0) { 4951 if (DoneWritingDeclsAndTypes) { 4952 assert(0 && "New type seen after serializing all the types to emit!"); 4953 return TypeIdx(); 4954 } 4955 4956 // We haven't seen this type before. Assign it a new ID and put it 4957 // into the queue of types to emit. 4958 Idx = TypeIdx(NextTypeID++); 4959 DeclTypesToEmit.push(T); 4960 } 4961 return Idx; 4962 }); 4963 } 4964 4965 TypeID ASTWriter::getTypeID(QualType T) const { 4966 assert(Context); 4967 return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx { 4968 if (T.isNull()) 4969 return TypeIdx(); 4970 assert(!T.getLocalFastQualifiers()); 4971 4972 TypeIdxMap::const_iterator I = TypeIdxs.find(T); 4973 assert(I != TypeIdxs.end() && "Type not emitted!"); 4974 return I->second; 4975 }); 4976 } 4977 4978 void ASTWriter::AddDeclRef(const Decl *D, RecordDataImpl &Record) { 4979 Record.push_back(GetDeclRef(D)); 4980 } 4981 4982 DeclID ASTWriter::GetDeclRef(const Decl *D) { 4983 assert(WritingAST && "Cannot request a declaration ID before AST writing"); 4984 4985 if (!D) { 4986 return 0; 4987 } 4988 4989 // If D comes from an AST file, its declaration ID is already known and 4990 // fixed. 4991 if (D->isFromASTFile()) 4992 return D->getGlobalID(); 4993 4994 assert(!(reinterpret_cast<uintptr_t>(D) & 0x01) && "Invalid decl pointer"); 4995 DeclID &ID = DeclIDs[D]; 4996 if (ID == 0) { 4997 if (DoneWritingDeclsAndTypes) { 4998 assert(0 && "New decl seen after serializing all the decls to emit!"); 4999 return 0; 5000 } 5001 5002 // We haven't seen this declaration before. Give it a new ID and 5003 // enqueue it in the list of declarations to emit. 5004 ID = NextDeclID++; 5005 DeclTypesToEmit.push(const_cast<Decl *>(D)); 5006 } 5007 5008 return ID; 5009 } 5010 5011 DeclID ASTWriter::getDeclID(const Decl *D) { 5012 if (!D) 5013 return 0; 5014 5015 // If D comes from an AST file, its declaration ID is already known and 5016 // fixed. 5017 if (D->isFromASTFile()) 5018 return D->getGlobalID(); 5019 5020 assert(DeclIDs.find(D) != DeclIDs.end() && "Declaration not emitted!"); 5021 return DeclIDs[D]; 5022 } 5023 5024 void ASTWriter::associateDeclWithFile(const Decl *D, DeclID ID) { 5025 assert(ID); 5026 assert(D); 5027 5028 SourceLocation Loc = D->getLocation(); 5029 if (Loc.isInvalid()) 5030 return; 5031 5032 // We only keep track of the file-level declarations of each file. 5033 if (!D->getLexicalDeclContext()->isFileContext()) 5034 return; 5035 // FIXME: ParmVarDecls that are part of a function type of a parameter of 5036 // a function/objc method, should not have TU as lexical context. 5037 if (isa<ParmVarDecl>(D)) 5038 return; 5039 5040 SourceManager &SM = Context->getSourceManager(); 5041 SourceLocation FileLoc = SM.getFileLoc(Loc); 5042 assert(SM.isLocalSourceLocation(FileLoc)); 5043 FileID FID; 5044 unsigned Offset; 5045 std::tie(FID, Offset) = SM.getDecomposedLoc(FileLoc); 5046 if (FID.isInvalid()) 5047 return; 5048 assert(SM.getSLocEntry(FID).isFile()); 5049 5050 DeclIDInFileInfo *&Info = FileDeclIDs[FID]; 5051 if (!Info) 5052 Info = new DeclIDInFileInfo(); 5053 5054 std::pair<unsigned, serialization::DeclID> LocDecl(Offset, ID); 5055 LocDeclIDsTy &Decls = Info->DeclIDs; 5056 5057 if (Decls.empty() || Decls.back().first <= Offset) { 5058 Decls.push_back(LocDecl); 5059 return; 5060 } 5061 5062 LocDeclIDsTy::iterator I = 5063 std::upper_bound(Decls.begin(), Decls.end(), LocDecl, llvm::less_first()); 5064 5065 Decls.insert(I, LocDecl); 5066 } 5067 5068 void ASTWriter::AddDeclarationName(DeclarationName Name, RecordDataImpl &Record) { 5069 // FIXME: Emit a stable enum for NameKind. 0 = Identifier etc. 5070 Record.push_back(Name.getNameKind()); 5071 switch (Name.getNameKind()) { 5072 case DeclarationName::Identifier: 5073 AddIdentifierRef(Name.getAsIdentifierInfo(), Record); 5074 break; 5075 5076 case DeclarationName::ObjCZeroArgSelector: 5077 case DeclarationName::ObjCOneArgSelector: 5078 case DeclarationName::ObjCMultiArgSelector: 5079 AddSelectorRef(Name.getObjCSelector(), Record); 5080 break; 5081 5082 case DeclarationName::CXXConstructorName: 5083 case DeclarationName::CXXDestructorName: 5084 case DeclarationName::CXXConversionFunctionName: 5085 AddTypeRef(Name.getCXXNameType(), Record); 5086 break; 5087 5088 case DeclarationName::CXXOperatorName: 5089 Record.push_back(Name.getCXXOverloadedOperator()); 5090 break; 5091 5092 case DeclarationName::CXXLiteralOperatorName: 5093 AddIdentifierRef(Name.getCXXLiteralIdentifier(), Record); 5094 break; 5095 5096 case DeclarationName::CXXUsingDirective: 5097 // No extra data to emit 5098 break; 5099 } 5100 } 5101 5102 unsigned ASTWriter::getAnonymousDeclarationNumber(const NamedDecl *D) { 5103 assert(needsAnonymousDeclarationNumber(D) && 5104 "expected an anonymous declaration"); 5105 5106 // Number the anonymous declarations within this context, if we've not 5107 // already done so. 5108 auto It = AnonymousDeclarationNumbers.find(D); 5109 if (It == AnonymousDeclarationNumbers.end()) { 5110 auto *DC = D->getLexicalDeclContext(); 5111 numberAnonymousDeclsWithin(DC, [&](const NamedDecl *ND, unsigned Number) { 5112 AnonymousDeclarationNumbers[ND] = Number; 5113 }); 5114 5115 It = AnonymousDeclarationNumbers.find(D); 5116 assert(It != AnonymousDeclarationNumbers.end() && 5117 "declaration not found within its lexical context"); 5118 } 5119 5120 return It->second; 5121 } 5122 5123 void ASTWriter::AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, 5124 DeclarationName Name, RecordDataImpl &Record) { 5125 switch (Name.getNameKind()) { 5126 case DeclarationName::CXXConstructorName: 5127 case DeclarationName::CXXDestructorName: 5128 case DeclarationName::CXXConversionFunctionName: 5129 AddTypeSourceInfo(DNLoc.NamedType.TInfo, Record); 5130 break; 5131 5132 case DeclarationName::CXXOperatorName: 5133 AddSourceLocation( 5134 SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.BeginOpNameLoc), 5135 Record); 5136 AddSourceLocation( 5137 SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.EndOpNameLoc), 5138 Record); 5139 break; 5140 5141 case DeclarationName::CXXLiteralOperatorName: 5142 AddSourceLocation( 5143 SourceLocation::getFromRawEncoding(DNLoc.CXXLiteralOperatorName.OpNameLoc), 5144 Record); 5145 break; 5146 5147 case DeclarationName::Identifier: 5148 case DeclarationName::ObjCZeroArgSelector: 5149 case DeclarationName::ObjCOneArgSelector: 5150 case DeclarationName::ObjCMultiArgSelector: 5151 case DeclarationName::CXXUsingDirective: 5152 break; 5153 } 5154 } 5155 5156 void ASTWriter::AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo, 5157 RecordDataImpl &Record) { 5158 AddDeclarationName(NameInfo.getName(), Record); 5159 AddSourceLocation(NameInfo.getLoc(), Record); 5160 AddDeclarationNameLoc(NameInfo.getInfo(), NameInfo.getName(), Record); 5161 } 5162 5163 void ASTWriter::AddQualifierInfo(const QualifierInfo &Info, 5164 RecordDataImpl &Record) { 5165 AddNestedNameSpecifierLoc(Info.QualifierLoc, Record); 5166 Record.push_back(Info.NumTemplParamLists); 5167 for (unsigned i=0, e=Info.NumTemplParamLists; i != e; ++i) 5168 AddTemplateParameterList(Info.TemplParamLists[i], Record); 5169 } 5170 5171 void ASTWriter::AddNestedNameSpecifier(NestedNameSpecifier *NNS, 5172 RecordDataImpl &Record) { 5173 // Nested name specifiers usually aren't too long. I think that 8 would 5174 // typically accommodate the vast majority. 5175 SmallVector<NestedNameSpecifier *, 8> NestedNames; 5176 5177 // Push each of the NNS's onto a stack for serialization in reverse order. 5178 while (NNS) { 5179 NestedNames.push_back(NNS); 5180 NNS = NNS->getPrefix(); 5181 } 5182 5183 Record.push_back(NestedNames.size()); 5184 while(!NestedNames.empty()) { 5185 NNS = NestedNames.pop_back_val(); 5186 NestedNameSpecifier::SpecifierKind Kind = NNS->getKind(); 5187 Record.push_back(Kind); 5188 switch (Kind) { 5189 case NestedNameSpecifier::Identifier: 5190 AddIdentifierRef(NNS->getAsIdentifier(), Record); 5191 break; 5192 5193 case NestedNameSpecifier::Namespace: 5194 AddDeclRef(NNS->getAsNamespace(), Record); 5195 break; 5196 5197 case NestedNameSpecifier::NamespaceAlias: 5198 AddDeclRef(NNS->getAsNamespaceAlias(), Record); 5199 break; 5200 5201 case NestedNameSpecifier::TypeSpec: 5202 case NestedNameSpecifier::TypeSpecWithTemplate: 5203 AddTypeRef(QualType(NNS->getAsType(), 0), Record); 5204 Record.push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate); 5205 break; 5206 5207 case NestedNameSpecifier::Global: 5208 // Don't need to write an associated value. 5209 break; 5210 5211 case NestedNameSpecifier::Super: 5212 AddDeclRef(NNS->getAsRecordDecl(), Record); 5213 break; 5214 } 5215 } 5216 } 5217 5218 void ASTWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 5219 RecordDataImpl &Record) { 5220 // Nested name specifiers usually aren't too long. I think that 8 would 5221 // typically accommodate the vast majority. 5222 SmallVector<NestedNameSpecifierLoc , 8> NestedNames; 5223 5224 // Push each of the nested-name-specifiers's onto a stack for 5225 // serialization in reverse order. 5226 while (NNS) { 5227 NestedNames.push_back(NNS); 5228 NNS = NNS.getPrefix(); 5229 } 5230 5231 Record.push_back(NestedNames.size()); 5232 while(!NestedNames.empty()) { 5233 NNS = NestedNames.pop_back_val(); 5234 NestedNameSpecifier::SpecifierKind Kind 5235 = NNS.getNestedNameSpecifier()->getKind(); 5236 Record.push_back(Kind); 5237 switch (Kind) { 5238 case NestedNameSpecifier::Identifier: 5239 AddIdentifierRef(NNS.getNestedNameSpecifier()->getAsIdentifier(), Record); 5240 AddSourceRange(NNS.getLocalSourceRange(), Record); 5241 break; 5242 5243 case NestedNameSpecifier::Namespace: 5244 AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespace(), Record); 5245 AddSourceRange(NNS.getLocalSourceRange(), Record); 5246 break; 5247 5248 case NestedNameSpecifier::NamespaceAlias: 5249 AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespaceAlias(), Record); 5250 AddSourceRange(NNS.getLocalSourceRange(), Record); 5251 break; 5252 5253 case NestedNameSpecifier::TypeSpec: 5254 case NestedNameSpecifier::TypeSpecWithTemplate: 5255 Record.push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate); 5256 AddTypeLoc(NNS.getTypeLoc(), Record); 5257 AddSourceLocation(NNS.getLocalSourceRange().getEnd(), Record); 5258 break; 5259 5260 case NestedNameSpecifier::Global: 5261 AddSourceLocation(NNS.getLocalSourceRange().getEnd(), Record); 5262 break; 5263 5264 case NestedNameSpecifier::Super: 5265 AddDeclRef(NNS.getNestedNameSpecifier()->getAsRecordDecl(), Record); 5266 AddSourceRange(NNS.getLocalSourceRange(), Record); 5267 break; 5268 } 5269 } 5270 } 5271 5272 void ASTWriter::AddTemplateName(TemplateName Name, RecordDataImpl &Record) { 5273 TemplateName::NameKind Kind = Name.getKind(); 5274 Record.push_back(Kind); 5275 switch (Kind) { 5276 case TemplateName::Template: 5277 AddDeclRef(Name.getAsTemplateDecl(), Record); 5278 break; 5279 5280 case TemplateName::OverloadedTemplate: { 5281 OverloadedTemplateStorage *OvT = Name.getAsOverloadedTemplate(); 5282 Record.push_back(OvT->size()); 5283 for (OverloadedTemplateStorage::iterator I = OvT->begin(), E = OvT->end(); 5284 I != E; ++I) 5285 AddDeclRef(*I, Record); 5286 break; 5287 } 5288 5289 case TemplateName::QualifiedTemplate: { 5290 QualifiedTemplateName *QualT = Name.getAsQualifiedTemplateName(); 5291 AddNestedNameSpecifier(QualT->getQualifier(), Record); 5292 Record.push_back(QualT->hasTemplateKeyword()); 5293 AddDeclRef(QualT->getTemplateDecl(), Record); 5294 break; 5295 } 5296 5297 case TemplateName::DependentTemplate: { 5298 DependentTemplateName *DepT = Name.getAsDependentTemplateName(); 5299 AddNestedNameSpecifier(DepT->getQualifier(), Record); 5300 Record.push_back(DepT->isIdentifier()); 5301 if (DepT->isIdentifier()) 5302 AddIdentifierRef(DepT->getIdentifier(), Record); 5303 else 5304 Record.push_back(DepT->getOperator()); 5305 break; 5306 } 5307 5308 case TemplateName::SubstTemplateTemplateParm: { 5309 SubstTemplateTemplateParmStorage *subst 5310 = Name.getAsSubstTemplateTemplateParm(); 5311 AddDeclRef(subst->getParameter(), Record); 5312 AddTemplateName(subst->getReplacement(), Record); 5313 break; 5314 } 5315 5316 case TemplateName::SubstTemplateTemplateParmPack: { 5317 SubstTemplateTemplateParmPackStorage *SubstPack 5318 = Name.getAsSubstTemplateTemplateParmPack(); 5319 AddDeclRef(SubstPack->getParameterPack(), Record); 5320 AddTemplateArgument(SubstPack->getArgumentPack(), Record); 5321 break; 5322 } 5323 } 5324 } 5325 5326 void ASTWriter::AddTemplateArgument(const TemplateArgument &Arg, 5327 RecordDataImpl &Record) { 5328 Record.push_back(Arg.getKind()); 5329 switch (Arg.getKind()) { 5330 case TemplateArgument::Null: 5331 break; 5332 case TemplateArgument::Type: 5333 AddTypeRef(Arg.getAsType(), Record); 5334 break; 5335 case TemplateArgument::Declaration: 5336 AddDeclRef(Arg.getAsDecl(), Record); 5337 AddTypeRef(Arg.getParamTypeForDecl(), Record); 5338 break; 5339 case TemplateArgument::NullPtr: 5340 AddTypeRef(Arg.getNullPtrType(), Record); 5341 break; 5342 case TemplateArgument::Integral: 5343 AddAPSInt(Arg.getAsIntegral(), Record); 5344 AddTypeRef(Arg.getIntegralType(), Record); 5345 break; 5346 case TemplateArgument::Template: 5347 AddTemplateName(Arg.getAsTemplateOrTemplatePattern(), Record); 5348 break; 5349 case TemplateArgument::TemplateExpansion: 5350 AddTemplateName(Arg.getAsTemplateOrTemplatePattern(), Record); 5351 if (Optional<unsigned> NumExpansions = Arg.getNumTemplateExpansions()) 5352 Record.push_back(*NumExpansions + 1); 5353 else 5354 Record.push_back(0); 5355 break; 5356 case TemplateArgument::Expression: 5357 AddStmt(Arg.getAsExpr()); 5358 break; 5359 case TemplateArgument::Pack: 5360 Record.push_back(Arg.pack_size()); 5361 for (const auto &P : Arg.pack_elements()) 5362 AddTemplateArgument(P, Record); 5363 break; 5364 } 5365 } 5366 5367 void 5368 ASTWriter::AddTemplateParameterList(const TemplateParameterList *TemplateParams, 5369 RecordDataImpl &Record) { 5370 assert(TemplateParams && "No TemplateParams!"); 5371 AddSourceLocation(TemplateParams->getTemplateLoc(), Record); 5372 AddSourceLocation(TemplateParams->getLAngleLoc(), Record); 5373 AddSourceLocation(TemplateParams->getRAngleLoc(), Record); 5374 Record.push_back(TemplateParams->size()); 5375 for (TemplateParameterList::const_iterator 5376 P = TemplateParams->begin(), PEnd = TemplateParams->end(); 5377 P != PEnd; ++P) 5378 AddDeclRef(*P, Record); 5379 } 5380 5381 /// \brief Emit a template argument list. 5382 void 5383 ASTWriter::AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs, 5384 RecordDataImpl &Record) { 5385 assert(TemplateArgs && "No TemplateArgs!"); 5386 Record.push_back(TemplateArgs->size()); 5387 for (int i=0, e = TemplateArgs->size(); i != e; ++i) 5388 AddTemplateArgument(TemplateArgs->get(i), Record); 5389 } 5390 5391 void 5392 ASTWriter::AddASTTemplateArgumentListInfo 5393 (const ASTTemplateArgumentListInfo *ASTTemplArgList, RecordDataImpl &Record) { 5394 assert(ASTTemplArgList && "No ASTTemplArgList!"); 5395 AddSourceLocation(ASTTemplArgList->LAngleLoc, Record); 5396 AddSourceLocation(ASTTemplArgList->RAngleLoc, Record); 5397 Record.push_back(ASTTemplArgList->NumTemplateArgs); 5398 const TemplateArgumentLoc *TemplArgs = ASTTemplArgList->getTemplateArgs(); 5399 for (int i=0, e = ASTTemplArgList->NumTemplateArgs; i != e; ++i) 5400 AddTemplateArgumentLoc(TemplArgs[i], Record); 5401 } 5402 5403 void 5404 ASTWriter::AddUnresolvedSet(const ASTUnresolvedSet &Set, RecordDataImpl &Record) { 5405 Record.push_back(Set.size()); 5406 for (ASTUnresolvedSet::const_iterator 5407 I = Set.begin(), E = Set.end(); I != E; ++I) { 5408 AddDeclRef(I.getDecl(), Record); 5409 Record.push_back(I.getAccess()); 5410 } 5411 } 5412 5413 void ASTWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base, 5414 RecordDataImpl &Record) { 5415 Record.push_back(Base.isVirtual()); 5416 Record.push_back(Base.isBaseOfClass()); 5417 Record.push_back(Base.getAccessSpecifierAsWritten()); 5418 Record.push_back(Base.getInheritConstructors()); 5419 AddTypeSourceInfo(Base.getTypeSourceInfo(), Record); 5420 AddSourceRange(Base.getSourceRange(), Record); 5421 AddSourceLocation(Base.isPackExpansion()? Base.getEllipsisLoc() 5422 : SourceLocation(), 5423 Record); 5424 } 5425 5426 void ASTWriter::FlushCXXBaseSpecifiers() { 5427 RecordData Record; 5428 unsigned N = CXXBaseSpecifiersToWrite.size(); 5429 for (unsigned I = 0; I != N; ++I) { 5430 Record.clear(); 5431 5432 // Record the offset of this base-specifier set. 5433 unsigned Index = CXXBaseSpecifiersToWrite[I].ID - 1; 5434 if (Index == CXXBaseSpecifiersOffsets.size()) 5435 CXXBaseSpecifiersOffsets.push_back(Stream.GetCurrentBitNo()); 5436 else { 5437 if (Index > CXXBaseSpecifiersOffsets.size()) 5438 CXXBaseSpecifiersOffsets.resize(Index + 1); 5439 CXXBaseSpecifiersOffsets[Index] = Stream.GetCurrentBitNo(); 5440 } 5441 5442 const CXXBaseSpecifier *B = CXXBaseSpecifiersToWrite[I].Bases, 5443 *BEnd = CXXBaseSpecifiersToWrite[I].BasesEnd; 5444 Record.push_back(BEnd - B); 5445 for (; B != BEnd; ++B) 5446 AddCXXBaseSpecifier(*B, Record); 5447 Stream.EmitRecord(serialization::DECL_CXX_BASE_SPECIFIERS, Record); 5448 5449 // Flush any expressions that were written as part of the base specifiers. 5450 FlushStmts(); 5451 } 5452 5453 assert(N == CXXBaseSpecifiersToWrite.size() && 5454 "added more base specifiers while writing base specifiers"); 5455 CXXBaseSpecifiersToWrite.clear(); 5456 } 5457 5458 void ASTWriter::AddCXXCtorInitializers( 5459 const CXXCtorInitializer * const *CtorInitializers, 5460 unsigned NumCtorInitializers, 5461 RecordDataImpl &Record) { 5462 Record.push_back(NumCtorInitializers); 5463 for (unsigned i=0; i != NumCtorInitializers; ++i) { 5464 const CXXCtorInitializer *Init = CtorInitializers[i]; 5465 5466 if (Init->isBaseInitializer()) { 5467 Record.push_back(CTOR_INITIALIZER_BASE); 5468 AddTypeSourceInfo(Init->getTypeSourceInfo(), Record); 5469 Record.push_back(Init->isBaseVirtual()); 5470 } else if (Init->isDelegatingInitializer()) { 5471 Record.push_back(CTOR_INITIALIZER_DELEGATING); 5472 AddTypeSourceInfo(Init->getTypeSourceInfo(), Record); 5473 } else if (Init->isMemberInitializer()){ 5474 Record.push_back(CTOR_INITIALIZER_MEMBER); 5475 AddDeclRef(Init->getMember(), Record); 5476 } else { 5477 Record.push_back(CTOR_INITIALIZER_INDIRECT_MEMBER); 5478 AddDeclRef(Init->getIndirectMember(), Record); 5479 } 5480 5481 AddSourceLocation(Init->getMemberLocation(), Record); 5482 AddStmt(Init->getInit()); 5483 AddSourceLocation(Init->getLParenLoc(), Record); 5484 AddSourceLocation(Init->getRParenLoc(), Record); 5485 Record.push_back(Init->isWritten()); 5486 if (Init->isWritten()) { 5487 Record.push_back(Init->getSourceOrder()); 5488 } else { 5489 Record.push_back(Init->getNumArrayIndices()); 5490 for (unsigned i=0, e=Init->getNumArrayIndices(); i != e; ++i) 5491 AddDeclRef(Init->getArrayIndex(i), Record); 5492 } 5493 } 5494 } 5495 5496 void ASTWriter::FlushCXXCtorInitializers() { 5497 RecordData Record; 5498 5499 unsigned N = CXXCtorInitializersToWrite.size(); 5500 (void)N; // Silence unused warning in non-assert builds. 5501 for (auto &Init : CXXCtorInitializersToWrite) { 5502 Record.clear(); 5503 5504 // Record the offset of this mem-initializer list. 5505 unsigned Index = Init.ID - 1; 5506 if (Index == CXXCtorInitializersOffsets.size()) 5507 CXXCtorInitializersOffsets.push_back(Stream.GetCurrentBitNo()); 5508 else { 5509 if (Index > CXXCtorInitializersOffsets.size()) 5510 CXXCtorInitializersOffsets.resize(Index + 1); 5511 CXXCtorInitializersOffsets[Index] = Stream.GetCurrentBitNo(); 5512 } 5513 5514 AddCXXCtorInitializers(Init.Inits.data(), Init.Inits.size(), Record); 5515 Stream.EmitRecord(serialization::DECL_CXX_CTOR_INITIALIZERS, Record); 5516 5517 // Flush any expressions that were written as part of the initializers. 5518 FlushStmts(); 5519 } 5520 5521 assert(N == CXXCtorInitializersToWrite.size() && 5522 "added more ctor initializers while writing ctor initializers"); 5523 CXXCtorInitializersToWrite.clear(); 5524 } 5525 5526 void ASTWriter::AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Record) { 5527 auto &Data = D->data(); 5528 Record.push_back(Data.IsLambda); 5529 Record.push_back(Data.UserDeclaredConstructor); 5530 Record.push_back(Data.UserDeclaredSpecialMembers); 5531 Record.push_back(Data.Aggregate); 5532 Record.push_back(Data.PlainOldData); 5533 Record.push_back(Data.Empty); 5534 Record.push_back(Data.Polymorphic); 5535 Record.push_back(Data.Abstract); 5536 Record.push_back(Data.IsStandardLayout); 5537 Record.push_back(Data.HasNoNonEmptyBases); 5538 Record.push_back(Data.HasPrivateFields); 5539 Record.push_back(Data.HasProtectedFields); 5540 Record.push_back(Data.HasPublicFields); 5541 Record.push_back(Data.HasMutableFields); 5542 Record.push_back(Data.HasVariantMembers); 5543 Record.push_back(Data.HasOnlyCMembers); 5544 Record.push_back(Data.HasInClassInitializer); 5545 Record.push_back(Data.HasUninitializedReferenceMember); 5546 Record.push_back(Data.NeedOverloadResolutionForMoveConstructor); 5547 Record.push_back(Data.NeedOverloadResolutionForMoveAssignment); 5548 Record.push_back(Data.NeedOverloadResolutionForDestructor); 5549 Record.push_back(Data.DefaultedMoveConstructorIsDeleted); 5550 Record.push_back(Data.DefaultedMoveAssignmentIsDeleted); 5551 Record.push_back(Data.DefaultedDestructorIsDeleted); 5552 Record.push_back(Data.HasTrivialSpecialMembers); 5553 Record.push_back(Data.DeclaredNonTrivialSpecialMembers); 5554 Record.push_back(Data.HasIrrelevantDestructor); 5555 Record.push_back(Data.HasConstexprNonCopyMoveConstructor); 5556 Record.push_back(Data.DefaultedDefaultConstructorIsConstexpr); 5557 Record.push_back(Data.HasConstexprDefaultConstructor); 5558 Record.push_back(Data.HasNonLiteralTypeFieldsOrBases); 5559 Record.push_back(Data.ComputedVisibleConversions); 5560 Record.push_back(Data.UserProvidedDefaultConstructor); 5561 Record.push_back(Data.DeclaredSpecialMembers); 5562 Record.push_back(Data.ImplicitCopyConstructorHasConstParam); 5563 Record.push_back(Data.ImplicitCopyAssignmentHasConstParam); 5564 Record.push_back(Data.HasDeclaredCopyConstructorWithConstParam); 5565 Record.push_back(Data.HasDeclaredCopyAssignmentWithConstParam); 5566 // IsLambda bit is already saved. 5567 5568 Record.push_back(Data.NumBases); 5569 if (Data.NumBases > 0) 5570 AddCXXBaseSpecifiersRef(Data.getBases(), Data.getBases() + Data.NumBases, 5571 Record); 5572 5573 // FIXME: Make VBases lazily computed when needed to avoid storing them. 5574 Record.push_back(Data.NumVBases); 5575 if (Data.NumVBases > 0) 5576 AddCXXBaseSpecifiersRef(Data.getVBases(), Data.getVBases() + Data.NumVBases, 5577 Record); 5578 5579 AddUnresolvedSet(Data.Conversions.get(*Context), Record); 5580 AddUnresolvedSet(Data.VisibleConversions.get(*Context), Record); 5581 // Data.Definition is the owning decl, no need to write it. 5582 AddDeclRef(D->getFirstFriend(), Record); 5583 5584 // Add lambda-specific data. 5585 if (Data.IsLambda) { 5586 auto &Lambda = D->getLambdaData(); 5587 Record.push_back(Lambda.Dependent); 5588 Record.push_back(Lambda.IsGenericLambda); 5589 Record.push_back(Lambda.CaptureDefault); 5590 Record.push_back(Lambda.NumCaptures); 5591 Record.push_back(Lambda.NumExplicitCaptures); 5592 Record.push_back(Lambda.ManglingNumber); 5593 AddDeclRef(Lambda.ContextDecl, Record); 5594 AddTypeSourceInfo(Lambda.MethodTyInfo, Record); 5595 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) { 5596 const LambdaCapture &Capture = Lambda.Captures[I]; 5597 AddSourceLocation(Capture.getLocation(), Record); 5598 Record.push_back(Capture.isImplicit()); 5599 Record.push_back(Capture.getCaptureKind()); 5600 switch (Capture.getCaptureKind()) { 5601 case LCK_This: 5602 case LCK_VLAType: 5603 break; 5604 case LCK_ByCopy: 5605 case LCK_ByRef: 5606 VarDecl *Var = 5607 Capture.capturesVariable() ? Capture.getCapturedVar() : nullptr; 5608 AddDeclRef(Var, Record); 5609 AddSourceLocation(Capture.isPackExpansion() ? Capture.getEllipsisLoc() 5610 : SourceLocation(), 5611 Record); 5612 break; 5613 } 5614 } 5615 } 5616 } 5617 5618 void ASTWriter::ReaderInitialized(ASTReader *Reader) { 5619 assert(Reader && "Cannot remove chain"); 5620 assert((!Chain || Chain == Reader) && "Cannot replace chain"); 5621 assert(FirstDeclID == NextDeclID && 5622 FirstTypeID == NextTypeID && 5623 FirstIdentID == NextIdentID && 5624 FirstMacroID == NextMacroID && 5625 FirstSubmoduleID == NextSubmoduleID && 5626 FirstSelectorID == NextSelectorID && 5627 "Setting chain after writing has started."); 5628 5629 Chain = Reader; 5630 5631 // Note, this will get called multiple times, once one the reader starts up 5632 // and again each time it's done reading a PCH or module. 5633 FirstDeclID = NUM_PREDEF_DECL_IDS + Chain->getTotalNumDecls(); 5634 FirstTypeID = NUM_PREDEF_TYPE_IDS + Chain->getTotalNumTypes(); 5635 FirstIdentID = NUM_PREDEF_IDENT_IDS + Chain->getTotalNumIdentifiers(); 5636 FirstMacroID = NUM_PREDEF_MACRO_IDS + Chain->getTotalNumMacros(); 5637 FirstSubmoduleID = NUM_PREDEF_SUBMODULE_IDS + Chain->getTotalNumSubmodules(); 5638 FirstSelectorID = NUM_PREDEF_SELECTOR_IDS + Chain->getTotalNumSelectors(); 5639 NextDeclID = FirstDeclID; 5640 NextTypeID = FirstTypeID; 5641 NextIdentID = FirstIdentID; 5642 NextMacroID = FirstMacroID; 5643 NextSelectorID = FirstSelectorID; 5644 NextSubmoduleID = FirstSubmoduleID; 5645 } 5646 5647 void ASTWriter::IdentifierRead(IdentID ID, IdentifierInfo *II) { 5648 // Always keep the highest ID. See \p TypeRead() for more information. 5649 IdentID &StoredID = IdentifierIDs[II]; 5650 if (ID > StoredID) 5651 StoredID = ID; 5652 } 5653 5654 void ASTWriter::MacroRead(serialization::MacroID ID, MacroInfo *MI) { 5655 // Always keep the highest ID. See \p TypeRead() for more information. 5656 MacroID &StoredID = MacroIDs[MI]; 5657 if (ID > StoredID) 5658 StoredID = ID; 5659 } 5660 5661 void ASTWriter::TypeRead(TypeIdx Idx, QualType T) { 5662 // Always take the highest-numbered type index. This copes with an interesting 5663 // case for chained AST writing where we schedule writing the type and then, 5664 // later, deserialize the type from another AST. In this case, we want to 5665 // keep the higher-numbered entry so that we can properly write it out to 5666 // the AST file. 5667 TypeIdx &StoredIdx = TypeIdxs[T]; 5668 if (Idx.getIndex() >= StoredIdx.getIndex()) 5669 StoredIdx = Idx; 5670 } 5671 5672 void ASTWriter::SelectorRead(SelectorID ID, Selector S) { 5673 // Always keep the highest ID. See \p TypeRead() for more information. 5674 SelectorID &StoredID = SelectorIDs[S]; 5675 if (ID > StoredID) 5676 StoredID = ID; 5677 } 5678 5679 void ASTWriter::MacroDefinitionRead(serialization::PreprocessedEntityID ID, 5680 MacroDefinitionRecord *MD) { 5681 assert(MacroDefinitions.find(MD) == MacroDefinitions.end()); 5682 MacroDefinitions[MD] = ID; 5683 } 5684 5685 void ASTWriter::ModuleRead(serialization::SubmoduleID ID, Module *Mod) { 5686 assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end()); 5687 SubmoduleIDs[Mod] = ID; 5688 } 5689 5690 void ASTWriter::CompletedTagDefinition(const TagDecl *D) { 5691 assert(D->isCompleteDefinition()); 5692 assert(!WritingAST && "Already writing the AST!"); 5693 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { 5694 // We are interested when a PCH decl is modified. 5695 if (RD->isFromASTFile()) { 5696 // A forward reference was mutated into a definition. Rewrite it. 5697 // FIXME: This happens during template instantiation, should we 5698 // have created a new definition decl instead ? 5699 assert(isTemplateInstantiation(RD->getTemplateSpecializationKind()) && 5700 "completed a tag from another module but not by instantiation?"); 5701 DeclUpdates[RD].push_back( 5702 DeclUpdate(UPD_CXX_INSTANTIATED_CLASS_DEFINITION)); 5703 } 5704 } 5705 } 5706 5707 void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) { 5708 // TU and namespaces are handled elsewhere. 5709 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC)) 5710 return; 5711 5712 if (!(!D->isFromASTFile() && cast<Decl>(DC)->isFromASTFile())) 5713 return; // Not a source decl added to a DeclContext from PCH. 5714 5715 assert(DC == DC->getPrimaryContext() && "added to non-primary context"); 5716 assert(!getDefinitiveDeclContext(DC) && "DeclContext not definitive!"); 5717 assert(!WritingAST && "Already writing the AST!"); 5718 UpdatedDeclContexts.insert(DC); 5719 UpdatingVisibleDecls.push_back(D); 5720 } 5721 5722 void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) { 5723 assert(D->isImplicit()); 5724 if (!(!D->isFromASTFile() && RD->isFromASTFile())) 5725 return; // Not a source member added to a class from PCH. 5726 if (!isa<CXXMethodDecl>(D)) 5727 return; // We are interested in lazily declared implicit methods. 5728 5729 // A decl coming from PCH was modified. 5730 assert(RD->isCompleteDefinition()); 5731 assert(!WritingAST && "Already writing the AST!"); 5732 DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER, D)); 5733 } 5734 5735 void ASTWriter::AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, 5736 const ClassTemplateSpecializationDecl *D) { 5737 // The specializations set is kept in the canonical template. 5738 TD = TD->getCanonicalDecl(); 5739 if (!(!D->isFromASTFile() && TD->isFromASTFile())) 5740 return; // Not a source specialization added to a template from PCH. 5741 5742 assert(!WritingAST && "Already writing the AST!"); 5743 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION, 5744 D)); 5745 } 5746 5747 void ASTWriter::AddedCXXTemplateSpecialization( 5748 const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) { 5749 // The specializations set is kept in the canonical template. 5750 TD = TD->getCanonicalDecl(); 5751 if (!(!D->isFromASTFile() && TD->isFromASTFile())) 5752 return; // Not a source specialization added to a template from PCH. 5753 5754 assert(!WritingAST && "Already writing the AST!"); 5755 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION, 5756 D)); 5757 } 5758 5759 void ASTWriter::AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD, 5760 const FunctionDecl *D) { 5761 // The specializations set is kept in the canonical template. 5762 TD = TD->getCanonicalDecl(); 5763 if (!(!D->isFromASTFile() && TD->isFromASTFile())) 5764 return; // Not a source specialization added to a template from PCH. 5765 5766 assert(!WritingAST && "Already writing the AST!"); 5767 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION, 5768 D)); 5769 } 5770 5771 void ASTWriter::ResolvedExceptionSpec(const FunctionDecl *FD) { 5772 assert(!DoneWritingDeclsAndTypes && "Already done writing updates!"); 5773 if (!Chain) return; 5774 Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) { 5775 // If we don't already know the exception specification for this redecl 5776 // chain, add an update record for it. 5777 if (isUnresolvedExceptionSpec(cast<FunctionDecl>(D) 5778 ->getType() 5779 ->castAs<FunctionProtoType>() 5780 ->getExceptionSpecType())) 5781 DeclUpdates[D].push_back(UPD_CXX_RESOLVED_EXCEPTION_SPEC); 5782 }); 5783 } 5784 5785 void ASTWriter::DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) { 5786 assert(!WritingAST && "Already writing the AST!"); 5787 if (!Chain) return; 5788 Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) { 5789 DeclUpdates[D].push_back( 5790 DeclUpdate(UPD_CXX_DEDUCED_RETURN_TYPE, ReturnType)); 5791 }); 5792 } 5793 5794 void ASTWriter::ResolvedOperatorDelete(const CXXDestructorDecl *DD, 5795 const FunctionDecl *Delete) { 5796 assert(!WritingAST && "Already writing the AST!"); 5797 assert(Delete && "Not given an operator delete"); 5798 if (!Chain) return; 5799 Chain->forEachImportedKeyDecl(DD, [&](const Decl *D) { 5800 DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_RESOLVED_DTOR_DELETE, Delete)); 5801 }); 5802 } 5803 5804 void ASTWriter::CompletedImplicitDefinition(const FunctionDecl *D) { 5805 assert(!WritingAST && "Already writing the AST!"); 5806 if (!D->isFromASTFile()) 5807 return; // Declaration not imported from PCH. 5808 5809 // Implicit function decl from a PCH was defined. 5810 DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION)); 5811 } 5812 5813 void ASTWriter::FunctionDefinitionInstantiated(const FunctionDecl *D) { 5814 assert(!WritingAST && "Already writing the AST!"); 5815 if (!D->isFromASTFile()) 5816 return; 5817 5818 DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION)); 5819 } 5820 5821 void ASTWriter::StaticDataMemberInstantiated(const VarDecl *D) { 5822 assert(!WritingAST && "Already writing the AST!"); 5823 if (!D->isFromASTFile()) 5824 return; 5825 5826 // Since the actual instantiation is delayed, this really means that we need 5827 // to update the instantiation location. 5828 DeclUpdates[D].push_back( 5829 DeclUpdate(UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER, 5830 D->getMemberSpecializationInfo()->getPointOfInstantiation())); 5831 } 5832 5833 void ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 5834 const ObjCInterfaceDecl *IFD) { 5835 assert(!WritingAST && "Already writing the AST!"); 5836 if (!IFD->isFromASTFile()) 5837 return; // Declaration not imported from PCH. 5838 5839 assert(IFD->getDefinition() && "Category on a class without a definition?"); 5840 ObjCClassesWithCategories.insert( 5841 const_cast<ObjCInterfaceDecl *>(IFD->getDefinition())); 5842 } 5843 5844 5845 void ASTWriter::AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop, 5846 const ObjCPropertyDecl *OrigProp, 5847 const ObjCCategoryDecl *ClassExt) { 5848 const ObjCInterfaceDecl *D = ClassExt->getClassInterface(); 5849 if (!D) 5850 return; 5851 5852 assert(!WritingAST && "Already writing the AST!"); 5853 if (!D->isFromASTFile()) 5854 return; // Declaration not imported from PCH. 5855 5856 RewriteDecl(D); 5857 } 5858 5859 void ASTWriter::DeclarationMarkedUsed(const Decl *D) { 5860 assert(!WritingAST && "Already writing the AST!"); 5861 if (!D->isFromASTFile()) 5862 return; 5863 5864 DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_USED)); 5865 } 5866 5867 void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) { 5868 assert(!WritingAST && "Already writing the AST!"); 5869 if (!D->isFromASTFile()) 5870 return; 5871 5872 DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE)); 5873 } 5874 5875 void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) { 5876 assert(!WritingAST && "Already writing the AST!"); 5877 assert(D->isHidden() && "expected a hidden declaration"); 5878 DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M)); 5879 } 5880 5881 void ASTWriter::AddedAttributeToRecord(const Attr *Attr, 5882 const RecordDecl *Record) { 5883 assert(!WritingAST && "Already writing the AST!"); 5884 if (!Record->isFromASTFile()) 5885 return; 5886 DeclUpdates[Record].push_back(DeclUpdate(UPD_ADDED_ATTR_TO_RECORD, Attr)); 5887 } 5888