diff options
author | John McCall <rjmccall@apple.com> | 2011-07-12 16:41:08 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-07-12 16:41:08 +0000 |
commit | 4bd0fb1f09656a71bfa774ac446b03206990dad7 (patch) | |
tree | 340758044899ebde6842f0031ecce7e7335dcf41 /clang/lib/CodeGen/CGExpr.cpp | |
parent | 992a2856f5a9455e60d454458cb9f12bc4bf1ae4 (diff) | |
download | bcm5719-llvm-4bd0fb1f09656a71bfa774ac446b03206990dad7.tar.gz bcm5719-llvm-4bd0fb1f09656a71bfa774ac446b03206990dad7.zip |
Switch field destruction over to use the new destroyer-based API
and kill a lot of redundant code.
llvm-svn: 134988
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index dd238c17151..90bdd5caf6c 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -283,19 +283,24 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E, case Qualifiers::OCL_Autoreleasing: break; - case Qualifiers::OCL_Strong: - CGF.PushARCReleaseCleanup(CGF.getARCCleanupKind(), - ObjCARCReferenceLifetimeType, - ReferenceTemporary, - /*Precise lifetime=*/false, - /*For full expression=*/true); + case Qualifiers::OCL_Strong: { + assert(!ObjCARCReferenceLifetimeType->isArrayType()); + CleanupKind cleanupKind = CGF.getARCCleanupKind(); + CGF.pushDestroy(cleanupKind, + ReferenceTemporary, + ObjCARCReferenceLifetimeType, + CodeGenFunction::destroyARCStrongImprecise, + cleanupKind & EHCleanup); break; + } case Qualifiers::OCL_Weak: - CGF.PushARCWeakReleaseCleanup(NormalAndEHCleanup, - ObjCARCReferenceLifetimeType, - ReferenceTemporary, - /*For full expression=*/true); + assert(!ObjCARCReferenceLifetimeType->isArrayType()); + CGF.pushDestroy(NormalAndEHCleanup, + ReferenceTemporary, + ObjCARCReferenceLifetimeType, + CodeGenFunction::destroyARCWeak, + /*useEHCleanupForArray*/ true); break; } @@ -467,18 +472,21 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E, // Nothing to do. break; - case Qualifiers::OCL_Strong: - PushARCReleaseCleanup(getARCCleanupKind(), ObjCARCReferenceLifetimeType, - ReferenceTemporary, - VD && VD->hasAttr<ObjCPreciseLifetimeAttr>()); + case Qualifiers::OCL_Strong: { + bool precise = VD && VD->hasAttr<ObjCPreciseLifetimeAttr>(); + CleanupKind cleanupKind = getARCCleanupKind(); + pushDestroy(cleanupKind, ReferenceTemporary, + ObjCARCReferenceLifetimeType, + precise ? destroyARCStrongPrecise : destroyARCStrongImprecise, + cleanupKind & EHCleanup); break; + } case Qualifiers::OCL_Weak: // __weak objects always get EH cleanups; otherwise, exceptions // could cause really nasty crashes instead of mere leaks. - PushARCWeakReleaseCleanup(NormalAndEHCleanup, - ObjCARCReferenceLifetimeType, - ReferenceTemporary); + pushDestroy(NormalAndEHCleanup, ReferenceTemporary, + ObjCARCReferenceLifetimeType, destroyARCWeak, true); break; } } |