From 2769a48f2791ee4e721832ca165d56701a201628 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Fri, 18 Oct 2019 20:27:30 +0000 Subject: [PATCH] [WebAssembly] Allow multivalue signatures in object files Summary: Also changes the wasm YAML format to reflect the possibility of having multiple return types and to put the returns after the params for consistency with the binary encoding. Reviewers: aheejin, sbc100 Subscribers: dschuff, jgravelle-google, hiraditya, sunfish, arphaman, rupprecht, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69156 llvm-svn: 375283 --- include/llvm/ObjectYAML/WasmYAML.h | 2 +- lib/Object/WasmObjectFile.cpp | 9 +++----- lib/ObjectYAML/WasmEmitter.cpp | 9 +++----- lib/ObjectYAML/WasmYAML.cpp | 3 +-- test/CodeGen/WebAssembly/multivalue.ll | 17 ++++++++++++++ test/CodeGen/WebAssembly/tailcall.ll | 3 ++- test/MC/WebAssembly/assembler-binary.ll | 4 ++-- test/MC/WebAssembly/comdat.ll | 5 ++-- test/MC/WebAssembly/data-section.s | 3 ++- test/MC/WebAssembly/event-section.ll | 5 ++-- test/MC/WebAssembly/external-func-address.ll | 5 ++-- test/MC/WebAssembly/libcall.ll | 5 ++-- test/MC/WebAssembly/reloc-pic.s | 3 ++- test/MC/WebAssembly/type-index.s | 7 +++--- test/MC/WebAssembly/types.ll | 23 +++++++++++-------- test/MC/WebAssembly/weak-alias.ll | 3 ++- test/Object/wasm-duplicate-name.test | 3 ++- test/Object/wasm-relocs-and-producers.yaml | 2 +- test/ObjectYAML/wasm/code_section.yaml | 10 ++++---- test/ObjectYAML/wasm/event_section.yaml | 10 ++++---- test/ObjectYAML/wasm/export_section.yaml | 6 ++--- test/ObjectYAML/wasm/function_section.yaml | 4 ++-- .../ObjectYAML/wasm/import_memory_shared.yaml | 5 ++-- test/ObjectYAML/wasm/import_section.yaml | 5 ++-- .../wasm/invalid_section_order.yaml | 2 +- test/ObjectYAML/wasm/linking_section.yaml | 3 ++- test/ObjectYAML/wasm/name_section.yaml | 3 ++- test/ObjectYAML/wasm/start_section.yaml | 4 ++-- test/ObjectYAML/wasm/type_section.yaml | 12 ++++++---- test/ObjectYAML/wasm/weak_symbols.yaml | 11 +++++---- test/tools/llvm-nm/wasm/exports.yaml | 3 ++- test/tools/llvm-nm/wasm/imports.yaml | 3 ++- test/tools/llvm-nm/wasm/weak-symbols.yaml | 3 ++- test/tools/llvm-readobj/wasm-imports.test | 5 ++-- tools/obj2yaml/wasm2yaml.cpp | 7 ++---- 35 files changed, 123 insertions(+), 84 deletions(-) diff --git a/include/llvm/ObjectYAML/WasmYAML.h b/include/llvm/ObjectYAML/WasmYAML.h index 2411dc7ac17..15a8cc21502 100644 --- a/include/llvm/ObjectYAML/WasmYAML.h +++ b/include/llvm/ObjectYAML/WasmYAML.h @@ -145,7 +145,7 @@ struct Signature { uint32_t Index; SignatureForm Form = wasm::WASM_TYPE_FUNC; std::vector ParamTypes; - ValueType ReturnType; + std::vector ReturnTypes; }; struct SymbolInfo { diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 470283efb29..014b403556d 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -881,12 +881,9 @@ Error WasmObjectFile::parseTypeSection(ReadContext &Ctx) { Sig.Params.push_back(wasm::ValType(ParamType)); } uint32_t ReturnCount = readVaruint32(Ctx); - if (ReturnCount) { - if (ReturnCount != 1) { - return make_error( - "Multiple return types not supported", object_error::parse_failed); - } - Sig.Returns.push_back(wasm::ValType(readUint8(Ctx))); + while (ReturnCount--) { + uint32_t ReturnType = readUint8(Ctx); + Sig.Returns.push_back(wasm::ValType(ReturnType)); } Signatures.push_back(std::move(Sig)); } diff --git a/lib/ObjectYAML/WasmEmitter.cpp b/lib/ObjectYAML/WasmEmitter.cpp index 42c57d42ad7..debc040587a 100644 --- a/lib/ObjectYAML/WasmEmitter.cpp +++ b/lib/ObjectYAML/WasmEmitter.cpp @@ -334,12 +334,9 @@ void WasmWriter::writeSectionContent(raw_ostream &OS, encodeULEB128(Sig.ParamTypes.size(), OS); for (auto ParamType : Sig.ParamTypes) writeUint8(OS, ParamType); - if (Sig.ReturnType == wasm::WASM_TYPE_NORESULT) { - encodeULEB128(0, OS); - } else { - encodeULEB128(1, OS); - writeUint8(OS, Sig.ReturnType); - } + encodeULEB128(Sig.ReturnTypes.size(), OS); + for (auto ReturnType : Sig.ReturnTypes) + writeUint8(OS, ReturnType); } } diff --git a/lib/ObjectYAML/WasmYAML.cpp b/lib/ObjectYAML/WasmYAML.cpp index 04f56947959..232d5122004 100644 --- a/lib/ObjectYAML/WasmYAML.cpp +++ b/lib/ObjectYAML/WasmYAML.cpp @@ -295,8 +295,8 @@ void ScalarEnumerationTraits::enumeration( void MappingTraits::mapping( IO &IO, WasmYAML::Signature &Signature) { IO.mapRequired("Index", Signature.Index); - IO.mapRequired("ReturnType", Signature.ReturnType); IO.mapRequired("ParamTypes", Signature.ParamTypes); + IO.mapRequired("ReturnTypes", Signature.ReturnTypes); } void MappingTraits::mapping(IO &IO, WasmYAML::Table &Table) { @@ -560,7 +560,6 @@ void ScalarEnumerationTraits::enumeration( ECase(V128); ECase(FUNCREF); ECase(FUNC); - ECase(NORESULT); #undef ECase } diff --git a/test/CodeGen/WebAssembly/multivalue.ll b/test/CodeGen/WebAssembly/multivalue.ll index 877851f6a36..ee32852ef57 100644 --- a/test/CodeGen/WebAssembly/multivalue.ll +++ b/test/CodeGen/WebAssembly/multivalue.ll @@ -1,4 +1,5 @@ ; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+multivalue | FileCheck %s +; RUN: llc < %s --filetype=obj -mattr=+multivalue | obj2yaml | FileCheck %s --check-prefix OBJ ; Test that the multivalue returns, function types, and block types ; work as expected. @@ -42,3 +43,19 @@ loop: ; CHECK-NEXT: .int8 43 ; CHECK-NEXT: .int8 10 ; CHECK-NEXT: .ascii "multivalue" + +; OBJ-LABEL: - Type: TYPE +; OBJ-NEXT: Signatures: +; OBJ-NEXT: - Index: 0 +; OBJ-NEXT: ParamTypes: +; OBJ-NEXT: - I32 +; OBJ-NEXT: - I32 +; OBJ-NEXT: ReturnTypes: +; OBJ-NEXT: - I32 +; OBJ-NEXT: - I32 +; OBJ-NEXT: - Index: 1 +; OBJ-NEXT: ParamTypes: +; OBJ-NEXT: - I32 +; OBJ-NEXT: ReturnTypes: +; OBJ-NEXT: - I32 +; OBJ-NEXT: - I64 diff --git a/test/CodeGen/WebAssembly/tailcall.ll b/test/CodeGen/WebAssembly/tailcall.ll index a277b4f7bc2..f4d4499bcef 100644 --- a/test/CodeGen/WebAssembly/tailcall.ll +++ b/test/CodeGen/WebAssembly/tailcall.ll @@ -215,12 +215,13 @@ define i1 @mismatched_return_trunc() { ; return-called functions include the proper return types ; YAML-LABEL: - Index: 8 -; YAML-NEXT: ReturnType: I32 ; YAML-NEXT: ParamTypes: ; YAML-NEXT: - I32 ; YAML-NEXT: - F32 ; YAML-NEXT: - I64 ; YAML-NEXT: - F64 +; YAML-NEXT: ReturnTypes: +; YAML-NEXT: - I32 define i32 @unique_caller(i32 (i32, float, i64, double)** %p) { %f = load i32 (i32, float, i64, double)*, i32 (i32, float, i64, double)** %p %v = tail call i32 %f(i32 0, float 0., i64 0, double 0.) diff --git a/test/MC/WebAssembly/assembler-binary.ll b/test/MC/WebAssembly/assembler-binary.ll index 3683d63e435..35fa4111117 100644 --- a/test/MC/WebAssembly/assembler-binary.ll +++ b/test/MC/WebAssembly/assembler-binary.ll @@ -38,12 +38,12 @@ entry: ; CHECK-NEXT: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Index: 1 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: [] +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Type: IMPORT ; CHECK-NEXT: Imports: ; CHECK-NEXT: - Module: env diff --git a/test/MC/WebAssembly/comdat.ll b/test/MC/WebAssembly/comdat.ll index ecc5e5be27a..e50f5bf1cc9 100644 --- a/test/MC/WebAssembly/comdat.ll +++ b/test/MC/WebAssembly/comdat.ll @@ -28,8 +28,9 @@ define linkonce_odr i32 @sharedFn() #1 comdat($sharedComdat) { ; CHECK-NEXT: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: I32 -; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ParamTypes: [] +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK-NEXT: - Type: IMPORT ; CHECK-NEXT: Imports: ; CHECK-NEXT: - Module: env diff --git a/test/MC/WebAssembly/data-section.s b/test/MC/WebAssembly/data-section.s index 70d9de2bb93..52e60f6d4a7 100644 --- a/test/MC/WebAssembly/data-section.s +++ b/test/MC/WebAssembly/data-section.s @@ -35,8 +35,9 @@ test0: # BIN-NEXT: - Type: TYPE # BIN-NEXT: Signatures: # BIN-NEXT: - Index: 0 -# BIN-NEXT: ReturnType: I32 # BIN-NEXT: ParamTypes: [] +# BIN-NEXT: ReturnTypes: +# BIN-NEXT: - I32 # BIN-NEXT: - Type: IMPORT # BIN-NEXT: Imports: # BIN-NEXT: - Module: env diff --git a/test/MC/WebAssembly/event-section.ll b/test/MC/WebAssembly/event-section.ll index 2b5b5bba9fe..b662c290d3c 100644 --- a/test/MC/WebAssembly/event-section.ll +++ b/test/MC/WebAssembly/event-section.ll @@ -19,13 +19,14 @@ define i32 @test_throw1(i8* %p) { ; CHECK-NEXT: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: I32 ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK-NEXT: - Index: 1 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; CHECK: - Type: EVENT ; CHECK-NEXT: Events: diff --git a/test/MC/WebAssembly/external-func-address.ll b/test/MC/WebAssembly/external-func-address.ll index 9d3b33592e0..9c16c02a4a0 100644 --- a/test/MC/WebAssembly/external-func-address.ll +++ b/test/MC/WebAssembly/external-func-address.ll @@ -27,15 +27,16 @@ define void @call(i32) { ; CHECK-NEXT: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Index: 1 -; CHECK-NEXT: ReturnType: I32 ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK: - Type: IMPORT ; CHECK-NEXT: Imports: ; CHECK: - Module: env diff --git a/test/MC/WebAssembly/libcall.ll b/test/MC/WebAssembly/libcall.ll index b2253583898..9f8abba70c0 100644 --- a/test/MC/WebAssembly/libcall.ll +++ b/test/MC/WebAssembly/libcall.ll @@ -17,14 +17,15 @@ declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture r ; CHECK-NEXT: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Index: 1 -; CHECK-NEXT: ReturnType: I32 ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK-NEXT: - Type: IMPORT diff --git a/test/MC/WebAssembly/reloc-pic.s b/test/MC/WebAssembly/reloc-pic.s index 2b7ef54a3a5..626f8d993e3 100644 --- a/test/MC/WebAssembly/reloc-pic.s +++ b/test/MC/WebAssembly/reloc-pic.s @@ -52,8 +52,9 @@ hidden_func: # CHECK-NEXT: - Type: TYPE # CHECK-NEXT: Signatures: # CHECK-NEXT: - Index: 0 -# CHECK-NEXT: ReturnType: I32 # CHECK-NEXT: ParamTypes: [] +# CHECK-NEXT: ReturnTypes: +# CHECK-NEXT: - I32 # CHECK-NEXT: - Type: IMPORT # CHECK-NEXT: Imports: # CHECK-NEXT: - Module: env diff --git a/test/MC/WebAssembly/type-index.s b/test/MC/WebAssembly/type-index.s index 707f6aa9894..9c77434589f 100644 --- a/test/MC/WebAssembly/type-index.s +++ b/test/MC/WebAssembly/type-index.s @@ -22,13 +22,15 @@ test0: # BIN-NEXT: - Type: TYPE # BIN-NEXT: Signatures: # BIN-NEXT: - Index: 0 -# BIN-NEXT: ReturnType: I32 # BIN-NEXT: ParamTypes: # BIN-NEXT: - I32 +# BIN-NEXT: ReturnTypes: +# BIN-NEXT: - I32 # BIN-NEXT: - Index: 1 -# BIN-NEXT: ReturnType: F64 # BIN-NEXT: ParamTypes: # BIN-NEXT: - F64 +# BIN-NEXT: ReturnTypes: +# BIN-NEXT: - F64 # BIN-NEXT: - Type: IMPORT # BIN-NEXT: Imports: # BIN-NEXT: - Module: env @@ -64,4 +66,3 @@ test0: # BIN-NEXT: Flags: [ BINDING_LOCAL ] # BIN-NEXT: Function: 0 # BIN-NEXT: ... - diff --git a/test/MC/WebAssembly/types.ll b/test/MC/WebAssembly/types.ll index 6eeeef2f531..c049d3ce0e8 100644 --- a/test/MC/WebAssembly/types.ll +++ b/test/MC/WebAssembly/types.ll @@ -37,32 +37,37 @@ define void @vararg(i32, i32, ...) { ; CHECK-LABEL: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Index: 1 -; CHECK-NEXT: ReturnType: I32 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK-NEXT: - Index: 2 -; CHECK-NEXT: ReturnType: I64 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I64 ; CHECK-NEXT: - Index: 3 -; CHECK-NEXT: ReturnType: F32 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - F32 ; CHECK-NEXT: - Index: 4 -; CHECK-NEXT: ReturnType: F64 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - F64 ; CHECK-NEXT: - Index: 5 -; CHECK-NEXT: ReturnType: V128 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - V128 ; CHECK-NEXT: - Index: 6 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Index: 7 -; CHECK-NEXT: ReturnType: NORESULT ; CHECK-NEXT: ParamTypes: ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 ; CHECK-NEXT: - I32 +; CHECK-NEXT: ReturnTypes: [] ; should be no additional types -; CHECK-NOT: ReturnType +; CHECK-NOT: ReturnTypes diff --git a/test/MC/WebAssembly/weak-alias.ll b/test/MC/WebAssembly/weak-alias.ll index 20a27edd343..c9c707e69e2 100644 --- a/test/MC/WebAssembly/weak-alias.ll +++ b/test/MC/WebAssembly/weak-alias.ll @@ -49,8 +49,9 @@ entry: ; CHECK: - Type: TYPE ; CHECK-NEXT: Signatures: ; CHECK-NEXT: - Index: 0 -; CHECK-NEXT: ReturnType: I32 ; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: ReturnTypes: +; CHECK-NEXT: - I32 ; CHECK-NEXT: - Type: IMPORT ; CHECK-NEXT: Imports: ; CHECK-NEXT: - Module: env diff --git a/test/Object/wasm-duplicate-name.test b/test/Object/wasm-duplicate-name.test index 1bf20778028..666291c9524 100644 --- a/test/Object/wasm-duplicate-name.test +++ b/test/Object/wasm-duplicate-name.test @@ -7,9 +7,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: foo diff --git a/test/Object/wasm-relocs-and-producers.yaml b/test/Object/wasm-relocs-and-producers.yaml index 01ad2bb89fb..2bdc12e4619 100644 --- a/test/Object/wasm-relocs-and-producers.yaml +++ b/test/Object/wasm-relocs-and-producers.yaml @@ -16,8 +16,8 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: NORESULT ParamTypes: [] + ReturnTypes: [] - Type: IMPORT Imports: - Module: env diff --git a/test/ObjectYAML/wasm/code_section.yaml b/test/ObjectYAML/wasm/code_section.yaml index 0171938a6a3..dad75e081ea 100644 --- a/test/ObjectYAML/wasm/code_section.yaml +++ b/test/ObjectYAML/wasm/code_section.yaml @@ -6,14 +6,15 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: F32 ParamTypes: - I32 + ReturnTypes: + - F32 - Index: 1 - ReturnType: NORESULT ParamTypes: - I32 - I64 + ReturnTypes: [] - Type: FUNCTION FunctionTypes: - 0 @@ -59,14 +60,15 @@ Sections: # CHECK: - Type: TYPE # CHECK: Signatures: # CHECK: - Index: 0 -# CHECK: ReturnType: F32 # CHECK: ParamTypes: # CHECK: - I32 +# CHECK: ReturnTypes: +# CHECK: - F32 # CHECK: - Index: 1 -# CHECK: ReturnType: NORESULT # CHECK: ParamTypes: # CHECK: - I32 # CHECK: - I64 +# CHECK: ReturnTypes: [] # CHECK: - Type: CODE # CHECK: Relocations: # CHECK: - Type: R_WASM_TABLE_INDEX_SLEB diff --git a/test/ObjectYAML/wasm/event_section.yaml b/test/ObjectYAML/wasm/event_section.yaml index 91683bd3da4..5c64cc81552 100644 --- a/test/ObjectYAML/wasm/event_section.yaml +++ b/test/ObjectYAML/wasm/event_section.yaml @@ -7,13 +7,14 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Index: 1 - ReturnType: NORESULT ParamTypes: - I32 + ReturnTypes: [] - Type: FUNCTION FunctionTypes: [ 0 ] - Type: EVENT @@ -53,13 +54,14 @@ Sections: # CHECK-NEXT: - Type: TYPE # CHECK-NEXT: Signatures: # CHECK-NEXT: - Index: 0 -# CHECK-NEXT: ReturnType: I32 # CHECK-NEXT: ParamTypes: # CHECK-NEXT: - I32 +# CHECK-NEXT: ReturnTypes: +# CHECK-NEXT: - I32 # CHECK-NEXT: - Index: 1 -# CHECK-NEXT: ReturnType: NORESULT # CHECK-NEXT: ParamTypes: # CHECK-NEXT: - I32 +# CHECK-NEXT: ReturnTypes: [] # CHECK-NEXT: - Type: FUNCTION # CHECK-NEXT: FunctionTypes: [ 0 ] # CHECK-NEXT: - Type: EVENT diff --git a/test/ObjectYAML/wasm/export_section.yaml b/test/ObjectYAML/wasm/export_section.yaml index af72f136811..4b3487cec5a 100644 --- a/test/ObjectYAML/wasm/export_section.yaml +++ b/test/ObjectYAML/wasm/export_section.yaml @@ -6,8 +6,8 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: NORESULT ParamTypes: + ReturnTypes: [] - Type: FUNCTION FunctionTypes: [ 0, 0 ] - Type: GLOBAL @@ -25,7 +25,7 @@ Sections: Opcode: I64_CONST Value: 64 - Type: EXPORT - Exports: + Exports: - Name: function_export Kind: FUNCTION Index: 1 @@ -52,7 +52,7 @@ Sections: # CHECK: Version: 0x00000001 # CHECK: Sections: # CHECK: - Type: EXPORT -# CHECK: Exports: +# CHECK: Exports: # CHECK: - Name: function_export # CHECK: Kind: FUNCTION # CHECK: Index: 1 diff --git a/test/ObjectYAML/wasm/function_section.yaml b/test/ObjectYAML/wasm/function_section.yaml index d3161445295..8bfe4fa7f58 100644 --- a/test/ObjectYAML/wasm/function_section.yaml +++ b/test/ObjectYAML/wasm/function_section.yaml @@ -6,12 +6,12 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: NORESULT ParamTypes: + ReturnTypes: [] - Index: 1 - ReturnType: NORESULT ParamTypes: - I32 + ReturnTypes: [] - Type: FUNCTION FunctionTypes: [ 1, 0 ] - Type: CODE diff --git a/test/ObjectYAML/wasm/import_memory_shared.yaml b/test/ObjectYAML/wasm/import_memory_shared.yaml index 849bdc5314d..b6ca9fa44f9 100644 --- a/test/ObjectYAML/wasm/import_memory_shared.yaml +++ b/test/ObjectYAML/wasm/import_memory_shared.yaml @@ -6,9 +6,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: foo @@ -25,7 +26,7 @@ Sections: # CHECK: Version: 0x00000001 # CHECK: Sections: # CHECK: - Type: IMPORT -# CHECK: Imports: +# CHECK: Imports: # CHECK: - Module: foo # CHECK: Field: imported_memory # CHECK: Kind: MEMORY diff --git a/test/ObjectYAML/wasm/import_section.yaml b/test/ObjectYAML/wasm/import_section.yaml index 90de6f0fec7..2df2f3928ec 100644 --- a/test/ObjectYAML/wasm/import_section.yaml +++ b/test/ObjectYAML/wasm/import_section.yaml @@ -6,9 +6,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: foo @@ -42,7 +43,7 @@ Sections: # CHECK: Version: 0x00000001 # CHECK: Sections: # CHECK: - Type: IMPORT -# CHECK: Imports: +# CHECK: Imports: # CHECK: - Module: foo # CHECK: Field: imported_function # CHECK: Kind: FUNCTION diff --git a/test/ObjectYAML/wasm/invalid_section_order.yaml b/test/ObjectYAML/wasm/invalid_section_order.yaml index 4e3581ec5eb..71767576979 100644 --- a/test/ObjectYAML/wasm/invalid_section_order.yaml +++ b/test/ObjectYAML/wasm/invalid_section_order.yaml @@ -7,8 +7,8 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: NORESULT ParamTypes: [] + ReturnTypes: [] - Type: CODE Functions: - Index: 0 diff --git a/test/ObjectYAML/wasm/linking_section.yaml b/test/ObjectYAML/wasm/linking_section.yaml index 39827410b0e..2e3da8791c7 100644 --- a/test/ObjectYAML/wasm/linking_section.yaml +++ b/test/ObjectYAML/wasm/linking_section.yaml @@ -6,9 +6,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: foo diff --git a/test/ObjectYAML/wasm/name_section.yaml b/test/ObjectYAML/wasm/name_section.yaml index f7a489d7542..a22b25771e1 100644 --- a/test/ObjectYAML/wasm/name_section.yaml +++ b/test/ObjectYAML/wasm/name_section.yaml @@ -6,9 +6,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: foo diff --git a/test/ObjectYAML/wasm/start_section.yaml b/test/ObjectYAML/wasm/start_section.yaml index 5d57c1b7a05..754adea5a18 100644 --- a/test/ObjectYAML/wasm/start_section.yaml +++ b/test/ObjectYAML/wasm/start_section.yaml @@ -7,8 +7,8 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: NORESULT - ParamTypes: + ParamTypes: [] + ReturnTypes: [] - Type: FUNCTION FunctionTypes: [ 0, 0, 0 ] - Type: START diff --git a/test/ObjectYAML/wasm/type_section.yaml b/test/ObjectYAML/wasm/type_section.yaml index a87949fed06..beb3a16e766 100644 --- a/test/ObjectYAML/wasm/type_section.yaml +++ b/test/ObjectYAML/wasm/type_section.yaml @@ -6,15 +6,17 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - F32 - F32 + ReturnTypes: + - I32 - Index: 1 - ReturnType: I64 ParamTypes: - F64 - F64 + ReturnTypes: + - I64 ... # CHECK: --- !WASM # CHECK: FileHeader: @@ -23,13 +25,15 @@ Sections: # CHECK: - Type: TYPE # CHECK: Signatures: # CHECK: - Index: 0 -# CHECK: ReturnType: I32 # CHECK: ParamTypes: # CHECK: - F32 # CHECK: - F32 +# CHECK: ReturnTypes: +# CHECK: - I32 # CHECK: - Index: 1 -# CHECK: ReturnType: I64 # CHECK: ParamTypes: # CHECK: - F64 # CHECK: - F64 +# CHECK: ReturnTypes: +# CHECK: - I64 # CHECK: ... diff --git a/test/ObjectYAML/wasm/weak_symbols.yaml b/test/ObjectYAML/wasm/weak_symbols.yaml index fb85b829a37..82bc70c244f 100644 --- a/test/ObjectYAML/wasm/weak_symbols.yaml +++ b/test/ObjectYAML/wasm/weak_symbols.yaml @@ -6,12 +6,13 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 - ParamTypes: + ParamTypes: [] + ReturnTypes: + - I32 - Type: FUNCTION FunctionTypes: [ 0, 0 ] - Type: GLOBAL - Globals: + Globals: - Index: 0 Type: I32 Mutable: false @@ -19,7 +20,7 @@ Sections: Opcode: I32_CONST Value: 1 - Type: EXPORT - Exports: + Exports: - Name: function_export Kind: FUNCTION Index: 1 @@ -54,7 +55,7 @@ Sections: # CHECK: Version: 0x00000001 # CHECK: Sections: # CHECK: - Type: EXPORT -# CHECK: Exports: +# CHECK: Exports: # CHECK: - Name: function_export # CHECK: Kind: FUNCTION # CHECK: Index: 1 diff --git a/test/tools/llvm-nm/wasm/exports.yaml b/test/tools/llvm-nm/wasm/exports.yaml index eddcbc22c1f..15c98ae2bf4 100644 --- a/test/tools/llvm-nm/wasm/exports.yaml +++ b/test/tools/llvm-nm/wasm/exports.yaml @@ -9,9 +9,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: FUNCTION FunctionTypes: [ 0 ] - Type: GLOBAL diff --git a/test/tools/llvm-nm/wasm/imports.yaml b/test/tools/llvm-nm/wasm/imports.yaml index 2ea0d0f13fe..37b0ce486c3 100644 --- a/test/tools/llvm-nm/wasm/imports.yaml +++ b/test/tools/llvm-nm/wasm/imports.yaml @@ -9,9 +9,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: env diff --git a/test/tools/llvm-nm/wasm/weak-symbols.yaml b/test/tools/llvm-nm/wasm/weak-symbols.yaml index a81559402dc..d8e4cece0fe 100644 --- a/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ b/test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -9,9 +9,10 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: - I32 + ReturnTypes: + - I32 - Type: IMPORT Imports: - Module: env diff --git a/test/tools/llvm-readobj/wasm-imports.test b/test/tools/llvm-readobj/wasm-imports.test index fd1e5c8e641..6eb19673d99 100644 --- a/test/tools/llvm-readobj/wasm-imports.test +++ b/test/tools/llvm-readobj/wasm-imports.test @@ -9,11 +9,12 @@ Sections: - Type: TYPE Signatures: - Index: 0 - ReturnType: I32 ParamTypes: [] + ReturnTypes: + - I32 - Index: 1 - ReturnType: NORESULT ParamTypes: [] + ReturnTypes: [] - Type: IMPORT Imports: - Module: env diff --git a/tools/obj2yaml/wasm2yaml.cpp b/tools/obj2yaml/wasm2yaml.cpp index 7a540974d50..ea7a1e983bd 100644 --- a/tools/obj2yaml/wasm2yaml.cpp +++ b/tools/obj2yaml/wasm2yaml.cpp @@ -198,13 +198,10 @@ ErrorOr WasmDumper::dump() { for (const auto &FunctionSig : Obj.types()) { WasmYAML::Signature Sig; Sig.Index = Index++; - Sig.ReturnType = wasm::WASM_TYPE_NORESULT; - assert(FunctionSig.Returns.size() <= 1 && - "Functions with multiple returns are not supported"); - if (FunctionSig.Returns.size()) - Sig.ReturnType = static_cast(FunctionSig.Returns[0]); for (const auto &ParamType : FunctionSig.Params) Sig.ParamTypes.emplace_back(static_cast(ParamType)); + for (const auto &ReturnType : FunctionSig.Returns) + Sig.ReturnTypes.emplace_back(static_cast(ReturnType)); TypeSec->Signatures.push_back(Sig); } S = std::move(TypeSec);