aboutsummaryrefslogtreecommitdiff
path: root/unittests/IR/AttributesTest.cpp
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-01-12 01:25:15 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-01-12 01:25:15 +0000
commite8c161a92451ad38919525ea73ae3c6936c24bdf (patch)
tree1a695f9d0bcb9c782436b4beb22561336436da3d /unittests/IR/AttributesTest.cpp
parentec3199f675b17b12fd779df557c6bff25aa4e862 (diff)
Fixed a bug where we were tail calling objc_autorelease causing an object to not be placed into an autorelease pool.
The reason that this occurs is that tail calling objc_autorelease eventually tail calls -[NSObject autorelease] which supports fast autorelease. This can cause us to violate the semantic gaurantees of __autoreleasing variables that assignment to an __autoreleasing variables always yields an object that is placed into the innermost autorelease pool. The fix included in this patch works by: 1. In the peephole optimization function OptimizeIndividualFunctions, always remove tail call from objc_autorelease. 2. Whenever we convert to/from an objc_autorelease, set/unset the tail call keyword as appropriate. *NOTE* I also handled the case where objc_autorelease is converted in OptimizeReturns to an autoreleaseRV which still violates the ARC semantics. I will be removing that in a later patch and I wanted to make sure that the tree is in a consistent state vis-a-vis ARC always. Additionally some test cases are provided and all tests that have tail call marked objc_autorelease keywords have been modified so that tail call has been removed. *NOTE* One test fails due to a separate bug that I am going to commit soon. Thus I marked the check line TMP: instead of CHECK: so make check does not fail. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172287 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/IR/AttributesTest.cpp')
0 files changed, 0 insertions, 0 deletions