[lld] 21e14cc - [lld][WebAssembly] Allow ctors functions that return values

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 18 13:11:53 PDT 2020


Author: Sam Clegg
Date: 2020-06-18T13:11:40-07:00
New Revision: 21e14cce23582fcd622b97d643a4e9b2f10a0583

URL: https://github.com/llvm/llvm-project/commit/21e14cce23582fcd622b97d643a4e9b2f10a0583
DIFF: https://github.com/llvm/llvm-project/commit/21e14cce23582fcd622b97d643a4e9b2f10a0583.diff

LOG: [lld][WebAssembly] Allow ctors functions that return values

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

Added: 
    lld/test/wasm/ctor_return_value.s

Modified: 
    lld/wasm/Writer.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/ctor_return_value.s b/lld/test/wasm/ctor_return_value.s
new file mode 100644
index 000000000000..8fa28eac0755
--- /dev/null
+++ b/lld/test/wasm/ctor_return_value.s
@@ -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, at 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: ...

diff  --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 8cfab837df56..0434a4cf0293 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -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});
     }


        


More information about the llvm-commits mailing list