summaryrefslogtreecommitdiffstats
path: root/lld/wasm/Driver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/wasm/Driver.cpp')
-rw-r--r--lld/wasm/Driver.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 3de69954e0a..900cd051dcf 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -454,6 +454,7 @@ createUndefinedGlobal(StringRef name, llvm::wasm::WasmGlobalType *type) {
// Create ABI-defined synthetic symbols
static void createSyntheticSymbols() {
static WasmSignature nullSignature = {{}, {}};
+ static WasmSignature i32ArgSignature = {{}, {ValType::I32}};
static llvm::wasm::WasmGlobalType globalTypeI32 = {WASM_TYPE_I32, false};
static llvm::wasm::WasmGlobalType mutableGlobalTypeI32 = {WASM_TYPE_I32,
true};
@@ -516,6 +517,30 @@ static void createSyntheticSymbols() {
WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
}
+ if (config->sharedMemory && !config->shared) {
+ llvm::wasm::WasmGlobal tlsBaseGlobal;
+ tlsBaseGlobal.Type = {WASM_TYPE_I32, true};
+ tlsBaseGlobal.InitExpr.Value.Int32 = 0;
+ tlsBaseGlobal.InitExpr.Opcode = WASM_OPCODE_I32_CONST;
+ tlsBaseGlobal.SymbolName = "__tls_base";
+ WasmSym::tlsBase =
+ symtab->addSyntheticGlobal("__tls_base", WASM_SYMBOL_VISIBILITY_HIDDEN,
+ make<InputGlobal>(tlsBaseGlobal, nullptr));
+
+ llvm::wasm::WasmGlobal tlsSizeGlobal;
+ tlsSizeGlobal.Type = {WASM_TYPE_I32, false};
+ tlsSizeGlobal.InitExpr.Value.Int32 = 0;
+ tlsSizeGlobal.InitExpr.Opcode = WASM_OPCODE_I32_CONST;
+ tlsSizeGlobal.SymbolName = "__tls_size";
+ WasmSym::tlsSize =
+ symtab->addSyntheticGlobal("__tls_size", WASM_SYMBOL_VISIBILITY_HIDDEN,
+ make<InputGlobal>(tlsSizeGlobal, nullptr));
+
+ WasmSym::initTLS = symtab->addSyntheticFunction(
+ "__wasm_init_tls", WASM_SYMBOL_VISIBILITY_HIDDEN,
+ make<SyntheticFunction>(i32ArgSignature, "__wasm_init_tls"));
+ }
+
WasmSym::dsoHandle = symtab->addSyntheticDataSymbol(
"__dso_handle", WASM_SYMBOL_VISIBILITY_HIDDEN);
}
OpenPOWER on IntegriCloud