llvm-project/clang/test/CodeGen/attr-function-return.cpp
Rong Xu 6cee539337 [Clang] Change AnonStructIds in MangleContext to per-function based
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
2022-10-23 22:33:52 -07:00

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