From 38e1627e895cd276186ebf177f75ba5d229c3fd7 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Wed, 21 Oct 2009 22:01:24 +0000 Subject: [PATCH] Refine collection of BlockDeclRefExprs. WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84787 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 4 ++-- lib/CodeGen/CGBlocks.cpp | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 4a0df6bf02..42a6704d8a 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2757,8 +2757,8 @@ QualType ASTContext::BuildByRefType(const char *DeclName, QualType Ty) { // struct __Block_byref_1_X *__forwarding; // unsigned int __flags; // unsigned int __size; - // void *__copy_helper; - // void *__destroy_helper; + // void *__copy_helper; // as needed + // void *__destroy_help // as needed // int X; // } * diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index af64fd5546..08c45874a3 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -73,24 +73,29 @@ llvm::Constant *BlockModule::getNSConcreteStackBlock() { return NSConcreteStackBlock; } -static void CollectBlockDeclRefInfo(const Stmt *S, - CodeGenFunction::BlockInfo &Info) { +static void CollectBlockDeclRefInfo( + const Stmt *S, CodeGenFunction::BlockInfo &Info, + llvm::SmallSet &InnerContexts) { for (Stmt::const_child_iterator I = S->child_begin(), E = S->child_end(); I != E; ++I) if (*I) - CollectBlockDeclRefInfo(*I, Info); + CollectBlockDeclRefInfo(*I, Info, InnerContexts); // We want to ensure we walk down into block literals so we can find // all nested BlockDeclRefExprs. - if (const BlockExpr *BE = dyn_cast(S)) - CollectBlockDeclRefInfo(BE->getBody(), Info); + if (const BlockExpr *BE = dyn_cast(S)) { + InnerContexts.insert(cast(BE->getBlockDecl())); + CollectBlockDeclRefInfo(BE->getBody(), Info, InnerContexts); + } - if (const BlockDeclRefExpr *DE = dyn_cast(S)) { + if (const BlockDeclRefExpr *BDRE = dyn_cast(S)) { // FIXME: Handle enums. - if (isa(DE->getDecl())) + if (isa(BDRE->getDecl())) return; - Info.DeclRefs.push_back(DE); + // Only Decls that escape are added. + if (!InnerContexts.count(BDRE->getDecl()->getDeclContext())) + Info.DeclRefs.push_back(BDRE); } } @@ -130,7 +135,9 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { std::string Name = CurFn->getName(); CodeGenFunction::BlockInfo Info(0, Name.c_str()); - CollectBlockDeclRefInfo(BE->getBody(), Info); + llvm::SmallSet InnerContexts; + InnerContexts.insert(BE->getBlockDecl()); + CollectBlockDeclRefInfo(BE->getBody(), Info, InnerContexts); // Check if the block can be global. // FIXME: This test doesn't work for nested blocks yet. Longer term, I'd like -- 2.50.1