[WebAssembly] Compute and export TLS block alignment
Summary:
Add immutable WASM global `__tls_align` which stores the alignment
requirements of the TLS segment.
Add `__builtin_wasm_tls_align()` intrinsic to get this alignment in Clang.
The expected usage has now changed to:
__wasm_init_tls(memalign(__builtin_wasm_tls_align(),
__builtin_wasm_tls_size()));
Reviewers: tlively, aheejin, sbc100, sunfish, alexcrichton
Reviewed By: tlively
Subscribers: dschuff, jgravelle-google, hiraditya, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65028
llvm-svn: 366624
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 68e001c..2dbff1b 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -247,6 +247,9 @@
if (WasmSym::tlsSize && seg->name == ".tdata") {
auto *tlsSize = cast<DefinedGlobal>(WasmSym::tlsSize);
tlsSize->global->global.InitExpr.Value.Int32 = seg->size;
+
+ auto *tlsAlign = cast<DefinedGlobal>(WasmSym::tlsAlign);
+ tlsAlign->global->global.InitExpr.Value.Int32 = 1U << seg->alignment;
}
}