aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-12-18 17:29:46 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-12-18 17:29:46 +0000
commitefc4c4bdbd8fee90b93deb3b5cfaeb044ae22557 (patch)
treeed661077147ecc42999eec82a78377928ee84ad2
parentd8df6823420c22329a2a9aacd2a440368d38d86c (diff)
Removed a slot in ObjCMemRegExpr used in
code gen which did not belong there. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61203 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/ASTContext.h15
-rw-r--r--include/clang/AST/ExprObjC.h7
-rw-r--r--lib/AST/ASTContext.cpp10
-rw-r--r--lib/AST/StmtSerialization.cpp2
-rw-r--r--lib/CodeGen/CGExpr.cpp4
-rw-r--r--lib/CodeGen/CGObjC.cpp4
-rw-r--r--lib/Sema/SemaExpr.cpp15
7 files changed, 40 insertions, 17 deletions
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h
index 2bd274cbde..2c7b6fdf41 100644
--- a/include/clang/AST/ASTContext.h
+++ b/include/clang/AST/ASTContext.h
@@ -47,7 +47,10 @@ namespace clang {
class TypeDecl;
class TypedefDecl;
class TemplateTypeParmDecl;
-
+ class FieldDecl;
+ class ObjCIvarRefExpr;
+ class ObjCIvarDecl;
+
/// ASTContext - This class holds long-lived AST nodes (such as types and
/// decls) that can be referred to throughout the semantic analysis of a file.
class ASTContext {
@@ -74,6 +77,7 @@ class ASTContext {
llvm::DenseMap<const ObjCInterfaceDecl*,
const RecordDecl*> ASTRecordForInterface;
+ llvm::DenseMap<const ObjCIvarRefExpr*, const FieldDecl*> ASTFieldForIvarRef;
/// BuiltinVaListType - built-in va list type.
/// This is initially null and set by Sema::LazilyCreateBuiltin when
@@ -391,6 +395,15 @@ public:
const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D);
const RecordDecl *addRecordToClass(const ObjCInterfaceDecl *D);
+ const FieldDecl *getFieldDecl(const ObjCIvarRefExpr *MRef) {
+ llvm::DenseMap<const ObjCIvarRefExpr *, const FieldDecl*>::iterator I
+ = ASTFieldForIvarRef.find(MRef);
+ assert (I != ASTFieldForIvarRef.end() && "Unable to find field_decl");
+ return I->second;
+ }
+ void setFieldDecl(const ObjCInterfaceDecl *OI,
+ const ObjCIvarDecl *Ivar,
+ const ObjCIvarRefExpr *MRef);
//===--------------------------------------------------------------------===//
// Type Operators
//===--------------------------------------------------------------------===//
diff --git a/include/clang/AST/ExprObjC.h b/include/clang/AST/ExprObjC.h
index 22848b1c57..03d904d6fd 100644
--- a/include/clang/AST/ExprObjC.h
+++ b/include/clang/AST/ExprObjC.h
@@ -156,23 +156,20 @@ public:
/// ObjCIvarRefExpr - A reference to an ObjC instance variable.
class ObjCIvarRefExpr : public Expr {
class ObjCIvarDecl *D;
- FieldDecl *FD;
SourceLocation Loc;
Stmt *Base;
bool IsArrow:1; // True if this is "X->F", false if this is "X.F".
bool IsFreeIvar:1; // True if ivar reference has no base (self assumed).
public:
- ObjCIvarRefExpr(ObjCIvarDecl *d, FieldDecl *fd,
+ ObjCIvarRefExpr(ObjCIvarDecl *d,
QualType t, SourceLocation l, Expr *base=0,
bool arrow = false, bool freeIvar = false) :
- Expr(ObjCIvarRefExprClass, t), D(d), FD(fd),
+ Expr(ObjCIvarRefExprClass, t), D(d),
Loc(l), Base(base), IsArrow(arrow),
IsFreeIvar(freeIvar) {}
ObjCIvarDecl *getDecl() { return D; }
- FieldDecl *getFieldDecl() { return FD; }
- const FieldDecl *getFieldDecl() const { return FD; }
const ObjCIvarDecl *getDecl() const { return D; }
virtual SourceRange getSourceRange() const {
return isFreeIvar() ? SourceRange(Loc)
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 281b2cd5de..95f95ceb5e 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -540,6 +540,16 @@ const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D)
return RD;
}
+/// setFieldDecl - maps a field for the given Ivar reference node.
+//
+void ASTContext::setFieldDecl(const ObjCInterfaceDecl *OI,
+ const ObjCIvarDecl *Ivar,
+ const ObjCIvarRefExpr *MRef) {
+ FieldDecl *FD = (const_cast<ObjCInterfaceDecl *>(OI))->
+ lookupFieldDeclForIvar(*this, Ivar);
+ ASTFieldForIvarRef[MRef] = FD;
+}
+
/// getASTObjcInterfaceLayout - Get or compute information about the layout of
/// the specified Objective C, which indicates its size and ivar
/// position information.
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index e25c5cd861..686ee68b20 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/lib/AST/StmtSerialization.cpp
@@ -1162,7 +1162,7 @@ void ObjCIvarRefExpr::EmitImpl(Serializer& S) const {
ObjCIvarRefExpr* ObjCIvarRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
SourceLocation Loc = SourceLocation::ReadVal(D);
QualType T = QualType::ReadVal(D);
- ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,NULL,T,Loc);
+ ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc);
D.ReadPtr(dr->D,false);
return dr;
}
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 31b63d1fbc..59d7108e19 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -995,8 +995,8 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
CVRQualifiers = BaseExpr->getType().getCVRQualifiers();
}
- return EmitLValueForIvar(BaseValue, E->getDecl(), E->getFieldDecl(),
- CVRQualifiers);
+ return EmitLValueForIvar(BaseValue, E->getDecl(),
+ getContext().getFieldDecl(E), CVRQualifiers);
}
LValue
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index e419a7b959..b8261a0c9f 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -275,9 +275,9 @@ void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
ParmVarDecl *ArgDecl = OMD->getParamDecl(0);
DeclRefExpr Arg(ArgDecl, ArgDecl->getType(), Loc);
ObjCInterfaceDecl *OI = IMP->getClassInterface();
- FieldDecl *FD = OI->lookupFieldDeclForIvar(getContext(), Ivar);
- ObjCIvarRefExpr IvarRef(Ivar, FD, Ivar->getType(), Loc, &Base,
+ ObjCIvarRefExpr IvarRef(Ivar, Ivar->getType(), Loc, &Base,
true, true);
+ getContext().setFieldDecl(OI, Ivar, &IvarRef);
BinaryOperator Assign(&IvarRef, &Arg, BinaryOperator::Assign,
Ivar->getType(), Loc);
EmitStmt(&Assign);
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 096bcbe37b..3ee601faca 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -418,13 +418,14 @@ Sema::ExprResult Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc,
if (SD == 0 || SD->isDefinedOutsideFunctionOrMethod()) {
ObjCInterfaceDecl *IFace = getCurMethodDecl()->getClassInterface();
if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(II)) {
- FieldDecl *FD = IFace->lookupFieldDeclForIvar(Context, IV);
// FIXME: This should use a new expr for a direct reference, don't turn
// this into Self->ivar, just return a BareIVarExpr or something.
IdentifierInfo &II = Context.Idents.get("self");
ExprResult SelfExpr = ActOnIdentifierExpr(S, Loc, II, false);
- return new ObjCIvarRefExpr(IV, FD, IV->getType(), Loc,
- static_cast<Expr*>(SelfExpr.Val), true, true);
+ ObjCIvarRefExpr *MRef= new ObjCIvarRefExpr(IV, IV->getType(), Loc,
+ static_cast<Expr*>(SelfExpr.Val), true, true);
+ Context.setFieldDecl(IFace, IV, MRef);
+ return MRef;
}
}
// Needed to implement property "super.method" notation.
@@ -1266,9 +1267,11 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
// (*Obj).ivar.
if (const ObjCInterfaceType *IFTy = BaseType->getAsObjCInterfaceType()) {
if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member)) {
- FieldDecl *FD = IFTy->getDecl()->lookupFieldDeclForIvar(Context, IV);
- return new ObjCIvarRefExpr(IV, FD, IV->getType(), MemberLoc, BaseExpr,
- OpKind == tok::arrow);
+ ObjCIvarRefExpr *MRef= new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc,
+ BaseExpr,
+ OpKind == tok::arrow);
+ Context.setFieldDecl(IFTy->getDecl(), IV, MRef);
+ return MRef;
}
return Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
<< IFTy->getDecl()->getDeclName() << &Member