r230727 - [modules] Don't write out name lookup table entries merely because the module
David Blaikie
dblaikie at gmail.com
Thu Feb 26 19:53:56 PST 2015
On Thu, Feb 26, 2015 at 7:40 PM, Richard Smith <richard-llvm at metafoo.co.uk>
wrote:
> Author: rsmith
> Date: Thu Feb 26 21:40:09 2015
> New Revision: 230727
>
> URL: http://llvm.org/viewvc/llvm-project?rev=230727&view=rev
> Log:
> [modules] Don't write out name lookup table entries merely because the
> module
> happened to query them; only write them out if something new was added.
>
> Modified:
> cfe/trunk/include/clang/AST/DeclContextInternals.h
> cfe/trunk/include/clang/Serialization/ASTWriter.h
> cfe/trunk/lib/Serialization/ASTWriter.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclContextInternals.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclContextInternals.h?rev=230727&r1=230726&r2=230727&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclContextInternals.h (original)
> +++ cfe/trunk/include/clang/AST/DeclContextInternals.h Thu Feb 26 21:40:09
> 2015
> @@ -78,6 +78,17 @@ public:
> return getAsVectorAndHasExternal().getPointer();
> }
>
> + bool hasLocalDecls() const {
> + if (NamedDecl *Singleton = getAsDecl()) {
> + return !Singleton->isFromASTFile();
> + } else if (DeclsTy *Vec = getAsVector()) {
>
else after return (& braces on a single-line block)
> + for (auto *D : *Vec)
> + if (!D->isFromASTFile())
> + return true;
>
Looks a bit like std::any_of? (maybe not worth it, I dunno)
> + }
> + return false;
> + }
> +
> bool hasExternalDecls() const {
> return getAsVectorAndHasExternal().getInt();
> }
>
> Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=230727&r1=230726&r2=230727&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTWriter.h Thu Feb 26 21:40:09
> 2015
> @@ -477,6 +477,9 @@ private:
> void WriteTypeAbbrevs();
> void WriteType(QualType T);
>
> + template<typename Visitor>
> + void visitLocalLookupResults(const DeclContext *DC, Visitor
> AddLookupResult);
> +
> uint32_t GenerateNameLookupTable(const DeclContext *DC,
> llvm::SmallVectorImpl<char>
> &LookupTable);
> uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext
> *DC);
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=230727&r1=230726&r2=230727&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Feb 26 21:40:09 2015
> @@ -3663,17 +3663,22 @@ public:
> } // end anonymous namespace
>
> template<typename Visitor>
> -static void visitLocalLookupResults(const DeclContext *ConstDC,
> - bool
> NeedToReconcileExternalVisibleStorage,
> - Visitor AddLookupResult) {
> +void ASTWriter::visitLocalLookupResults(const DeclContext *ConstDC,
> + Visitor AddLookupResult) {
> // FIXME: We need to build the lookups table, which is logically const.
> DeclContext *DC = const_cast<DeclContext*>(ConstDC);
> assert(DC == DC->getPrimaryContext() && "only primary DC has lookup
> table");
>
> SmallVector<DeclarationName, 16> ExternalNames;
> for (auto &Lookup : *DC->buildLookup()) {
> + // If there are no local declarations in our lookup result, we don't
> + // need to write an entry for the name at all unless we're rewriting
> + // the decl context.
> + if (!Lookup.second.hasLocalDecls() && !isRewritten(cast<Decl>(DC)))
> + continue;
> +
> if (Lookup.second.hasExternalDecls() ||
> - NeedToReconcileExternalVisibleStorage) {
> + DC->NeedToReconcileExternalVisibleStorage) {
> // We don't know for sure what declarations are found by this name,
> // because the external source might have a different set from the
> set
> // that are in the lookup map, and we can't update it now without
> @@ -3697,9 +3702,8 @@ static void visitLocalLookupResults(cons
> void ASTWriter::AddUpdatedDeclContext(const DeclContext *DC) {
> if (UpdatedDeclContexts.insert(DC).second && WritingAST) {
> // Ensure we emit all the visible declarations.
> - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage,
> - [&](DeclarationName Name,
> - DeclContext::lookup_result Result) {
> + visitLocalLookupResults(DC, [&](DeclarationName Name,
> + DeclContext::lookup_result Result) {
> for (auto *Decl : Result)
> GetDeclRef(getDeclForLocalLookup(getLangOpts(), Decl));
> });
> @@ -3721,9 +3725,8 @@ ASTWriter::GenerateNameLookupTable(const
> SmallVector<NamedDecl *, 8> ConstructorDecls;
> SmallVector<NamedDecl *, 4> ConversionDecls;
>
> - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage,
> - [&](DeclarationName Name,
> - DeclContext::lookup_result Result) {
> + visitLocalLookupResults(DC, [&](DeclarationName Name,
> + DeclContext::lookup_result Result) {
> if (Result.empty())
> return;
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150226/0dde738c/attachment.html>
More information about the cfe-commits
mailing list