From ce718ff9f42c7da092eaa01dd0242e8d5ba84713 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Sat, 23 Jun 2012 11:37:03 +0000 Subject: 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 ++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) (limited to 'docs') diff --git a/docs/BitCodeFormat.html b/docs/BitCodeFormat.html index 30145de..6a670f5 100644 --- a/docs/BitCodeFormat.html +++ b/docs/BitCodeFormat.html @@ -864,7 +864,7 @@ library name referenced.

MODULE_CODE_GLOBALVAR Record

-

[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 9cb7e63..ba653db 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
    +
    +
    -- cgit v1.1