-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][serialization] Pass ASTContext
explicitly
#115235
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang][serialization] Pass ASTContext
explicitly
#115235
Conversation
@llvm/pr-subscribers-clang Author: Jan Svoboda (jansvoboda11) ChangesThis patch removes 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:
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]
|
@llvm/pr-subscribers-clang-modules Author: Jan Svoboda (jansvoboda11) ChangesThis patch removes 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:
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]
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
To clarify, the main reason for this patch is that I find passing a reference much less error-prone than having an omnipresent pointer that will only be null during dependency scanning. |
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. (cherry picked from commit 53e49f1)
… only (llvm#115237) This PR builds on top of llvm#115235 and makes it possible to call `ASTWriter::WriteAST()` with `Preprocessor` only instead of full `Sema` object. So far, there are no clients that leverage the new capability - that will come in a follow-up commit. (cherry picked from commit a2f9d1d)
This patch builds on top of llvm#115237 and llvm#115235, only passing the `Preprocessor` object to `ASTWriter`. This reduces the size of scanning PCM files by 1/3 and speeds up scans by 16%. (cherry picked from commit 25d1ac1)
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.
… only (llvm#115237) This PR builds on top of llvm#115235 and makes it possible to call `ASTWriter::WriteAST()` with `Preprocessor` only instead of full `Sema` object. So far, there are no clients that leverage the new capability - that will come in a follow-up commit.
This patch builds on top of llvm#115237 and llvm#115235, only passing the `Preprocessor` object to `ASTWriter`. This reduces the size of scanning PCM files by 1/3 and speeds up scans by 16%.
This patch removes
ASTWriter::Context
and starts passingASTContext &
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 noASTContext
at all.