
Clang is generating different mangled names for the same lambda function in slightly changed builds (like with non-related source/Macro change). This is due to the fact that clang uses a cross-translation-unit sequential string "$_<n>" in lambda's mangled name. Here, "n" is the AnonStructIds field in MangleContext. Different mangled names for a unchanged function is undesirable: it makes perf comparison harder, and can cause some unnecessary profile mismatch in SampleFDO. This patch makes mangled name for lambda functions more stable by changing AnonStructIds to a per-function based seq number if the DeclContext is a function. Differential Revision: https://reviews.llvm.org/D136397
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
// RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \
|
|
// RUN: -Werror=unknown-attributes \
|
|
// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-NOM
|
|
// RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \
|
|
// RUN: -Werror=unknown-attributes -mfunction-return=keep \
|
|
// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-KEEP
|
|
// RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \
|
|
// RUN: -Werror=unknown-attributes -mfunction-return=thunk-extern \
|
|
// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-EXTERN
|
|
|
|
int foo(void) {
|
|
// CHECK: @"_ZZ3foovENK3$_0clEv"({{.*}}) [[NOATTR:#[0-9]+]]
|
|
return []() {
|
|
return 42;
|
|
}();
|
|
}
|
|
int bar(void) {
|
|
// CHECK: @"_ZZ3barvENK3$_0clEv"({{.*}}) [[EXTERN:#[0-9]+]]
|
|
return []() __attribute__((function_return("thunk-extern"))) {
|
|
return 42;
|
|
}
|
|
();
|
|
}
|
|
int baz(void) {
|
|
// CHECK: @"_ZZ3bazvENK3$_0clEv"({{.*}}) [[KEEP:#[0-9]+]]
|
|
return []() __attribute__((function_return("keep"))) {
|
|
return 42;
|
|
}
|
|
();
|
|
}
|
|
|
|
class Foo {
|
|
public:
|
|
// CHECK: @_ZN3Foo3fooEv({{.*}}) [[EXTERN]]
|
|
__attribute__((function_return("thunk-extern"))) int foo() { return 42; }
|
|
};
|
|
|
|
int quux() {
|
|
Foo my_foo;
|
|
return my_foo.foo();
|
|
}
|
|
|
|
// CHECK: @extern_c() [[EXTERN]]
|
|
extern "C" __attribute__((function_return("thunk-extern"))) void extern_c() {}
|
|
extern "C" {
|
|
// CHECK: @extern_c2() [[EXTERN]]
|
|
__attribute__((function_return("thunk-extern"))) void extern_c2() {}
|
|
}
|
|
|
|
// CHECK-NOM-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern
|
|
// CHECK-KEEP-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern
|
|
// CHECK-KEEP-NOT: [[KEEP]] = {{.*}}fn_ret_thunk_extern
|
|
// CHECK-EXTERN: [[EXTERN]] = {{.*}}fn_ret_thunk_extern
|