[lld][WebAssembly] Do not require --shared-memory with --relocatable
authorThomas Lively <tlively@google.com>
Tue, 14 Apr 2020 02:16:20 +0000 (19:16 -0700)
committerThomas Lively <tlively@google.com>
Tue, 14 Apr 2020 20:49:28 +0000 (13:49 -0700)
Summary:
wasm-ld requires --shared-memory to be passed when the atomics feature
is enabled because historically atomic operations were only valid with
shared memories. This change relaxes that requirement for when
building relocatable objects because their memories are not
meaningful. This technically maintains the validity of object files
because the threads spec now allows atomic operations with unshared
memories, although we don't support that elsewhere in the tools yet.

This fixes and Emscripten build issue reported at
https://bugs.chromium.org/p/webp/issues/detail?id=463.

Reviewers: sbc100

Subscribers: dschuff, jgravelle-google, aheejin, sunfish, jfb, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D78072

lld/test/wasm/driver.ll
lld/test/wasm/relocatable.ll
lld/test/wasm/shared-memory.yaml
lld/wasm/Driver.cpp
lld/wasm/Writer.cpp

index 22e6bc1..995b10a 100644 (file)
@@ -20,3 +20,7 @@ entry:
 ; RUN: not wasm-ld --export-table --import-table %t.o 2>&1 \
 ; RUN:   | FileCheck -check-prefix=TABLE %s
 ; TABLE: error: --import-table and --export-table may not be used together
+
+; RUN: not wasm-ld --relocatable --shared-memory %t.o 2>&1 \
+; RUN:   | FileCheck -check-prefix=SHARED-MEM %s
+; SHARED-MEM: error: -r and --shared-memory may not be used together
index c3d67b1..a43a06e 100644 (file)
@@ -1,12 +1,7 @@
 ; RUN: llc -filetype=obj %p/Inputs/hello.ll -o %t.hello.o
 ; RUN: llc -filetype=obj %s -o %t.o
 ; RUN: wasm-ld -r -o %t.wasm %t.hello.o %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s --check-prefixes CHECK,NORMAL
-
-; RUN: llc -filetype=obj %p/Inputs/hello.ll -o %t.hello.bm.o -mattr=+bulk-memory,+atomics
-; RUN: llc -filetype=obj %s -o %t.bm.o -mattr=+bulk-memory
-; RUN: wasm-ld -r -o %t.mt.wasm %t.hello.bm.o %t.bm.o --shared-memory --max-memory=131072
-; RUN: obj2yaml %t.mt.wasm | FileCheck %s --check-prefixes CHECK,SHARED
+; RUN: obj2yaml %t.wasm | FileCheck %s
 
 target triple = "wasm32-unknown-unknown"
 
@@ -79,10 +74,7 @@ entry:
 ; CHECK-NEXT:           Maximum:         0x00000004
 ; CHECK-NEXT:   - Type:            MEMORY
 ; CHECK-NEXT:     Memories:
-; NORMAL-NEXT:      - Initial:         0x00000001
-; SHARED-NEXT:      - Flags:           [ HAS_MAX, IS_SHARED ]
-; SHARED-NEXT:        Initial:         0x00000001
-; SHARED-NEXT:        Maximum:         0x00000002
+; CHECK-NEXT:      - Initial:         0x00000001
 ; CHECK-NEXT:   - Type:            ELEM
 ; CHECK-NEXT:     Segments:
 ; CHECK-NEXT:       - Offset:
index 7ccbb77..8a03e0e 100644 (file)
@@ -10,6 +10,8 @@
 
 # RUN: not wasm-ld --no-entry --features=atomics %t1.o -o - 2>&1 | FileCheck %s --check-prefix ATOMICS-NO-SHARED
 
+# RUN: wasm-ld --relocatable --features=atomics %t1.o -o - | obj2yaml | FileCheck %s --check-prefix ATOMICS-RELOCATABLE
+
 # RUN: wasm-ld --no-entry --shared-memory --max-memory=131072 --features=atomics,bulk-memory %t1.o -o - | obj2yaml | FileCheck %s --check-prefix SHARED
 
 --- !WASM
@@ -65,6 +67,11 @@ Sections:
 
 # ATOMICS-NO-SHARED: 'atomics' feature is used, so --shared-memory must be used{{$}}
 
+# ATOMICS-RELOCATABLE:        - Type:            MEMORY
+# ATOMICS-RELOCATABLE-NEXT:     Memories:
+# ATOMICS-RELOCATABLE-NEXT:         Initial:         0x00000001
+# ATOMICS-RELOCATABLE-NEXT:   - Type:
+
 # SHARED:        - Type:            MEMORY
 # SHARED-NEXT:     Memories:
 # SHARED-NEXT:       - Flags:           [ HAS_MAX, IS_SHARED ]
index b6cd879..c2a4e61 100644 (file)
@@ -453,6 +453,8 @@ static void checkOptions(opt::InputArgList &args) {
       error("-r -and --undefined may not be used together");
     if (config->pie)
       error("-r and -pie may not be used together");
+    if (config->sharedMemory)
+      error("-r and --shared-memory may not be used together");
   }
 }
 
index a6b2153..7c6c2de 100644 (file)
@@ -429,7 +429,8 @@ void Writer::populateTargetFeatures() {
     for (const auto &key : used.keys())
       allowed.insert(std::string(key));
 
-  if (allowed.count("atomics") && !config->sharedMemory) {
+  if (!config->relocatable && allowed.count("atomics") &&
+      !config->sharedMemory) {
     if (inferFeatures)
       error(Twine("'atomics' feature is used by ") + used["atomics"] +
             ", so --shared-memory must be used");