From e53af7f6df2cabaa62516e32ae00aaf271258fa4 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 9 Jan 2018 21:38:53 +0000 Subject: [PATCH] [WebAssembly] Explicitly specify function/global index space in YAML These indexes are useful because they are not always zero based and functions and globals are referenced elsewhere by their index. This matches what we already do for the type index space. Differential Revision: https://reviews.llvm.org/D41877 llvm-svn: 322121 --- llvm/include/llvm/BinaryFormat/Wasm.h | 2 + llvm/include/llvm/ObjectYAML/WasmYAML.h | 2 + llvm/lib/Object/WasmObjectFile.cpp | 4 +- llvm/lib/ObjectYAML/WasmYAML.cpp | 4 +- llvm/test/MC/WebAssembly/bss.ll | 12 +++-- llvm/test/MC/WebAssembly/explicit-sections.ll | 12 +++-- llvm/test/MC/WebAssembly/init-fini-array.ll | 15 ++++--- llvm/test/MC/WebAssembly/unnamed-data.ll | 12 +++-- llvm/test/MC/WebAssembly/weak-alias.ll | 24 ++++++---- llvm/test/ObjectYAML/wasm/code_section.yaml | 18 +++++--- llvm/test/ObjectYAML/wasm/export_section.yaml | 6 ++- llvm/test/ObjectYAML/wasm/global_section.yaml | 6 ++- llvm/test/ObjectYAML/wasm/import_section.yaml | 3 +- .../test/ObjectYAML/wasm/linking_section.yaml | 3 +- llvm/test/ObjectYAML/wasm/name_section.yaml | 3 +- llvm/test/ObjectYAML/wasm/start_section.yaml | 3 +- llvm/test/ObjectYAML/wasm/type_section.yaml | 6 ++- llvm/test/ObjectYAML/wasm/weak_symbols.yaml | 6 ++- llvm/test/tools/llvm-nm/wasm/exports.yaml | 44 ++++++++++--------- llvm/test/tools/llvm-nm/wasm/imports.yaml | 3 +- .../test/tools/llvm-nm/wasm/weak-symbols.yaml | 16 ++++--- llvm/tools/obj2yaml/wasm2yaml.cpp | 2 + llvm/tools/yaml2obj/yaml2wasm.cpp | 37 ++++++++++++++-- 23 files changed, 168 insertions(+), 75 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h index 57a0b441821b..7d436180f037 100644 --- a/llvm/include/llvm/BinaryFormat/Wasm.h +++ b/llvm/include/llvm/BinaryFormat/Wasm.h @@ -66,6 +66,7 @@ struct WasmInitExpr { }; struct WasmGlobal { + uint32_t Index; int32_t Type; bool Mutable; WasmInitExpr InitExpr; @@ -89,6 +90,7 @@ struct WasmLocalDecl { }; struct WasmFunction { + uint32_t Index; std::vector Locals; ArrayRef Body; uint32_t CodeSectionOffset; diff --git a/llvm/include/llvm/ObjectYAML/WasmYAML.h b/llvm/include/llvm/ObjectYAML/WasmYAML.h index 188ce8e44491..dcc31fc1137f 100644 --- a/llvm/include/llvm/ObjectYAML/WasmYAML.h +++ b/llvm/include/llvm/ObjectYAML/WasmYAML.h @@ -66,6 +66,7 @@ struct ElemSegment { }; struct Global { + uint32_t Index; ValueType Type; bool Mutable; wasm::WasmInitExpr InitExpr; @@ -89,6 +90,7 @@ struct LocalDecl { }; struct Function { + uint32_t Index; std::vector Locals; yaml::BinaryRef Body; }; diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 48f98df6f34d..c33f4f686940 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -632,6 +632,7 @@ Error WasmObjectFile::parseGlobalSection(const uint8_t *Ptr, const uint8_t *End) Globals.reserve(Count); while (Count--) { wasm::WasmGlobal Global; + Global.Index = NumImportedGlobals + Globals.size(); Global.Type = readVarint7(Ptr); Global.Mutable = readVaruint1(Ptr); if (Error Err = readInitExpr(Global.InitExpr, Ptr)) @@ -706,6 +707,7 @@ Error WasmObjectFile::parseCodeSection(const uint8_t *Ptr, const uint8_t *End) { uint32_t Size = readVaruint32(Ptr); const uint8_t *FunctionEnd = Ptr + Size; + Function.Index = NumImportedFunctions + Functions.size(); Function.CodeSectionOffset = FunctionStart - CodeSectionStart; Function.Size = FunctionEnd - FunctionStart; @@ -858,7 +860,7 @@ uint64_t WasmObjectFile::getWasmSymbolValue(const WasmSymbol& Sym) const { case WasmSymbol::SymbolType::GLOBAL_EXPORT: { uint32_t GlobalIndex = Sym.ElementIndex - NumImportedGlobals; assert(GlobalIndex < Globals.size()); - const wasm::WasmGlobal& Global = Globals[GlobalIndex]; + const wasm::WasmGlobal &Global = Globals[GlobalIndex]; // WasmSymbols correspond only to I32_CONST globals assert(Global.InitExpr.Opcode == wasm::WASM_OPCODE_I32_CONST); return Global.InitExpr.Value.Int32; diff --git a/llvm/lib/ObjectYAML/WasmYAML.cpp b/llvm/lib/ObjectYAML/WasmYAML.cpp index b2411395dc0f..70721e006dab 100644 --- a/llvm/lib/ObjectYAML/WasmYAML.cpp +++ b/llvm/lib/ObjectYAML/WasmYAML.cpp @@ -236,7 +236,7 @@ void ScalarEnumerationTraits::enumeration( void MappingTraits::mapping( IO &IO, WasmYAML::Signature &Signature) { - IO.mapOptional("Index", Signature.Index); + IO.mapRequired("Index", Signature.Index); IO.mapRequired("ReturnType", Signature.ReturnType); IO.mapRequired("ParamTypes", Signature.ParamTypes); } @@ -248,6 +248,7 @@ void MappingTraits::mapping(IO &IO, WasmYAML::Table &Table) { void MappingTraits::mapping(IO &IO, WasmYAML::Function &Function) { + IO.mapRequired("Index", Function.Index); IO.mapRequired("Locals", Function.Locals); IO.mapRequired("Body", Function.Body); } @@ -323,6 +324,7 @@ void MappingTraits::mapping(IO &IO, void MappingTraits::mapping(IO &IO, WasmYAML::Global &Global) { + IO.mapRequired("Index", Global.Index); IO.mapRequired("Type", Global.Type); IO.mapRequired("Mutable", Global.Mutable); IO.mapRequired("InitExpr", Global.InitExpr); diff --git a/llvm/test/MC/WebAssembly/bss.ll b/llvm/test/MC/WebAssembly/bss.ll index 66fad935fd82..b9b868a2fd47 100644 --- a/llvm/test/MC/WebAssembly/bss.ll +++ b/llvm/test/MC/WebAssembly/bss.ll @@ -9,22 +9,26 @@ ; CHECK: - Type: GLOBAL ; CHECK-NEXT: Globals: -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 0 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 4 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 8 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST diff --git a/llvm/test/MC/WebAssembly/explicit-sections.ll b/llvm/test/MC/WebAssembly/explicit-sections.ll index 87a2c6bcf03d..91f2f7bd28ce 100644 --- a/llvm/test/MC/WebAssembly/explicit-sections.ll +++ b/llvm/test/MC/WebAssembly/explicit-sections.ll @@ -9,22 +9,26 @@ ; CHECK: - Type: GLOBAL ; CHECK-NEXT: Globals: -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 0 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 8 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 16 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST diff --git a/llvm/test/MC/WebAssembly/init-fini-array.ll b/llvm/test/MC/WebAssembly/init-fini-array.ll index ddcdd1a0c413..b0a0d4b35553 100644 --- a/llvm/test/MC/WebAssembly/init-fini-array.ll +++ b/llvm/test/MC/WebAssembly/init-fini-array.ll @@ -55,7 +55,8 @@ declare void @func3() ; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 1 ] ; CHECK-NEXT: - Type: GLOBAL ; CHECK-NEXT: Globals: -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST @@ -110,13 +111,17 @@ declare void @func3() ; CHECK-NEXT: Index: 1 ; CHECK-NEXT: Offset: 0x00000045 ; CHECK-NEXT: Functions: -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 5 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 1080808080000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 6 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 0240418080808000410041FFFFFFFF7F1081808080000D000F0B00000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 7 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 1082808080000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 8 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 0240418180808000410041FFFFFFFF7F1081808080000D000F0B00000B ; CHECK-NEXT: - Type: DATA ; CHECK-NEXT: Segments: diff --git a/llvm/test/MC/WebAssembly/unnamed-data.ll b/llvm/test/MC/WebAssembly/unnamed-data.ll index 98e7a81c1962..27d4a587fba5 100644 --- a/llvm/test/MC/WebAssembly/unnamed-data.ll +++ b/llvm/test/MC/WebAssembly/unnamed-data.ll @@ -9,22 +9,26 @@ ; CHECK: - Type: GLOBAL ; CHECK-NEXT: Globals: -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 0 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 6 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 16 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST diff --git a/llvm/test/MC/WebAssembly/weak-alias.ll b/llvm/test/MC/WebAssembly/weak-alias.ll index 29eeac02da66..83757f48a16c 100644 --- a/llvm/test/MC/WebAssembly/weak-alias.ll +++ b/llvm/test/MC/WebAssembly/weak-alias.ll @@ -76,17 +76,20 @@ entry: ; CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ] ; CHECK-NEXT: - Type: GLOBAL ; CHECK-NEXT: Globals: -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 8 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 16 -; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST @@ -150,15 +153,20 @@ entry: ; CHECK-NEXT: Index: 0 ; CHECK-NEXT: Offset: 0x00000037 ; CHECK-NEXT: Functions: -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 41000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 1081808080000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 1080808080000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 4 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 410028028880808000118080808000000B -; CHECK-NEXT: - Locals: +; CHECK-NEXT: - Index: 5 +; CHECK-NEXT: Locals: ; CHECK-NEXT: Body: 410028029080808000118080808000000B ; CHECK-NEXT: - Type: DATA ; CHECK-NEXT: Relocations: diff --git a/llvm/test/ObjectYAML/wasm/code_section.yaml b/llvm/test/ObjectYAML/wasm/code_section.yaml index 5359d2a100ca..4f7da6725ec3 100644 --- a/llvm/test/ObjectYAML/wasm/code_section.yaml +++ b/llvm/test/ObjectYAML/wasm/code_section.yaml @@ -5,10 +5,12 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: F32 + - Index: 0 + ReturnType: F32 ParamTypes: - I32 - - ReturnType: NORESULT + - Index: 1 + ReturnType: NORESULT ParamTypes: - I32 - I64 @@ -25,11 +27,13 @@ Sections: Index: 1 Offset: 0x00000025 Functions: - - Locals: + - Index: 0 + Locals: - Type: I32 Count: 3 Body: 418080808000210020002101200111808080800000210220020F0B - - Locals: + - Index: 1 + Locals: - Type: I32 Count: 1 Body: 108180808000210020000F0B @@ -58,11 +62,13 @@ Sections: # CHECK: Index: 1 # CHECK: Offset: 0x00000025 # CHECK: Functions: -# CHECK: - Locals: +# CHECK: - Index: 0 +# CHECK: Locals: # CHECK: - Type: I32 # CHECK: Count: 3 # CHECK: Body: 418080808000210020002101200111808080800000210220020F0B -# CHECK: - Locals: +# CHECK: - Index: 1 +# CHECK: Locals: # CHECK: - Type: I32 # CHECK: Count: 1 # CHECK: Body: 108180808000210020000F0B diff --git a/llvm/test/ObjectYAML/wasm/export_section.yaml b/llvm/test/ObjectYAML/wasm/export_section.yaml index 8c5f57c29920..4dd62bde2c68 100644 --- a/llvm/test/ObjectYAML/wasm/export_section.yaml +++ b/llvm/test/ObjectYAML/wasm/export_section.yaml @@ -7,12 +7,14 @@ Sections: FunctionTypes: [ 0, 0 ] - Type: GLOBAL Globals: - - Type: I32 + - Index: 0 + Type: I32 Mutable: false InitExpr: Opcode: I64_CONST Value: 32 - - Type: I32 + - Index: 1 + Type: I32 Mutable: false InitExpr: Opcode: I64_CONST diff --git a/llvm/test/ObjectYAML/wasm/global_section.yaml b/llvm/test/ObjectYAML/wasm/global_section.yaml index 3f17c6d88ba4..73e50b57f5dc 100644 --- a/llvm/test/ObjectYAML/wasm/global_section.yaml +++ b/llvm/test/ObjectYAML/wasm/global_section.yaml @@ -5,7 +5,8 @@ FileHeader: Sections: - Type: GLOBAL Globals: - - Type: I32 + - Index: 0 + Type: I32 Mutable: false InitExpr: Opcode: I64_CONST @@ -17,7 +18,8 @@ Sections: # CHECK: Sections: # CHECK: - Type: GLOBAL # CHECK: Globals: -# CHECK: - Type: I32 +# CHECK: - Index: 0 +# CHECK: Type: I32 # CHECK: Mutable: false # CHECK: InitExpr: # CHECK: Opcode: I64_CONST diff --git a/llvm/test/ObjectYAML/wasm/import_section.yaml b/llvm/test/ObjectYAML/wasm/import_section.yaml index 000b4c270c37..fc75705ab2c3 100644 --- a/llvm/test/ObjectYAML/wasm/import_section.yaml +++ b/llvm/test/ObjectYAML/wasm/import_section.yaml @@ -5,7 +5,8 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT diff --git a/llvm/test/ObjectYAML/wasm/linking_section.yaml b/llvm/test/ObjectYAML/wasm/linking_section.yaml index e413bd3f1ea4..fdb6d256a572 100644 --- a/llvm/test/ObjectYAML/wasm/linking_section.yaml +++ b/llvm/test/ObjectYAML/wasm/linking_section.yaml @@ -5,7 +5,8 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT diff --git a/llvm/test/ObjectYAML/wasm/name_section.yaml b/llvm/test/ObjectYAML/wasm/name_section.yaml index 0a4191dd0541..f7a489d75426 100644 --- a/llvm/test/ObjectYAML/wasm/name_section.yaml +++ b/llvm/test/ObjectYAML/wasm/name_section.yaml @@ -5,7 +5,8 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT diff --git a/llvm/test/ObjectYAML/wasm/start_section.yaml b/llvm/test/ObjectYAML/wasm/start_section.yaml index 38feebcdf993..7d5e59643957 100644 --- a/llvm/test/ObjectYAML/wasm/start_section.yaml +++ b/llvm/test/ObjectYAML/wasm/start_section.yaml @@ -6,7 +6,8 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - F32 - F32 diff --git a/llvm/test/ObjectYAML/wasm/type_section.yaml b/llvm/test/ObjectYAML/wasm/type_section.yaml index d6602595a60e..a87949fed06b 100644 --- a/llvm/test/ObjectYAML/wasm/type_section.yaml +++ b/llvm/test/ObjectYAML/wasm/type_section.yaml @@ -5,11 +5,13 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - F32 - F32 - - ReturnType: I64 + - Index: 1 + ReturnType: I64 ParamTypes: - F64 - F64 diff --git a/llvm/test/ObjectYAML/wasm/weak_symbols.yaml b/llvm/test/ObjectYAML/wasm/weak_symbols.yaml index 9af2e54fe58d..c12ef24633af 100644 --- a/llvm/test/ObjectYAML/wasm/weak_symbols.yaml +++ b/llvm/test/ObjectYAML/wasm/weak_symbols.yaml @@ -5,13 +5,15 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - Type: FUNCTION FunctionTypes: [ 0, 0 ] - Type: GLOBAL Globals: - - Type: I32 + - Index: 0 + Type: I32 Mutable: false InitExpr: Opcode: I32_CONST diff --git a/llvm/test/tools/llvm-nm/wasm/exports.yaml b/llvm/test/tools/llvm-nm/wasm/exports.yaml index ad31fea774c1..c9937747a684 100644 --- a/llvm/test/tools/llvm-nm/wasm/exports.yaml +++ b/llvm/test/tools/llvm-nm/wasm/exports.yaml @@ -9,28 +9,10 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - - Type: FUNCTION - FunctionTypes: [ 0, 0, 0, 0, 0 ] - - Type: GLOBAL - Globals: - - Type: I32 - Mutable: false - InitExpr: - Opcode: I64_CONST - Value: 32 - - Type: I32 - Mutable: false - InitExpr: - Opcode: I32_CONST - Value: 64 - - Type: I32 - Mutable: false - InitExpr: - Opcode: I32_CONST - Value: 1024 - Type: IMPORT Imports: - Module: env @@ -42,6 +24,28 @@ Sections: Kind: GLOBAL GlobalType: I32 GlobalMutable: false + - Type: FUNCTION + FunctionTypes: [ 0, 0, 0, 0, 0 ] + - Type: GLOBAL + Globals: + - Index: 1 + Type: I32 + Mutable: false + InitExpr: + Opcode: I64_CONST + Value: 32 + - Index: 2 + Type: I32 + Mutable: false + InitExpr: + Opcode: I32_CONST + Value: 64 + - Index: 3 + Type: I32 + Mutable: false + InitExpr: + Opcode: I32_CONST + Value: 1024 - Type: EXPORT Exports: - Name: foo diff --git a/llvm/test/tools/llvm-nm/wasm/imports.yaml b/llvm/test/tools/llvm-nm/wasm/imports.yaml index 82be0a675b07..2f25d7ff95b7 100644 --- a/llvm/test/tools/llvm-nm/wasm/imports.yaml +++ b/llvm/test/tools/llvm-nm/wasm/imports.yaml @@ -6,7 +6,8 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT diff --git a/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml b/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml index 254fb4ddf683..816634f616cb 100644 --- a/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ b/llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -9,11 +9,10 @@ FileHeader: Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - - Type: FUNCTION - FunctionTypes: [ 0, 0, 0, 0 ] - Type: IMPORT Imports: - Module: env @@ -25,19 +24,24 @@ Sections: Kind: GLOBAL GlobalType: I32 GlobalMutable: false + - Type: FUNCTION + FunctionTypes: [ 0, 0, 0, 0 ] - Type: GLOBAL Globals: - - Type: I32 + - Index: 1 + Type: I32 Mutable: false InitExpr: Opcode: I64_CONST Value: 32 - - Type: I32 + - Index: 2 + Type: I32 Mutable: false InitExpr: Opcode: I32_CONST Value: 64 - - Type: I32 + - Index: 3 + Type: I32 Mutable: false InitExpr: Opcode: I32_CONST diff --git a/llvm/tools/obj2yaml/wasm2yaml.cpp b/llvm/tools/obj2yaml/wasm2yaml.cpp index 1bf8149493c4..476fb6c1de24 100644 --- a/llvm/tools/obj2yaml/wasm2yaml.cpp +++ b/llvm/tools/obj2yaml/wasm2yaml.cpp @@ -186,6 +186,7 @@ ErrorOr WasmDumper::dump() { auto GlobalSec = make_unique(); for (auto &Global : Obj.globals()) { WasmYAML::Global G; + G.Index = Global.Index; G.Type = Global.Type; G.Mutable = Global.Mutable; G.InitExpr = Global.InitExpr; @@ -230,6 +231,7 @@ ErrorOr WasmDumper::dump() { auto CodeSec = make_unique(); for (auto &Func : Obj.functions()) { WasmYAML::Function Function; + Function.Index = Func.Index; for (auto &Local : Func.Locals) { WasmYAML::LocalDecl LocalDecl; LocalDecl.Type = Local.Type; diff --git a/llvm/tools/yaml2obj/yaml2wasm.cpp b/llvm/tools/yaml2obj/yaml2wasm.cpp index 792f7c108bc1..7770622149cf 100644 --- a/llvm/tools/yaml2obj/yaml2wasm.cpp +++ b/llvm/tools/yaml2obj/yaml2wasm.cpp @@ -45,6 +45,8 @@ private: int writeSectionContent(raw_ostream &OS, WasmYAML::NameSection &Section); int writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &Section); WasmYAML::Object &Obj; + uint32_t NumImportedFunctions = 0; + uint32_t NumImportedGlobals = 0; }; static int writeUint64(raw_ostream &OS, uint64_t Value) { @@ -101,7 +103,7 @@ static int writeInitExpr(const wasm::WasmInitExpr &InitExpr, raw_ostream &OS) { encodeULEB128(InitExpr.Value.Global, OS); break; default: - errs() << "Unknown opcode in init_expr: " << InitExpr.Opcode; + errs() << "Unknown opcode in init_expr: " << InitExpr.Opcode << "\n"; return 1; } writeUint8(OS, wasm::WASM_OPCODE_END); @@ -211,7 +213,13 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::TypeSection &Section) { encodeULEB128(Section.Signatures.size(), OS); + uint32_t ExpectedIndex = 0; for (const WasmYAML::Signature &Sig : Section.Signatures) { + if (Sig.Index != ExpectedIndex) { + errs() << "Unexpected type index: " << Sig.Index << "\n"; + return 1; + } + ++ExpectedIndex; encodeSLEB128(Sig.Form, OS); encodeULEB128(Sig.ParamTypes.size(), OS); for (auto ParamType : Sig.ParamTypes) @@ -236,10 +244,12 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, switch (Import.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: encodeULEB128(Import.SigIndex, OS); + NumImportedFunctions++; break; case wasm::WASM_EXTERNAL_GLOBAL: encodeSLEB128(Import.GlobalImport.Type, OS); writeUint8(OS, Import.GlobalImport.Mutable); + NumImportedGlobals++; break; case wasm::WASM_EXTERNAL_MEMORY: writeLimits(Import.Memory, OS); @@ -249,7 +259,7 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, writeLimits(Import.TableImport.TableLimits, OS); break; default: - errs() << "Unknown import type: " << Import.Kind; + errs() << "Unknown import type: " << Import.Kind << "\n"; return 1; } } @@ -304,7 +314,13 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::GlobalSection &Section) { encodeULEB128(Section.Globals.size(), OS); + uint32_t ExpectedIndex = NumImportedGlobals; for (auto &Global : Section.Globals) { + if (Global.Index != ExpectedIndex) { + errs() << "Unexpected global index: " << Global.Index << "\n"; + return 1; + } + ++ExpectedIndex; encodeSLEB128(Global.Type, OS); writeUint8(OS, Global.Mutable); writeInitExpr(Global.InitExpr, OS); @@ -330,9 +346,15 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::CodeSection &Section) { encodeULEB128(Section.Functions.size(), OS); + uint32_t ExpectedIndex = NumImportedFunctions; for (auto &Func : Section.Functions) { std::string OutString; raw_string_ostream StringStream(OutString); + if (Func.Index != ExpectedIndex) { + errs() << "Unexpected function index: " << Func.Index << "\n"; + return 1; + } + ++ExpectedIndex; encodeULEB128(Func.Locals.size(), StringStream); for (auto &LocalDecl : Func.Locals) { @@ -402,9 +424,18 @@ int WasmWriter::writeWasm(raw_ostream &OS) { writeUint32(OS, Obj.Header.Version); // Write each section + uint32_t LastType = 0; for (const std::unique_ptr &Sec : Obj.Sections) { - encodeULEB128(Sec->Type, OS); + uint32_t Type = Sec->Type; + if (Type != wasm::WASM_SEC_CUSTOM) { + if (Type < LastType) { + errs() << "Out of order section type: " << Type << "\n"; + return 1; + } + LastType = Type; + } + encodeULEB128(Sec->Type, OS); std::string OutString; raw_string_ostream StringStream(OutString); if (auto S = dyn_cast(Sec.get())) {