diff options
| author | Sam Clegg <sbc@chromium.org> | 2018-01-09 21:38:53 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2018-01-09 21:38:53 +0000 |
| commit | e53af7f6df2cabaa62516e32ae00aaf271258fa4 (patch) | |
| tree | dac521f63a63655bedd0ea9cb27429a8943ea6cb /llvm | |
| parent | d68fa1be57ae66236af53f7a16e78309d2aecdea (diff) | |
| download | bcm5719-llvm-e53af7f6df2cabaa62516e32ae00aaf271258fa4.tar.gz bcm5719-llvm-e53af7f6df2cabaa62516e32ae00aaf271258fa4.zip | |
[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
Diffstat (limited to 'llvm')
23 files changed, 163 insertions, 70 deletions
diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h index 57a0b441821..7d436180f03 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<WasmLocalDecl> Locals; ArrayRef<uint8_t> Body; uint32_t CodeSectionOffset; diff --git a/llvm/include/llvm/ObjectYAML/WasmYAML.h b/llvm/include/llvm/ObjectYAML/WasmYAML.h index 188ce8e4449..dcc31fc1137 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<LocalDecl> Locals; yaml::BinaryRef Body; }; diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 48f98df6f34..c33f4f68694 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 b2411395dc0..70721e006da 100644 --- a/llvm/lib/ObjectYAML/WasmYAML.cpp +++ b/llvm/lib/ObjectYAML/WasmYAML.cpp @@ -236,7 +236,7 @@ void ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration( void MappingTraits<WasmYAML::Signature>::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<WasmYAML::Table>::mapping(IO &IO, WasmYAML::Table &Table) { void MappingTraits<WasmYAML::Function>::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<WasmYAML::Export>::mapping(IO &IO, void MappingTraits<WasmYAML::Global>::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 66fad935fd8..b9b868a2fd4 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 87a2c6bcf03..91f2f7bd28c 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 ddcdd1a0c41..b0a0d4b3555 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 98e7a81c196..27d4a587fba 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 29eeac02da6..83757f48a16 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 5359d2a100c..4f7da6725ec 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 8c5f57c2992..4dd62bde2c6 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 3f17c6d88ba..73e50b57f5d 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 000b4c270c3..fc75705ab2c 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 e413bd3f1ea..fdb6d256a57 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 0a4191dd054..f7a489d7542 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 38feebcdf99..7d5e5964395 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 d6602595a60..a87949fed06 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 9af2e54fe58..c12ef24633a 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 ad31fea774c..c9937747a68 100644 --- a/llvm/test/tools/llvm-nm/wasm/exports.yaml +++ b/llvm/test/tools/llvm-nm/wasm/exports.yaml @@ -9,39 +9,43 @@ FileHeader: 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 diff --git a/llvm/test/tools/llvm-nm/wasm/imports.yaml b/llvm/test/tools/llvm-nm/wasm/imports.yaml index 82be0a675b0..2f25d7ff95b 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 254fb4ddf68..816634f616c 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 1bf8149493c..476fb6c1de2 100644 --- a/llvm/tools/obj2yaml/wasm2yaml.cpp +++ b/llvm/tools/obj2yaml/wasm2yaml.cpp @@ -186,6 +186,7 @@ ErrorOr<WasmYAML::Object *> WasmDumper::dump() { auto GlobalSec = make_unique<WasmYAML::GlobalSection>(); 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<WasmYAML::Object *> WasmDumper::dump() { auto CodeSec = make_unique<WasmYAML::CodeSection>(); 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 792f7c108bc..7770622149c 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<WasmYAML::Section> &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<WasmYAML::CustomSection>(Sec.get())) { |

