llvm-project/clang/test/CodeGenCXX/attr-cpuspecific.cpp
Benjamin Stott 0ff0892470
[Clang][CodeGen] Add disable_sanitizer_instrumentation attribute to multiversion resolvers (#167516)
- Fixes https://github.com/llvm/llvm-project/issues/163369
- Segmentation fault occurred because resolver was calling TSan
instrumentation functions (__tsan_func_entry, __tsan_func_exit) but as
the resolver is run by the dynamic linker at load time, TSan is not
initialized yet so the current thread pointer is null.
- This PR adds the DisableSanitizerInstrumentation attribute to the
multiversion function resolvers to avoid issues like this.
- Added regression test for TSan segfault.
2025-11-12 10:39:30 +00:00

32 lines
1.3 KiB
C++

// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LINUX
// RUN: %clang_cc1 -triple x86_64-apple-macos -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LINUX
// RUN: %clang_cc1 -triple x86_64-windows-pc -fms-compatibility -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WINDOWS
struct S {
__attribute__((cpu_specific(atom)))
void Func(){}
__attribute__((cpu_dispatch(ivybridge,atom)))
void Func(){}
};
void foo() {
S s;
s.Func();
}
// LINUX: @_ZN1S4FuncEv = weak_odr alias void (ptr), ptr @_ZN1S4FuncEv.ifunc
// LINUX: @_ZN1S4FuncEv.ifunc = weak_odr ifunc void (ptr), ptr @_ZN1S4FuncEv.resolver
// LINUX: define weak_odr ptr @_ZN1S4FuncEv.resolver() #[[ATTR_RESOLVER:[0-9]+]]
// LINUX: ret ptr @_ZN1S4FuncEv.S
// LINUX: ret ptr @_ZN1S4FuncEv.O
// LINUX: declare void @_ZN1S4FuncEv.S
// LINUX: define linkonce_odr void @_ZN1S4FuncEv.O
// WINDOWS: define weak_odr dso_local void @"?Func@S@@QEAAXXZ"(ptr %0) #[[ATTR_RESOLVER:[0-9]+]] comdat
// WINDOWS: musttail call void @"?Func@S@@QEAAXXZ.S"(ptr %0)
// WINDOWS: musttail call void @"?Func@S@@QEAAXXZ.O"(ptr %0)
// WINDOWS: declare dso_local void @"?Func@S@@QEAAXXZ.S"
// WINDOWS: define linkonce_odr dso_local void @"?Func@S@@QEAAXXZ.O"
// CHECK: attributes #[[ATTR_RESOLVER]] = { disable_sanitizer_instrumentation }