diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-05-29 18:28:49 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-05-29 18:28:49 +0000 |
commit | 1da9dbbc25131bf5bfc2719bc4ef40fa000971dc (patch) | |
tree | 426a0adc60fc14c47201edbf4be16f52a98c7f46 /clang/lib | |
parent | 681b882d4e80177f95d62e465fc9f8af3744607f (diff) | |
download | bcm5719-llvm-1da9dbbc25131bf5bfc2719bc4ef40fa000971dc.tar.gz bcm5719-llvm-1da9dbbc25131bf5bfc2719bc4ef40fa000971dc.zip |
[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
llvm-svn: 333447
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index b608adfe771..9768e71178b 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -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. |