mirror of https://github.com/microsoft/clang.git
[CodeGen][Darwin] Set the calling-convention of thread-local variable
initialization functions to 'cxx_fast_tlscc'. This fixes a bug where instructions calling initialization functions for thread-local static members of c++ template classes were using calling convention 'cxx_fast_tlscc' while the called functions weren't annotated with the calling convention. rdar://problem/40447463 Differential Revision: https://reviews.llvm.org/D47354 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333447 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
237a8531a0
commit
79b32e787b
|
@ -2450,8 +2450,12 @@ void ItaniumCXXABI::EmitThreadLocalInitFuncs(
|
|||
if (InitIsInitFunc) {
|
||||
if (Init) {
|
||||
llvm::CallInst *CallVal = Builder.CreateCall(Init);
|
||||
if (isThreadWrapperReplaceable(VD, CGM))
|
||||
if (isThreadWrapperReplaceable(VD, CGM)) {
|
||||
CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
|
||||
llvm::Function *Fn =
|
||||
cast<llvm::Function>(cast<llvm::GlobalAlias>(Init)->getAliasee());
|
||||
Fn->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Don't know whether we have an init function. Call it if it exists.
|
||||
|
|
|
@ -166,7 +166,8 @@ int f() {
|
|||
// DARWIN: call cxx_fast_tlscc void @_ZTHN1XIiE1mE()
|
||||
// CHECK: ret {{.*}}* @_ZN1XIiE1mE
|
||||
|
||||
// CHECK: define internal {{.*}} @[[VF_M_INIT]]()
|
||||
// LINUX: define internal void @[[VF_M_INIT]]()
|
||||
// DARWIN: define internal cxx_fast_tlscc void @[[VF_M_INIT]]()
|
||||
// LINUX-SAME: comdat($_ZN1VIfE1mE)
|
||||
// DARWIN-NOT: comdat
|
||||
// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIfE1mE to i8*)
|
||||
|
@ -178,7 +179,8 @@ int f() {
|
|||
// CHECK: store i64 1, i64* @_ZGVN1VIfE1mE
|
||||
// CHECK: br label
|
||||
|
||||
// CHECK: define internal {{.*}} @[[XF_M_INIT]]()
|
||||
// LINUX: define internal void @[[XF_M_INIT]]()
|
||||
// DARWIN: define internal cxx_fast_tlscc void @[[XF_M_INIT]]()
|
||||
// LINUX-SAME: comdat($_ZN1XIfE1mE)
|
||||
// DARWIN-NOT: comdat
|
||||
// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIfE1mE to i8*)
|
||||
|
@ -268,7 +270,8 @@ void set_anon_i() {
|
|||
// LINUX-LABEL: define internal i32* @_ZTWN12_GLOBAL__N_16anon_iE()
|
||||
// DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWN12_GLOBAL__N_16anon_iE()
|
||||
|
||||
// CHECK: define internal {{.*}} @[[V_M_INIT]]()
|
||||
// LINUX: define internal void @[[V_M_INIT]]()
|
||||
// DARWIN: define internal cxx_fast_tlscc void @[[V_M_INIT]]()
|
||||
// LINUX-SAME: comdat($_ZN1VIiE1mE)
|
||||
// DARWIN-NOT: comdat
|
||||
// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*)
|
||||
|
@ -280,7 +283,8 @@ void set_anon_i() {
|
|||
// CHECK: store i64 1, i64* @_ZGVN1VIiE1mE
|
||||
// CHECK: br label
|
||||
|
||||
// CHECK: define internal {{.*}} @[[X_M_INIT]]()
|
||||
// LINUX: define internal void @[[X_M_INIT]]()
|
||||
// DARWIN: define internal cxx_fast_tlscc void @[[X_M_INIT]]()
|
||||
// LINUX-SAME: comdat($_ZN1XIiE1mE)
|
||||
// DARWIN-NOT: comdat
|
||||
// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIiE1mE to i8*)
|
||||
|
|
Loading…
Reference in New Issue