diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-12-18 17:29:46 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-12-18 17:29:46 +0000 |
commit | efc4c4bdbd8fee90b93deb3b5cfaeb044ae22557 (patch) | |
tree | ed661077147ecc42999eec82a78377928ee84ad2 | |
parent | d8df6823420c22329a2a9aacd2a440368d38d86c (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.h | 15 | ||||
-rw-r--r-- | include/clang/AST/ExprObjC.h | 7 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 10 | ||||
-rw-r--r-- | lib/AST/StmtSerialization.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGObjC.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 15 |
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 |