diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-21 18:14:01 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-21 18:14:01 +0000 |
commit | 735a4158d96dfbda71e0ecc275755fafe56a40f1 (patch) | |
tree | cd86d4c02a3282bfb7b2ffce0adf695735616722 /clang/lib/CodeGen/CGExpr.cpp | |
parent | 09075a99e090173dbab66d85adf39222e253929f (diff) | |
download | bcm5719-llvm-735a4158d96dfbda71e0ecc275755fafe56a40f1.tar.gz bcm5719-llvm-735a4158d96dfbda71e0ecc275755fafe56a40f1.zip |
Fields of ivars of struct types are considered ivars
themselves for gc API generation purposes.
llvm-svn: 59828
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 21ac806c624..4f2bd4871b8 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; } |