Author: ahatanak Date: Tue May 29 11:28:49 2018 New Revision: 333447 URL: http://llvm.org/viewvc/llvm-project?rev=333447&view=rev Log: [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 Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=333447&r1=333446&r2=333447&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Tue May 29 11:28:49 2018 @@ -2450,8 +2450,12 @@ void ItaniumCXXABI::EmitThreadLocalInitF 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. Modified: cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp?rev=333447&r1=333446&r2=333447&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp (original) +++ cfe/trunk/test/CodeGenCXX/cxx11-thread-local.cpp Tue May 29 11:28:49 2018 @@ -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*) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits