================
@@ -1267,60 +1267,83 @@ Error WasmObjectFile::parseTypeSection(ReadContext
&Ctx) {
return Error::success();
}
+Error WasmObjectFile::parseImport(ReadContext &Ctx, wasm::WasmImport &Im) {
+ switch (Im.Kind) {
+ case wasm::WASM_EXTERNAL_FUNCTION:
+ NumImportedFunctions++;
+ Im.SigIndex = readVaruint32(Ctx);
+ if (Im.SigIndex >= Signatures.size())
+ return make_error<GenericBinaryError>("invalid function type",
+ object_error::parse_failed);
+ break;
+ case wasm::WASM_EXTERNAL_GLOBAL:
+ NumImportedGlobals++;
+ Im.Global.Type = readUint8(Ctx);
+ Im.Global.Mutable = readVaruint1(Ctx);
+ break;
+ case wasm::WASM_EXTERNAL_MEMORY:
+ Im.Memory = readLimits(Ctx);
+ if (Im.Memory.Flags & wasm::WASM_LIMITS_FLAG_IS_64)
+ HasMemory64 = true;
+ break;
+ case wasm::WASM_EXTERNAL_TABLE: {
+ Im.Table = readTableType(Ctx);
+ NumImportedTables++;
+ auto ElemType = Im.Table.ElemType;
+ if (ElemType != wasm::ValType::FUNCREF &&
+ ElemType != wasm::ValType::EXTERNREF &&
+ ElemType != wasm::ValType::EXNREF &&
+ ElemType != wasm::ValType::OTHERREF)
+ return make_error<GenericBinaryError>("invalid table element type",
+ object_error::parse_failed);
+ break;
+ }
+ case wasm::WASM_EXTERNAL_TAG:
+ NumImportedTags++;
+ if (readUint8(Ctx) != 0) // Reserved 'attribute' field
+ return make_error<GenericBinaryError>("invalid attribute",
+ object_error::parse_failed);
+ Im.SigIndex = readVaruint32(Ctx);
+ if (Im.SigIndex >= Signatures.size())
+ return make_error<GenericBinaryError>("invalid tag type",
+ object_error::parse_failed);
+ break;
+ default:
+ return make_error<GenericBinaryError>("unexpected import kind: " +
+ Twine(unsigned(Im.Kind)),
+ object_error::parse_failed);
+ }
+ Imports.push_back(Im);
+ return Error::success();
+}
+
Error WasmObjectFile::parseImportSection(ReadContext &Ctx) {
uint32_t Count = readVaruint32(Ctx);
- uint32_t NumTypes = Signatures.size();
Imports.reserve(Count);
- for (uint32_t I = 0; I < Count; I++) {
+ uint32_t I = 0;
+ while (I < Count) {
wasm::WasmImport Im;
Im.Module = readString(Ctx);
Im.Field = readString(Ctx);
Im.Kind = readUint8(Ctx);
- switch (Im.Kind) {
- case wasm::WASM_EXTERNAL_FUNCTION:
- NumImportedFunctions++;
- Im.SigIndex = readVaruint32(Ctx);
- if (Im.SigIndex >= NumTypes)
- return make_error<GenericBinaryError>("invalid function type",
- object_error::parse_failed);
- break;
- case wasm::WASM_EXTERNAL_GLOBAL:
- NumImportedGlobals++;
- Im.Global.Type = readUint8(Ctx);
- Im.Global.Mutable = readVaruint1(Ctx);
- break;
- case wasm::WASM_EXTERNAL_MEMORY:
- Im.Memory = readLimits(Ctx);
- if (Im.Memory.Flags & wasm::WASM_LIMITS_FLAG_IS_64)
- HasMemory64 = true;
- break;
- case wasm::WASM_EXTERNAL_TABLE: {
- Im.Table = readTableType(Ctx);
- NumImportedTables++;
- auto ElemType = Im.Table.ElemType;
- if (ElemType != wasm::ValType::FUNCREF &&
- ElemType != wasm::ValType::EXTERNREF &&
- ElemType != wasm::ValType::EXNREF &&
- ElemType != wasm::ValType::OTHERREF)
- return make_error<GenericBinaryError>("invalid table element type",
- object_error::parse_failed);
- break;
- }
- case wasm::WASM_EXTERNAL_TAG:
- NumImportedTags++;
- if (readUint8(Ctx) != 0) // Reserved 'attribute' field
- return make_error<GenericBinaryError>("invalid attribute",
- object_error::parse_failed);
- Im.SigIndex = readVaruint32(Ctx);
- if (Im.SigIndex >= NumTypes)
- return make_error<GenericBinaryError>("invalid tag type",
- object_error::parse_failed);
- break;
- default:
- return make_error<GenericBinaryError>("unexpected import kind",
- object_error::parse_failed);
+ // 0x7E along with and empty Field string signals a block of compact
+ // imports
+ if (Im.Kind == 0x7F && Im.Field == "") {
+ uint32_t NumCompactImports = readVaruint32(Ctx);
+ while (NumCompactImports--) {
+ Im.Field = readString(Ctx);
+ Im.Kind = readUint8(Ctx);
+ Error rtn = parseImport(Ctx, Im);
+ if (rtn)
+ return rtn;
+ I++;
+ }
+ } else {
----------------
bvisness wrote:
Do you intend to parse the second compact import encoding as well?
https://github.com/llvm/llvm-project/pull/176617
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits