mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[objc-arc] Turn off the objc_retainBlock -> objc_retain optimization.
The reason that I am turning off this optimization is that there is an additional case where a block can escape that has come up. Specifically, this occurs when a block is used in a scope outside of its current scope. This can cause a captured retainable object pointer whose life is preserved by the objc_retainBlock to be deallocated before the block is invoked. An example of the code needed to trigger the bug is: ---- \#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { void (^somethingToDoLater)(); { NSObject *obj = [NSObject new]; somethingToDoLater = ^{ [obj self]; // Crashes here }; } NSLog(@"test."); somethingToDoLater(); return 0; } ---- In the next commit, I remove all the dead code that results from this. Once I put in the fixing commit I will bring back the tests that I deleted in this commit. rdar://14802782. rdar://14868830. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189869 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1510,11 +1510,6 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IC_RetainBlock:
|
||||
// If we strength reduce an objc_retainBlock to an objc_retain, continue
|
||||
// onto the objc_retain peephole optimizations. Otherwise break.
|
||||
OptimizeRetainBlockCall(F, Inst, Class);
|
||||
break;
|
||||
case IC_RetainRV:
|
||||
if (OptimizeRetainRVCall(F, Inst))
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user