[cfe-commits] r49520 - in /cfe/trunk/lib/Sema: Sema.cpp Sema.h SemaDecl.cpp SemaDeclObjC.cpp

Chris Lattner sabre at nondot.org
Fri Apr 11 00:00:53 PDT 2008


Author: lattner
Date: Fri Apr 11 02:00:53 2008
New Revision: 49520

URL: http://llvm.org/viewvc/llvm-project?rev=49520&view=rev
Log:
Switch sema to maintaining its own scope chain information for variable
shadowing, instead of threading it through the AST.  This patch contributed
by Argiris Kirtzidis!


Modified:
    cfe/trunk/lib/Sema/Sema.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=49520&r1=49519&r2=49520&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Fri Apr 11 02:00:53 2008
@@ -48,14 +48,14 @@
   
   // Add the built-in ObjC types.
   t = cast<TypedefType>(Context.getObjCIdType().getTypePtr());
-  t->getDecl()->getIdentifier()->setFETokenInfo(t->getDecl());
+  IdResolver.AddDecl(t->getDecl(), S);
   TUScope->AddDecl(t->getDecl());
   t = cast<TypedefType>(Context.getObjCClassType().getTypePtr());
-  t->getDecl()->getIdentifier()->setFETokenInfo(t->getDecl());
+  IdResolver.AddDecl(t->getDecl(), S);
   TUScope->AddDecl(t->getDecl());
   ObjCInterfaceType *it = cast<ObjCInterfaceType>(Context.getObjCProtoType());
   ObjCInterfaceDecl *IDecl = it->getDecl();
-  IDecl->getIdentifier()->setFETokenInfo(IDecl);
+  IdResolver.AddDecl(IDecl, S);
   TUScope->AddDecl(IDecl);
   
   // Synthesize "typedef struct objc_selector *SEL;"
@@ -63,7 +63,7 @@
                                           SourceLocation(), 
                                           &Context.Idents.get("objc_selector"),
                                           0);
-  SelTag->getIdentifier()->setFETokenInfo(SelTag);
+  IdResolver.AddDecl(SelTag, S);
   TUScope->AddDecl(SelTag);
   
   QualType SelT = Context.getPointerType(Context.getTagDeclType(SelTag));
@@ -71,7 +71,7 @@
                                                 SourceLocation(),
                                                 &Context.Idents.get("SEL"),
                                                 SelT, 0);
-  SelTypedef->getIdentifier()->setFETokenInfo(SelTypedef);
+  IdResolver.AddDecl(SelTypedef, S);
   TUScope->AddDecl(SelTypedef);
   Context.setObjCSelType(SelTypedef);
 }

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=49520&r1=49519&r2=49520&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Fri Apr 11 02:00:53 2008
@@ -15,6 +15,7 @@
 #ifndef LLVM_CLANG_AST_SEMA_H
 #define LLVM_CLANG_AST_SEMA_H
 
+#include "IdentifierResolver.h"
 #include "clang/Parse/Action.h"
 #include "clang/Parse/DeclSpec.h"
 #include "llvm/ADT/SmallVector.h"
@@ -113,6 +114,8 @@
                          ObjCCompatibleAliasDecl*> ObjCAliasTy;
   ObjCAliasTy ObjCAliasDecls;
 
+  IdentifierResolver IdResolver;
+
   // Enum values used by KnownFunctionIDs (see below).
   enum {
     id_printf,

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=49520&r1=49519&r2=49520&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Apr 11 02:00:53 2008
@@ -65,23 +65,9 @@
     IdentifierInfo *II = D->getIdentifier();
     if (!II) continue;
     
-    // Unlink this decl from the identifier.  Because the scope contains decls
-    // in an unordered collection, and because we have multiple identifier
-    // namespaces (e.g. tag, normal, label),the decl may not be the first entry.
-    if (II->getFETokenInfo<Decl>() == D) {
-      // Normal case, no multiple decls in different namespaces.
-      II->setFETokenInfo(D->getNext());
-    } else {
-      // Scan ahead.  There are only three namespaces in C, so this loop can
-      // never execute more than 3 times.
-      ScopedDecl *SomeDecl = II->getFETokenInfo<ScopedDecl>();
-      while (SomeDecl->getNext() != D) {
-        SomeDecl = SomeDecl->getNext();
-        assert(SomeDecl && "Didn't find this decl on its identifier's chain!");
-      }
-      SomeDecl->setNext(D->getNext());
-    }
-    
+    // Unlink this decl from the identifier.
+    IdResolver.RemoveDecl(D);
+
     // This will have to be revisited for C++: there we want to nest stuff in
     // namespace decls etc.  Even for C, we might want a top-level translation
     // unit decl or something.
@@ -111,14 +97,13 @@
                        Scope *S, bool enableLazyBuiltinCreation) {
   if (II == 0) return 0;
   Decl::IdentifierNamespace NS = (Decl::IdentifierNamespace)NSI;
-  
+
   // Scan up the scope chain looking for a decl that matches this identifier
   // that is in the appropriate namespace.  This search should not take long, as
   // shadowing of names is uncommon, and deep shadowing is extremely uncommon.
-  for (ScopedDecl *D = II->getFETokenInfo<ScopedDecl>(); D; D = D->getNext())
-    if (D->getIdentifierNamespace() == NS)
-      return D;
-  
+  NamedDecl *ND = IdResolver.Lookup(II, NS);
+  if (ND) return ND;
+
   // If we didn't find a use of this identifier, and if the identifier
   // corresponds to a compiler builtin, create the decl object for the builtin
   // now, injecting it into translation unit scope, and return it.
@@ -171,23 +156,12 @@
                                            SourceLocation(), II, R,
                                            FunctionDecl::Extern, false, 0);
   
-  // Find translation-unit scope to insert this function into.
-  if (Scope *FnS = S->getFnParent())
-    S = FnS->getParent();   // Skip all scopes in a function at once.
-  while (S->getParent())
-    S = S->getParent();
-  S->AddDecl(New);
+  // TUScope is the translation-unit scope to insert this function into.
+  TUScope->AddDecl(New);
   
   // Add this decl to the end of the identifier info.
-  if (ScopedDecl *LastDecl = II->getFETokenInfo<ScopedDecl>()) {
-    // Scan until we find the last (outermost) decl in the id chain. 
-    while (LastDecl->getNext())
-      LastDecl = LastDecl->getNext();
-    // Insert before (outside) it.
-    LastDecl->setNext(New);
-  } else {
-    II->setFETokenInfo(New);
-  }    
+  IdResolver.AddGlobalDecl(New);
+
   return New;
 }
 
@@ -456,8 +430,7 @@
   ParmVarDecl *New = ParmVarDecl::Create(Context, CurContext, IdLoc, Id, Type, 
                                          VarDecl::None, 0, 0);
   if (Id) {
-    New->setNext(Id->getFETokenInfo<ScopedDecl>());
-    Id->setFETokenInfo(New);
+    IdResolver.AddDecl(New, S);
     S->AddDecl(New);
   }
 
@@ -924,8 +897,7 @@
   
   // If this has an identifier, add it to the scope stack.
   if (II) {
-    New->setNext(II->getFETokenInfo<ScopedDecl>());
-    II->setFETokenInfo(New);
+    IdResolver.AddDecl(New, S);
     S->AddDecl(New);
   }
   // If any semantic error occurred, mark the decl as invalid.
@@ -1146,8 +1118,7 @@
     New->setInvalidDecl();
     
   if (II) {
-    New->setNext(II->getFETokenInfo<ScopedDecl>());
-    II->setFETokenInfo(New);
+    IdResolver.AddDecl(New, S);
     S->AddDecl(New);
   }
 
@@ -1213,9 +1184,8 @@
   for (unsigned p = 0, NumParams = FD->getNumParams(); p < NumParams; ++p) {
     ParmVarDecl *Param = FD->getParamDecl(p);
     // If this has an identifier, add it to the scope stack.
-    if (IdentifierInfo *II = Param->getIdentifier()) {
-      Param->setNext(II->getFETokenInfo<ScopedDecl>());
-      II->setFETokenInfo(Param);
+    if (Param->getIdentifier()) {
+      IdResolver.AddDecl(Param, FnBodyScope);
       FnBodyScope->AddDecl(Param);
     }
   }
@@ -1408,8 +1378,7 @@
       S = S->getParent();
     
     // Add it to the decl chain.
-    New->setNext(Name->getFETokenInfo<ScopedDecl>());
-    Name->setFETokenInfo(New);
+    IdResolver.AddDecl(New, S);
     S->AddDecl(New);
   }
   
@@ -1752,8 +1721,7 @@
                              LastEnumConst);
   
   // Register this decl in the current scope stack.
-  New->setNext(Id->getFETokenInfo<ScopedDecl>());
-  Id->setFETokenInfo(New);
+  IdResolver.AddDecl(New, S);
   S->AddDecl(New);
   return New;
 }

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=49520&r1=49519&r2=49520&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Apr 11 02:00:53 2008
@@ -63,8 +63,7 @@
     ParmVarDecl *PDecl = MDecl->getParamDecl(i);
     IdentifierInfo *II = PDecl->getIdentifier();
     if (II) {
-      PDecl->setNext(II->getFETokenInfo<ScopedDecl>());
-      II->setFETokenInfo(PDecl);
+      IdResolver.AddDecl(PDecl, FnBodyScope);
       FnBodyScope->AddDecl(PDecl);
     }
   }
@@ -926,3 +925,5 @@
   return PDecl;
 }
 
+
+





More information about the cfe-commits mailing list