From 09c84f13c6662e680f86e16f2474adf6177cf52f Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 16 Jan 2013 06:32:39 +0000 Subject: [PATCH] [ObjCARC] Turn off ignoring unwind edges in ObjCARC when -fno-objc-arc-exception is enabled due to it's affect on correctness. Specifically according to the semantics of ARC -fno-objc-arc-exception simply states that it is expected that the unwind path out of a call *MAY* not release objects. Thus we can have the situation where a release gets moved into a catch block which we ignore when we remove a retain/release pair resulting in (even though we assume the program is exiting anyways) the cleanup code path potentially blowing up before program exit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172599 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/ObjCARC.cpp | 33 ------------------------------- 1 file changed, 33 deletions(-) diff --git a/lib/Transforms/Scalar/ObjCARC.cpp b/lib/Transforms/Scalar/ObjCARC.cpp index abd6b4185f6..8da87267665 100644 --- a/lib/Transforms/Scalar/ObjCARC.cpp +++ b/lib/Transforms/Scalar/ObjCARC.cpp @@ -2675,17 +2675,6 @@ ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB, PtrState &S = I->second; succ_const_iterator SI(TI), SE(TI, false); - // If the terminator is an invoke marked with the - // clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be - // ignored, for ARC purposes. - if (isa(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) { - DEBUG(dbgs() << "ObjCARCOpt::CheckForCFGHazards: Found an invoke " - "terminator marked with " - "clang.arc.no_objc_arc_exceptions. Ignoring unwind " - "edge.\n"); - --SE; - } - for (; SI != SE; ++SI) { Sequence SuccSSeq = S_None; bool SuccSRRIKnownSafe = false; @@ -2734,17 +2723,6 @@ ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB, PtrState &S = I->second; succ_const_iterator SI(TI), SE(TI, false); - // If the terminator is an invoke marked with the - // clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be - // ignored, for ARC purposes. - if (isa(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) { - DEBUG(dbgs() << "ObjCARCOpt::CheckForCFGHazards: Found an invoke " - "terminator marked with " - "clang.arc.no_objc_arc_exceptions. Ignoring unwind " - "edge.\n"); - --SE; - } - for (; SI != SE; ++SI) { Sequence SuccSSeq = S_None; bool SuccSRRIKnownSafe = false; @@ -3199,17 +3177,6 @@ ComputePostOrders(Function &F, TerminatorInst *TI = cast(&CurrBB->back()); succ_iterator SE(TI, false); - // If the terminator is an invoke marked with the - // clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be - // ignored, for ARC purposes. - if (isa(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) { - DEBUG(dbgs() << "ObjCARCOpt::ComputePostOrders: Found an invoke " - "terminator marked with " - "clang.arc.no_objc_arc_exceptions. Ignoring unwind " - "edge.\n"); - --SE; - } - while (SuccStack.back().second != SE) { BasicBlock *SuccBB = *SuccStack.back().second++; if (Visited.insert(SuccBB)) {