[clang] e6b8320 - [clang][AST] Improve AST Reader/Writer memory footprint
Wei Wang via cfe-commits
cfe-commits at lists.llvm.org
Thu May 20 15:35:30 PDT 2021
Author: Wei Wang
Date: 2021-05-20T15:34:29-07:00
New Revision: e6b8320c0a634ba60c82693c6631ea90fb2988a6
URL: https://github.com/llvm/llvm-project/commit/e6b8320c0a634ba60c82693c6631ea90fb2988a6
DIFF: https://github.com/llvm/llvm-project/commit/e6b8320c0a634ba60c82693c6631ea90fb2988a6.diff
LOG: [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
Added:
Modified:
clang/include/clang/Sema/ExternalSemaSource.h
clang/include/clang/Sema/MultiplexExternalSemaSource.h
clang/include/clang/Sema/Sema.h
clang/include/clang/Serialization/ASTReader.h
clang/include/clang/Serialization/ASTWriter.h
clang/lib/Sema/MultiplexExternalSemaSource.cpp
clang/lib/Sema/SemaDecl.cpp
clang/lib/Serialization/ASTReader.cpp
clang/lib/Serialization/ASTWriter.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/ExternalSemaSource.h b/clang/include/clang/Sema/ExternalSemaSource.h
index 2854b4893484d..9c18aa1398d37 100644
--- a/clang/include/clang/Sema/ExternalSemaSource.h
+++ b/clang/include/clang/Sema/ExternalSemaSource.h
@@ -199,8 +199,8 @@ class ExternalSemaSource : public ExternalASTSource {
/// 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
diff --git a/clang/include/clang/Sema/MultiplexExternalSemaSource.h b/clang/include/clang/Sema/MultiplexExternalSemaSource.h
index b54a6283d6408..78658dcf990c4 100644
--- a/clang/include/clang/Sema/MultiplexExternalSemaSource.h
+++ b/clang/include/clang/Sema/MultiplexExternalSemaSource.h
@@ -337,7 +337,7 @@ class MultiplexExternalSemaSource : public ExternalSemaSource {
/// 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.
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 114ff6441b4a8..2ac6471c4f04a 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -1786,7 +1786,7 @@ class Sema final {
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.
diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h
index 0df687c05366a..6932d9c86d0cc 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -767,21 +767,21 @@ class ASTReader
/// 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 @@ class ASTReader
/// 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 @@ class ASTReader
/// 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 @@ class ASTReader
/// 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 @@ class ASTReader
/// 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 @@ class ASTReader
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 @@ class ASTReader
/// 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 @@ class ASTReader
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;
diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h
index 30f5e49c4e628..a7a659637902e 100644
--- a/clang/include/clang/Serialization/ASTWriter.h
+++ b/clang/include/clang/Serialization/ASTWriter.h
@@ -402,8 +402,8 @@ class ASTWriter : public ASTDeserializationListener,
/// 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.
diff --git a/clang/lib/Sema/MultiplexExternalSemaSource.cpp b/clang/lib/Sema/MultiplexExternalSemaSource.cpp
index 3a993e24b134d..072775642d75b 100644
--- a/clang/lib/Sema/MultiplexExternalSemaSource.cpp
+++ b/clang/lib/Sema/MultiplexExternalSemaSource.cpp
@@ -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);
}
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 90fae1d9c9286..6d6b8b5e797da 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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;
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index eb635b25480be..c8290ac5c31bf 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -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())
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 267a0785bd109..5f038b318e268 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -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;
More information about the cfe-commits
mailing list