summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorMehdi Amini <mehdi.amini@apple.com>2016-11-16 07:07:28 +0000
committerMehdi Amini <mehdi.amini@apple.com>2016-11-16 07:07:28 +0000
commitdc9bf8fab6365af788976edddfc8221eceecaccb (patch)
treea1f6c8d9ceb7c895f5df00ba3850847c050545fa /clang/test
parent844ab6a0126a6379712e1db5c3c3a93653022f99 (diff)
downloadbcm5719-llvm-dc9bf8fab6365af788976edddfc8221eceecaccb.tar.gz
bcm5719-llvm-dc9bf8fab6365af788976edddfc8221eceecaccb.zip
Improve handling of __FUNCTION__ and other predefined expression for Objective-C Blocks
Instead of always displaying the mangled name, try to do better and get something closer to regular functions. Recommit r287039 (that was reverted in r287039) with a tweak to be more generic, and test fixes! Differential Revision: https://reviews.llvm.org/D26522 llvm-svn: 287085
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGen/block-with-perdefinedexpr.cpp87
-rw-r--r--clang/test/CodeGen/func-in-block.c4
-rw-r--r--clang/test/CodeGen/mangle-blocks.c4
-rw-r--r--clang/test/CodeGenCXX/predefined-expr-cxx14.cpp4
-rw-r--r--clang/test/CodeGenObjC/mangle-blocks.m5
-rw-r--r--clang/test/SemaCXX/predefined-expr.cpp18
6 files changed, 103 insertions, 19 deletions
diff --git a/clang/test/CodeGen/block-with-perdefinedexpr.cpp b/clang/test/CodeGen/block-with-perdefinedexpr.cpp
new file mode 100644
index 00000000000..890c2d63585
--- /dev/null
+++ b/clang/test/CodeGen/block-with-perdefinedexpr.cpp
@@ -0,0 +1,87 @@
+// RUN: %clang_cc1 %s -emit-llvm -o - -fblocks -triple x86_64-apple-darwin10 -std=c++11 | FileCheck %s
+
+void bar() {
+ // CHECK-DAG: @__FUNCTION__.___Z3barv_block_invoke = private unnamed_addr constant [17 x i8] c"bar_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __FUNCTION__;
+ };
+ // CHECK-DAG: @__FUNCTION__.___Z3barv_block_invoke_2 = private unnamed_addr constant [19 x i8] c"bar_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __FUNCTION__;
+ };
+}
+
+void baz() {
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___Z3bazv_block_invoke = private unnamed_addr constant [24 x i8] c"void baz()_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___Z3bazv_block_invoke_2 = private unnamed_addr constant [26 x i8] c"void baz()_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+}
+
+namespace foonamespace {
+class Foo {
+public:
+ Foo() {
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZN12foonamespace3FooC2Ev_block_invoke = private unnamed_addr constant [38 x i8] c"foonamespace::Foo::Foo()_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZN12foonamespace3FooC2Ev_block_invoke_2 = private unnamed_addr constant [40 x i8] c"foonamespace::Foo::Foo()_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__func__.___ZN12foonamespace3FooC2Ev_block_invoke_3 = private unnamed_addr constant [19 x i8] c"Foo_block_invoke_3\00", align 1
+ const char * (^block3)() = ^() {
+ return __func__;
+ };
+ bar();
+ inside_lambda();
+ }
+ ~Foo() {
+ // CHECK-DAG: @__func__.___ZN12foonamespace3FooD2Ev_block_invoke = private unnamed_addr constant [18 x i8] c"~Foo_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __func__;
+ };
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZN12foonamespace3FooD2Ev_block_invoke_2 = private unnamed_addr constant [41 x i8] c"foonamespace::Foo::~Foo()_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ }
+ void bar() {
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZN12foonamespace3Foo3barEv_block_invoke = private unnamed_addr constant [43 x i8] c"void foonamespace::Foo::bar()_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZN12foonamespace3Foo3barEv_block_invoke_2 = private unnamed_addr constant [45 x i8] c"void foonamespace::Foo::bar()_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__func__.___ZN12foonamespace3Foo3barEv_block_invoke_3 = private unnamed_addr constant [19 x i8] c"bar_block_invoke_3\00", align 1
+ const char * (^block3)() = ^() {
+ return __func__;
+ };
+ }
+ void inside_lambda() {
+ auto lambda = []() {
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZZN12foonamespace3Foo13inside_lambdaEvENKUlvE_clEv_block_invoke = private unnamed_addr constant [92 x i8] c"auto foonamespace::Foo::inside_lambda()::(anonymous class)::operator()() const_block_invoke\00", align 1
+ const char * (^block1)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__PRETTY_FUNCTION__.___ZZN12foonamespace3Foo13inside_lambdaEvENKUlvE_clEv_block_invoke_2 = private unnamed_addr constant [94 x i8] c"auto foonamespace::Foo::inside_lambda()::(anonymous class)::operator()() const_block_invoke_2\00", align 1
+ const char * (^block2)() = ^() {
+ return __PRETTY_FUNCTION__;
+ };
+ // CHECK-DAG: @__func__.___ZZN12foonamespace3Foo13inside_lambdaEvENKUlvE_clEv_block_invoke_3 = private unnamed_addr constant [26 x i8] c"operator()_block_invoke_3\00", align 1
+ const char * (^block3)() = ^() {
+ return __func__;
+ };
+ };
+ lambda();
+ }
+};
+Foo f;
+}
diff --git a/clang/test/CodeGen/func-in-block.c b/clang/test/CodeGen/func-in-block.c
index 503695f8c37..937390c1cdb 100644
--- a/clang/test/CodeGen/func-in-block.c
+++ b/clang/test/CodeGen/func-in-block.c
@@ -15,5 +15,5 @@ int main()
return 0; // not reached
}
-// CHECK: @__func__.__main_block_invoke = private unnamed_addr constant [20 x i8] c"__main_block_invoke\00"
-// CHECK: call void @PRINTF({{.*}}@__func__.__main_block_invoke
+// CHECK: @__func__.__main_block_invoke = private unnamed_addr constant [18 x i8] c"main_block_invoke\00"
+// CHECK: call void @PRINTF({{.*}}@__func__.__main_block_invoke
diff --git a/clang/test/CodeGen/mangle-blocks.c b/clang/test/CodeGen/mangle-blocks.c
index 0023f53b349..e8de92d8b40 100644
--- a/clang/test/CodeGen/mangle-blocks.c
+++ b/clang/test/CodeGen/mangle-blocks.c
@@ -11,13 +11,13 @@ void (^mangle(void))(void) {
};
}
-// CHECK: @__func__.__mangle_block_invoke_2 = private unnamed_addr constant [24 x i8] c"__mangle_block_invoke_2\00", align 1
+// CHECK: @__func__.__mangle_block_invoke_2 = private unnamed_addr constant [22 x i8] c"mangle_block_invoke_2\00", align 1
// CHECK: @.str = private unnamed_addr constant {{.*}}, align 1
// CHECK: @.str.1 = 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], [24 x i8]* @__func__.__mangle_block_invoke_2, i32 0, i32 0), i8* getelementptr inbounds {{.*}}, i32 9, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0))
+// CHECK: call void @__assert_rtn(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @__func__.__mangle_block_invoke_2, i32 0, i32 0), i8* getelementptr inbounds {{.*}}, i32 9, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0))
// CHECK: }
diff --git a/clang/test/CodeGenCXX/predefined-expr-cxx14.cpp b/clang/test/CodeGenCXX/predefined-expr-cxx14.cpp
index 1f035757dea..dd531e3112b 100644
--- a/clang/test/CodeGenCXX/predefined-expr-cxx14.cpp
+++ b/clang/test/CodeGenCXX/predefined-expr-cxx14.cpp
@@ -17,8 +17,8 @@
// CHECK-DAG: @__func__._ZN24ClassInTopLevelNamespace25topLevelNamespaceFunctionEv = private unnamed_addr constant [26 x i8] c"topLevelNamespaceFunction\00"
// CHECK-DAG: @__PRETTY_FUNCTION__._ZN24ClassInTopLevelNamespace25topLevelNamespaceFunctionEv = private unnamed_addr constant [60 x i8] c"auto *ClassInTopLevelNamespace::topLevelNamespaceFunction()\00"
-// CHECK-DAG: @__func__.___ZN16ClassBlockConstrD2Ev_block_invoke = private unnamed_addr constant [41 x i8] c"___ZN16ClassBlockConstrD2Ev_block_invoke\00"
-// CHECK-DAG: @__func__.___ZN16ClassBlockConstrC2Ev_block_invoke = private unnamed_addr constant [41 x i8] c"___ZN16ClassBlockConstrC2Ev_block_invoke\00"
+// CHECK-DAG: @__func__.___ZN16ClassBlockConstrD2Ev_block_invoke = private unnamed_addr constant [31 x i8] c"~ClassBlockConstr_block_invoke\00"
+// CHECK-DAG: @__func__.___ZN16ClassBlockConstrC2Ev_block_invoke = private unnamed_addr constant [30 x i8] c"ClassBlockConstr_block_invoke\00"
int printf(const char * _Format, ...);
diff --git a/clang/test/CodeGenObjC/mangle-blocks.m b/clang/test/CodeGenObjC/mangle-blocks.m
index 3d6e56a1501..4cc32040332 100644
--- a/clang/test/CodeGenObjC/mangle-blocks.m
+++ b/clang/test/CodeGenObjC/mangle-blocks.m
@@ -17,13 +17,12 @@ void __assert_rtn(const char *, const char *, int, const char *);
}
@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: @"__func__.__14-[Test mangle]_block_invoke_2" = private unnamed_addr constant [30 x i8] c"-[Test mangle]_block_invoke_2\00", align 1
// CHECK: @.str = private unnamed_addr constant {{.*}}, align 1
// CHECK: @.str.1 = 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], [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], [7 x i8]* @.str.1, i32 0, i32 0))
+// CHECK: call void @__assert_rtn(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @"__func__.__14-[Test mangle]_block_invoke_2", i32 0, i32 0), i8* getelementptr inbounds {{.*}}, i32 14, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0))
// CHECK: }
-
diff --git a/clang/test/SemaCXX/predefined-expr.cpp b/clang/test/SemaCXX/predefined-expr.cpp
index f4a155da667..8cba0d41a29 100644
--- a/clang/test/SemaCXX/predefined-expr.cpp
+++ b/clang/test/SemaCXX/predefined-expr.cpp
@@ -33,11 +33,10 @@ int baz() {
();
^{
- static_assert(sizeof(__func__) == 27, "___Z3bazIiEiv_block_invoke");
- static_assert(sizeof(__FUNCTION__) == 27, "___Z3bazIiEiv_block_invoke");
- static_assert(sizeof(__PRETTY_FUNCTION__) == 27, "___Z3bazIiEiv_block_invoke");
- }
- ();
+ static_assert(sizeof(__func__) == 17, "baz_block_invoke");
+ static_assert(sizeof(__FUNCTION__) == 17, "baz_block_invoke");
+ static_assert(sizeof(__PRETTY_FUNCTION__) == 33, "int baz() [T = int]_block_invoke");
+ }();
#pragma clang __debug captured
{
@@ -64,11 +63,10 @@ int main() {
();
^{
- static_assert(sizeof(__func__) == 20, "__main_block_invoke");
- static_assert(sizeof(__FUNCTION__) == 20, "__main_block_invoke");
- static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "__main_block_invoke");
- }
- ();
+ static_assert(sizeof(__func__) == 18, "main_block_invoke");
+ static_assert(sizeof(__FUNCTION__) == 18, "main_block_invoke");
+ static_assert(sizeof(__PRETTY_FUNCTION__) == 24, "int main()_block_invoke");
+ }();
#pragma clang __debug captured
{
OpenPOWER on IntegriCloud