r219697 - CodeGen: correct block mangling in ObjC

Saleem Abdulrasool compnerd at compnerd.org
Tue Oct 14 10:20:18 PDT 2014


Author: compnerd
Date: Tue Oct 14 12:20:18 2014
New Revision: 219697

URL: http://llvm.org/viewvc/llvm-project?rev=219697&view=rev
Log:
CodeGen: correct block mangling in ObjC

Mangling for blocks defined within blocks in an ObjectiveC context were also
broken by SVN r219393.  Because the code in mangleName assumed that the code was
either C or C++, we would trigger assertions when trying to mangle the inner
blocks in an ObjectiveC context.

Add a test and use the ObjectiveC specific mangling when dealing with an
ObjectiveC method declaration.

Added:
    cfe/trunk/test/CodeGenObjC/mangle-blocks.m
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=219697&r1=219696&r2=219697&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Mangle.cpp (original)
+++ cfe/trunk/lib/AST/Mangle.cpp Tue Oct 14 12:20:18 2014
@@ -135,7 +135,10 @@ void MangleContext::mangleName(const Nam
   bool MCXX = shouldMangleCXXName(D);
   const TargetInfo &TI = Context.getTargetInfo();
   if (CC == SOF_OTHER || (MCXX && TI.getCXXABI() == TargetCXXABI::Microsoft)) {
-    mangleCXXName(D, Out);
+    if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))
+      mangleObjCMethodName(OMD, Out);
+    else
+      mangleCXXName(D, Out);
     return;
   }
 
@@ -147,6 +150,8 @@ void MangleContext::mangleName(const Nam
 
   if (!MCXX)
     Out << D->getIdentifier()->getName();
+  else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))
+    mangleObjCMethodName(OMD, Out);
   else
     mangleCXXName(D, Out);
 

Added: cfe/trunk/test/CodeGenObjC/mangle-blocks.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/mangle-blocks.m?rev=219697&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/mangle-blocks.m (added)
+++ cfe/trunk/test/CodeGenObjC/mangle-blocks.m Tue Oct 14 12:20:18 2014
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple i386-apple-ios -fblocks -emit-llvm -o - %s -Wno-objc-root-class \
+// RUN:   | FileCheck %s
+
+void __assert_rtn(const char *, const char *, int, const char *);
+
+ at interface Test
+- (void (^)(void)) mangle;
+ at end
+
+ at implementation Test
+- (void (^)(void)) mangle {
+  return ^() {
+    void (^b)(void) = ^() {
+      __assert_rtn(__func__, __FILE__, __LINE__, "mangle");
+    };
+  };
+}
+ at end
+
+// CHECK: @"__func__.__14-[Test mangle]_block_invoke_2" = private unnamed_addr constant [34 x i8] c"__14-[Test 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 @"__14-[Test mangle]_block_invoke"(i8* %.block_descriptor)
+
+// CHECK: define internal void @"__14-[Test mangle]_block_invoke_2"(i8* %.block_descriptor){{.*}}{
+// CHECK: call void @__assert_rtn(i8* getelementptr inbounds ([34 x i8]* @"__func__.__14-[Test mangle]_block_invoke_2", i32 0, i32 0), i8* getelementptr inbounds {{.*}}, i32 14, i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0))
+// CHECK: }
+





More information about the cfe-commits mailing list