diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-12-25 00:39:58 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-12-25 00:39:58 +0000 |
commit | dfb316613a40d0efc033c7bd0a49da59c915fc63 (patch) | |
tree | 2667cd947b697a035beb84db61713f5681595eb9 /lib/Sema | |
parent | a73d3db5bf38ec2c3908187c24fec7219c4e46b5 (diff) |
Cache visibility of decls.
This unifies the linkage and visibility caching. I first implemented this when
working on pr13844, but the previous fixes removed the performance advantage of
this one.
This is still a step in the right direction for making linkage and visibility
cheap to use.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171048 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaAttr.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 10 | ||||
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 12 |
3 files changed, 20 insertions, 6 deletions
diff --git a/lib/Sema/SemaAttr.cpp b/lib/Sema/SemaAttr.cpp index 4406f2d956..3bfb8f22b4 100644 --- a/lib/Sema/SemaAttr.cpp +++ b/lib/Sema/SemaAttr.cpp @@ -309,7 +309,8 @@ void Sema::AddPushedVisibilityAttribute(Decl *D) { if (!VisContext) return; - if (isa<NamedDecl>(D) && cast<NamedDecl>(D)->getExplicitVisibility()) + NamedDecl *ND = dyn_cast<NamedDecl>(D); + if (ND && ND->getExplicitVisibility()) return; VisStack *Stack = static_cast<VisStack*>(VisContext); @@ -320,6 +321,7 @@ void Sema::AddPushedVisibilityAttribute(Decl *D) { = (VisibilityAttr::VisibilityType) rawType; SourceLocation loc = Stack->back().second; + ND->ClearLVCache(); D->addAttr(::new (Context) VisibilityAttr(loc, Context, type)); } diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 105ef49bd8..e1d772b084 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1775,9 +1775,13 @@ bool Sema::mergeDeclAttribute(Decl *D, InheritableAttr *Attr) { AA->getIntroduced(), AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(), AA->getMessage()); - else if (VisibilityAttr *VA = dyn_cast<VisibilityAttr>(Attr)) + else if (VisibilityAttr *VA = dyn_cast<VisibilityAttr>(Attr)) { NewAttr = mergeVisibilityAttr(D, VA->getRange(), VA->getVisibility()); - else if (DLLImportAttr *ImportA = dyn_cast<DLLImportAttr>(Attr)) + if (NewAttr) { + NamedDecl *ND = cast<NamedDecl>(D); + ND->ClearLVCache(); + } + } else if (DLLImportAttr *ImportA = dyn_cast<DLLImportAttr>(Attr)) NewAttr = mergeDLLImportAttr(D, ImportA->getRange()); else if (DLLExportAttr *ExportA = dyn_cast<DLLExportAttr>(Attr)) NewAttr = mergeDLLExportAttr(D, ExportA->getRange()); @@ -6611,7 +6615,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, } VDecl->setTypeSourceInfo(DeducedType); VDecl->setType(DeducedType->getType()); - VDecl->ClearLinkageCache(); + VDecl->ClearLVCache(); // In ARC, infer lifetime. if (getLangOpts().ObjCAutoRefCount && inferObjCARCLifetime(VDecl)) diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 22aad165e9..437e2a826b 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2147,8 +2147,11 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, Deprecated.Version, Obsoleted.Version, IsUnavailable, Str); - if (NewAttr) + if (NewAttr) { D->addAttr(NewAttr); + NamedDecl *ND = cast<NamedDecl>(D); + ND->ClearLVCache(); + } } VisibilityAttr *Sema::mergeVisibilityAttr(Decl *D, SourceRange Range, @@ -2165,6 +2168,8 @@ VisibilityAttr *Sema::mergeVisibilityAttr(Decl *D, SourceRange Range, Diag(ExistingAttr->getLocation(), diag::err_mismatched_visibility); Diag(Range.getBegin(), diag::note_previous_attribute); D->dropAttr<VisibilityAttr>(); + NamedDecl *ND = cast<NamedDecl>(D); + ND->ClearLVCache(); } return ::new (Context) VisibilityAttr(Range, Context, Vis); } @@ -2208,8 +2213,11 @@ static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) { } VisibilityAttr *NewAttr = S.mergeVisibilityAttr(D, Attr.getRange(), type); - if (NewAttr) + if (NewAttr) { D->addAttr(NewAttr); + NamedDecl *ND = cast<NamedDecl>(D); + ND->ClearLVCache(); + } } static void handleObjCMethodFamilyAttr(Sema &S, Decl *decl, |