Extend the IL for selecting TLS models (PR9788)

This allows the user/front-end to specify a model that is better
than what LLVM would choose by default. For example, a variable
might be declared as

  @x = thread_local(initialexec) global i32 42

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

If the specified model isn't supported by the target, or if LLVM can
make a better choice, a different model may be used.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159077 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hans Wennborg
2012-06-23 11:37:03 +00:00
parent 47cbc4e0ee
commit ce718ff9f4
24 changed files with 707 additions and 48 deletions
+24 -1
View File
@@ -130,6 +130,7 @@ namespace {
private:
void printLinkageType(GlobalValue::LinkageTypes LT);
void printVisibilityType(GlobalValue::VisibilityTypes VisTypes);
void printThreadLocalMode(GlobalVariable::ThreadLocalMode TLM);
void printCallingConv(CallingConv::ID cc);
void printEscapedString(const std::string& str);
void printCFP(const ConstantFP* CFP);
@@ -325,6 +326,26 @@ void CppWriter::printVisibilityType(GlobalValue::VisibilityTypes VisType) {
}
}
void CppWriter::printThreadLocalMode(GlobalVariable::ThreadLocalMode TLM) {
switch (TLM) {
case GlobalVariable::NotThreadLocal:
Out << "GlobalVariable::NotThreadLocal";
break;
case GlobalVariable::GeneralDynamicTLSModel:
Out << "GlobalVariable::GeneralDynamicTLSModel";
break;
case GlobalVariable::LocalDynamicTLSModel:
Out << "GlobalVariable::LocalDynamicTLSModel";
break;
case GlobalVariable::InitialExecTLSModel:
Out << "GlobalVariable::InitialExecTLSModel";
break;
case GlobalVariable::LocalExecTLSModel:
Out << "GlobalVariable::LocalExecTLSModel";
break;
}
}
// printEscapedString - Print each character of the specified string, escaping
// it if it is not printable or if it is an escape char.
void CppWriter::printEscapedString(const std::string &Str) {
@@ -996,7 +1017,9 @@ void CppWriter::printVariableHead(const GlobalVariable *GV) {
}
if (GV->isThreadLocal()) {
printCppName(GV);
Out << "->setThreadLocal(true);";
Out << "->setThreadLocalMode(";
printThreadLocalMode(GV->getThreadLocalMode());
Out << ");";
nl(Out);
}
if (is_inline) {