diff options
author | Richard Henderson <rth@redhat.com> | 2002-05-21 18:11:29 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-05-21 18:11:29 -0700 |
commit | 3d78f2e96e29feaff7046c22fdc97aa58bee9688 (patch) | |
tree | 1d3e8e4b6c824cf31a86c19bd79a5a7767a5a468 /gcc/doc | |
parent | f5eb2fc83e49d200496a62d29b3236c6cfd76a91 (diff) | |
download | gcc-3d78f2e96e29feaff7046c22fdc97aa58bee9688.zip gcc-3d78f2e96e29feaff7046c22fdc97aa58bee9688.tar.gz gcc-3d78f2e96e29feaff7046c22fdc97aa58bee9688.tar.bz2 |
c-common.h (enum rid): Add RID_THREAD.
* c-common.h (enum rid): Add RID_THREAD.
* c-decl.c (start_decl): Do not set DECL_COMMON for tls variables.
(grokdeclarator): Grok __thread.
* c-parse.in (reswords): Add __thread.
(rid_to_yy): Add RID_THREAD.
* cp/lex.c (rid_to_yy): Add RID_THREAD.
* tree.h (DECL_THREAD_LOCAL): New.
(struct tree_decl): Add thread_local_flag.
* print-tree.c (print_node): Dump DECL_THREAD_LOCAL.
* tree.c (staticp): TLS variables are not static.
* target-def.h (TARGET_HAVE_TLS): New.
* target.h (have_tls): New.
* output.h (SECTION_TLS): New.
* varasm.c (assemble_variable): TLS variables can't be common for now.
(default_section_type_flags): Handle .tdata and .tbss.
(default_elf_asm_named_section): Handle SECTION_TLS.
(categorize_decl_for_section): Handle DECL_THREAD_LOCAL.
* flags.h (flag_tls_default): Declare.
* toplev.c (flag_tls_default): Define.
(display_help): Display help for it.
(decode_f_option): Set it.
* doc/extend.texi (Thread-Local): New node describing language-level
thread-local storage.
* doc/invoke.texi (-ftls-model): Document.
* fixinc/inclhack.def (thread_keyword): New.
* fixinc/fixincl.x: Rebuild.
From-SVN: r53715
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/extend.texi | 50 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 10 |
2 files changed, 59 insertions, 1 deletions
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index b27bec4..e37a66b 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -432,6 +432,7 @@ extensions, accepted by GCC in C89 mode and in C++. * Target Builtins:: Built-in functions specific to particular targets. * Pragmas:: Pragmas accepted by GCC. * Unnamed Fields:: Unnamed struct/union fields within structs/unions. +* Thread-Local:: Per-thread variables. @end menu @node Statement Exprs @@ -6165,6 +6166,55 @@ It is ambiguous which @code{a} is being referred to with @samp{foo.a}. Such constructs are not supported and must be avoided. In the future, such constructs may be detected and treated as compilation errors. +@node Thread-Local +@section Thread-Local Storage +@cindex Thread-Local Storage +@cindex TLS +@cindex __thread + +Thread-local storage (TLS) is a mechanism by which variables are +allocated such that there is one instance of the variable per extant +thread. The run-time model GCC uses to implement this originates +in the IA-64 processor-specific ABI, but has since been migrated +to other processors as well. It requires significant support from +the linker (@command{ld}), dynamic linker (@command{ld.so}), and +system libraries (@file{libc.so} and @file{libpthread.so}), so it +is not supported everywhere. + +At the user level, the extension is visible with a new storage +class keyword: @code{__thread}. For example: + +@example +__thread int i; +extern __thread struct state s; +static __thread char *p; +@end example + +The @code{__thread} specifier may be used alone, with the @code{extern} +or @code{static} specifiers, but with no other storage class specifier. +When used with @code{extern} or @code{static}, @code{__thread} must appear +immediately after the other storage class specifier. + +The @code{__thread} specifier may be applied to any global, file-scoped +static, function-scoped static, or class-scoped static variable. It may +not be applied to function-scoped automatic or class-scoped member variables. + +When the address-of operator is applied to a thread-local variable, it is +evaluated at run-time and returns the address of the current thread's +instance of that variable. An address so obtained may be used by any +thread. When a thread terminates, any pointers to thread-local variables +in that thread become invalid. + +No static initialization may refer to the address of a thread-local variable. + +In C++, a thread-local variable may not be initialized by a static +constructor. + +See @uref{http://people.redhat.com/drepper/tls.pdf, +ELF Handling For Thread-Local Storage} for a detailed explanation of +the four thread-local storage addressing models, and how the run-time +is expected to function. + @node C++ Extensions @chapter Extensions to the C++ Language @cindex extensions, C++ language diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 855fcd9..cedabdf 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -677,7 +677,7 @@ in the following sections. -fverbose-asm -fpack-struct -fstack-check @gol -fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol -fargument-alias -fargument-noalias @gol --fargument-noalias-global -fleading-underscore} +-fargument-noalias-global -fleading-underscore -ftls-model=@var{model}} @end table @menu @@ -9915,6 +9915,14 @@ is to help link with legacy assembly code. Be warned that you should know what you are doing when invoking this option, and that not all targets provide complete support for it. + +@item -ftls-model=@var{model} +Alter the thread-local storage model to be used (@pxref{Thread-Local}). +The @var{model} argument should be one of @code{global-dynamic}, +@code{local-dynamic}, @code{initial-exec} or @code{local-exec}. + +The default without @option{-fpic} is @code{initial-exec}; with +@option{-fpic} the default is @code{global-dynamic}. @end table @c man end |