diff options
author | Hans Wennborg <hans@hanshq.net> | 2012-06-28 08:01:44 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2012-06-28 08:01:44 +0000 |
commit | f60f6af9e84fe7752edb6fa42464778ac8a53e99 (patch) | |
tree | 0fc46d3b32bf750669cf8ad484e64d94c8b54447 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 608c0b65d78531d1713a02f34a9b876deefb4943 (diff) | |
download | bcm5719-llvm-f60f6af9e84fe7752edb6fa42464778ac8a53e99.tar.gz bcm5719-llvm-f60f6af9e84fe7752edb6fa42464778ac8a53e99.zip |
Add -ftls-model command-line flag.
This allows for setting the default TLS model. (PR9788)
llvm-svn: 159336
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 8f769d90204..25053b91a4c 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -258,6 +258,45 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, GV->setVisibility(GetLLVMVisibility(LV.visibility())); } +static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { + return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) + .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) + .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) + .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) + .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); +} + +static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( + CodeGenOptions::TLSModel M) { + switch (M) { + case CodeGenOptions::GeneralDynamicTLSModel: + return llvm::GlobalVariable::GeneralDynamicTLSModel; + case CodeGenOptions::LocalDynamicTLSModel: + return llvm::GlobalVariable::LocalDynamicTLSModel; + case CodeGenOptions::InitialExecTLSModel: + return llvm::GlobalVariable::InitialExecTLSModel; + case CodeGenOptions::LocalExecTLSModel: + return llvm::GlobalVariable::LocalExecTLSModel; + } + llvm_unreachable("Invalid TLS model!"); +} + +void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, + const VarDecl &D) const { + assert(D.isThreadSpecified() && "setting TLS mode on non-TLS var!"); + + llvm::GlobalVariable::ThreadLocalMode TLM; + TLM = GetLLVMTLSModel(CodeGenOpts.DefaultTLSModel); + + // Override the TLS model if it is explicitly specified. + if (D.hasAttr<TLSModelAttr>()) { + const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>(); + TLM = GetLLVMTLSModel(Attr->getModel()); + } + + GV->setThreadLocalMode(TLM); +} + /// Set the symbol visibility of type information (vtable and RTTI) /// associated with the given type. void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, @@ -1212,13 +1251,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, GV->setVisibility(GetLLVMVisibility(LV.visibility())); } - GV->setThreadLocal(D->isThreadSpecified()); - - // Set the TLS model if it it's explicitly specified. - if (D->hasAttr<TLSModelAttr>()) { - const TLSModelAttr *Attr = D->getAttr<TLSModelAttr>(); - GV->setThreadLocalMode(GetLLVMTLSModel(Attr->getModel())); - } + if (D->isThreadSpecified()) + setTLSMode(GV, *D); } if (AddrSpace != Ty->getAddressSpace()) |