OSDN Git Service

[WebAssembly] Implement thread-local storage (local-exec model)
authorGuanzhong Chen <gzchen@google.com>
Tue, 16 Jul 2019 22:00:45 +0000 (22:00 +0000)
committerGuanzhong Chen <gzchen@google.com>
Tue, 16 Jul 2019 22:00:45 +0000 (22:00 +0000)
commitb261aae2976dc0fc307cd00e2456d0249d73a091
treee14476521d21f7f32513ebea56fa534130fb2c2d
parent831ed7f0dce2509f595b4fba4bbc7489f86eff7c
[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366272 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/BinaryFormat/Wasm.h
include/llvm/IR/IntrinsicsWebAssembly.td
include/llvm/MC/MCSectionWasm.h
lib/Target/WebAssembly/WebAssemblyFastISel.cpp
lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
test/CodeGen/WebAssembly/target-features-tls.ll
test/CodeGen/WebAssembly/tls.ll