From ce718ff9f42c7da092eaa01dd0242e8d5ba84713 Mon Sep 17 00:00:00 2001
From: Hans Wennborg
Date: Sat, 23 Jun 2012 11:37:03 +0000
Subject: [PATCH] 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
---
docs/BitCodeFormat.html | 14 +-
docs/LangRef.html | 34 +++-
include/llvm/GlobalVariable.h | 41 ++++-
lib/AsmParser/LLLexer.cpp | 3 +
lib/AsmParser/LLParser.cpp | 50 +++++-
lib/AsmParser/LLParser.h | 3 +
lib/AsmParser/LLToken.h | 3 +-
lib/Bitcode/Reader/BitcodeReader.cpp | 19 +-
lib/Bitcode/Writer/BitcodeWriter.cpp | 13 +-
lib/Linker/LinkModules.cpp | 4 +-
lib/Target/CppBackend/CPPBackend.cpp | 25 ++-
lib/Target/TargetMachine.cpp | 40 ++++-
lib/Transforms/IPO/GlobalOpt.cpp | 14 +-
.../Instrumentation/AddressSanitizer.cpp | 2 +-
.../Instrumentation/GCOVProfiling.cpp | 2 +-
lib/Transforms/Utils/CloneModule.cpp | 2 +-
lib/VMCore/AsmWriter.cpp | 22 ++-
lib/VMCore/Core.cpp | 2 +-
lib/VMCore/Globals.cpp | 51 +++++-
lib/VMCore/IRBuilder.cpp | 2 +-
test/Assembler/tls-models.ll | 11 ++
test/CodeGen/ARM/tls-models.ll | 117 ++++++++++++
test/CodeGen/Mips/tls-models.ll | 113 ++++++++++++
test/CodeGen/X86/tls-models.ll | 166 ++++++++++++++++++
24 files changed, 706 insertions(+), 47 deletions(-)
create mode 100644 test/Assembler/tls-models.ll
create mode 100644 test/CodeGen/ARM/tls-models.ll
create mode 100644 test/CodeGen/Mips/tls-models.ll
create mode 100644 test/CodeGen/X86/tls-models.ll
diff --git a/docs/BitCodeFormat.html b/docs/BitCodeFormat.html
index 30145de5811..6a670f56b97 100644
--- a/docs/BitCodeFormat.html
+++ b/docs/BitCodeFormat.html
@@ -864,7 +864,7 @@ library name referenced.
-
[GLOBALVAR, pointer type, isconst, initid, linkage, alignment, section, visibility, threadlocal]
+
[GLOBALVAR, pointer type, isconst, initid, linkage, alignment, section, visibility, threadlocal, unnamed_addr]
The GLOBALVAR record (code 7) marks the declaration or
definition of a global variable. The operand fields are:
@@ -915,8 +915,16 @@ encoding of the visibility of this variable:
-
threadlocal: If present and non-zero, indicates that the variable
-is thread_local
+
threadlocal: If present, an encoding of the thread local storage
+mode of the variable:
+
+ - not thread local: code 0
+ - thread local; default TLS model: code 1
+ - localdynamic: code 2
+ - initialexec: code 3
+ - localexec: code 4
+
+
unnamed_addr: If present and non-zero, indicates that the variable
has unnamed_addr
diff --git a/docs/LangRef.html b/docs/LangRef.html
index 9cb7e6392ab..ba653dbd498 100644
--- a/docs/LangRef.html
+++ b/docs/LangRef.html
@@ -838,9 +838,32 @@ define i32 @main() {
; i32()*
Global variables define regions of memory allocated at compilation time
instead of run-time. Global variables may optionally be initialized, may
have an explicit section to be placed in, and may have an optional explicit
- alignment specified. A variable may be defined as "thread_local", which
+ alignment specified.
+
+
A variable may be defined as thread_local, which
means that it will not be shared by threads (each thread will have a
- separated copy of the variable). A variable may be defined as a global
+ separated copy of the variable). Not all targets support thread-local
+ variables. Optionally, a TLS model may be specified:
+
+
+ - localdynamic:
+ - For variables that are only used within the current shared library.
+
+ - initialexec:
+ - For variables in modules that will not be loaded dynamically.
+
+ - localexec:
+ - For variables defined in the executable and only used within it.
+
+
+
The models correspond to the ELF TLS models; see
+ ELF
+ Handling For Thread-Local Storage for more information on under which
+ circumstances the different models may be used. The target may choose a
+ different TLS model if the specified model is not supported, or if a better
+ choice of model can be made.
+
+
A variable may be defined as a global
"constant," which indicates that the contents of the variable
will never be modified (enabling better optimization, allowing the
global data to be placed in the read-only section of an executable, etc).
@@ -893,6 +916,13 @@ define i32 @main() { ; i32()*
@G = addrspace(5) constant float 1.0, section "foo", align 4
+
The following example defines a thread-local global with
+ the initialexec TLS model:
+
+
+@G = thread_local(initialexec) global i32 0, align 4
+
+
diff --git a/include/llvm/GlobalVariable.h b/include/llvm/GlobalVariable.h
index 034ade1fb03..fbb708b26b7 100644
--- a/include/llvm/GlobalVariable.h
+++ b/include/llvm/GlobalVariable.h
@@ -41,24 +41,47 @@ class GlobalVariable : public GlobalValue, public ilist_node