mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-01 01:31:26 +00:00
[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:
parent
e84a9b9bb3
commit
e6b8320c0a
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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())
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user