llvm-project/clang/test/CodeGenCXX/arm64-generated-fn-attr.cpp
Anatoly Trosinenko f10a90587f
[clang][AArch64] Move initialization of ptrauth-* function attrs (#140277)
Move the initialization of ptrauth-* function attributes near the
initialization of branch protection attributes. The semantics of these
groups of attributes partially overlaps, so handle both groups in
getDefaultFunctionAttributes() and setTargetAttributes() functions to
prevent getting them out of sync. This fixes C++ TLS wrappers.
2025-05-20 12:50:58 +03:00

38 lines
1.8 KiB
C++

// RUN: %clang_cc1 -triple aarch64 -mbranch-target-enforce -msign-return-address=all \
// RUN: -fcxx-exceptions -fexceptions -emit-llvm %s -o - \
// RUN: | FileCheck --check-prefixes=CHECK,BTE-SIGNRA %s
// RUN: %clang_cc1 -triple aarch64 -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps -fptrauth-indirect-gotos \
// RUN: -fcxx-exceptions -fexceptions -emit-llvm %s -o - \
// RUN: | FileCheck --check-prefixes=CHECK,PAUTHTEST %s
// Check that functions generated by clang have the correct attributes
class Example {
public:
Example();
int fn();
};
// Initialization of var1 causes __cxx_global_var_init and __tls_init to be generated
thread_local Example var1;
extern thread_local Example var2;
extern void fn();
int testfn() noexcept {
// Calling fn in a noexcept function causes __clang_call_terminate to be generated
fn();
// Use of var1 and var2 causes TLS wrapper functions to be generated
return var1.fn() + var2.fn();
}
// CHECK: define {{.*}} @__cxx_global_var_init() [[ATTR1:#[0-9]+]]
// CHECK: define {{.*}} @__clang_call_terminate({{.*}}) [[ATTR2:#[0-9]+]]
// CHECK: define {{.*}} @_ZTW4var1() [[ATTR1]]
// CHECK: define {{.*}} @_ZTW4var2() [[ATTR1]]
// CHECK: define {{.*}} @__tls_init() [[ATTR1]]
// BTE-SIGNRA: attributes [[ATTR1]] = { {{.*}}"branch-target-enforcement" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
// BTE-SIGNRA: attributes [[ATTR2]] = { {{.*}}"branch-target-enforcement" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
// PAUTHTEST: attributes [[ATTR1]] = { {{.*}}"ptrauth-auth-traps" "ptrauth-calls" "ptrauth-indirect-gotos" "ptrauth-returns"
// PAUTHTEST: attributes [[ATTR2]] = { {{.*}}"ptrauth-auth-traps" "ptrauth-calls" "ptrauth-indirect-gotos" "ptrauth-returns"