[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
This commit is contained in:
Sam Clegg 2020-06-16 12:23:25 -07:00
parent 25cbfa0788
commit 21e14cce23
2 changed files with 51 additions and 2 deletions

View File

@ -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: ...

View 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});
}