Support the tls_model attribute (PR9788)

This adds support for the tls_model attribute. This allows the user to
choose a TLS model that is better than what LLVM would select by
default. For example, a variable might be declared as:

  __thread int x __attribute__((tls_model("initial-exec")));

if it will not be used in a shared library that is dlopen'ed.

This depends on LLVM r159077.

llvm-svn: 159078
This commit is contained in:
Hans Wennborg
2012-06-23 11:51:46 +00:00
parent cbe34b4cc9
commit d3b01bc7c6
10 changed files with 124 additions and 9 deletions

View File

@@ -1187,7 +1187,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
new llvm::GlobalVariable(getModule(), Ty->getElementType(), false,
llvm::GlobalValue::ExternalLinkage,
0, MangledName, 0,
false, AddrSpace);
llvm::GlobalVariable::NotThreadLocal, AddrSpace);
// Handle things which are present even on external declarations.
if (D) {
@@ -1211,6 +1211,12 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
}
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 (AddrSpace != Ty->getAddressSpace())