Author: Sam Clegg Date: 2020-12-03T11:06:07-08:00 New Revision: 701fa0b5ab04e9aa309cbc30599e9d6ee879e61a
URL: https://github.com/llvm/llvm-project/commit/701fa0b5ab04e9aa309cbc30599e9d6ee879e61a DIFF: https://github.com/llvm/llvm-project/commit/701fa0b5ab04e9aa309cbc30599e9d6ee879e61a.diff LOG: [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 Added: Modified: lld/test/wasm/data-segments.ll lld/wasm/MarkLive.cpp lld/wasm/OutputSections.cpp lld/wasm/Writer.cpp Removed: ################################################################################ diff --git a/lld/test/wasm/data-segments.ll b/lld/test/wasm/data-segments.ll index eb419ba07f30..835aa31b7ab1 100644 --- a/lld/test/wasm/data-segments.ll +++ b/lld/test/wasm/data-segments.ll @@ -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 diff --git a/lld/wasm/MarkLive.cpp b/lld/wasm/MarkLive.cpp index 235936e4ef3e..046041bab472 100644 --- a/lld/wasm/MarkLive.cpp +++ b/lld/wasm/MarkLive.cpp @@ -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. diff --git a/lld/wasm/OutputSections.cpp b/lld/wasm/OutputSections.cpp index fca9bd79296c..89f51ec467b1 100644 --- a/lld/wasm/OutputSections.cpp +++ b/lld/wasm/OutputSections.cpp @@ -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(); } diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 0be9a044763b..e818bc5db60a 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -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. _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits