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

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 3 11:06:41 PST 2020


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.


        


More information about the llvm-commits mailing list