diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-01-16 06:32:39 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-01-16 06:32:39 +0000 |
commit | 09c84f13c6662e680f86e16f2474adf6177cf52f (patch) | |
tree | e0fcf773d98019069dd5195c86836adf9de61e67 /lib/Transforms/Scalar | |
parent | 457ee1a12e2c52624af7fdb81cf938f6d8d96572 (diff) | |
download | external_llvm-09c84f13c6662e680f86e16f2474adf6177cf52f.zip external_llvm-09c84f13c6662e680f86e16f2474adf6177cf52f.tar.gz external_llvm-09c84f13c6662e680f86e16f2474adf6177cf52f.tar.bz2 |
[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
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/ObjCARC.cpp | 33 |
1 files changed, 0 insertions, 33 deletions
diff --git a/lib/Transforms/Scalar/ObjCARC.cpp b/lib/Transforms/Scalar/ObjCARC.cpp index abd6b41..8da8726 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<InvokeInst>(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<InvokeInst>(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<TerminatorInst>(&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<InvokeInst>(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)) { |