Index: llvm/trunk/include/llvm/BinaryFormat/Wasm.h =================================================================== --- llvm/trunk/include/llvm/BinaryFormat/Wasm.h +++ llvm/trunk/include/llvm/BinaryFormat/Wasm.h @@ -66,6 +66,7 @@ }; struct WasmGlobal { + uint32_t Index; int32_t Type; bool Mutable; WasmInitExpr InitExpr; @@ -89,6 +90,7 @@ }; struct WasmFunction { + uint32_t Index; std::vector Locals; ArrayRef Body; uint32_t CodeSectionOffset; Index: llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h =================================================================== --- llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h +++ llvm/trunk/include/llvm/ObjectYAML/WasmYAML.h @@ -66,6 +66,7 @@ }; struct Global { + uint32_t Index; ValueType Type; bool Mutable; wasm::WasmInitExpr InitExpr; @@ -89,6 +90,7 @@ }; struct Function { + uint32_t Index; std::vector Locals; yaml::BinaryRef Body; }; Index: llvm/trunk/lib/Object/WasmObjectFile.cpp =================================================================== --- llvm/trunk/lib/Object/WasmObjectFile.cpp +++ llvm/trunk/lib/Object/WasmObjectFile.cpp @@ -632,6 +632,7 @@ 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 @@ 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 @@ 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; Index: llvm/trunk/lib/ObjectYAML/WasmYAML.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/WasmYAML.cpp +++ llvm/trunk/lib/ObjectYAML/WasmYAML.cpp @@ -236,7 +236,7 @@ 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::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, WasmYAML::Global &Global) { + IO.mapRequired("Index", Global.Index); IO.mapRequired("Type", Global.Type); IO.mapRequired("Mutable", Global.Mutable); IO.mapRequired("InitExpr", Global.InitExpr); Index: llvm/trunk/test/MC/WebAssembly/bss.ll =================================================================== --- llvm/trunk/test/MC/WebAssembly/bss.ll +++ llvm/trunk/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 Index: llvm/trunk/test/MC/WebAssembly/explicit-sections.ll =================================================================== --- llvm/trunk/test/MC/WebAssembly/explicit-sections.ll +++ llvm/trunk/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 Index: llvm/trunk/test/MC/WebAssembly/init-fini-array.ll =================================================================== --- llvm/trunk/test/MC/WebAssembly/init-fini-array.ll +++ llvm/trunk/test/MC/WebAssembly/init-fini-array.ll @@ -55,7 +55,8 @@ ; 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 @@ ; 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: Index: llvm/trunk/test/MC/WebAssembly/unnamed-data.ll =================================================================== --- llvm/trunk/test/MC/WebAssembly/unnamed-data.ll +++ llvm/trunk/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 Index: llvm/trunk/test/MC/WebAssembly/weak-alias.ll =================================================================== --- llvm/trunk/test/MC/WebAssembly/weak-alias.ll +++ llvm/trunk/test/MC/WebAssembly/weak-alias.ll @@ -76,17 +76,20 @@ ; 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 @@ ; 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: Index: llvm/trunk/test/ObjectYAML/wasm/code_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/code_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/code_section.yaml @@ -5,10 +5,12 @@ 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 @@ 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 @@ # 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 Index: llvm/trunk/test/ObjectYAML/wasm/export_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/export_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/export_section.yaml @@ -7,12 +7,14 @@ 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 Index: llvm/trunk/test/ObjectYAML/wasm/global_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/global_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/global_section.yaml @@ -5,7 +5,8 @@ Sections: - Type: GLOBAL Globals: - - Type: I32 + - Index: 0 + Type: I32 Mutable: false InitExpr: Opcode: I64_CONST @@ -17,7 +18,8 @@ # 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 Index: llvm/trunk/test/ObjectYAML/wasm/import_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/import_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/import_section.yaml @@ -5,7 +5,8 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT Index: llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/linking_section.yaml @@ -5,7 +5,8 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT Index: llvm/trunk/test/ObjectYAML/wasm/name_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/name_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/name_section.yaml @@ -5,7 +5,8 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT Index: llvm/trunk/test/ObjectYAML/wasm/start_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/start_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/start_section.yaml @@ -6,7 +6,8 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - F32 - F32 Index: llvm/trunk/test/ObjectYAML/wasm/type_section.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/type_section.yaml +++ llvm/trunk/test/ObjectYAML/wasm/type_section.yaml @@ -5,11 +5,13 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - F32 - F32 - - ReturnType: I64 + - Index: 1 + ReturnType: I64 ParamTypes: - F64 - F64 Index: llvm/trunk/test/ObjectYAML/wasm/weak_symbols.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/wasm/weak_symbols.yaml +++ llvm/trunk/test/ObjectYAML/wasm/weak_symbols.yaml @@ -5,13 +5,15 @@ 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 Index: llvm/trunk/test/tools/llvm-nm/wasm/exports.yaml =================================================================== --- llvm/trunk/test/tools/llvm-nm/wasm/exports.yaml +++ llvm/trunk/test/tools/llvm-nm/wasm/exports.yaml @@ -9,39 +9,43 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 + - Type: IMPORT + Imports: + - Module: env + Field: fimport + Kind: FUNCTION + SigIndex: 0 + - Module: env + Field: gimport + Kind: GLOBAL + GlobalType: I32 + GlobalMutable: false - Type: FUNCTION FunctionTypes: [ 0, 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 Value: 1024 - - Type: IMPORT - Imports: - - Module: env - Field: fimport - Kind: FUNCTION - SigIndex: 0 - - Module: env - Field: gimport - Kind: GLOBAL - GlobalType: I32 - GlobalMutable: false - Type: EXPORT Exports: - Name: foo Index: llvm/trunk/test/tools/llvm-nm/wasm/imports.yaml =================================================================== --- llvm/trunk/test/tools/llvm-nm/wasm/imports.yaml +++ llvm/trunk/test/tools/llvm-nm/wasm/imports.yaml @@ -6,7 +6,8 @@ Sections: - Type: TYPE Signatures: - - ReturnType: I32 + - Index: 0 + ReturnType: I32 ParamTypes: - I32 - Type: IMPORT Index: llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml =================================================================== --- llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml +++ llvm/trunk/test/tools/llvm-nm/wasm/weak-symbols.yaml @@ -9,11 +9,10 @@ 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 @@ 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 Index: llvm/trunk/tools/obj2yaml/wasm2yaml.cpp =================================================================== --- llvm/trunk/tools/obj2yaml/wasm2yaml.cpp +++ llvm/trunk/tools/obj2yaml/wasm2yaml.cpp @@ -186,6 +186,7 @@ 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 @@ 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; Index: llvm/trunk/tools/yaml2obj/yaml2wasm.cpp =================================================================== --- llvm/trunk/tools/yaml2obj/yaml2wasm.cpp +++ llvm/trunk/tools/yaml2obj/yaml2wasm.cpp @@ -45,6 +45,8 @@ 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 @@ 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, 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 @@ 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 @@ 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, 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, 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 @@ 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())) {