diff options
author | John McCall <rjmccall@apple.com> | 2011-07-22 05:23:13 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-07-22 05:23:13 +0000 |
commit | 24fada127fdbc56a83af499ea05d44d2713913f6 (patch) | |
tree | ecae3a6eabd16b2823a6aa0a5cea728d04da5921 /clang/lib/CodeGen/CGObjC.cpp | |
parent | 0410e572b9878c269530a60fe1d195f4e0903489 (diff) | |
download | bcm5719-llvm-24fada127fdbc56a83af499ea05d44d2713913f6.tar.gz bcm5719-llvm-24fada127fdbc56a83af499ea05d44d2713913f6.zip |
In ARC, non-atomic getters do not need to retain and autorelease
their loaded values, although it still worth doing this for __weak
properties to get the autoreleased-return-value optimization.
llvm-svn: 135747
Diffstat (limited to 'clang/lib/CodeGen/CGObjC.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 4beb704d159..fd686cc6a0c 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -465,27 +465,30 @@ void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP, EmitAggregateCopy(ReturnValue, LV.getAddress(), IVART); } } - } - else { - LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), - Ivar, 0); - QualType propType = PD->getType(); + } else { + LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), + Ivar, 0); + QualType propType = PD->getType(); - llvm::Value *value; - if (propType->isReferenceType()) { - value = LV.getAddress(); + llvm::Value *value; + if (propType->isReferenceType()) { + value = LV.getAddress(); + } else { + // We want to load and autoreleaseReturnValue ARC __weak ivars. + if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) { + value = emitARCRetainLoadOfScalar(*this, LV, IVART); + + // Otherwise we want to do a simple load, suppressing the + // final autorelease. } else { - // In ARC, we want to emit this retained. - if (getLangOptions().ObjCAutoRefCount && - PD->getType()->isObjCRetainableType()) - value = emitARCRetainLoadOfScalar(*this, LV, IVART); - else - value = EmitLoadOfLValue(LV).getScalarVal(); - - value = Builder.CreateBitCast(value, ConvertType(propType)); + value = EmitLoadOfLValue(LV).getScalarVal(); + AutoreleaseResult = false; } - EmitReturnOfRValue(RValue::get(value), propType); + value = Builder.CreateBitCast(value, ConvertType(propType)); + } + + EmitReturnOfRValue(RValue::get(value), propType); } } |