forked from OSchip/llvm-project
[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:
parent
fb2e109d45
commit
701fa0b5ab
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue