[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
This commit is contained in:
Thomas Lively 2020-04-13 19:16:20 -07:00
parent 5f07dcd23c
commit 6474d1b20e
5 changed files with 17 additions and 11 deletions

View 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

View 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:

View 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 ]

View 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");
}
}

View 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");