[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