<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 14, 2014 at 10:20 AM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Tue Oct 14 12:20:14 2014<br>
New Revision: 219696<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=219696&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=219696&view=rev</a><br>
Log:<br>
CodeGen: correct mangling for blocks<br>
<br>
This addresses a regression introduced with SVN r219393.  A block may be<br>
contained within another block.  In such a scenario, we would end up within a<br>
BlockDecl, which is not a NamedDecl (as the names are synthesised).  The cast to<br>
a NamedDecl of the DeclContext would then assert as the types are unrelated.<br>
<br>
Restore the mangling behaviour to that prior to SVN r219393.  If the current<br>
block is contained within a BlockDecl, walk up to the parent DeclContext,<br>
recursively, until we have a non-BlockDecl.  This is expected to be a NamedDecl.<br>
Add in a couple of asserts to ensure that the assumption that we only encounter<br>
a block within a NamedDecl or a BlockDecl.<br></blockquote><div><br></div><div>What about nested global blocks or blocks in CapturedDecls?</div><div><br></div><div>Also, I don't think we need distinct manglings for blocks in different Ctor variants. We can probably significantly simplify the API if we always mangle the block using the "base" variant of the ctor/dtor.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Added:<br>
    cfe/trunk/test/CodeGen/mangle-blocks.c<br>
Modified:<br>
    cfe/trunk/lib/AST/Mangle.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/Mangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Mangle.cpp?rev=219696&r1=219695&r2=219696&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Mangle.cpp?rev=219696&r1=219695&r2=219696&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/Mangle.cpp (original)<br>
+++ cfe/trunk/lib/AST/Mangle.cpp Tue Oct 14 12:20:14 2014<br>
@@ -215,6 +215,12 @@ void MangleContext::mangleBlock(const De<br>
   if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC)) {<br>
     mangleObjCMethodName(Method, Stream);<br>
   } else {<br>
+    assert((isa<NamedDecl>(DC) || isa<BlockDecl>(DC)) &&<br>
+           "expected a NamedDecl or BlockDecl");<br>
+    if (isa<BlockDecl>(DC))<br>
+      for (; DC && isa<BlockDecl>(DC); DC = DC->getParent())<br>
+        (void) getBlockId(cast<BlockDecl>(DC), true);<br>
+    assert(isa<NamedDecl>(DC) && "expected a NamedDecl");<br>
     const NamedDecl *ND = cast<NamedDecl>(DC);<br>
     if (!shouldMangleDeclName(ND) && ND->getIdentifier())<br>
       Stream << ND->getIdentifier()->getName();<br>
<br>
Added: cfe/trunk/test/CodeGen/mangle-blocks.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mangle-blocks.c?rev=219696&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mangle-blocks.c?rev=219696&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/mangle-blocks.c (added)<br>
+++ cfe/trunk/test/CodeGen/mangle-blocks.c Tue Oct 14 12:20:14 2014<br>
@@ -0,0 +1,20 @@<br>
+// RUN: %clang_cc1 -triple i386-apple-ios -fblocks -emit-llvm -o - %s | FileCheck %s<br>
+<br>
+void __assert_rtn(const char *, const char *, int, const char *)<br>
+    __attribute__ (( noreturn ));<br>
+void invoke(void (^)(void));<br>
+<br>
+void mangle(void) {<br>
+  invoke(^{ invoke(^{ __assert_rtn(__func__, __FILE__, __LINE__, "mangle"); }); });<br>
+}<br>
+<br>
+// CHECK: @__func__.__mangle_block_invoke_2 = private unnamed_addr constant [24 x i8] c"__mangle_block_invoke_2\00", align 1<br>
+// CHECK: @.str = private unnamed_addr constant {{.*}}, align 1<br>
+// CHECK: @.str1 = private unnamed_addr constant [7 x i8] c"mangle\00", align 1<br>
+<br>
+// CHECK: define internal void @__mangle_block_invoke(i8* %.block_descriptor)<br>
+<br>
+// CHECK: define internal void @__mangle_block_invoke_2(i8* %.block_descriptor){{.*}}{<br>
+// CHECK:   call void @__assert_rtn(i8* getelementptr inbounds ([24 x i8]* @__func__.__mangle_block_invoke_2, i32 0, i32 0), i8* getelementptr inbounds {{.*}}, i32 8, i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0))<br>
+// CHECK: }<br>
+<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>