summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/BinaryFormat/Wasm.h2
-rw-r--r--llvm/include/llvm/ObjectYAML/WasmYAML.h2
-rw-r--r--llvm/lib/Object/WasmObjectFile.cpp4
-rw-r--r--llvm/lib/ObjectYAML/WasmYAML.cpp4
-rw-r--r--llvm/test/MC/WebAssembly/bss.ll12
-rw-r--r--llvm/test/MC/WebAssembly/explicit-sections.ll12
-rw-r--r--llvm/test/MC/WebAssembly/init-fini-array.ll15
-rw-r--r--llvm/test/MC/WebAssembly/unnamed-data.ll12
-rw-r--r--llvm/test/MC/WebAssembly/weak-alias.ll24
-rw-r--r--llvm/test/ObjectYAML/wasm/code_section.yaml18
-rw-r--r--llvm/test/ObjectYAML/wasm/export_section.yaml6
-rw-r--r--llvm/test/ObjectYAML/wasm/global_section.yaml6
-rw-r--r--llvm/test/ObjectYAML/wasm/import_section.yaml3
-rw-r--r--llvm/test/ObjectYAML/wasm/linking_section.yaml3
-rw-r--r--llvm/test/ObjectYAML/wasm/name_section.yaml3
-rw-r--r--llvm/test/ObjectYAML/wasm/start_section.yaml3
-rw-r--r--llvm/test/ObjectYAML/wasm/type_section.yaml6
-rw-r--r--llvm/test/ObjectYAML/wasm/weak_symbols.yaml6
-rw-r--r--llvm/test/tools/llvm-nm/wasm/exports.yaml34
-rw-r--r--llvm/test/tools/llvm-nm/wasm/imports.yaml3
-rw-r--r--llvm/test/tools/llvm-nm/wasm/weak-symbols.yaml16
-rw-r--r--llvm/tools/obj2yaml/wasm2yaml.cpp2
-rw-r--r--llvm/tools/yaml2obj/yaml2wasm.cpp37
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())) {
OpenPOWER on IntegriCloud