diff options
author | John McCall <rjmccall@apple.com> | 2011-11-10 10:43:54 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-11-10 10:43:54 +0000 |
commit | 6f103ba42cb69d50005a977c5ea583984ab63fc4 (patch) | |
tree | ebadb2d10dc505112b39803e795db603c221e178 /lib/CodeGen/CGBlocks.cpp | |
parent | 3fe0aad1a6f692f691b8f953a7d079f49dfac314 (diff) |
Whenever explicitly activating or deactivating a cleanup, we
need to provide a 'dominating IP' which is guaranteed to
dominate the (de)activation point but which cannot be avoided
along any execution path from the (de)activation point to
the push-point of the cleanup. Using the entry block is
bad mojo.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144276 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 9825c1ea69..e713492cc0 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -27,7 +27,8 @@ using namespace CodeGen; CGBlockInfo::CGBlockInfo(const BlockDecl *block, StringRef name) : Name(name), CXXThisIndex(0), CanBeGlobal(false), NeedsCopyDispose(false), - HasCXXObject(false), UsesStret(false), StructureType(0), Block(block) { + HasCXXObject(false), UsesStret(false), StructureType(0), Block(block), + DominatingIP(0) { // Skip asm prefix, if any. 'name' is usually taken directly from // the mangled name of the enclosing function. @@ -541,6 +542,10 @@ static void enterBlockScope(CodeGenFunction &CGF, BlockDecl *block) { llvm::Value *addr = CGF.Builder.CreateStructGEP(blockInfo.Address, capture.getIndex()); + // We can use that GEP as the dominating IP. + if (!blockInfo.DominatingIP) + blockInfo.DominatingIP = cast<llvm::Instruction>(addr); + CleanupKind cleanupKind = InactiveNormalCleanup; bool useArrayEHCleanup = CGF.needsEHCleanup(dtorKind); if (useArrayEHCleanup) @@ -749,7 +754,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) { if (!ci->isByRef()) { EHScopeStack::stable_iterator cleanup = capture.getCleanup(); if (cleanup.isValid()) - ActivateCleanupBlock(cleanup); + ActivateCleanupBlock(cleanup, blockInfo.DominatingIP); } } |