r219696 - CodeGen: correct mangling for blocks

Reid Kleckner rnk at google.com
Tue Oct 14 10:56:58 PDT 2014


On Tue, Oct 14, 2014 at 10:20 AM, Saleem Abdulrasool <compnerd at compnerd.org>
wrote:

> Author: compnerd
> Date: Tue Oct 14 12:20:14 2014
> New Revision: 219696
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219696&view=rev
> Log:
> CodeGen: correct mangling for blocks
>
> This addresses a regression introduced with SVN r219393.  A block may be
> contained within another block.  In such a scenario, we would end up
> within a
> BlockDecl, which is not a NamedDecl (as the names are synthesised).  The
> cast to
> a NamedDecl of the DeclContext would then assert as the types are
> unrelated.
>
> Restore the mangling behaviour to that prior to SVN r219393.  If the
> current
> block is contained within a BlockDecl, walk up to the parent DeclContext,
> recursively, until we have a non-BlockDecl.  This is expected to be a
> NamedDecl.
> Add in a couple of asserts to ensure that the assumption that we only
> encounter
> a block within a NamedDecl or a BlockDecl.
>

What about nested global blocks or blocks in CapturedDecls?

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.


> Added:
>     cfe/trunk/test/CodeGen/mangle-blocks.c
> Modified:
>     cfe/trunk/lib/AST/Mangle.cpp
>
> Modified: cfe/trunk/lib/AST/Mangle.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Mangle.cpp?rev=219696&r1=219695&r2=219696&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/Mangle.cpp (original)
> +++ cfe/trunk/lib/AST/Mangle.cpp Tue Oct 14 12:20:14 2014
> @@ -215,6 +215,12 @@ void MangleContext::mangleBlock(const De
>    if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC)) {
>      mangleObjCMethodName(Method, Stream);
>    } else {
> +    assert((isa<NamedDecl>(DC) || isa<BlockDecl>(DC)) &&
> +           "expected a NamedDecl or BlockDecl");
> +    if (isa<BlockDecl>(DC))
> +      for (; DC && isa<BlockDecl>(DC); DC = DC->getParent())
> +        (void) getBlockId(cast<BlockDecl>(DC), true);
> +    assert(isa<NamedDecl>(DC) && "expected a NamedDecl");
>      const NamedDecl *ND = cast<NamedDecl>(DC);
>      if (!shouldMangleDeclName(ND) && ND->getIdentifier())
>        Stream << ND->getIdentifier()->getName();
>
> Added: cfe/trunk/test/CodeGen/mangle-blocks.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mangle-blocks.c?rev=219696&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/mangle-blocks.c (added)
> +++ cfe/trunk/test/CodeGen/mangle-blocks.c Tue Oct 14 12:20:14 2014
> @@ -0,0 +1,20 @@
> +// RUN: %clang_cc1 -triple i386-apple-ios -fblocks -emit-llvm -o - %s |
> FileCheck %s
> +
> +void __assert_rtn(const char *, const char *, int, const char *)
> +    __attribute__ (( noreturn ));
> +void invoke(void (^)(void));
> +
> +void mangle(void) {
> +  invoke(^{ invoke(^{ __assert_rtn(__func__, __FILE__, __LINE__,
> "mangle"); }); });
> +}
> +
> +// CHECK: @__func__.__mangle_block_invoke_2 = private unnamed_addr
> constant [24 x i8] c"__mangle_block_invoke_2\00", align 1
> +// CHECK: @.str = private unnamed_addr constant {{.*}}, align 1
> +// CHECK: @.str1 = private unnamed_addr constant [7 x i8] c"mangle\00",
> align 1
> +
> +// CHECK: define internal void @__mangle_block_invoke(i8*
> %.block_descriptor)
> +
> +// CHECK: define internal void @__mangle_block_invoke_2(i8*
> %.block_descriptor){{.*}}{
> +// 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))
> +// CHECK: }
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141014/d2905b8b/attachment.html>


More information about the cfe-commits mailing list