[lld][WebAssembly] Fix malformed output with -pie + --shared-memory

The conditional guarding createInitMemoryFunction was incorrect and
didn't match that guarding the creation of the associated symbol.

Rather that reproduce the same conditions in multiple places we can
simply use the presence of the associated symbol.

Also, add an assertion that would have caught this bug.

Also, add a new test for this flag combination.

This is part of an ongoing effort to enable dynamic linking with
threads in emscripten.

See https://github.com/emscripten-core/emscripten/issues/3494

Differential Revision: https://reviews.llvm.org/D92520
This commit is contained in:
Sam Clegg 2020-12-02 15:55:25 -08:00
parent fb2e109d45
commit 701fa0b5ab
4 changed files with 14 additions and 9 deletions

View File

@ -13,6 +13,10 @@
; RUN: wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.o -o %t.atomics.bulk-mem.wasm
; RUN: obj2yaml %t.atomics.bulk-mem.wasm | FileCheck %s --check-prefixes PASSIVE
; Also test in combination with PIC/pie
; RUN: llc -filetype=obj -relocation-model=pic %s -o %t.atomics.bulk-mem.pic.o -mattr=+atomics,+bulk-memory,+mutable-globals
; RUN: wasm-ld --experimental-pic -pie -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.pic.o -o %t.pic.wasm
target triple = "wasm32-unknown-unknown"
@a = hidden global [6 x i8] c"hello\00", align 1

View File

@ -96,15 +96,13 @@ void MarkLive::run() {
if (sym->isNoStrip() || sym->isExported())
enqueue(sym);
// If we'll be calling the user's `__wasm_call_dtors` function, mark it live.
if (Symbol *callDtors = WasmSym::callDtors)
enqueue(callDtors);
if (WasmSym::callDtors)
enqueue(WasmSym::callDtors);
// In Emscripten-style PIC, `__wasm_call_ctors` calls `__wasm_apply_relocs`.
if (config->isPic)
if (WasmSym::applyRelocs)
enqueue(WasmSym::applyRelocs);
if (config->sharedMemory && !config->shared)
if (WasmSym::initMemory)
enqueue(WasmSym::initMemory);
// Enqueue constructors in objects explicitly live from the command-line.

View File

@ -90,6 +90,8 @@ void CodeSection::finalizeContents() {
func->outputSec = this;
func->outputOffset = bodySize;
func->calculateSize();
// All functions should have a non-empty body at this point
assert(func->getSize());
bodySize += func->getSize();
}

View File

@ -1214,11 +1214,12 @@ void Writer::run() {
calculateInitFunctions();
if (!config->relocatable) {
// Create linker synthesized functions
if (config->isPic)
if (WasmSym::applyRelocs)
createApplyRelocationsFunction();
else if (config->sharedMemory)
if (WasmSym::initMemory)
createInitMemoryFunction();
// Create linker synthesized functions
createCallCtorsFunction();
// Create export wrappers for commands if needed.