[cfe-commits] r121012 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/AST/DeclBase.h include/clang/AST/DeclTemplate.h include/clang/AST/Redeclarable.h lib/AST/Decl.cpp lib/AST/DeclBase.cpp lib/AST/DeclCXX.cpp lib/Serialization/ASTReaderDecl.cpp

Douglas Gregor dgregor at apple.com
Mon Dec 6 09:49:02 PST 2010


Author: dgregor
Date: Mon Dec  6 11:49:01 2010
New Revision: 121012

URL: http://llvm.org/viewvc/llvm-project?rev=121012&view=rev
Log:
Revert r120808, my previous implementation of caching for the linkage
and visibility of declarations, because it was extremely messy and it
increased the size of NamedDecl.

An improved implementation is forthcoming.

Modified:
    cfe/trunk/include/clang/AST/Decl.h
    cfe/trunk/include/clang/AST/DeclBase.h
    cfe/trunk/include/clang/AST/DeclTemplate.h
    cfe/trunk/include/clang/AST/Redeclarable.h
    cfe/trunk/lib/AST/Decl.cpp
    cfe/trunk/lib/AST/DeclBase.cpp
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp

Modified: cfe/trunk/include/clang/AST/Decl.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Decl.h (original)
+++ cfe/trunk/include/clang/AST/Decl.h Mon Dec  6 11:49:01 2010
@@ -99,25 +99,10 @@
   /// constructor, Objective-C selector, etc.)
   DeclarationName Name;
 
-  /// \brief Whether we have already cached linkage and visibility.
-  mutable unsigned HasLinkageAndVisibilityCached : 1;
-
-  /// \brief The cached visibility, if \c HasLinkageAndVisibilityCached is 
-  /// non-zero.
-  mutable unsigned CachedVisibility : 2;
-
-  /// \brief Whether the cached visibility was explicitly placed on this
-  /// declaration.
-  mutable unsigned CachedVisibilityIsExplicit : 1;
-  
-  /// \brief The cached linkage, if \c HasLinkageAndVisibilityCached is
-  /// non-zero.
-  mutable unsigned CachedLinkage : 2;
-
 protected:
   NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
-    : Decl(DK, DC, L), Name(N), HasLinkageAndVisibilityCached(0) { }
-  
+    : Decl(DK, DC, L), Name(N) { }
+
 public:
   /// getIdentifier - Get the identifier that names this declaration,
   /// if there is one. This will return NULL if this declaration has
@@ -287,13 +272,6 @@
   /// \brief Determines the linkage and visibility of this entity.
   LinkageInfo getLinkageAndVisibility() const;
 
-  /// \brief Clear the linkage and visibility cache in response to a change
-  /// to the declaration. 
-  ///
-  /// \param Redeclarations When true, we also have to clear out the linkage
-  /// and visibility cache for all redeclarations.
-  void ClearLinkageAndVisibilityCache();
-
   /// \brief Looks through UsingDecls and ObjCCompatibleAliasDecls for
   /// the underlying named decl.
   NamedDecl *getUnderlyingDecl();
@@ -647,8 +625,6 @@
   bool NRVOVariable : 1;
   
   friend class StmtIteratorBase;
-  friend class ASTDeclReader;
-  
 protected:
   VarDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
           QualType T, TypeSourceInfo *TInfo, StorageClass SC,
@@ -684,7 +660,10 @@
   StorageClass getStorageClassAsWritten() const {
     return (StorageClass) SClassAsWritten;
   }
-  void setStorageClass(StorageClass SC);
+  void setStorageClass(StorageClass SC) {
+    assert(isLegalForVariable(SC));
+    SClass = SC;
+  }
   void setStorageClassAsWritten(StorageClass SC) {
     assert(isLegalForVariable(SC));
     SClassAsWritten = SC;
@@ -1499,7 +1478,10 @@
   }
                        
   StorageClass getStorageClass() const { return StorageClass(SClass); }
-  void setStorageClass(StorageClass SC);
+  void setStorageClass(StorageClass SC) {
+    assert(isLegalForFunction(SC));
+    SClass = SC;
+  }
 
   StorageClass getStorageClassAsWritten() const {
     return StorageClass(SClassAsWritten);
@@ -2576,63 +2558,6 @@
   return DB;
 }
 
-template<typename decl_type>
-void Redeclarable<decl_type>::setPreviousDeclaration(decl_type *PrevDecl) {
-  // Note: This routine is implemented here because we need both NamedDecl
-  // and Redeclarable to be defined.
-  decl_type *First;
-  
-  if (PrevDecl) {
-    // Point to previous. Make sure that this is actually the most recent
-    // redeclaration, or we can build invalid chains. If the most recent
-    // redeclaration is invalid, it won't be PrevDecl, but we want it anyway.
-    RedeclLink = PreviousDeclLink(llvm::cast<decl_type>(
-                                                        PrevDecl->getMostRecentDeclaration()));
-    First = PrevDecl->getFirstDeclaration();
-    assert(First->RedeclLink.NextIsLatest() && "Expected first");
-  } else {
-    // Make this first.
-    First = static_cast<decl_type*>(this);
-  }
-  
-  // First one will point to this one as latest.
-  First->RedeclLink = LatestDeclLink(static_cast<decl_type*>(this));
-  
-  // If this declaration has a visibility attribute that differs from the 
-  // previous visibility attribute, or has private extern storage while the
-  // previous declaration merely had extern storage, clear out the linkage and 
-  ///visibility cache. This is required because declarations after the first 
-  // declaration can change the visibility for all previous and future 
-  // declarations.
-  if (NamedDecl *ND = dyn_cast<NamedDecl>(static_cast<decl_type*>(this))) {
-    bool MustClear = false;
-    if (VisibilityAttr *Visibility = ND->getAttr<VisibilityAttr>()) {
-      VisibilityAttr *PrevVisibility 
-                                = PrevDecl->template getAttr<VisibilityAttr>();
-      if (!PrevVisibility || 
-          PrevVisibility->getVisibility() != Visibility->getVisibility())
-        MustClear = true;
-    }
-    
-    if (!MustClear) {
-      if (VarDecl *VD = dyn_cast<VarDecl>(ND)) {
-        if (VD->getStorageClass() != cast<VarDecl>(PrevDecl)->getStorageClass())
-          MustClear = true;
-      } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
-        FunctionDecl *PrevFD = cast<FunctionDecl>(PrevDecl);
-        if (FD->getStorageClass() != PrevFD->getStorageClass())
-          MustClear = true;
-        else if (FD->isInlineSpecified() && !PrevFD->isInlined())
-          MustClear = true;
-      }
-    }
-    
-    if (MustClear)
-      ND->ClearLinkageAndVisibilityCache();
-  }
-}
-
-
 }  // end namespace clang
 
 #endif

Modified: cfe/trunk/include/clang/AST/DeclBase.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclBase.h (original)
+++ cfe/trunk/include/clang/AST/DeclBase.h Mon Dec  6 11:49:01 2010
@@ -198,7 +198,7 @@
     return DeclCtx.get<DeclContext*>();
   }
 
-  /// Loc - The location of this decl.
+  /// Loc - The location that this decl.
   SourceLocation Loc;
 
   /// DeclKind - This indicates which class this is.
@@ -316,7 +316,12 @@
   void swapAttrs(Decl *D);
   void dropAttrs();
 
-  void addAttr(Attr *A);
+  void addAttr(Attr *A) {
+    if (hasAttrs())
+      getAttrs().push_back(A);
+    else
+      setAttrs(AttrVec(1, A));
+  }
 
   typedef AttrVec::const_iterator attr_iterator;
 

Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
+++ cfe/trunk/include/clang/AST/DeclTemplate.h Mon Dec  6 11:49:01 2010
@@ -1241,8 +1241,6 @@
   }
 
   void setSpecializationKind(TemplateSpecializationKind TSK) {
-    if (getSpecializationKind() != TSK)
-      ClearLinkageAndVisibilityCache();
     SpecializationKind = TSK;
   }
 

Modified: cfe/trunk/include/clang/AST/Redeclarable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Redeclarable.h?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Redeclarable.h (original)
+++ cfe/trunk/include/clang/AST/Redeclarable.h Mon Dec  6 11:49:01 2010
@@ -109,8 +109,26 @@
   
   /// \brief Set the previous declaration. If PrevDecl is NULL, set this as the
   /// first and only declaration.
-  void setPreviousDeclaration(decl_type *PrevDecl);
-  
+  void setPreviousDeclaration(decl_type *PrevDecl) {
+    decl_type *First;
+
+    if (PrevDecl) {
+      // Point to previous. Make sure that this is actually the most recent
+      // redeclaration, or we can build invalid chains. If the most recent
+      // redeclaration is invalid, it won't be PrevDecl, but we want it anyway.
+      RedeclLink = PreviousDeclLink(llvm::cast<decl_type>(
+                                      PrevDecl->getMostRecentDeclaration()));
+      First = PrevDecl->getFirstDeclaration();
+      assert(First->RedeclLink.NextIsLatest() && "Expected first");
+    } else {
+      // Make this first.
+      First = static_cast<decl_type*>(this);
+    }
+
+    // First one will point to this one as latest.
+    First->RedeclLink = LatestDeclLink(static_cast<decl_type*>(this));
+  }
+
   /// \brief Iterates through all the redeclarations of the same decl.
   class redecl_iterator {
     /// Current - The current declaration.

Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Mon Dec  6 11:49:01 2010
@@ -526,57 +526,7 @@
 }
 
 LinkageInfo NamedDecl::getLinkageAndVisibility() const {
-  // If we have already cached linkage and visibility, just return the
-  // cached information.
-  if (HasLinkageAndVisibilityCached) {
-#ifndef NDEBUG
-    LinkageInfo LI = getLVForDecl(this, LVFlags());
-    assert(LI.visibility() == Visibility(CachedVisibility));
-    assert(LI.visibilityExplicit() == CachedVisibilityIsExplicit);
-    assert(LI.linkage() == Linkage(CachedLinkage));
-#endif
-    return LinkageInfo(Linkage(CachedLinkage), Visibility(CachedVisibility),
-                       CachedVisibilityIsExplicit);
-  }
-  
-  LinkageInfo LI = getLVForDecl(this, LVFlags());
-  HasLinkageAndVisibilityCached = 1;
-  CachedVisibility = LI.visibility();
-  CachedVisibilityIsExplicit = LI.visibilityExplicit();
-  CachedLinkage = LI.linkage();
-  return LI;
-}
-
-void NamedDecl::ClearLinkageAndVisibilityCache() {
-  HasLinkageAndVisibilityCached = 0;
-  
-  if (VarDecl *VD = dyn_cast<VarDecl>(this)) {
-    for (VarDecl::redecl_iterator R = VD->redecls_begin(),
-                               REnd = VD->redecls_end();
-         R != REnd; ++R)
-      R->HasLinkageAndVisibilityCached = 0;
-    
-    return;
-  }
-  
-  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) {
-    for (FunctionDecl::redecl_iterator R = FD->redecls_begin(),
-                                    REnd = FD->redecls_end();
-         R != REnd; ++R)
-      R->HasLinkageAndVisibilityCached = 0;
-    
-    return;
-  }
-  
-  // Changing the linkage or visibility of a C++ class affect the linkage and
-  // visibility of all of its members. Clear their caches, too.
-  if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(this)) {
-    for (DeclContext::decl_iterator D = RD->decls_begin(),
-                                 DEnd = RD->decls_end();
-         D != DEnd; ++D)
-      if (NamedDecl *ND = dyn_cast<NamedDecl>(*D))
-        ND->ClearLinkageAndVisibilityCache();
-  }
+  return getLVForDecl(this, LVFlags());
 }
 
 static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) {
@@ -928,14 +878,6 @@
   return new (C) VarDecl(Var, DC, L, Id, T, TInfo, S, SCAsWritten);
 }
 
-void VarDecl::setStorageClass(StorageClass SC) {
-  assert(isLegalForVariable(SC));
-  if (getStorageClass() != SC)
-    ClearLinkageAndVisibilityCache();
-  
-  SClass = SC;
-}
-
 SourceLocation VarDecl::getInnerLocStart() const {
   SourceLocation Start = getTypeSpecStartLoc();
   if (Start.isInvalid())
@@ -1154,7 +1096,6 @@
       PointOfInstantiation.isValid() &&
       MSI->getPointOfInstantiation().isInvalid())
     MSI->setPointOfInstantiation(PointOfInstantiation);
-  ClearLinkageAndVisibilityCache();
 }
 
 //===----------------------------------------------------------------------===//
@@ -1254,10 +1195,8 @@
 
 void FunctionDecl::setBody(Stmt *B) {
   Body = B;
-  if (B) {
+  if (B)
     EndRangeLoc = B->getLocEnd();
-    ClearLinkageAndVisibilityCache();
-  }
 }
 
 void FunctionDecl::setPure(bool P) {
@@ -1338,14 +1277,6 @@
   return getFirstDeclaration();
 }
 
-void FunctionDecl::setStorageClass(StorageClass SC) {
-  assert(isLegalForFunction(SC));
-  if (getStorageClass() != SC)
-    ClearLinkageAndVisibilityCache();
-  
-  SClass = SC;
-}
-
 /// \brief Returns a value indicating whether this function
 /// corresponds to a builtin function.
 ///
@@ -1778,7 +1709,6 @@
       MSInfo->setPointOfInstantiation(PointOfInstantiation);
   } else
     assert(false && "Function cannot have a template specialization kind");
-  ClearLinkageAndVisibilityCache();
 }
 
 SourceLocation FunctionDecl::getPointOfInstantiation() const {
@@ -1857,7 +1787,6 @@
   TypedefDeclOrQualifier = TDD; 
   if (TypeForDecl)
     TypeForDecl->ClearLinkageCache();
-  ClearLinkageAndVisibilityCache();
 }
 
 void TagDecl::startDefinition() {

Modified: cfe/trunk/lib/AST/DeclBase.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclBase.cpp (original)
+++ cfe/trunk/lib/AST/DeclBase.cpp Mon Dec  6 11:49:01 2010
@@ -337,38 +337,6 @@
   getASTContext().eraseDeclAttrs(this);
 }
 
-void Decl::addAttr(Attr *A) {
-  if (NamedDecl *ND = dyn_cast<NamedDecl>(this))
-    if (VisibilityAttr *Visibility = dyn_cast<VisibilityAttr>(A)) {
-      bool ClearVisibility = true;
-      if (VarDecl *VD = dyn_cast<VarDecl>(this)) {
-        if (VD->getPreviousDeclaration()) {
-          VisibilityAttr *PrevVisibility 
-            = VD->getPreviousDeclaration()->getAttr<VisibilityAttr>();
-          if  (PrevVisibility &&
-               PrevVisibility->getVisibility() == Visibility->getVisibility())
-            ClearVisibility = false;
-        }
-      } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) {
-        if (FD->getPreviousDeclaration()) {
-          VisibilityAttr *PrevVisibility 
-            = FD->getPreviousDeclaration()->getAttr<VisibilityAttr>();
-          if  (PrevVisibility &&
-               PrevVisibility->getVisibility() == Visibility->getVisibility())
-            ClearVisibility = false;
-        }
-      }
-      
-      if (ClearVisibility)
-        ND->ClearLinkageAndVisibilityCache();
-    }
-  
-  if (hasAttrs())
-    getAttrs().push_back(A);
-  else
-    setAttrs(AttrVec(1, A));
-}
-
 const AttrVec &Decl::getAttrs() const {
   assert(HasAttrs && "No attrs to get!");
   return getASTContext().getDeclAttrs(this);

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Dec  6 11:49:01 2010
@@ -792,8 +792,6 @@
   }
   
   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
-    if (MSInfo->getTemplateSpecializationKind() != TSK)
-      ClearLinkageAndVisibilityCache();
     MSInfo->setTemplateSpecializationKind(TSK);
     return;
   }

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=121012&r1=121011&r2=121012&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Mon Dec  6 11:49:01 2010
@@ -384,7 +384,7 @@
   // FunctionDecl's body is handled last at ASTDeclReader::Visit,
   // after everything else is read.
 
-  FD->SClass = (StorageClass)Record[Idx++];
+  FD->setStorageClass((StorageClass)Record[Idx++]);
   FD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
   FD->setInlineSpecified(Record[Idx++]);
   FD->setVirtualAsWritten(Record[Idx++]);
@@ -651,7 +651,7 @@
 void ASTDeclReader::VisitVarDecl(VarDecl *VD) {
   VisitDeclaratorDecl(VD);
   VisitRedeclarable(VD);
-  VD->SClass = (StorageClass)Record[Idx++];
+  VD->setStorageClass((StorageClass)Record[Idx++]);
   VD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
   VD->setThreadSpecified(Record[Idx++]);
   VD->setCXXDirectInitializer(Record[Idx++]);





More information about the cfe-commits mailing list