OSDN Git Service

[lld][WebAssembly] Allow ctors functions that return values
authorSam Clegg <sbc@chromium.org>
Tue, 16 Jun 2020 19:23:25 +0000 (12:23 -0700)
committerSam Clegg <sbc@chromium.org>
Thu, 18 Jun 2020 20:11:40 +0000 (13:11 -0700)
Some projects use the constructor attribute on functions that also
return values.  In this case we just ignore them.

The error was reported in the libgpg-error project that marks
gpg_err_init with the `__constructor__` attribute.

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

lld/test/wasm/ctor_return_value.s [new file with mode: 0644]
lld/wasm/Writer.cpp

diff --git a/lld/test/wasm/ctor_return_value.s b/lld/test/wasm/ctor_return_value.s
new file mode 100644 (file)
index 0000000..8fa28ea
--- /dev/null
@@ -0,0 +1,46 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld %t.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+  .globl  myctor
+myctor:
+  .functype myctor () -> (i32)
+  i32.const 1
+
+  end_function
+
+  .globl  _start
+_start:
+  .functype _start () -> ()
+  call __wasm_call_ctors
+  end_function
+
+  .section  .init_array.100,"",@
+  .p2align  2
+  .int32  myctor
+  .int32  myctor
+  .int32  myctor
+
+.type __wasm_call_ctors,@function
+
+#      CHECK:   - Type:            CODE
+# CHECK-NEXT:     Functions:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Locals:          []
+# CHECK-NEXT:         Body:            10011A10011A10011A0B
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Locals:          []
+# CHECK-NEXT:         Body:            41010B
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Locals:          []
+# CHECK-NEXT:         Body:            1080808080000B
+# CHECK-NEXT:   - Type:            CUSTOM
+# CHECK-NEXT:     Name:            name
+# CHECK-NEXT:     FunctionNames:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Name:            __wasm_call_ctors
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Name:            myctor
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Name:            _start
+# CHECK-NEXT: ...
index 8cfab83..0434a4c 100644 (file)
@@ -913,6 +913,9 @@ void Writer::createCallCtorsFunction() {
     for (const WasmInitEntry &f : initFunctions) {
       writeU8(os, WASM_OPCODE_CALL, "CALL");
       writeUleb128(os, f.sym->getFunctionIndex(), "function index");
+      for (size_t i = 0; i < f.sym->signature->Returns.size(); i++) {
+        writeU8(os, WASM_OPCODE_DROP, "DROP");
+      }
     }
     writeU8(os, WASM_OPCODE_END, "END");
   }
@@ -977,8 +980,8 @@ void Writer::calculateInitFunctions() {
       if (sym->isDiscarded())
         continue;
       assert(sym->isLive());
-      if (*sym->signature != WasmSignature{{}, {}})
-        error("invalid signature for init func: " + toString(*sym));
+      if (sym->signature->Params.size() != 0)
+        error("constructor functions cannot take arguments: " + toString(*sym));
       LLVM_DEBUG(dbgs() << "initFunctions: " << toString(*sym) << "\n");
       initFunctions.emplace_back(WasmInitEntry{sym, f.Priority});
     }