llvm-project/llvm
Guanzhong Chen 42bba4b852 [WebAssembly] Implement thread-local storage (local-exec model)
Summary:
Thread local variables are placed inside a `.tdata` segment. Their symbols are
offsets from the start of the segment. The address of a thread local variable
is computed as `__tls_base` + the offset from the start of the segment.

`.tdata` segment is a passive segment and `memory.init` is used once per thread
to initialize the thread local storage.

`__tls_base` is a wasm global. Since each thread has its own wasm instance,
it is effectively thread local. Currently, `__tls_base` must be initialized
at thread startup, and so cannot be used with dynamic libraries.

`__tls_base` is to be initialized with a new linker-synthesized function,
`__wasm_init_tls`, which takes as an argument a block of memory to use as the
storage for thread locals. It then initializes the block of memory and sets
`__tls_base`. As `__wasm_init_tls` will handle the memory initialization,
the memory does not have to be zeroed.

To help allocating memory for thread-local storage, a new compiler intrinsic
is introduced: `__builtin_wasm_tls_size()`. This instrinsic function returns
the size of the thread-local storage for the current function.

The expected usage is to run something like the following upon thread startup:

    __wasm_init_tls(malloc(__builtin_wasm_tls_size()));

Reviewers: tlively, aheejin, kripken, sbc100

Subscribers: dschuff, jgravelle-google, hiraditya, sunfish, jfb, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D64537

llvm-svn: 366272
2019-07-16 22:00:45 +00:00
..
benchmarks
bindings [IR/DIVar] Add the flag for params that have unmodified value 2019-06-26 11:19:26 +00:00
cmake [cmake] Don't set install rules for tblgen if building utils is disabled 2019-07-15 19:04:04 +00:00
docs [ORC][docs] Fix an RST error: the code-block directive needs a newline after it. 2019-07-16 21:41:43 +00:00
examples [ORC] Add custom IR compiler configuration to LLJITBuilder to enable obj caches. 2019-07-10 17:24:24 +00:00
include [WebAssembly] Implement thread-local storage (local-exec model) 2019-07-16 22:00:45 +00:00
lib [WebAssembly] Implement thread-local storage (local-exec model) 2019-07-16 22:00:45 +00:00
projects
resources
runtimes
test [WebAssembly] Implement thread-local storage (local-exec model) 2019-07-16 22:00:45 +00:00
tools Teach `llvm-pdbutil pretty -native` about `-injected-sources` 2019-07-16 18:04:26 +00:00
unittests [Remarks] Simplify and refactor the RemarkParser interface 2019-07-16 15:25:05 +00:00
utils Teach `llvm-pdbutil pretty -native` about `-injected-sources` 2019-07-16 18:04:26 +00:00
.arcconfig
.clang-format
.clang-tidy
.gitattributes
.gitignore
CMakeLists.txt Add support for building with Python 3 2019-07-10 19:31:25 +00:00
CODE_OWNERS.TXT Update email address in CODE_OWNERS 2019-07-01 16:01:15 +00:00
CREDITS.TXT
LICENSE.TXT
LLVMBuild.txt
README.txt
RELEASE_TESTERS.TXT
configure
llvm.spec.in

README.txt

The LLVM Compiler Infrastructure
================================

This directory and its subdirectories contain source code for LLVM,
a toolkit for the construction of highly optimized compilers,
optimizers, and runtime environments.

LLVM is open source software. You may freely distribute it under the terms of
the license agreement found in LICENSE.txt.

Please see the documentation provided in docs/ for further
assistance with LLVM, and in particular docs/GettingStarted.rst for getting
started with LLVM and docs/README.txt for an overview of LLVM's
documentation setup.

If you are writing a package for LLVM, see docs/Packaging.rst for our
suggestions.