[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