llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Jan Svoboda (jansvoboda11) <details> <summary>Changes</summary> This patch removes `ASTWriter::Context` and starts passing `ASTContext &` explicitly to functions that actually need it. This is a non-functional change with the end-goal of being able to write lightweight PCM files with no `ASTContext` at all. --- Patch is 31.71 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/115235.diff 5 Files Affected: - (modified) clang/include/clang/Serialization/ASTRecordWriter.h (+4-3) - (modified) clang/include/clang/Serialization/ASTWriter.h (+11-17) - (modified) clang/lib/Serialization/ASTWriter.cpp (+57-61) - (modified) clang/lib/Serialization/ASTWriterDecl.cpp (+30-25) - (modified) clang/lib/Serialization/ASTWriterStmt.cpp (+8-7) ``````````diff diff --git a/clang/include/clang/Serialization/ASTRecordWriter.h b/clang/include/clang/Serialization/ASTRecordWriter.h index d6090ba1a6c690..67720a0aebc1ca 100644 --- a/clang/include/clang/Serialization/ASTRecordWriter.h +++ b/clang/include/clang/Serialization/ASTRecordWriter.h @@ -60,8 +60,9 @@ class ASTRecordWriter public: /// Construct a ASTRecordWriter that uses the default encoding scheme. - ASTRecordWriter(ASTWriter &W, ASTWriter::RecordDataImpl &Record) - : DataStreamBasicWriter(W.getASTContext()), Writer(&W), Record(&Record) {} + ASTRecordWriter(ASTContext &Context, ASTWriter &W, + ASTWriter::RecordDataImpl &Record) + : DataStreamBasicWriter(Context), Writer(&W), Record(&Record) {} /// Construct a ASTRecordWriter that uses the same encoding scheme as another /// ASTRecordWriter. @@ -208,7 +209,7 @@ class ASTRecordWriter /// Emit a reference to a type. void AddTypeRef(QualType T) { - return Writer->AddTypeRef(T, *Record); + return Writer->AddTypeRef(getASTContext(), T, *Record); } void writeQualType(QualType T) { AddTypeRef(T); diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index d0e841f367c1e0..dc9fcd3c33726e 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -119,9 +119,6 @@ class ASTWriter : public ASTDeserializationListener, /// The PCM manager which manages memory buffers for pcm files. InMemoryModuleCache &ModuleCache; - /// The ASTContext we're writing. - ASTContext *Context = nullptr; - /// The preprocessor we're writing. Preprocessor *PP = nullptr; @@ -545,7 +542,7 @@ class ASTWriter : public ASTDeserializationListener, unsigned getSubmoduleID(Module *Mod); /// Write the given subexpression to the bitstream. - void WriteSubStmt(Stmt *S); + void WriteSubStmt(ASTContext &Context, Stmt *S); void WriteBlockInfoBlock(); void WriteControlBlock(Preprocessor &PP, StringRef isysroot); @@ -564,25 +561,25 @@ class ASTWriter : public ASTDeserializationListener, void WriteHeaderSearch(const HeaderSearch &HS); void WritePreprocessorDetail(PreprocessingRecord &PPRec, uint64_t MacroOffsetsBase); - void WriteSubmodules(Module *WritingModule); + void WriteSubmodules(Module *WritingModule, ASTContext &Context); void WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, bool isModule); unsigned TypeExtQualAbbrev = 0; void WriteTypeAbbrevs(); - void WriteType(QualType T); + void WriteType(ASTContext &Context, QualType T); bool isLookupResultExternal(StoredDeclsList &Result, DeclContext *DC); - void GenerateNameLookupTable(const DeclContext *DC, + void GenerateNameLookupTable(ASTContext &Context, const DeclContext *DC, llvm::SmallVectorImpl<char> &LookupTable); uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, const DeclContext *DC); uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC); void WriteTypeDeclOffsets(); void WriteFileDeclIDsMap(); - void WriteComments(); + void WriteComments(ASTContext &Context); void WriteSelectors(Sema &SemaRef); void WriteReferencedSelectorsPool(Sema &SemaRef); void WriteIdentifierTable(Preprocessor &PP, IdentifierResolver &IdResolver, @@ -590,8 +587,10 @@ class ASTWriter : public ASTDeserializationListener, void WriteDeclAndTypes(ASTContext &Context); void PrepareWritingSpecialDecls(Sema &SemaRef); void WriteSpecialDeclRecords(Sema &SemaRef); - void WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord); - void WriteDeclContextVisibleUpdate(const DeclContext *DC); + void WriteDeclUpdatesBlocks(ASTContext &Context, + RecordDataImpl &OffsetsRecord); + void WriteDeclContextVisibleUpdate(ASTContext &Context, + const DeclContext *DC); void WriteFPPragmaOptions(const FPOptionsOverride &Opts); void WriteOpenCLExtensions(Sema &SemaRef); void WriteCUDAPragmas(Sema &SemaRef); @@ -653,11 +652,6 @@ class ASTWriter : public ASTDeserializationListener, bool GeneratingReducedBMI = false); ~ASTWriter() override; - ASTContext &getASTContext() const { - assert(Context && "requested AST context when not writing AST"); - return *Context; - } - const LangOptions &getLangOpts() const; /// Get a timestamp for output into the AST file. The actual timestamp @@ -723,10 +717,10 @@ class ASTWriter : public ASTDeserializationListener, uint32_t getMacroDirectivesOffset(const IdentifierInfo *Name); /// Emit a reference to a type. - void AddTypeRef(QualType T, RecordDataImpl &Record); + void AddTypeRef(ASTContext &Context, QualType T, RecordDataImpl &Record); /// Force a type to be emitted and get its ID. - serialization::TypeID GetOrCreateTypeID(QualType T); + serialization::TypeID GetOrCreateTypeID(ASTContext &Context, QualType T); /// Find the first local declaration of a given local redeclarable /// decl. diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index b95e29cbc02515..d1af80b3243ba9 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -277,8 +277,8 @@ class ASTTypeWriter { ASTRecordWriter BasicWriter; public: - ASTTypeWriter(ASTWriter &Writer) - : Writer(Writer), BasicWriter(Writer, Record) {} + ASTTypeWriter(ASTContext &Context, ASTWriter &Writer) + : Writer(Writer), BasicWriter(Context, Writer, Record) {} uint64_t write(QualType T) { if (T.hasLocalNonFastQualifiers()) { @@ -2872,7 +2872,7 @@ static unsigned getNumberOfModules(Module *Mod) { return ChildModules + 1; } -void ASTWriter::WriteSubmodules(Module *WritingModule) { +void ASTWriter::WriteSubmodules(Module *WritingModule, ASTContext &Context) { // Enter the submodule description block. Stream.EnterSubblock(SUBMODULE_BLOCK_ID, /*bits for abbreviations*/5); @@ -3124,7 +3124,7 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { // Emit the reachable initializers. // The initializer may only be unreachable in reduced BMI. RecordData Inits; - for (Decl *D : Context->getModuleInitializers(Mod)) + for (Decl *D : Context.getModuleInitializers(Mod)) if (wasDeclEmitted(D)) AddDeclRef(D, Inits); if (!Inits.empty()) @@ -3259,7 +3259,7 @@ void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, //===----------------------------------------------------------------------===// /// Write the representation of a type to the AST stream. -void ASTWriter::WriteType(QualType T) { +void ASTWriter::WriteType(ASTContext &Context, QualType T) { TypeIdx &IdxRef = TypeIdxs[T]; if (IdxRef.getValue() == 0) // we haven't seen this type before. IdxRef = TypeIdx(0, NextTypeID++); @@ -3269,7 +3269,8 @@ void ASTWriter::WriteType(QualType T) { assert(Idx.getValue() >= FirstTypeID && "Writing predefined type"); // Emit the type's representation. - uint64_t Offset = ASTTypeWriter(*this).write(T) - DeclTypesBlockStartOffset; + uint64_t Offset = + ASTTypeWriter(Context, *this).write(T) - DeclTypesBlockStartOffset; // Record the offset for this type. uint64_t Index = Idx.getValue() - FirstTypeID; @@ -3393,7 +3394,7 @@ void ASTWriter::WriteFileDeclIDsMap() { Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs)); } -void ASTWriter::WriteComments() { +void ASTWriter::WriteComments(ASTContext &Context) { Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3); auto _ = llvm::make_scope_exit([this] { Stream.ExitBlock(); }); if (!PP->getPreprocessorOpts().WriteCommentListToPCH) @@ -3406,7 +3407,7 @@ void ASTWriter::WriteComments() { return; RecordData Record; - for (const auto &FO : Context->Comments.OrderedComments) { + for (const auto &FO : Context.Comments.OrderedComments) { for (const auto &OC : FO.second) { const RawComment *I = OC.second; Record.clear(); @@ -3656,7 +3657,7 @@ void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) { return; RecordData Record; - ASTRecordWriter Writer(*this, Record); + ASTRecordWriter Writer(SemaRef.Context, *this, Record); // Note: this writes out all references even for a dependent AST. But it is // very tricky to fix, and given that @selector shouldn't really appear in @@ -4137,9 +4138,9 @@ static bool isLookupResultNotInteresting(ASTWriter &Writer, return true; } -void -ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC, - llvm::SmallVectorImpl<char> &LookupTable) { +void ASTWriter::GenerateNameLookupTable( + ASTContext &Context, const DeclContext *ConstDC, + llvm::SmallVectorImpl<char> &LookupTable) { assert(!ConstDC->hasLazyLocalLexicalLookups() && !ConstDC->hasLazyExternalLexicalLookups() && "must call buildLookups first"); @@ -4234,8 +4235,8 @@ ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC, // another declaration in the redecl chain. Any non-implicit constructor or // conversion function which doesn't occur in all the lexical contexts // would be an ODR violation. - auto ImplicitCtorName = Context->DeclarationNames.getCXXConstructorName( - Context->getCanonicalType(Context->getRecordType(D))); + auto ImplicitCtorName = Context.DeclarationNames.getCXXConstructorName( + Context.getCanonicalType(Context.getRecordType(D))); if (ConstructorNameSet.erase(ImplicitCtorName)) Names.push_back(ImplicitCtorName); @@ -4415,7 +4416,7 @@ uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, // Create the on-disk hash table in a buffer. SmallString<4096> LookupTable; - GenerateNameLookupTable(DC, LookupTable); + GenerateNameLookupTable(Context, DC, LookupTable); // Write the lookup table RecordData::value_type Record[] = {DECL_CONTEXT_VISIBLE}; @@ -4431,14 +4432,15 @@ uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, /// DeclContext in a dependent AST file. As such, they only exist for the TU /// (in C++), for namespaces, and for classes with forward-declared unscoped /// enumeration members (in C++11). -void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { +void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context, + const DeclContext *DC) { StoredDeclsMap *Map = DC->getLookupPtr(); if (!Map || Map->empty()) return; // Create the on-disk hash table in a buffer. SmallString<4096> LookupTable; - GenerateNameLookupTable(DC, LookupTable); + GenerateNameLookupTable(Context, DC, LookupTable); // If we're updating a namespace, select a key declaration as the key for the // update record; those are the only ones that will be checked on reload. @@ -4753,15 +4755,12 @@ void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) { } bool ASTWriter::PreparePathForOutput(SmallVectorImpl<char> &Path) { - assert(Context && "should have context when outputting path"); - // Leave special file names as they are. StringRef PathStr(Path.data(), Path.size()); if (PathStr == "<built-in>" || PathStr == "<command line>") return false; - bool Changed = - cleanPathForOutput(Context->getSourceManager().getFileManager(), Path); + bool Changed = cleanPathForOutput(PP->getFileManager(), Path); // Remove a prefix to make the path relative, if relevant. const char *PathBegin = Path.data(); @@ -4850,7 +4849,7 @@ ASTWriter::~ASTWriter() = default; const LangOptions &ASTWriter::getLangOpts() const { assert(WritingAST && "can't determine lang opts when not writing AST"); - return Context->getLangOpts(); + return PP->getLangOpts(); } time_t ASTWriter::getTimestampForOutput(const FileEntry *E) const { @@ -4874,11 +4873,9 @@ ASTFileSignature ASTWriter::WriteAST(Sema &SemaRef, StringRef OutputFile, WriteBlockInfoBlock(); - Context = &SemaRef.Context; PP = &SemaRef.PP; this->WritingModule = WritingModule; ASTFileSignature Signature = WriteASTCore(SemaRef, isysroot, WritingModule); - Context = nullptr; PP = nullptr; this->WritingModule = nullptr; this->BaseDirectory.clear(); @@ -5417,14 +5414,14 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot, // Form the record of special types. RecordData SpecialTypes; - AddTypeRef(Context.getRawCFConstantStringType(), SpecialTypes); - AddTypeRef(Context.getFILEType(), SpecialTypes); - AddTypeRef(Context.getjmp_bufType(), SpecialTypes); - AddTypeRef(Context.getsigjmp_bufType(), SpecialTypes); - AddTypeRef(Context.ObjCIdRedefinitionType, SpecialTypes); - AddTypeRef(Context.ObjCClassRedefinitionType, SpecialTypes); - AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes); - AddTypeRef(Context.getucontext_tType(), SpecialTypes); + AddTypeRef(Context, Context.getRawCFConstantStringType(), SpecialTypes); + AddTypeRef(Context, Context.getFILEType(), SpecialTypes); + AddTypeRef(Context, Context.getjmp_bufType(), SpecialTypes); + AddTypeRef(Context, Context.getsigjmp_bufType(), SpecialTypes); + AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes); + AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes); + AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes); + AddTypeRef(Context, Context.getucontext_tType(), SpecialTypes); PrepareWritingSpecialDecls(SemaRef); @@ -5523,7 +5520,7 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot, WriteFileDeclIDsMap(); WriteSourceManagerBlock(PP.getSourceManager()); - WriteComments(); + WriteComments(Context); WritePreprocessor(PP, isModule); WriteHeaderSearch(PP.getHeaderSearchInfo()); WriteSelectors(SemaRef); @@ -5536,7 +5533,7 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot, // If we're emitting a module, write out the submodule information. if (WritingModule) - WriteSubmodules(WritingModule); + WriteSubmodules(WritingModule, SemaRef.Context); Stream.EmitRecord(SPECIAL_TYPES, SpecialTypes); @@ -5656,12 +5653,12 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { WriteTypeAbbrevs(); WriteDeclAbbrevs(); do { - WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord); + WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord); while (!DeclTypesToEmit.empty()) { DeclOrType DOT = DeclTypesToEmit.front(); DeclTypesToEmit.pop(); if (DOT.isType()) - WriteType(DOT.getType()); + WriteType(Context, DOT.getType()); else WriteDecl(Context, DOT.getDecl()); } @@ -5757,18 +5754,19 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv)); // And a visible updates block for the translation unit. - WriteDeclContextVisibleUpdate(TU); + WriteDeclContextVisibleUpdate(Context, TU); // If we have any extern "C" names, write out a visible update for them. if (Context.ExternCContext) - WriteDeclContextVisibleUpdate(Context.ExternCContext); + WriteDeclContextVisibleUpdate(Context, Context.ExternCContext); // Write the visible updates to DeclContexts. for (auto *DC : UpdatedDeclContexts) - WriteDeclContextVisibleUpdate(DC); + WriteDeclContextVisibleUpdate(Context, DC); } -void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { +void ASTWriter::WriteDeclUpdatesBlocks(ASTContext &Context, + RecordDataImpl &OffsetsRecord) { if (DeclUpdates.empty()) return; @@ -5781,7 +5779,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { bool HasUpdatedBody = false; bool HasAddedVarDefinition = false; RecordData RecordData; - ASTRecordWriter Record(*this, RecordData); + ASTRecordWriter Record(Context, *this, RecordData); for (auto &Update : DeclUpdate.second) { DeclUpdateKind Kind = (DeclUpdateKind)Update.getKind(); @@ -5827,7 +5825,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { Record.push_back(RD->isParamDestroyedInCallee()); Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions())); Record.AddCXXDefinitionData(RD); - Record.AddOffset(WriteDeclContextLexicalBlock(*Context, RD)); + Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD)); // This state is sometimes updated by template instantiation, when we // switch from the specialization referring to the template declaration @@ -5880,7 +5878,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { } case UPD_CXX_DEDUCED_RETURN_TYPE: - Record.push_back(GetOrCreateTypeID(Update.getType())); + Record.push_back(GetOrCreateTypeID(Context, Update.getType())); break; case UPD_DECL_MARKED_USED: @@ -6022,8 +6020,7 @@ ASTWriter::getRawSourceLocationEncoding(SourceLocation Loc, LocSeq *Seq) { unsigned ModuleFileIndex = 0; // See SourceLocationEncoding.h for the encoding details. - if (Context->getSourceManager().isLoadedSourceLocation(Loc) && - Loc.isValid()) { + if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.isValid()) { assert(getChain()); auto SLocMapI = getChain()->GlobalSLocOffsetMap.find( SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); @@ -6184,8 +6181,9 @@ void ASTRecordWriter::AddTypeLoc(TypeLoc TL, LocSeq *OuterSeq) { TLW.Visit(TL); } -void ASTWriter::AddTypeRef(QualType T, RecordDataImpl &Record) { - Record.push_back(GetOrCreateTypeID(T)); +void ASTWriter::AddTypeRef(ASTContext &Context, QualType T, + RecordDataImpl &Record) { + Record.push_back(GetOrCreateTypeID(Context, T)); } template <typename IdxForTypeTy> @@ -6213,9 +6211,8 @@ static TypeID MakeTypeID(ASTContext &Context, QualType T, return IdxForType(T).asTypeID(FastQuals); } -TypeID ASTWriter::GetOrCreateTypeID(QualType T) { - assert(Context); - return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx { +TypeID ASTWriter::GetOrCreateTypeID(ASTContext &Context, QualType T) { + return MakeTypeID(Context, T, [&](QualType T) -> TypeIdx { if (T.isNull()) return TypeIdx(); assert(!T.getLocalFastQualifiers()); @@ -6335,7 +6332,7 @@ void ASTWriter::associateDeclWithFile(const Decl *D, LocalDeclID ID) { if (isa<ParmVarDecl, TemplateTemplateParmDecl>(D)) return; - SourceManager &SM = Context->getSourceManager(); + SourceManager &SM = PP->getSourceManager(); SourceLocation FileLoc = SM.getFileLoc(Loc); assert(SM.isLocalSourceLocation(FileLoc)); FileID FID; @@ -6530,10 +6527,10 @@ void ASTRecordWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base) { : SourceLocation()); } -static uint64_t EmitCXXBaseSpecifiers(ASTWriter &W, +static uint64_t EmitCXXBaseSpecifiers(ASTContext &Context, ASTWriter &W, ArrayRef<CXXBaseSpecifier> Bases) { ASTWriter::RecordData Record; - ASTRecordWriter Writer(W, Record); + ASTRecordWriter Writer(Context, W, Record); Writer.push_back(Bases.size()); for (auto &Base : Bases) @@ -6544,14 +6541,14 @@ static uint64_t EmitCXXBaseSpecifiers(ASTWriter &W, // FIXME: Move this out of the main ASTRecordWriter interface. void ASTRecordWriter::AddCXXBaseSpecifiers(ArrayRef<CXXBaseSpecifier> Bases) { - AddOffset(EmitCXXBaseSpecifiers(*Writer, Bases)); + AddOffset(EmitCXXBaseSpecifiers(getASTContext(), *Writer, Bases)); } static uint64_t -EmitCXXCtorInitializers(ASTWriter &W, +EmitCXXCtorInitializers(ASTContext &Context, ASTWriter &W, ArrayRef<CXXCtorInitializer *> CtorInits) { ASTWriter::RecordData Record; - ASTRecordWriter Writer(W, Record); + ASTRecordWriter Writer(Context, W, Record); Writer.push_back(CtorInits.size()); for (auto *Init : CtorInits) { @@ -6585,7 +6582,7 @@ EmitCXXCtorInitializers(ASTWriter &W, // FIXME: Move this out of the main ASTRecordWriter interface. void ASTRecordWriter::AddCXXCtorInitialize... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/115235 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits