[clang][AST] Improve AST Reader/Writer memory footprint

Reduce memory footprint of AST Reader/Writer:
1. Adjust internal data containers' element type.
2. Switch to set for deduplication of deferred diags.

Differential Revision: https://reviews.llvm.org/D101793
This commit is contained in:
Wei Wang 2021-05-03 15:43:39 -07:00
parent e84a9b9bb3
commit e6b8320c0a
9 changed files with 33 additions and 37 deletions

View File

@ -199,8 +199,8 @@ public:
/// and variable decls which may cause deferred diags. Note that this routine
/// may be invoked multiple times; the external source should take care not to
/// introduce the same declarations repeatedly.
virtual void ReadDeclsToCheckForDeferredDiags(
llvm::SmallVector<Decl *, 4> &Decls) {}
virtual void
ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *, 4> &Decls) {}
/// \copydoc Sema::CorrectTypo
/// \note LookupKind must correspond to a valid Sema::LookupNameKind

View File

@ -337,7 +337,7 @@ public:
/// may be invoked multiple times; the external source should take care not to
/// introduce the same declarations repeatedly.
void ReadDeclsToCheckForDeferredDiags(
llvm::SmallVector<Decl *, 4> &Decls) override;
llvm::SmallSetVector<Decl *, 4> &Decls) override;
/// \copydoc ExternalSemaSource::CorrectTypo
/// \note Returns the first nonempty correction.

View File

@ -1786,7 +1786,7 @@ public:
private:
/// Function or variable declarations to be checked for whether the deferred
/// diagnostics should be emitted.
SmallVector<Decl *, 4> DeclsToCheckForDeferredDiags;
llvm::SmallSetVector<Decl *, 4> DeclsToCheckForDeferredDiags;
public:
// Emit all deferred diagnostics.

View File

@ -767,21 +767,21 @@ private:
/// This contains the data loaded from all EAGERLY_DESERIALIZED_DECLS blocks
/// in the chain. The referenced declarations are deserialized and passed to
/// the consumer eagerly.
SmallVector<uint64_t, 16> EagerlyDeserializedDecls;
SmallVector<serialization::DeclID, 16> EagerlyDeserializedDecls;
/// The IDs of all tentative definitions stored in the chain.
///
/// Sema keeps track of all tentative definitions in a TU because it has to
/// complete them and pass them on to CodeGen. Thus, tentative definitions in
/// the PCH chain must be eagerly deserialized.
SmallVector<uint64_t, 16> TentativeDefinitions;
SmallVector<serialization::DeclID, 16> TentativeDefinitions;
/// The IDs of all CXXRecordDecls stored in the chain whose VTables are
/// used.
///
/// CodeGen has to emit VTables for these records, so they have to be eagerly
/// deserialized.
SmallVector<uint64_t, 64> VTableUses;
SmallVector<serialization::DeclID, 64> VTableUses;
/// A snapshot of the pending instantiations in the chain.
///
@ -789,7 +789,7 @@ private:
/// end of the TU. It consists of a pair of values for every pending
/// instantiation where the first value is the ID of the decl and the second
/// is the instantiation location.
SmallVector<uint64_t, 64> PendingInstantiations;
SmallVector<serialization::DeclID, 64> PendingInstantiations;
//@}
@ -799,24 +799,24 @@ private:
/// A snapshot of Sema's unused file-scoped variable tracking, for
/// generating warnings.
SmallVector<uint64_t, 16> UnusedFileScopedDecls;
SmallVector<serialization::DeclID, 16> UnusedFileScopedDecls;
/// A list of all the delegating constructors we've seen, to diagnose
/// cycles.
SmallVector<uint64_t, 4> DelegatingCtorDecls;
SmallVector<serialization::DeclID, 4> DelegatingCtorDecls;
/// Method selectors used in a @selector expression. Used for
/// implementation of -Wselector.
SmallVector<uint64_t, 64> ReferencedSelectorsData;
SmallVector<serialization::SelectorID, 64> ReferencedSelectorsData;
/// A snapshot of Sema's weak undeclared identifier tracking, for
/// generating warnings.
SmallVector<uint64_t, 64> WeakUndeclaredIdentifiers;
SmallVector<serialization::IdentifierID, 64> WeakUndeclaredIdentifiers;
/// The IDs of type aliases for ext_vectors that exist in the chain.
///
/// Used by Sema for finding sugared names for ext_vectors in diagnostics.
SmallVector<uint64_t, 4> ExtVectorDecls;
SmallVector<serialization::DeclID, 4> ExtVectorDecls;
//@}
@ -827,7 +827,7 @@ private:
/// The IDs of all potentially unused typedef names in the chain.
///
/// Sema tracks these to emit warnings.
SmallVector<uint64_t, 16> UnusedLocalTypedefNameCandidates;
SmallVector<serialization::DeclID, 16> UnusedLocalTypedefNameCandidates;
/// Our current depth in #pragma cuda force_host_device begin/end
/// macros.
@ -836,18 +836,18 @@ private:
/// The IDs of the declarations Sema stores directly.
///
/// Sema tracks a few important decls, such as namespace std, directly.
SmallVector<uint64_t, 4> SemaDeclRefs;
SmallVector<serialization::DeclID, 4> SemaDeclRefs;
/// The IDs of the types ASTContext stores directly.
///
/// The AST context tracks a few important types, such as va_list, directly.
SmallVector<uint64_t, 16> SpecialTypes;
SmallVector<serialization::TypeID, 16> SpecialTypes;
/// The IDs of CUDA-specific declarations ASTContext stores directly.
///
/// The AST context tracks a few important decls, currently cudaConfigureCall,
/// directly.
SmallVector<uint64_t, 2> CUDASpecialDeclRefs;
SmallVector<serialization::DeclID, 2> CUDASpecialDeclRefs;
/// The floating point pragma option settings.
SmallVector<uint64_t, 1> FPPragmaOptions;
@ -896,11 +896,11 @@ private:
llvm::DenseMap<const Decl *, std::set<std::string>> OpenCLDeclExtMap;
/// A list of the namespaces we've seen.
SmallVector<uint64_t, 4> KnownNamespaces;
SmallVector<serialization::DeclID, 4> KnownNamespaces;
/// A list of undefined decls with internal linkage followed by the
/// SourceLocation of a matching ODR-use.
SmallVector<uint64_t, 8> UndefinedButUsed;
SmallVector<serialization::DeclID, 8> UndefinedButUsed;
/// Delete expressions to analyze at the end of translation unit.
SmallVector<uint64_t, 8> DelayedDeleteExprs;
@ -912,8 +912,7 @@ private:
/// The IDs of all decls to be checked for deferred diags.
///
/// Sema tracks these to emit deferred diags.
SmallVector<uint64_t, 4> DeclsToCheckForDeferredDiags;
llvm::SmallSetVector<serialization::DeclID, 4> DeclsToCheckForDeferredDiags;
public:
struct ImportedSubmodule {
@ -2016,7 +2015,7 @@ public:
llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) override;
void ReadDeclsToCheckForDeferredDiags(
llvm::SmallVector<Decl *, 4> &Decls) override;
llvm::SmallSetVector<Decl *, 4> &Decls) override;
void ReadReferencedSelectors(
SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) override;

View File

@ -402,8 +402,8 @@ private:
/// headers. The declarations themselves are stored as declaration
/// IDs, since they will be written out to an EAGERLY_DESERIALIZED_DECLS
/// record.
SmallVector<uint64_t, 16> EagerlyDeserializedDecls;
SmallVector<uint64_t, 16> ModularCodegenDecls;
SmallVector<serialization::DeclID, 16> EagerlyDeserializedDecls;
SmallVector<serialization::DeclID, 16> ModularCodegenDecls;
/// DeclContexts that have received extensions since their serialized
/// form.

View File

@ -268,7 +268,7 @@ void MultiplexExternalSemaSource::ReadExtVectorDecls(
}
void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(
llvm::SmallVector<Decl *, 4> &Decls) {
llvm::SmallSetVector<Decl *, 4> &Decls) {
for(size_t i = 0; i < Sources.size(); ++i)
Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);
}

View File

@ -12539,7 +12539,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
if (LangOpts.OpenMP && VDecl->isFileVarDecl())
DeclsToCheckForDeferredDiags.push_back(VDecl);
DeclsToCheckForDeferredDiags.insert(VDecl);
CheckCompleteVariableDeclaration(VDecl);
}
@ -14773,7 +14773,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
auto ES = getEmissionStatus(FD);
if (ES == Sema::FunctionEmissionStatus::Emitted ||
ES == Sema::FunctionEmissionStatus::Unknown)
DeclsToCheckForDeferredDiags.push_back(FD);
DeclsToCheckForDeferredDiags.insert(FD);
}
return dcl;

View File

@ -3810,7 +3810,7 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
for (unsigned I = 0, N = Record.size(); I != N; ++I)
DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I]));
DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I]));
break;
}
}
@ -8333,18 +8333,15 @@ void ASTReader::ReadUnusedLocalTypedefNameCandidates(
}
void ASTReader::ReadDeclsToCheckForDeferredDiags(
llvm::SmallVector<Decl *, 4> &Decls) {
for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N;
++I) {
auto *D = dyn_cast_or_null<Decl>(
GetDecl(DeclsToCheckForDeferredDiags[I]));
llvm::SmallSetVector<Decl *, 4> &Decls) {
for (auto I : DeclsToCheckForDeferredDiags) {
auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
if (D)
Decls.push_back(D);
Decls.insert(D);
}
DeclsToCheckForDeferredDiags.clear();
}
void ASTReader::ReadReferencedSelectors(
SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
if (ReferencedSelectorsData.empty())

View File

@ -4667,9 +4667,9 @@ ASTFileSignature ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
}
// Build a record containing all of the DeclsToCheckForDeferredDiags.
RecordData DeclsToCheckForDeferredDiags;
SmallVector<serialization::DeclID, 64> DeclsToCheckForDeferredDiags;
for (auto *D : SemaRef.DeclsToCheckForDeferredDiags)
AddDeclRef(D, DeclsToCheckForDeferredDiags);
DeclsToCheckForDeferredDiags.push_back(GetDeclRef(D));
RecordData DeclUpdatesOffsetsRecord;