
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
27 lines
878 B
LLVM
27 lines
878 B
LLVM
; RUN: llc < %s -mattr=-bulk-memory | FileCheck %s --check-prefixes NO-BULK-MEM
|
|
; RUN: llc < %s -mattr=+bulk-memory | FileCheck %s --check-prefixes BULK-MEM
|
|
|
|
; Test that the target features section contains -atomics or +atomics
|
|
; for modules that have thread local storage in their source.
|
|
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
@foo = internal thread_local global i32 0
|
|
|
|
; -bulk-memory
|
|
; NO-BULK-MEM-LABEL: .custom_section.target_features,"",@
|
|
; NO-BULK-MEM-NEXT: .int8 1
|
|
; NO-BULK-MEM-NEXT: .int8 45
|
|
; NO-BULK-MEM-NEXT: .int8 7
|
|
; NO-BULK-MEM-NEXT: .ascii "atomics"
|
|
; NO-BULK-MEM-NEXT: .bss.foo,"",@
|
|
|
|
; +bulk-memory
|
|
; BULK-MEM-LABEL: .custom_section.target_features,"",@
|
|
; BULK-MEM-NEXT: .int8 1
|
|
; BULK-MEM-NEXT: .int8 43
|
|
; BULK-MEM-NEXT: .int8 11
|
|
; BULK-MEM-NEXT: .ascii "bulk-memory"
|
|
; BULK-MEM-NEXT: .tbss.foo,"",@
|