diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-03 00:09:52 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-03 00:09:52 +0000 |
commit | c88a70d885cd6dbf6e8bcb4e719407662139dfab (patch) | |
tree | f0b6fc357c6974ebba56e8a9d0b959a1888ffca3 /clang/lib/CodeGen/CGExpr.cpp | |
parent | 76a07f59d4351bb0f26ffb2f0e16b1396774fe73 (diff) | |
download | bcm5719-llvm-c88a70d885cd6dbf6e8bcb4e719407662139dfab.tar.gz bcm5719-llvm-c88a70d885cd6dbf6e8bcb4e719407662139dfab.zip |
objc2's ir-gen for nonfragile ivar access.
llvm-svn: 63578
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 2c16c1940b5..4f8bd46b524 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1020,7 +1020,8 @@ llvm::Value *CodeGenFunction::EmitIvarOffset(ObjCInterfaceDecl *Interface, Offset); } -LValue CodeGenFunction::EmitLValueForIvar(llvm::Value *BaseValue, +LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy, + llvm::Value *BaseValue, const ObjCIvarDecl *Ivar, const FieldDecl *Field, unsigned CVRQualifiers) { @@ -1035,6 +1036,7 @@ LValue CodeGenFunction::EmitLValueForIvar(llvm::Value *BaseValue, CVRQualifiers, Index); } llvm::Value *V = CGM.getObjCRuntime().EmitObjCValueForIvar(*this, + ObjectTy, BaseValue, Ivar, Field, CVRQualifiers); LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers); SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV); @@ -1047,19 +1049,22 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) { llvm::Value *BaseValue = 0; const Expr *BaseExpr = E->getBase(); unsigned CVRQualifiers = 0; + QualType ObjectTy; if (E->isArrow()) { BaseValue = EmitScalarExpr(BaseExpr); const PointerType *PTy = cast<PointerType>(getContext().getCanonicalType(BaseExpr->getType())); - CVRQualifiers = PTy->getPointeeType().getCVRQualifiers(); + ObjectTy = PTy->getPointeeType(); + CVRQualifiers = ObjectTy.getCVRQualifiers(); } else { LValue BaseLV = EmitLValue(BaseExpr); // FIXME: this isn't right for bitfields. BaseValue = BaseLV.getAddress(); - CVRQualifiers = BaseExpr->getType().getCVRQualifiers(); + ObjectTy = BaseExpr->getType(); + CVRQualifiers = ObjectTy.getCVRQualifiers(); } - return EmitLValueForIvar(BaseValue, E->getDecl(), + return EmitLValueForIvar(ObjectTy, BaseValue, E->getDecl(), getContext().getFieldDecl(E), CVRQualifiers); } |