[llvm] r327146 - [WebAssembly] Disallow weak undefined globals in the object format

Nicholas Wilson via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 9 08:30:44 PST 2018


Author: ncw
Date: Fri Mar  9 08:30:44 2018
New Revision: 327146

URL: http://llvm.org/viewvc/llvm-project?rev=327146&view=rev
Log:
[WebAssembly] Disallow weak undefined globals in the object format

This implements https://github.com/WebAssembly/tool-conventions/pull/47

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

Added:
    llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml
Modified:
    llvm/trunk/lib/MC/WasmObjectWriter.cpp
    llvm/trunk/lib/Object/WasmObjectFile.cpp
    llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml

Modified: llvm/trunk/lib/MC/WasmObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WasmObjectWriter.cpp?rev=327146&r1=327145&r2=327146&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WasmObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/WasmObjectWriter.cpp Fri Mar  9 08:30:44 2018
@@ -1024,6 +1024,9 @@ void WasmObjectWriter::writeObject(MCAss
         Imports.push_back(Import);
         WasmIndices[&WS] = NumFunctionImports++;
       } else if (WS.isGlobal()) {
+        if (WS.isWeak())
+          report_fatal_error("undefined global symbol cannot be weak");
+
         wasm::WasmImport Import;
         Import.Module = WS.getModuleName();
         Import.Field = WS.getName();

Modified: llvm/trunk/lib/Object/WasmObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WasmObjectFile.cpp?rev=327146&r1=327145&r2=327146&view=diff
==============================================================================
--- llvm/trunk/lib/Object/WasmObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/WasmObjectFile.cpp Fri Mar  9 08:30:44 2018
@@ -422,6 +422,11 @@ Error WasmObjectFile::parseLinkingSectio
           IsDefined != isDefinedGlobalIndex(Info.ElementIndex))
         return make_error<GenericBinaryError>("invalid global symbol index",
                                               object_error::parse_failed);
+      if (!IsDefined &&
+          (Info.Flags & wasm::WASM_SYMBOL_BINDING_MASK) ==
+              wasm::WASM_SYMBOL_BINDING_WEAK)
+        return make_error<GenericBinaryError>("undefined weak global symbol",
+                                              object_error::parse_failed);
       if (IsDefined) {
         Info.Name = readString(Ptr);
         unsigned GlobalIndex = Info.ElementIndex - NumImportedGlobals;

Added: llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml?rev=327146&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml (added)
+++ llvm/trunk/test/ObjectYAML/wasm/invalid_global_weak.yaml Fri Mar  9 08:30:44 2018
@@ -0,0 +1,24 @@
+# RUN: yaml2obj < %s | not obj2yaml 2>&1 | FileCheck %s
+
+--- !WASM
+FileHeader:
+  Version:         0x00000001
+Sections:
+  - Type:            IMPORT
+    Imports:
+      - Module:          fiz
+        Field:           imported_global
+        Kind:            GLOBAL
+        GlobalType:      I32
+        GlobalMutable:   false
+  - Type:            CUSTOM
+    Name:            linking
+    SymbolTable:
+      - Index:           0
+        Kind:            GLOBAL
+        Name:            imported_global
+        Flags:           [ BINDING_WEAK, UNDEFINED ]
+        Global:          0
+...
+
+# CHECK: Error reading file: <stdin>: undefined weak global symbol

Modified: llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml?rev=327146&r1=327145&r2=327146&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml (original)
+++ llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml Fri Mar  9 08:30:44 2018
@@ -18,16 +18,11 @@ Sections:
         Field:           weak_import_func
         Kind:            FUNCTION
         SigIndex:        0
-      - Module:          env
-        Field:           weak_import_global
-        Kind:            GLOBAL
-        GlobalType:      I32
-        GlobalMutable:   false
   - Type:            FUNCTION
     FunctionTypes: [ 0 ]
   - Type:            GLOBAL
     Globals:
-      - Index:       1
+      - Index:       0
         Type:        I32
         Mutable:     false
         InitExpr:
@@ -64,7 +59,7 @@ Sections:
          Kind:            GLOBAL
          Name:            weak_defined_global
          Flags:           [ BINDING_WEAK ]
-         Global:          1
+         Global:          0
        - Index:           3
          Kind:            DATA
          Name:            weak_import_data
@@ -74,11 +69,6 @@ Sections:
          Name:            weak_import_func
          Flags:           [ BINDING_WEAK, UNDEFINED ]
          Function:        0
-       - Index:           5
-         Kind:            GLOBAL
-         Name:            weak_import_global
-         Flags:           [ BINDING_WEAK, UNDEFINED ]
-         Global:          0
     SegmentInfo:
       - Index:           0
         Name:            .rodata.constantData
@@ -88,7 +78,6 @@ Sections:
 
 # CHECK:      00000000 W weak_defined_data
 # CHECK-NEXT: 00000001 W weak_defined_func
-# CHECK-NEXT: 00000001 W weak_defined_global
+# CHECK-NEXT: 00000000 W weak_defined_global
 # CHECK-NEXT:          w weak_import_data
 # CHECK-NEXT:          w weak_import_func
-# CHECK-NEXT:          w weak_import_global




More information about the llvm-commits mailing list