1 //===--- ASTWriter.h - AST File Writer --------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the ASTWriter class, which writes an AST file 11 // containing a serialized representation of a translation unit. 12 // 13 //===----------------------------------------------------------------------===// 14 #ifndef LLVM_CLANG_SERIALIZATION_ASTWRITER_H 15 #define LLVM_CLANG_SERIALIZATION_ASTWRITER_H 16 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclarationName.h" 20 #include "clang/Frontend/PCHContainerOperations.h" 21 #include "clang/AST/TemplateBase.h" 22 #include "clang/Sema/SemaConsumer.h" 23 #include "clang/Serialization/ASTBitCodes.h" 24 #include "clang/Serialization/ASTDeserializationListener.h" 25 #include "llvm/ADT/DenseMap.h" 26 #include "llvm/ADT/DenseSet.h" 27 #include "llvm/ADT/MapVector.h" 28 #include "llvm/ADT/SetVector.h" 29 #include "llvm/ADT/SmallPtrSet.h" 30 #include "llvm/ADT/SmallVector.h" 31 #include "llvm/Bitcode/BitstreamWriter.h" 32 #include <map> 33 #include <queue> 34 #include <vector> 35 36 namespace llvm { 37 class APFloat; 38 class APInt; 39 class BitstreamWriter; 40 } 41 42 namespace clang { 43 44 class ASTContext; 45 class Attr; 46 class NestedNameSpecifier; 47 class CXXBaseSpecifier; 48 class CXXCtorInitializer; 49 class FileEntry; 50 class FPOptions; 51 class HeaderSearch; 52 class HeaderSearchOptions; 53 class IdentifierResolver; 54 class MacroDefinitionRecord; 55 class MacroDirective; 56 class MacroInfo; 57 class OpaqueValueExpr; 58 class OpenCLOptions; 59 class ASTReader; 60 class Module; 61 class ModuleFileExtension; 62 class ModuleFileExtensionWriter; 63 class PreprocessedEntity; 64 class PreprocessingRecord; 65 class Preprocessor; 66 class RecordDecl; 67 class Sema; 68 class SourceManager; 69 struct StoredDeclsList; 70 class SwitchCase; 71 class TargetInfo; 72 class Token; 73 class VersionTuple; 74 class ASTUnresolvedSet; 75 76 namespace SrcMgr { class SLocEntry; } 77 78 /// \brief Writes an AST file containing the contents of a translation unit. 79 /// 80 /// The ASTWriter class produces a bitstream containing the serialized 81 /// representation of a given abstract syntax tree and its supporting 82 /// data structures. This bitstream can be de-serialized via an 83 /// instance of the ASTReader class. 84 class ASTWriter : public ASTDeserializationListener, 85 public ASTMutationListener { 86 public: 87 typedef SmallVector<uint64_t, 64> RecordData; 88 typedef SmallVectorImpl<uint64_t> RecordDataImpl; 89 typedef ArrayRef<uint64_t> RecordDataRef; 90 91 friend class ASTDeclWriter; 92 friend class ASTStmtWriter; 93 friend class ASTTypeWriter; 94 friend class ASTRecordWriter; 95 private: 96 /// \brief Map that provides the ID numbers of each type within the 97 /// output stream, plus those deserialized from a chained PCH. 98 /// 99 /// The ID numbers of types are consecutive (in order of discovery) 100 /// and start at 1. 0 is reserved for NULL. When types are actually 101 /// stored in the stream, the ID number is shifted by 2 bits to 102 /// allow for the const/volatile qualifiers. 103 /// 104 /// Keys in the map never have const/volatile qualifiers. 105 typedef llvm::DenseMap<QualType, serialization::TypeIdx, 106 serialization::UnsafeQualTypeDenseMapInfo> 107 TypeIdxMap; 108 109 /// \brief The bitstream writer used to emit this precompiled header. 110 llvm::BitstreamWriter &Stream; 111 112 /// \brief The ASTContext we're writing. 113 ASTContext *Context; 114 115 /// \brief The preprocessor we're writing. 116 Preprocessor *PP; 117 118 /// \brief The reader of existing AST files, if we're chaining. 119 ASTReader *Chain; 120 121 /// \brief The module we're currently writing, if any. 122 Module *WritingModule; 123 124 /// \brief The base directory for any relative paths we emit. 125 std::string BaseDirectory; 126 127 /// \brief Indicates whether timestamps should be written to the produced 128 /// module file. This is the case for files implicitly written to the 129 /// module cache, where we need the timestamps to determine if the module 130 /// file is up to date, but not otherwise. 131 bool IncludeTimestamps; 132 133 /// \brief Indicates when the AST writing is actively performing 134 /// serialization, rather than just queueing updates. 135 bool WritingAST; 136 137 /// \brief Indicates that we are done serializing the collection of decls 138 /// and types to emit. 139 bool DoneWritingDeclsAndTypes; 140 141 /// \brief Indicates that the AST contained compiler errors. 142 bool ASTHasCompilerErrors; 143 144 /// \brief Mapping from input file entries to the index into the 145 /// offset table where information about that input file is stored. 146 llvm::DenseMap<const FileEntry *, uint32_t> InputFileIDs; 147 148 /// \brief Stores a declaration or a type to be written to the AST file. 149 class DeclOrType { 150 public: DeclOrType(Decl * D)151 DeclOrType(Decl *D) : Stored(D), IsType(false) { } DeclOrType(QualType T)152 DeclOrType(QualType T) : Stored(T.getAsOpaquePtr()), IsType(true) { } 153 isType()154 bool isType() const { return IsType; } isDecl()155 bool isDecl() const { return !IsType; } 156 getType()157 QualType getType() const { 158 assert(isType() && "Not a type!"); 159 return QualType::getFromOpaquePtr(Stored); 160 } 161 getDecl()162 Decl *getDecl() const { 163 assert(isDecl() && "Not a decl!"); 164 return static_cast<Decl *>(Stored); 165 } 166 167 private: 168 void *Stored; 169 bool IsType; 170 }; 171 172 /// \brief The declarations and types to emit. 173 std::queue<DeclOrType> DeclTypesToEmit; 174 175 /// \brief The first ID number we can use for our own declarations. 176 serialization::DeclID FirstDeclID; 177 178 /// \brief The decl ID that will be assigned to the next new decl. 179 serialization::DeclID NextDeclID; 180 181 /// \brief Map that provides the ID numbers of each declaration within 182 /// the output stream, as well as those deserialized from a chained PCH. 183 /// 184 /// The ID numbers of declarations are consecutive (in order of 185 /// discovery) and start at 2. 1 is reserved for the translation 186 /// unit, while 0 is reserved for NULL. 187 llvm::DenseMap<const Decl *, serialization::DeclID> DeclIDs; 188 189 /// \brief Offset of each declaration in the bitstream, indexed by 190 /// the declaration's ID. 191 std::vector<serialization::DeclOffset> DeclOffsets; 192 193 /// \brief Sorted (by file offset) vector of pairs of file offset/DeclID. 194 typedef SmallVector<std::pair<unsigned, serialization::DeclID>, 64> 195 LocDeclIDsTy; 196 struct DeclIDInFileInfo { 197 LocDeclIDsTy DeclIDs; 198 /// \brief Set when the DeclIDs vectors from all files are joined, this 199 /// indicates the index that this particular vector has in the global one. 200 unsigned FirstDeclIndex; 201 }; 202 typedef llvm::DenseMap<FileID, DeclIDInFileInfo *> FileDeclIDsTy; 203 204 /// \brief Map from file SLocEntries to info about the file-level declarations 205 /// that it contains. 206 FileDeclIDsTy FileDeclIDs; 207 208 void associateDeclWithFile(const Decl *D, serialization::DeclID); 209 210 /// \brief The first ID number we can use for our own types. 211 serialization::TypeID FirstTypeID; 212 213 /// \brief The type ID that will be assigned to the next new type. 214 serialization::TypeID NextTypeID; 215 216 /// \brief Map that provides the ID numbers of each type within the 217 /// output stream, plus those deserialized from a chained PCH. 218 /// 219 /// The ID numbers of types are consecutive (in order of discovery) 220 /// and start at 1. 0 is reserved for NULL. When types are actually 221 /// stored in the stream, the ID number is shifted by 2 bits to 222 /// allow for the const/volatile qualifiers. 223 /// 224 /// Keys in the map never have const/volatile qualifiers. 225 TypeIdxMap TypeIdxs; 226 227 /// \brief Offset of each type in the bitstream, indexed by 228 /// the type's ID. 229 std::vector<uint32_t> TypeOffsets; 230 231 /// \brief The first ID number we can use for our own identifiers. 232 serialization::IdentID FirstIdentID; 233 234 /// \brief The identifier ID that will be assigned to the next new identifier. 235 serialization::IdentID NextIdentID; 236 237 /// \brief Map that provides the ID numbers of each identifier in 238 /// the output stream. 239 /// 240 /// The ID numbers for identifiers are consecutive (in order of 241 /// discovery), starting at 1. An ID of zero refers to a NULL 242 /// IdentifierInfo. 243 llvm::MapVector<const IdentifierInfo *, serialization::IdentID> IdentifierIDs; 244 245 /// \brief The first ID number we can use for our own macros. 246 serialization::MacroID FirstMacroID; 247 248 /// \brief The identifier ID that will be assigned to the next new identifier. 249 serialization::MacroID NextMacroID; 250 251 /// \brief Map that provides the ID numbers of each macro. 252 llvm::DenseMap<MacroInfo *, serialization::MacroID> MacroIDs; 253 254 struct MacroInfoToEmitData { 255 const IdentifierInfo *Name; 256 MacroInfo *MI; 257 serialization::MacroID ID; 258 }; 259 /// \brief The macro infos to emit. 260 std::vector<MacroInfoToEmitData> MacroInfosToEmit; 261 262 llvm::DenseMap<const IdentifierInfo *, uint64_t> IdentMacroDirectivesOffsetMap; 263 264 /// @name FlushStmt Caches 265 /// @{ 266 267 /// \brief Set of parent Stmts for the currently serializing sub-stmt. 268 llvm::DenseSet<Stmt *> ParentStmts; 269 270 /// \brief Offsets of sub-stmts already serialized. The offset points 271 /// just after the stmt record. 272 llvm::DenseMap<Stmt *, uint64_t> SubStmtEntries; 273 274 /// @} 275 276 /// \brief Offsets of each of the identifier IDs into the identifier 277 /// table. 278 std::vector<uint32_t> IdentifierOffsets; 279 280 /// \brief The first ID number we can use for our own submodules. 281 serialization::SubmoduleID FirstSubmoduleID; 282 283 /// \brief The submodule ID that will be assigned to the next new submodule. 284 serialization::SubmoduleID NextSubmoduleID; 285 286 /// \brief The first ID number we can use for our own selectors. 287 serialization::SelectorID FirstSelectorID; 288 289 /// \brief The selector ID that will be assigned to the next new selector. 290 serialization::SelectorID NextSelectorID; 291 292 /// \brief Map that provides the ID numbers of each Selector. 293 llvm::MapVector<Selector, serialization::SelectorID> SelectorIDs; 294 295 /// \brief Offset of each selector within the method pool/selector 296 /// table, indexed by the Selector ID (-1). 297 std::vector<uint32_t> SelectorOffsets; 298 299 /// \brief Mapping from macro definitions (as they occur in the preprocessing 300 /// record) to the macro IDs. 301 llvm::DenseMap<const MacroDefinitionRecord *, 302 serialization::PreprocessedEntityID> MacroDefinitions; 303 304 /// \brief Cache of indices of anonymous declarations within their lexical 305 /// contexts. 306 llvm::DenseMap<const Decl *, unsigned> AnonymousDeclarationNumbers; 307 308 /// An update to a Decl. 309 class DeclUpdate { 310 /// A DeclUpdateKind. 311 unsigned Kind; 312 union { 313 const Decl *Dcl; 314 void *Type; 315 unsigned Loc; 316 unsigned Val; 317 Module *Mod; 318 const Attr *Attribute; 319 }; 320 321 public: DeclUpdate(unsigned Kind)322 DeclUpdate(unsigned Kind) : Kind(Kind), Dcl(nullptr) {} DeclUpdate(unsigned Kind,const Decl * Dcl)323 DeclUpdate(unsigned Kind, const Decl *Dcl) : Kind(Kind), Dcl(Dcl) {} DeclUpdate(unsigned Kind,QualType Type)324 DeclUpdate(unsigned Kind, QualType Type) 325 : Kind(Kind), Type(Type.getAsOpaquePtr()) {} DeclUpdate(unsigned Kind,SourceLocation Loc)326 DeclUpdate(unsigned Kind, SourceLocation Loc) 327 : Kind(Kind), Loc(Loc.getRawEncoding()) {} DeclUpdate(unsigned Kind,unsigned Val)328 DeclUpdate(unsigned Kind, unsigned Val) 329 : Kind(Kind), Val(Val) {} DeclUpdate(unsigned Kind,Module * M)330 DeclUpdate(unsigned Kind, Module *M) 331 : Kind(Kind), Mod(M) {} DeclUpdate(unsigned Kind,const Attr * Attribute)332 DeclUpdate(unsigned Kind, const Attr *Attribute) 333 : Kind(Kind), Attribute(Attribute) {} 334 getKind()335 unsigned getKind() const { return Kind; } getDecl()336 const Decl *getDecl() const { return Dcl; } getType()337 QualType getType() const { return QualType::getFromOpaquePtr(Type); } getLoc()338 SourceLocation getLoc() const { 339 return SourceLocation::getFromRawEncoding(Loc); 340 } getNumber()341 unsigned getNumber() const { return Val; } getModule()342 Module *getModule() const { return Mod; } getAttr()343 const Attr *getAttr() const { return Attribute; } 344 }; 345 346 typedef SmallVector<DeclUpdate, 1> UpdateRecord; 347 typedef llvm::MapVector<const Decl *, UpdateRecord> DeclUpdateMap; 348 /// \brief Mapping from declarations that came from a chained PCH to the 349 /// record containing modifications to them. 350 DeclUpdateMap DeclUpdates; 351 352 typedef llvm::DenseMap<Decl *, Decl *> FirstLatestDeclMap; 353 /// \brief Map of first declarations from a chained PCH that point to the 354 /// most recent declarations in another PCH. 355 FirstLatestDeclMap FirstLatestDecls; 356 357 /// \brief Declarations encountered that might be external 358 /// definitions. 359 /// 360 /// We keep track of external definitions and other 'interesting' declarations 361 /// as we are emitting declarations to the AST file. The AST file contains a 362 /// separate record for these declarations, which are provided to the AST 363 /// consumer by the AST reader. This is behavior is required to properly cope with, 364 /// e.g., tentative variable definitions that occur within 365 /// headers. The declarations themselves are stored as declaration 366 /// IDs, since they will be written out to an EAGERLY_DESERIALIZED_DECLS 367 /// record. 368 SmallVector<uint64_t, 16> EagerlyDeserializedDecls; 369 370 /// \brief DeclContexts that have received extensions since their serialized 371 /// form. 372 /// 373 /// For namespaces, when we're chaining and encountering a namespace, we check 374 /// if its primary namespace comes from the chain. If it does, we add the 375 /// primary to this set, so that we can write out lexical content updates for 376 /// it. 377 llvm::SmallSetVector<const DeclContext *, 16> UpdatedDeclContexts; 378 379 /// \brief Keeps track of visible decls that were added in DeclContexts 380 /// coming from another AST file. 381 SmallVector<const Decl *, 16> UpdatingVisibleDecls; 382 383 /// \brief The set of Objective-C class that have categories we 384 /// should serialize. 385 llvm::SetVector<ObjCInterfaceDecl *> ObjCClassesWithCategories; 386 387 /// \brief The set of declarations that may have redeclaration chains that 388 /// need to be serialized. 389 llvm::SmallVector<const Decl *, 16> Redeclarations; 390 391 /// \brief A cache of the first local declaration for "interesting" 392 /// redeclaration chains. 393 llvm::DenseMap<const Decl *, const Decl *> FirstLocalDeclCache; 394 395 /// \brief Mapping from SwitchCase statements to IDs. 396 llvm::DenseMap<SwitchCase *, unsigned> SwitchCaseIDs; 397 398 /// \brief The number of statements written to the AST file. 399 unsigned NumStatements; 400 401 /// \brief The number of macros written to the AST file. 402 unsigned NumMacros; 403 404 /// \brief The number of lexical declcontexts written to the AST 405 /// file. 406 unsigned NumLexicalDeclContexts; 407 408 /// \brief The number of visible declcontexts written to the AST 409 /// file. 410 unsigned NumVisibleDeclContexts; 411 412 /// \brief A mapping from each known submodule to its ID number, which will 413 /// be a positive integer. 414 llvm::DenseMap<Module *, unsigned> SubmoduleIDs; 415 416 /// \brief A list of the module file extension writers. 417 std::vector<std::unique_ptr<ModuleFileExtensionWriter>> 418 ModuleFileExtensionWriters; 419 420 /// \brief Retrieve or create a submodule ID for this module. 421 unsigned getSubmoduleID(Module *Mod); 422 423 /// \brief Write the given subexpression to the bitstream. 424 void WriteSubStmt(Stmt *S); 425 426 void WriteBlockInfoBlock(); 427 uint64_t WriteControlBlock(Preprocessor &PP, ASTContext &Context, 428 StringRef isysroot, const std::string &OutputFile); 429 void WriteInputFiles(SourceManager &SourceMgr, HeaderSearchOptions &HSOpts, 430 bool Modules); 431 void WriteSourceManagerBlock(SourceManager &SourceMgr, 432 const Preprocessor &PP); 433 void WritePreprocessor(const Preprocessor &PP, bool IsModule); 434 void WriteHeaderSearch(const HeaderSearch &HS); 435 void WritePreprocessorDetail(PreprocessingRecord &PPRec); 436 void WriteSubmodules(Module *WritingModule); 437 438 void WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, 439 bool isModule); 440 441 unsigned TypeExtQualAbbrev; 442 unsigned TypeFunctionProtoAbbrev; 443 void WriteTypeAbbrevs(); 444 void WriteType(QualType T); 445 446 bool isLookupResultExternal(StoredDeclsList &Result, DeclContext *DC); 447 bool isLookupResultEntirelyExternal(StoredDeclsList &Result, DeclContext *DC); 448 449 void GenerateNameLookupTable(const DeclContext *DC, 450 llvm::SmallVectorImpl<char> &LookupTable); 451 uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC); 452 uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC); 453 void WriteTypeDeclOffsets(); 454 void WriteFileDeclIDsMap(); 455 void WriteComments(); 456 void WriteSelectors(Sema &SemaRef); 457 void WriteReferencedSelectorsPool(Sema &SemaRef); 458 void WriteIdentifierTable(Preprocessor &PP, IdentifierResolver &IdResolver, 459 bool IsModule); 460 void WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord); 461 void WriteDeclContextVisibleUpdate(const DeclContext *DC); 462 void WriteFPPragmaOptions(const FPOptions &Opts); 463 void WriteOpenCLExtensions(Sema &SemaRef); 464 void WriteObjCCategories(); 465 void WriteLateParsedTemplates(Sema &SemaRef); 466 void WriteOptimizePragmaOptions(Sema &SemaRef); 467 void WriteMSStructPragmaOptions(Sema &SemaRef); 468 void WriteMSPointersToMembersPragmaOptions(Sema &SemaRef); 469 void WriteModuleFileExtension(Sema &SemaRef, 470 ModuleFileExtensionWriter &Writer); 471 472 unsigned DeclParmVarAbbrev; 473 unsigned DeclContextLexicalAbbrev; 474 unsigned DeclContextVisibleLookupAbbrev; 475 unsigned UpdateVisibleAbbrev; 476 unsigned DeclRecordAbbrev; 477 unsigned DeclTypedefAbbrev; 478 unsigned DeclVarAbbrev; 479 unsigned DeclFieldAbbrev; 480 unsigned DeclEnumAbbrev; 481 unsigned DeclObjCIvarAbbrev; 482 unsigned DeclCXXMethodAbbrev; 483 484 unsigned DeclRefExprAbbrev; 485 unsigned CharacterLiteralAbbrev; 486 unsigned IntegerLiteralAbbrev; 487 unsigned ExprImplicitCastAbbrev; 488 489 void WriteDeclAbbrevs(); 490 void WriteDecl(ASTContext &Context, Decl *D); 491 492 uint64_t WriteASTCore(Sema &SemaRef, 493 StringRef isysroot, const std::string &OutputFile, 494 Module *WritingModule); 495 496 public: 497 /// \brief Create a new precompiled header writer that outputs to 498 /// the given bitstream. 499 ASTWriter(llvm::BitstreamWriter &Stream, 500 ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 501 bool IncludeTimestamps = true); 502 ~ASTWriter() override; 503 504 const LangOptions &getLangOpts() const; 505 506 /// \brief Get a timestamp for output into the AST file. The actual timestamp 507 /// of the specified file may be ignored if we have been instructed to not 508 /// include timestamps in the output file. 509 time_t getTimestampForOutput(const FileEntry *E) const; 510 511 /// \brief Write a precompiled header for the given semantic analysis. 512 /// 513 /// \param SemaRef a reference to the semantic analysis object that processed 514 /// the AST to be written into the precompiled header. 515 /// 516 /// \param WritingModule The module that we are writing. If null, we are 517 /// writing a precompiled header. 518 /// 519 /// \param isysroot if non-empty, write a relocatable file whose headers 520 /// are relative to the given system root. If we're writing a module, its 521 /// build directory will be used in preference to this if both are available. 522 /// 523 /// \return the module signature, which eventually will be a hash of 524 /// the module but currently is merely a random 32-bit number. 525 uint64_t WriteAST(Sema &SemaRef, const std::string &OutputFile, 526 Module *WritingModule, StringRef isysroot, 527 bool hasErrors = false); 528 529 /// \brief Emit a token. 530 void AddToken(const Token &Tok, RecordDataImpl &Record); 531 532 /// \brief Emit a source location. 533 void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record); 534 535 /// \brief Emit a source range. 536 void AddSourceRange(SourceRange Range, RecordDataImpl &Record); 537 538 /// \brief Emit a reference to an identifier. 539 void AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record); 540 541 /// \brief Get the unique number used to refer to the given selector. 542 serialization::SelectorID getSelectorRef(Selector Sel); 543 544 /// \brief Get the unique number used to refer to the given identifier. 545 serialization::IdentID getIdentifierRef(const IdentifierInfo *II); 546 547 /// \brief Get the unique number used to refer to the given macro. 548 serialization::MacroID getMacroRef(MacroInfo *MI, const IdentifierInfo *Name); 549 550 /// \brief Determine the ID of an already-emitted macro. 551 serialization::MacroID getMacroID(MacroInfo *MI); 552 553 uint64_t getMacroDirectivesOffset(const IdentifierInfo *Name); 554 555 /// \brief Emit a reference to a type. 556 void AddTypeRef(QualType T, RecordDataImpl &Record); 557 558 /// \brief Force a type to be emitted and get its ID. 559 serialization::TypeID GetOrCreateTypeID(QualType T); 560 561 /// \brief Determine the type ID of an already-emitted type. 562 serialization::TypeID getTypeID(QualType T) const; 563 564 /// \brief Find the first local declaration of a given local redeclarable 565 /// decl. 566 const Decl *getFirstLocalDecl(const Decl *D); 567 568 /// \brief Is this a local declaration (that is, one that will be written to 569 /// our AST file)? This is the case for declarations that are neither imported 570 /// from another AST file nor predefined. IsLocalDecl(const Decl * D)571 bool IsLocalDecl(const Decl *D) { 572 if (D->isFromASTFile()) 573 return false; 574 auto I = DeclIDs.find(D); 575 return (I == DeclIDs.end() || 576 I->second >= serialization::NUM_PREDEF_DECL_IDS); 577 }; 578 579 /// \brief Emit a reference to a declaration. 580 void AddDeclRef(const Decl *D, RecordDataImpl &Record); 581 582 583 /// \brief Force a declaration to be emitted and get its ID. 584 serialization::DeclID GetDeclRef(const Decl *D); 585 586 /// \brief Determine the declaration ID of an already-emitted 587 /// declaration. 588 serialization::DeclID getDeclID(const Decl *D); 589 590 unsigned getAnonymousDeclarationNumber(const NamedDecl *D); 591 592 /// \brief Add a string to the given record. 593 void AddString(StringRef Str, RecordDataImpl &Record); 594 595 /// \brief Convert a path from this build process into one that is appropriate 596 /// for emission in the module file. 597 bool PreparePathForOutput(SmallVectorImpl<char> &Path); 598 599 /// \brief Add a path to the given record. 600 void AddPath(StringRef Path, RecordDataImpl &Record); 601 602 /// \brief Emit the current record with the given path as a blob. 603 void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, 604 StringRef Path); 605 606 /// \brief Add a version tuple to the given record 607 void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record); 608 609 /// \brief Infer the submodule ID that contains an entity at the given 610 /// source location. 611 serialization::SubmoduleID inferSubmoduleIDFromLocation(SourceLocation Loc); 612 613 /// \brief Retrieve or create a submodule ID for this module, or return 0 if 614 /// the submodule is neither local (a submodle of the currently-written module) 615 /// nor from an imported module. 616 unsigned getLocalOrImportedSubmoduleID(Module *Mod); 617 618 /// \brief Note that the identifier II occurs at the given offset 619 /// within the identifier table. 620 void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset); 621 622 /// \brief Note that the selector Sel occurs at the given offset 623 /// within the method pool/selector table. 624 void SetSelectorOffset(Selector Sel, uint32_t Offset); 625 626 /// \brief Record an ID for the given switch-case statement. 627 unsigned RecordSwitchCaseID(SwitchCase *S); 628 629 /// \brief Retrieve the ID for the given switch-case statement. 630 unsigned getSwitchCaseID(SwitchCase *S); 631 632 void ClearSwitchCaseIDs(); 633 getTypeExtQualAbbrev()634 unsigned getTypeExtQualAbbrev() const { 635 return TypeExtQualAbbrev; 636 } getTypeFunctionProtoAbbrev()637 unsigned getTypeFunctionProtoAbbrev() const { 638 return TypeFunctionProtoAbbrev; 639 } 640 getDeclParmVarAbbrev()641 unsigned getDeclParmVarAbbrev() const { return DeclParmVarAbbrev; } getDeclRecordAbbrev()642 unsigned getDeclRecordAbbrev() const { return DeclRecordAbbrev; } getDeclTypedefAbbrev()643 unsigned getDeclTypedefAbbrev() const { return DeclTypedefAbbrev; } getDeclVarAbbrev()644 unsigned getDeclVarAbbrev() const { return DeclVarAbbrev; } getDeclFieldAbbrev()645 unsigned getDeclFieldAbbrev() const { return DeclFieldAbbrev; } getDeclEnumAbbrev()646 unsigned getDeclEnumAbbrev() const { return DeclEnumAbbrev; } getDeclObjCIvarAbbrev()647 unsigned getDeclObjCIvarAbbrev() const { return DeclObjCIvarAbbrev; } getDeclCXXMethodAbbrev()648 unsigned getDeclCXXMethodAbbrev() const { return DeclCXXMethodAbbrev; } 649 getDeclRefExprAbbrev()650 unsigned getDeclRefExprAbbrev() const { return DeclRefExprAbbrev; } getCharacterLiteralAbbrev()651 unsigned getCharacterLiteralAbbrev() const { return CharacterLiteralAbbrev; } getIntegerLiteralAbbrev()652 unsigned getIntegerLiteralAbbrev() const { return IntegerLiteralAbbrev; } getExprImplicitCastAbbrev()653 unsigned getExprImplicitCastAbbrev() const { return ExprImplicitCastAbbrev; } 654 hasChain()655 bool hasChain() const { return Chain; } getChain()656 ASTReader *getChain() const { return Chain; } 657 658 private: 659 // ASTDeserializationListener implementation 660 void ReaderInitialized(ASTReader *Reader) override; 661 void IdentifierRead(serialization::IdentID ID, IdentifierInfo *II) override; 662 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override; 663 void TypeRead(serialization::TypeIdx Idx, QualType T) override; 664 void SelectorRead(serialization::SelectorID ID, Selector Sel) override; 665 void MacroDefinitionRead(serialization::PreprocessedEntityID ID, 666 MacroDefinitionRecord *MD) override; 667 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override; 668 669 // ASTMutationListener implementation. 670 void CompletedTagDefinition(const TagDecl *D) override; 671 void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override; 672 void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override; 673 void ResolvedExceptionSpec(const FunctionDecl *FD) override; 674 void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override; 675 void ResolvedOperatorDelete(const CXXDestructorDecl *DD, 676 const FunctionDecl *Delete) override; 677 void CompletedImplicitDefinition(const FunctionDecl *D) override; 678 void StaticDataMemberInstantiated(const VarDecl *D) override; 679 void DefaultArgumentInstantiated(const ParmVarDecl *D) override; 680 void FunctionDefinitionInstantiated(const FunctionDecl *D) override; 681 void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 682 const ObjCInterfaceDecl *IFD) override; 683 void DeclarationMarkedUsed(const Decl *D) override; 684 void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override; 685 void DeclarationMarkedOpenMPDeclareTarget(const Decl *D, 686 const Attr *Attr) override; 687 void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override; 688 void AddedAttributeToRecord(const Attr *Attr, 689 const RecordDecl *Record) override; 690 }; 691 692 /// \brief An object for streaming information to a record. 693 class ASTRecordWriter { 694 ASTWriter *Writer; 695 ASTWriter::RecordDataImpl *Record; 696 697 /// \brief Statements that we've encountered while serializing a 698 /// declaration or type. 699 SmallVector<Stmt *, 16> StmtsToEmit; 700 701 /// \brief Indices of record elements that describe offsets within the 702 /// bitcode. These will be converted to offsets relative to the current 703 /// record when emitted. 704 SmallVector<unsigned, 8> OffsetIndices; 705 706 /// \brief Flush all of the statements and expressions that have 707 /// been added to the queue via AddStmt(). 708 void FlushStmts(); 709 void FlushSubStmts(); 710 PrepareToEmit(uint64_t MyOffset)711 void PrepareToEmit(uint64_t MyOffset) { 712 // Convert offsets into relative form. 713 for (unsigned I : OffsetIndices) { 714 auto &StoredOffset = (*Record)[I]; 715 assert(StoredOffset < MyOffset && "invalid offset"); 716 if (StoredOffset) 717 StoredOffset = MyOffset - StoredOffset; 718 } 719 OffsetIndices.clear(); 720 } 721 722 public: 723 /// Construct a ASTRecordWriter that uses the default encoding scheme. ASTRecordWriter(ASTWriter & Writer,ASTWriter::RecordDataImpl & Record)724 ASTRecordWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record) 725 : Writer(&Writer), Record(&Record) {} 726 727 /// Construct a ASTRecordWriter that uses the same encoding scheme as another 728 /// ASTRecordWriter. ASTRecordWriter(ASTRecordWriter & Parent,ASTWriter::RecordDataImpl & Record)729 ASTRecordWriter(ASTRecordWriter &Parent, ASTWriter::RecordDataImpl &Record) 730 : Writer(Parent.Writer), Record(&Record) {} 731 732 /// Copying an ASTRecordWriter is almost certainly a bug. 733 ASTRecordWriter(const ASTRecordWriter&) = delete; 734 void operator=(const ASTRecordWriter&) = delete; 735 736 /// \brief Extract the underlying record storage. getRecordData()737 ASTWriter::RecordDataImpl &getRecordData() const { return *Record; } 738 739 /// \brief Minimal vector-like interface. 740 /// @{ push_back(uint64_t N)741 void push_back(uint64_t N) { Record->push_back(N); } 742 template<typename InputIterator> append(InputIterator begin,InputIterator end)743 void append(InputIterator begin, InputIterator end) { 744 Record->append(begin, end); 745 } empty()746 bool empty() const { return Record->empty(); } size()747 size_t size() const { return Record->size(); } 748 uint64_t &operator[](size_t N) { return (*Record)[N]; } 749 /// @} 750 751 /// \brief Emit the record to the stream, followed by its substatements, and 752 /// return its offset. 753 // FIXME: Allow record producers to suggest Abbrevs. 754 uint64_t Emit(unsigned Code, unsigned Abbrev = 0) { 755 uint64_t Offset = Writer->Stream.GetCurrentBitNo(); 756 PrepareToEmit(Offset); 757 Writer->Stream.EmitRecord(Code, *Record, Abbrev); 758 FlushStmts(); 759 return Offset; 760 } 761 762 /// \brief Emit the record to the stream, preceded by its substatements. 763 uint64_t EmitStmt(unsigned Code, unsigned Abbrev = 0) { 764 FlushSubStmts(); 765 PrepareToEmit(Writer->Stream.GetCurrentBitNo()); 766 Writer->Stream.EmitRecord(Code, *Record, Abbrev); 767 return Writer->Stream.GetCurrentBitNo(); 768 } 769 770 /// \brief Add a bit offset into the record. This will be converted into an 771 /// offset relative to the current record when emitted. AddOffset(uint64_t BitOffset)772 void AddOffset(uint64_t BitOffset) { 773 OffsetIndices.push_back(Record->size()); 774 Record->push_back(BitOffset); 775 } 776 777 /// \brief Add the given statement or expression to the queue of 778 /// statements to emit. 779 /// 780 /// This routine should be used when emitting types and declarations 781 /// that have expressions as part of their formulation. Once the 782 /// type or declaration has been written, Emit() will write 783 /// the corresponding statements just after the record. AddStmt(Stmt * S)784 void AddStmt(Stmt *S) { 785 StmtsToEmit.push_back(S); 786 } 787 788 /// \brief Add a definition for the given function to the queue of statements 789 /// to emit. 790 void AddFunctionDefinition(const FunctionDecl *FD); 791 792 /// \brief Emit a source location. AddSourceLocation(SourceLocation Loc)793 void AddSourceLocation(SourceLocation Loc) { 794 return Writer->AddSourceLocation(Loc, *Record); 795 } 796 797 /// \brief Emit a source range. AddSourceRange(SourceRange Range)798 void AddSourceRange(SourceRange Range) { 799 return Writer->AddSourceRange(Range, *Record); 800 } 801 802 /// \brief Emit an integral value. 803 void AddAPInt(const llvm::APInt &Value); 804 805 /// \brief Emit a signed integral value. 806 void AddAPSInt(const llvm::APSInt &Value); 807 808 /// \brief Emit a floating-point value. 809 void AddAPFloat(const llvm::APFloat &Value); 810 811 /// \brief Emit a reference to an identifier. AddIdentifierRef(const IdentifierInfo * II)812 void AddIdentifierRef(const IdentifierInfo *II) { 813 return Writer->AddIdentifierRef(II, *Record); 814 } 815 816 /// \brief Emit a Selector (which is a smart pointer reference). 817 void AddSelectorRef(Selector S); 818 819 /// \brief Emit a CXXTemporary. 820 void AddCXXTemporary(const CXXTemporary *Temp); 821 822 /// \brief Emit a C++ base specifier. 823 void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base); 824 825 /// \brief Emit a set of C++ base specifiers. 826 void AddCXXBaseSpecifiers(ArrayRef<CXXBaseSpecifier> Bases); 827 828 /// \brief Emit a reference to a type. AddTypeRef(QualType T)829 void AddTypeRef(QualType T) { 830 return Writer->AddTypeRef(T, *Record); 831 } 832 833 /// \brief Emits a reference to a declarator info. 834 void AddTypeSourceInfo(TypeSourceInfo *TInfo); 835 836 /// \brief Emits a type with source-location information. 837 void AddTypeLoc(TypeLoc TL); 838 839 /// \brief Emits a template argument location info. 840 void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, 841 const TemplateArgumentLocInfo &Arg); 842 843 /// \brief Emits a template argument location. 844 void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg); 845 846 /// \brief Emits an AST template argument list info. 847 void AddASTTemplateArgumentListInfo( 848 const ASTTemplateArgumentListInfo *ASTTemplArgList); 849 850 /// \brief Emit a reference to a declaration. AddDeclRef(const Decl * D)851 void AddDeclRef(const Decl *D) { 852 return Writer->AddDeclRef(D, *Record); 853 } 854 855 /// \brief Emit a declaration name. 856 void AddDeclarationName(DeclarationName Name); 857 858 void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, 859 DeclarationName Name); 860 void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 861 862 void AddQualifierInfo(const QualifierInfo &Info); 863 864 /// \brief Emit a nested name specifier. 865 void AddNestedNameSpecifier(NestedNameSpecifier *NNS); 866 867 /// \brief Emit a nested name specifier with source-location information. 868 void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS); 869 870 /// \brief Emit a template name. 871 void AddTemplateName(TemplateName Name); 872 873 /// \brief Emit a template argument. 874 void AddTemplateArgument(const TemplateArgument &Arg); 875 876 /// \brief Emit a template parameter list. 877 void AddTemplateParameterList(const TemplateParameterList *TemplateParams); 878 879 /// \brief Emit a template argument list. 880 void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs); 881 882 /// \brief Emit a UnresolvedSet structure. 883 void AddUnresolvedSet(const ASTUnresolvedSet &Set); 884 885 /// \brief Emit a CXXCtorInitializer array. 886 void AddCXXCtorInitializers(ArrayRef<CXXCtorInitializer*> CtorInits); 887 888 void AddCXXDefinitionData(const CXXRecordDecl *D); 889 890 /// \brief Emit a string. AddString(StringRef Str)891 void AddString(StringRef Str) { 892 return Writer->AddString(Str, *Record); 893 } 894 895 /// \brief Emit a path. AddPath(StringRef Path)896 void AddPath(StringRef Path) { 897 return Writer->AddPath(Path, *Record); 898 } 899 900 /// \brief Emit a version tuple. AddVersionTuple(const VersionTuple & Version)901 void AddVersionTuple(const VersionTuple &Version) { 902 return Writer->AddVersionTuple(Version, *Record); 903 } 904 905 /// \brief Emit a list of attributes. 906 void AddAttributes(ArrayRef<const Attr*> Attrs); 907 }; 908 909 /// \brief AST and semantic-analysis consumer that generates a 910 /// precompiled header from the parsed source code. 911 class PCHGenerator : public SemaConsumer { 912 const Preprocessor &PP; 913 std::string OutputFile; 914 clang::Module *Module; 915 std::string isysroot; 916 Sema *SemaPtr; 917 std::shared_ptr<PCHBuffer> Buffer; 918 llvm::BitstreamWriter Stream; 919 ASTWriter Writer; 920 bool AllowASTWithErrors; 921 922 protected: getWriter()923 ASTWriter &getWriter() { return Writer; } getWriter()924 const ASTWriter &getWriter() const { return Writer; } getPCH()925 SmallVectorImpl<char> &getPCH() const { return Buffer->Data; } 926 927 public: 928 PCHGenerator( 929 const Preprocessor &PP, StringRef OutputFile, 930 clang::Module *Module, StringRef isysroot, 931 std::shared_ptr<PCHBuffer> Buffer, 932 ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 933 bool AllowASTWithErrors = false, 934 bool IncludeTimestamps = true); 935 ~PCHGenerator() override; InitializeSema(Sema & S)936 void InitializeSema(Sema &S) override { SemaPtr = &S; } 937 void HandleTranslationUnit(ASTContext &Ctx) override; 938 ASTMutationListener *GetASTMutationListener() override; 939 ASTDeserializationListener *GetASTDeserializationListener() override; hasEmittedPCH()940 bool hasEmittedPCH() const { return Buffer->IsComplete; } 941 }; 942 943 } // end namespace clang 944 945 #endif 946