[lld] 6474d1b - [lld][WebAssembly] Do not require --shared-memory with --relocatable

Thomas Lively via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 13:49:36 PDT 2020


Author: Thomas Lively
Date: 2020-04-14T13:49:28-07:00
New Revision: 6474d1b20ea74982f9446a11b367a5936b6bbbdd

URL: https://github.com/llvm/llvm-project/commit/6474d1b20ea74982f9446a11b367a5936b6bbbdd
DIFF: https://github.com/llvm/llvm-project/commit/6474d1b20ea74982f9446a11b367a5936b6bbbdd.diff

LOG: [lld][WebAssembly] Do not require --shared-memory with --relocatable

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

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/driver.ll b/lld/test/wasm/driver.ll
index 22e6bc180e4a..995b10a9d9aa 100644
--- a/lld/test/wasm/driver.ll
+++ b/lld/test/wasm/driver.ll
@@ -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

diff  --git a/lld/test/wasm/relocatable.ll b/lld/test/wasm/relocatable.ll
index c3d67b1d7b66..a43a06e4be58 100644
--- a/lld/test/wasm/relocatable.ll
+++ b/lld/test/wasm/relocatable.ll
@@ -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:

diff  --git a/lld/test/wasm/shared-memory.yaml b/lld/test/wasm/shared-memory.yaml
index 7ccbb7722740..8a03e0e776da 100644
--- a/lld/test/wasm/shared-memory.yaml
+++ b/lld/test/wasm/shared-memory.yaml
@@ -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 ]

diff  --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index b6cd879e89c6..c2a4e61c365f 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -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");
   }
 }
 

diff  --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index a6b215344cdb..7c6c2de1d14f 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -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");


        


More information about the llvm-commits mailing list