summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTWriter.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-02-27 03:40:09 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-02-27 03:40:09 +0000
commit4a7e390c12157bd8e48295eae47291e05d292afa (patch)
tree38f057bbf9cc4e629c80368cfcb9b65da350b3a5 /clang/lib/Serialization/ASTWriter.cpp
parent4a528dd5be29ca72493205c1b9aeab88ce1e872f (diff)
downloadbcm5719-llvm-4a7e390c12157bd8e48295eae47291e05d292afa.tar.gz
bcm5719-llvm-4a7e390c12157bd8e48295eae47291e05d292afa.zip
[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. llvm-svn: 230727
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 3af2a4003ba..c70935c0c7d 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -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(const DeclContext *ConstDC,
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 DeclContext *DC,
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;
OpenPOWER on IntegriCloud