diff options
author | Hans Wennborg <hans@hanshq.net> | 2012-06-23 11:37:03 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2012-06-23 11:37:03 +0000 |
commit | ce718ff9f42c7da092eaa01dd0242e8d5ba84713 (patch) | |
tree | d3c6b996686af3fc9f47f7b5407c773a86a4f653 /docs | |
parent | 47cbc4e0ee6098b7be3c60108000a979f1809949 (diff) |
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
Diffstat (limited to 'docs')
-rw-r--r-- | docs/BitCodeFormat.html | 14 | ||||
-rw-r--r-- | docs/LangRef.html | 34 |
2 files changed, 43 insertions, 5 deletions
diff --git a/docs/BitCodeFormat.html b/docs/BitCodeFormat.html index 30145de581..6a670f56b9 100644 --- a/docs/BitCodeFormat.html +++ b/docs/BitCodeFormat.html @@ -864,7 +864,7 @@ library name referenced.</p> <h4><a name="MODULE_CODE_GLOBALVAR">MODULE_CODE_GLOBALVAR Record</a></h4> <div> -<p><tt>[GLOBALVAR, pointer type, isconst, initid, linkage, alignment, section, visibility, threadlocal]</tt></p> +<p><tt>[GLOBALVAR, pointer type, isconst, initid, linkage, alignment, section, visibility, threadlocal, unnamed_addr]</tt></p> <p>The <tt>GLOBALVAR</tt> record (code 7) marks the declaration or definition of a global variable. The operand fields are:</p> @@ -915,8 +915,16 @@ encoding of the visibility of this variable: </ul> </li> -<li><i>threadlocal</i>: If present and non-zero, indicates that the variable -is <tt>thread_local</tt></li> +<li><i>threadlocal</i>: If present, an encoding of the thread local storage +mode of the variable: + <ul> + <li><tt>not thread local</tt>: code 0</li> + <li><tt>thread local; default TLS model</tt>: code 1</li> + <li><tt>localdynamic</tt>: code 2</li> + <li><tt>initialexec</tt>: code 3</li> + <li><tt>localexec</tt>: code 4</li> + </ul> +</li> <li><i>unnamed_addr</i>: If present and non-zero, indicates that the variable has <tt>unnamed_addr</tt></li> diff --git a/docs/LangRef.html b/docs/LangRef.html index 9cb7e6392a..ba653dbd49 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -838,9 +838,32 @@ define i32 @main() { <i>; i32()* </i> <p>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.</p> + +<p>A variable may be defined as <tt>thread_local</tt>, 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:</p> + +<dl> + <dt><b><tt>localdynamic</tt></b>:</dt> + <dd>For variables that are only used within the current shared library.</dd> + + <dt><b><tt>initialexec</tt></b>:</dt> + <dd>For variables in modules that will not be loaded dynamically.</dd> + + <dt><b><tt>localexec</tt></b>:</dt> + <dd>For variables defined in the executable and only used within it.</dd> +</dl> + +<p>The models correspond to the ELF TLS models; see + <a href="http://people.redhat.com/drepper/tls.pdf">ELF + Handling For Thread-Local Storage</a> 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.</p> + +<p>A variable may be defined as a global "constant," which indicates that the contents of the variable will <b>never</b> 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() { <i>; i32()* </i> @G = addrspace(5) constant float 1.0, section "foo", align 4 </pre> +<p>The following example defines a thread-local global with + the <tt>initialexec</tt> TLS model:</p> + +<pre class="doc_code"> +@G = thread_local(initialexec) global i32 0, align 4 +</pre> + </div> |