[lld] r357310 - [WebAssembly] "atomics" feature requires shared memory

Thomas Lively via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 29 13:43:50 PDT 2019


Author: tlively
Date: Fri Mar 29 13:43:49 2019
New Revision: 357310

URL: http://llvm.org/viewvc/llvm-project?rev=357310&view=rev
Log:
[WebAssembly] "atomics" feature requires shared memory

Summary:
Makes it a linker error if the "atomics" feature is used but the user
does not opt in to shared memory or if "atomics" is disallowed but the
user does opt in to shared memory. Also check that an appropriate max
memory size is supplied if shared memory is used.

Reviewers: sbc100, aheejin

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

Tags: #llvm

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

Added:
    lld/trunk/test/wasm/shared-memory-no-atomics.yaml
    lld/trunk/test/wasm/shared-memory.yaml
Modified:
    lld/trunk/wasm/Writer.cpp

Added: lld/trunk/test/wasm/shared-memory-no-atomics.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/shared-memory-no-atomics.yaml?rev=357310&view=auto
==============================================================================
--- lld/trunk/test/wasm/shared-memory-no-atomics.yaml (added)
+++ lld/trunk/test/wasm/shared-memory-no-atomics.yaml Fri Mar 29 13:43:49 2019
@@ -0,0 +1,60 @@
+# RUN: yaml2obj %s -o %t1.o
+
+# RUN: wasm-ld --no-entry %t1.o -o - | obj2yaml | FileCheck %s --check-prefix NO-SHARED
+
+# RUN: not wasm-ld --no-entry --shared-memory --max-memory=131072 %t1.o -o - 2>&1 | FileCheck %s --check-prefix SHARED
+
+--- !WASM
+FileHeader:
+  Version:         0x00000001
+Sections:
+  - Type:            IMPORT
+    Imports:
+      - Module:          env
+        Field:           __linear_memory
+        Kind:            MEMORY
+        Memory:
+          Initial:         0x00000001
+      - Module:          env
+        Field:           __indirect_function_table
+        Kind:            TABLE
+        Table:
+          ElemType:        FUNCREF
+          Limits:
+            Initial:         0x00000000
+  - Type:            DATA
+    Segments:
+      - SectionOffset:   6
+        InitFlags:       0
+        Offset:
+          Opcode:          I32_CONST
+          Value:           0
+        Content:         68656C6C6F0A00
+  - Type:            CUSTOM
+    Name:            linking
+    Version:         2
+    SymbolTable:
+      - Index:           0
+        Kind:            DATA
+        Name:            hello_str
+        Flags:           [  ]
+        Segment:         0
+        Size:            7
+    SegmentInfo:
+      - Index:           0
+        Name:            .rodata.hello_str
+        Alignment:       0
+        Flags:           [  ]
+  - Type:            CUSTOM
+    Name:            target_features
+    Features:
+      - Prefix:        DISALLOWED
+        Name:          "atomics"
+...
+
+# NO-SHARED:      - Type:            MEMORY
+# NO-SHARED-NEXT:   Memories:
+# NO-SHARED-NEXT:     - Initial:         0x00000002
+# NO-SHARED-NOT:        Maximum:
+
+# SHARED: 'atomics' feature is disallowed, so --shared-memory must not be used{{$}}

Added: lld/trunk/test/wasm/shared-memory.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/shared-memory.yaml?rev=357310&view=auto
==============================================================================
--- lld/trunk/test/wasm/shared-memory.yaml (added)
+++ lld/trunk/test/wasm/shared-memory.yaml Fri Mar 29 13:43:49 2019
@@ -0,0 +1,75 @@
+# RUN: yaml2obj %s -o %t1.o
+
+# RUN: not wasm-ld --no-entry --shared-memory %t1.o -o - 2>&1 | FileCheck %s --check-prefix SHARED-NO-MAX
+
+# RUN: not wasm-ld --no-entry --shared-memory --max-memory=100000 %t1.o -o - 2>&1 | FileCheck %s --check-prefix SHARED-UNALIGNED
+
+# RUN: wasm-ld --no-entry --shared-memory --max-memory=131072 %t1.o -o - | obj2yaml | FileCheck %s --check-prefix SHARED
+
+# RUN: not wasm-ld --no-entry --features=atomics %t1.o -o - 2>&1 | FileCheck %s --check-prefix ATOMICS-NO-SHARED
+
+# RUN: not wasm-ld --no-entry --features=atomics --shared-memory %t1.o -o - 2>&1 | FileCheck %s --check-prefix ATOMICS-NO-MAX
+
+# RUN: not wasm-ld --no-entry --features=atomics --shared-memory --max-memory=100000 %t1.o -o - 2>&1 | FileCheck %s --check-prefix ATOMICS-UNALIGNED
+
+# RUN: wasm-ld --no-entry --features=atomics --shared-memory --max-memory=131072 %t1.o -o - | obj2yaml | FileCheck %s --check-prefix SHARED
+
+
+--- !WASM
+FileHeader:
+  Version:         0x00000001
+Sections:
+  - Type:            IMPORT
+    Imports:
+      - Module:          env
+        Field:           __linear_memory
+        Kind:            MEMORY
+        Memory:
+          Initial:         0x00000001
+      - Module:          env
+        Field:           __indirect_function_table
+        Kind:            TABLE
+        Table:
+          ElemType:        FUNCREF
+          Limits:
+            Initial:         0x00000000
+  - Type:            DATA
+    Segments:
+      - SectionOffset:   6
+        InitFlags:       0
+        Offset:
+          Opcode:          I32_CONST
+          Value:           0
+        Content:         68656C6C6F0A00
+  - Type:            CUSTOM
+    Name:            linking
+    Version:         2
+    SymbolTable:
+      - Index:           0
+        Kind:            DATA
+        Name:            hello_str
+        Flags:           [  ]
+        Segment:         0
+        Size:            7
+    SegmentInfo:
+      - Index:           0
+        Name:            .rodata.hello_str
+        Alignment:       0
+        Flags:           [  ]
+...
+
+# SHARED-NO-MAX: maximum memory too small, 66560 bytes needed{{$}}
+
+# SHARED-UNALIGNED: maximum memory must be 65536-byte aligned{{$}}
+
+# SHARED:        - Type:            MEMORY
+# SHARED-NEXT:     Memories:
+# SHARED-NEXT:       - Flags:           [ HAS_MAX, IS_SHARED ]
+# SHARED-NEXT:         Initial:         0x00000002
+# SHARED-NEXT:         Maximum:         0x00000002
+
+# ATOMICS-NO-SHARED: 'atomics' feature is used, so --shared-memory must be used{{$}}
+
+# ATOMICS-NO-MAX: maximum memory too small, 66560 bytes needed{{$}}
+
+# ATOMICS-UNALIGNED: maximum memory must be 65536-byte aligned{{$}}

Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=357310&r1=357309&r2=357310&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Fri Mar 29 13:43:49 2019
@@ -169,7 +169,7 @@ void Writer::createImportSection() {
     Import.Kind = WASM_EXTERNAL_MEMORY;
     Import.Memory.Flags = 0;
     Import.Memory.Initial = NumMemoryPages;
-    if (MaxMemoryPages != 0) {
+    if (MaxMemoryPages != 0 || Config->SharedMemory) {
       Import.Memory.Flags |= WASM_LIMITS_FLAG_HAS_MAX;
       Import.Memory.Maximum = MaxMemoryPages;
     }
@@ -257,7 +257,7 @@ void Writer::createMemorySection() {
   SyntheticSection *Section = createSyntheticSection(WASM_SEC_MEMORY);
   raw_ostream &OS = Section->getStream();
 
-  bool HasMax = MaxMemoryPages != 0;
+  bool HasMax = MaxMemoryPages != 0 || Config->SharedMemory;
   writeUleb128(OS, 1, "memory count");
   unsigned Flags = 0;
   if (HasMax)
@@ -831,7 +831,8 @@ void Writer::layoutMemory() {
   NumMemoryPages = alignTo(MemoryPtr, WasmPageSize) / WasmPageSize;
   log("mem: total pages = " + Twine(NumMemoryPages));
 
-  if (Config->MaxMemory != 0) {
+  // Check max if explicitly supplied or required by shared memory
+  if (Config->MaxMemory != 0 || Config->SharedMemory) {
     if (Config->MaxMemory != alignTo(Config->MaxMemory, WasmPageSize))
       error("maximum memory must be " + Twine(WasmPageSize) + "-byte aligned");
     if (MemoryPtr > Config->MaxMemory)
@@ -927,9 +928,16 @@ void Writer::calculateTargetFeatures() {
   if (InferFeatures)
     TargetFeatures.insert(Used.begin(), Used.end());
 
+  if (TargetFeatures.count("atomics") && !Config->SharedMemory)
+    error("'atomics' feature is used, so --shared-memory must be used");
+
   if (!Config->CheckFeatures)
     return;
 
+  if (Disallowed.count("atomics") && Config->SharedMemory)
+    error(
+        "'atomics' feature is disallowed, so --shared-memory must not be used");
+
   // Validate that used features are allowed in output
   if (!InferFeatures) {
     for (auto &Feature : Used) {




More information about the llvm-commits mailing list