Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/CodeGen/CodeGenModule.cpp
Show First 20 Lines • Show All 965 Lines • ▼ Show 20 Lines | |||||
static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { | static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { | ||||
return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) | return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) | ||||
.Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) | .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) | ||||
.Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) | .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) | ||||
.Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) | .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) | ||||
.Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); | .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); | ||||
} | } | ||||
static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( | llvm::GlobalVariable::ThreadLocalMode | ||||
CodeGenOptions::TLSModel M) { | CodeGenModule::GetDefaultLLVMTLSModel() const { | ||||
switch (M) { | switch (CodeGenOpts.getDefaultTLSModel()) { | ||||
case CodeGenOptions::GeneralDynamicTLSModel: | case CodeGenOptions::GeneralDynamicTLSModel: | ||||
return llvm::GlobalVariable::GeneralDynamicTLSModel; | return llvm::GlobalVariable::GeneralDynamicTLSModel; | ||||
case CodeGenOptions::LocalDynamicTLSModel: | case CodeGenOptions::LocalDynamicTLSModel: | ||||
return llvm::GlobalVariable::LocalDynamicTLSModel; | return llvm::GlobalVariable::LocalDynamicTLSModel; | ||||
case CodeGenOptions::InitialExecTLSModel: | case CodeGenOptions::InitialExecTLSModel: | ||||
return llvm::GlobalVariable::InitialExecTLSModel; | return llvm::GlobalVariable::InitialExecTLSModel; | ||||
case CodeGenOptions::LocalExecTLSModel: | case CodeGenOptions::LocalExecTLSModel: | ||||
return llvm::GlobalVariable::LocalExecTLSModel; | return llvm::GlobalVariable::LocalExecTLSModel; | ||||
} | } | ||||
llvm_unreachable("Invalid TLS model!"); | llvm_unreachable("Invalid TLS model!"); | ||||
} | } | ||||
void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const { | void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const { | ||||
assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); | assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); | ||||
llvm::GlobalValue::ThreadLocalMode TLM; | llvm::GlobalValue::ThreadLocalMode TLM; | ||||
TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); | TLM = GetDefaultLLVMTLSModel(); | ||||
// Override the TLS model if it is explicitly specified. | // Override the TLS model if it is explicitly specified. | ||||
if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) { | if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) { | ||||
TLM = GetLLVMTLSModel(Attr->getModel()); | TLM = GetLLVMTLSModel(Attr->getModel()); | ||||
} | } | ||||
GV->setThreadLocalMode(TLM); | GV->setThreadLocalMode(TLM); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 5,049 Lines • Show Last 20 Lines |