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