From 735a4158d96dfbda71e0ecc275755fafe56a40f1 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 21 Nov 2008 18:14:01 +0000 Subject: [PATCH] Fields of ivars of struct types are considered ivars themselves for gc API generation purposes. llvm-svn: 59828 --- clang/lib/CodeGen/CGExpr.cpp | 9 +++++++-- clang/lib/CodeGen/CGValue.h | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 21ac806c6242..4f2bd4871b81 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -732,6 +732,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { bool isUnion = false; + bool isIvar = false; Expr *BaseExpr = E->getBase(); llvm::Value *BaseValue = NULL; unsigned CVRQualifiers=0; @@ -747,6 +748,8 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { } else { LValue BaseLV = EmitLValue(BaseExpr); + if (BaseLV.isObjCIvar()) + isIvar = true; // FIXME: this isn't right for bitfields. BaseValue = BaseLV.getAddress(); if (BaseExpr->getType()->isUnionType()) @@ -755,7 +758,9 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { } FieldDecl *Field = E->getMemberDecl(); - return EmitLValueForField(BaseValue, Field, isUnion, CVRQualifiers); + LValue MemExpLV = EmitLValueForField(BaseValue, Field, isUnion, CVRQualifiers); + LValue::SetObjCIvar(MemExpLV, isIvar); + return MemExpLV; } LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, @@ -937,7 +942,7 @@ LValue CodeGenFunction::EmitLValueForIvar(llvm::Value *BaseValue, llvm::Value *V = Builder.CreateStructGEP(BaseValue, Index, "tmp"); LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers); SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV); - LValue::SetObjCIvar(LV); + LValue::SetObjCIvar(LV, true); return LV; } diff --git a/clang/lib/CodeGen/CGValue.h b/clang/lib/CodeGen/CGValue.h index 3cf5d4a7d93c..59cfc54c9d80 100644 --- a/clang/lib/CodeGen/CGValue.h +++ b/clang/lib/CodeGen/CGValue.h @@ -168,8 +168,8 @@ public: bool isObjCWeak() const { return ObjCType == Weak; } bool isObjCStrong() const { return ObjCType == Strong; } - static void SetObjCIvar(LValue& R) { - R.Ivar = true; + static void SetObjCIvar(LValue& R, bool iValue) { + R.Ivar = iValue; } static void SetObjCType(bool isWeak, bool isStrong, LValue& R) {