diff --git a/include/llvm/BinaryFormat/Wasm.h b/include/llvm/BinaryFormat/Wasm.h index 57a0b441821..7d436180f03 100644 --- a/include/llvm/BinaryFormat/Wasm.h +++ b/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/include/llvm/ObjectYAML/WasmYAML.h b/include/llvm/ObjectYAML/WasmYAML.h index 188ce8e4449..dcc31fc1137 100644 --- a/include/llvm/ObjectYAML/WasmYAML.h +++ b/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/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 48f98df6f34..c33f4f68694 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/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/lib/ObjectYAML/WasmYAML.cpp b/lib/ObjectYAML/WasmYAML.cpp index b2411395dc0..70721e006da 100644 --- a/lib/ObjectYAML/WasmYAML.cpp +++ b/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/test/MC/WebAssembly/bss.ll b/test/MC/WebAssembly/bss.ll index 66fad935fd8..b9b868a2fd4 100644 --- a/test/MC/WebAssembly/bss.ll +++ b/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/test/MC/WebAssembly/explicit-sections.ll b/test/MC/WebAssembly/explicit-sections.ll index 87a2c6bcf03..91f2f7bd28c 100644 --- a/test/MC/WebAssembly/explicit-sections.ll +++ b/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/test/MC/WebAssembly/init-fini-array.ll b/test/MC/WebAssembly/init-fini-array.ll index ddcdd1a0c41..b0a0d4b3555 100644 --- a/test/MC/WebAssembly/init-fini-array.ll +++ b/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/test/MC/WebAssembly/unnamed-data.ll b/test/MC/WebAssembly/unnamed-data.ll index 98e7a81c196..27d4a587fba 100644 --- a/test/MC/WebAssembly/unnamed-data.ll +++ b/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/test/MC/WebAssembly/weak-alias.ll b/test/MC/WebAssembly/weak-alias.ll index 29eeac02da6..83757f48a16 100644 --- a/test/MC/WebAssembly/weak-alias.ll +++ b/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/test/ObjectYAML/wasm/code_section.yaml b/test/ObjectYAML/wasm/code_section.yaml index 5359d2a100c..4f7da6725ec 100644 --- a/test/ObjectYAML/wasm/code_section.yaml +++ b/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/test/ObjectYAML/wasm/export_section.yaml b/test/ObjectYAML/wasm/export_section.yaml index 8c5f57c2992..4dd62bde2c6 100644 --- a/test/ObjectYAML/wasm/export_section.yaml +++ b/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/test/ObjectYAML/wasm/global_section.yaml b/test/ObjectYAML/wasm/global_section.yaml index 3f17c6d88ba..73e50b57f5d 100644 --- a/test/ObjectYAML/wasm/global_section.yaml +++ b/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/test/ObjectYAML/wasm/import_section.yaml b/test/ObjectYAML/wasm/import_section.yaml index 000b4c270c3..fc75705ab2c 100644 --- a/test/ObjectYAML/wasm/import_section.yaml +++ b/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/test/ObjectYAML/wasm/linking_section.yaml b/test/ObjectYAML/wasm/linking_section.yaml index e413bd3f1ea..fdb6d256a57 100644 --- a/test/ObjectYAML/wasm/linking_section.yaml +++ b/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/test/ObjectYAML/wasm/name_section.yaml b/test/ObjectYAML/wasm/name_section.yaml index 0a4191dd054..f7a489d7542 100644 --- a/test/ObjectYAML/wasm/name_section.yaml +++ b/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/test/ObjectYAML/wasm/start_section.yaml b/test/ObjectYAML/wasm/start_section.yaml index 38feebcdf99..7d5e5964395 100644 --- a/test/ObjectYAML/wasm/start_section.yaml +++ b/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/test/ObjectYAML/wasm/type_section.yaml b/test/ObjectYAML/wasm/type_section.yaml index d6602595a60..a87949fed06 100644 --- a/test/ObjectYAML/wasm/type_section.yaml +++ b/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/test/ObjectYAML/wasm/weak_symbols.yaml b/test/ObjectYAML/wasm/weak_symbols.yaml index 9af2e54fe58..c12ef24633a 100644 --- a/test/ObjectYAML/wasm/weak_symbols.yaml +++ b/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/test/tools/llvm-nm/wasm/exports.yaml b/test/tools/llvm-nm/wasm/exports.yaml index ad31fea774c..c9937747a68 100644 --- a/test/tools/llvm-nm/wasm/exports.yaml +++ b/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/test/tools/llvm-nm/wasm/imports.yaml b/test/tools/llvm-nm/wasm/imports.yaml index 82be0a675b0..2f25d7ff95b 100644 --- a/test/tools/llvm-nm/wasm/imports.yaml +++ b/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/test/tools/llvm-nm/wasm/weak-symbols.yaml b/test/tools/llvm-nm/wasm/weak-symbols.yaml index 254fb4ddf68..816634f616c 100644 --- a/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ b/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/tools/obj2yaml/wasm2yaml.cpp b/tools/obj2yaml/wasm2yaml.cpp index 1bf8149493c..476fb6c1de2 100644 --- a/tools/obj2yaml/wasm2yaml.cpp +++ b/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/tools/yaml2obj/yaml2wasm.cpp b/tools/yaml2obj/yaml2wasm.cpp index 792f7c108bc..7770622149c 100644 --- a/tools/yaml2obj/yaml2wasm.cpp +++ b/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())) {