diff options
| author | Manman Ren <manman.ren@gmail.com> | 2015-12-17 00:42:36 +0000 |
|---|---|---|
| committer | Manman Ren <manman.ren@gmail.com> | 2015-12-17 00:42:36 +0000 |
| commit | b0b3af7dd8e7e99dce061285696e76d555274b71 (patch) | |
| tree | a94298a485bcb8759f17c9cbcea821aaaf023056 /clang/lib/CodeGen | |
| parent | 412c0af2b8407a6783bb3ebbd5077eefc76150bc (diff) | |
| download | bcm5719-llvm-b0b3af7dd8e7e99dce061285696e76d555274b71.tar.gz bcm5719-llvm-b0b3af7dd8e7e99dce061285696e76d555274b71.zip | |
[TLS on Darwin] use CXX_FAST_TLS calling convention for access functions.
Also set nounwind attribute.
rdar://problem/9001553
llvm-svn: 255860
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 44f64569e2c..0c4008f8ee7 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2194,6 +2194,11 @@ ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD, !llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) && !llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage()))) Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility); + + if (isThreadWrapperReplaceable(VD, CGM)) { + Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); + Wrapper->addFnAttr(llvm::Attribute::NoUnwind); + } return Wrapper; } @@ -2305,13 +2310,16 @@ LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD); llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val); - Val = CGF.Builder.CreateCall(Wrapper); + llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper); + if (isThreadWrapperReplaceable(VD, CGF.CGM)) + CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS); LValue LV; if (VD->getType()->isReferenceType()) - LV = CGF.MakeNaturalAlignAddrLValue(Val, LValType); + LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType); else - LV = CGF.MakeAddrLValue(Val, LValType, CGF.getContext().getDeclAlign(VD)); + LV = CGF.MakeAddrLValue(CallVal, LValType, + CGF.getContext().getDeclAlign(VD)); // FIXME: need setObjCGCLValueClass? return LV; } |

