mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 03:55:48 -04:00

Multi-versioned functions defined by cpu_dispatch and implemented with IFunc can not be called outside the translation units where they are defined due to lack of symbols. This patch add function aliases for these functions and thus make them visible outside. Differential Revision: https://reviews.llvm.org/D67058 Patch by Senran Zhang llvm-svn: 371586
29 lines
1.2 KiB
C++
29 lines
1.2 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-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 (%struct.S*), void (%struct.S*)* @_ZN1S4FuncEv.ifunc
|
|
// LINUX: @_ZN1S4FuncEv.ifunc = weak_odr ifunc void (%struct.S*), void (%struct.S*)* ()* @_ZN1S4FuncEv.resolver
|
|
// LINUX: define weak_odr void (%struct.S*)* @_ZN1S4FuncEv.resolver
|
|
// LINUX: ret void (%struct.S*)* @_ZN1S4FuncEv.S
|
|
// LINUX: ret void (%struct.S*)* @_ZN1S4FuncEv.O
|
|
// LINUX: declare void @_ZN1S4FuncEv.S
|
|
// LINUX: define linkonce_odr void @_ZN1S4FuncEv.O
|
|
|
|
// WINDOWS: define weak_odr dso_local void @"?Func@S@@QEAAXXZ"(%struct.S* %0) comdat
|
|
// WINDOWS: musttail call void @"?Func@S@@QEAAXXZ.S"(%struct.S* %0)
|
|
// WINDOWS: musttail call void @"?Func@S@@QEAAXXZ.O"(%struct.S* %0)
|
|
// WINDOWS: declare dso_local void @"?Func@S@@QEAAXXZ.S"
|
|
// WINDOWS: define linkonce_odr dso_local void @"?Func@S@@QEAAXXZ.O"
|