diff options
-rw-r--r-- | src/wasm-binary.h | 9 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 62 | ||||
-rw-r--r-- | test/example/c-api-unused-mem.txt | 2 |
3 files changed, 52 insertions, 21 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h index e24848d8e..2f2df7c9b 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -303,6 +303,11 @@ enum EncodedType { namespace UserSections { extern const char* Name; + +enum Subsection { + NameFunction = 1, + NameLocal = 2, +}; } enum ASTNodes { @@ -545,6 +550,8 @@ public: void writeResizableLimits(Address initial, Address maximum, bool hasMaximum); int32_t startSection(BinaryConsts::Section code); void finishSection(int32_t start); + int32_t startSubsection(BinaryConsts::UserSections::Subsection code); + void finishSubsection(int32_t start); void writeStart(); void writeMemory(); void writeTypes(); @@ -721,7 +728,7 @@ public: void readFunctionTableDeclaration(); void readTableElements(); - void readNames(); + void readNames(size_t); // AST reading int depth = 0; // only for debugging diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index c723dfe32..521edab39 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -83,6 +83,16 @@ void WasmBinaryWriter::finishSection(int32_t start) { o.writeAt(start, U32LEB(size)); } +int32_t WasmBinaryWriter::startSubsection(BinaryConsts::UserSections::Subsection code) { + o << U32LEB(code); + return writeU32LEBPlaceholder(); // section size to be filled in later +} + +void WasmBinaryWriter::finishSubsection(int32_t start) { + int32_t size = o.size() - start - 5; // section size does not include the 5 bytes of the size field itself + o.writeAt(start, U32LEB(size)); +} + void WasmBinaryWriter::writeStart() { if (!wasm->start.is()) return; if (debug) std::cerr << "== writeStart" << std::endl; @@ -389,21 +399,24 @@ void WasmBinaryWriter::writeNames() { if (debug) std::cerr << "== writeNames" << std::endl; auto start = startSection(BinaryConsts::Section::User); writeInlineString(BinaryConsts::UserSections::Name); + auto substart = startSubsection(BinaryConsts::UserSections::Subsection::NameFunction); o << U32LEB(mappedFunctions.size()); Index emitted = 0; for (auto& import : wasm->imports) { if (import->kind == ExternalKind::Function) { + o << U32LEB(emitted); writeInlineString(import->name.str); - o << U32LEB(0); // TODO: locals emitted++; } } for (auto& curr : wasm->functions) { + o << U32LEB(emitted); writeInlineString(curr->name.str); - o << U32LEB(0); // TODO: locals emitted++; } assert(emitted == mappedFunctions.size()); + finishSubsection(substart); + /* TODO: locals */ finishSection(start); } @@ -969,7 +982,7 @@ void WasmBinaryBuilder::readUserSection(size_t payloadLen) { auto oldPos = pos; Name sectionName = getInlineString(); if (sectionName.equals(BinaryConsts::UserSections::Name)) { - readNames(); + readNames(payloadLen - (pos - oldPos)); } else { // an unfamiliar custom section wasm.userSections.resize(wasm.userSections.size() + 1); @@ -1510,25 +1523,36 @@ void WasmBinaryBuilder::readTableElements() { } } -void WasmBinaryBuilder::readNames() { +void WasmBinaryBuilder::readNames(size_t payloadLen) { if (debug) std::cerr << "== readNames" << std::endl; - auto num = getU32LEB(); - if (num == 0) return; - for (auto& import : wasm.imports) { - if (import->kind == ExternalKind::Function) { - getInlineString(); // TODO: use this - auto numLocals = getU32LEB(); - WASM_UNUSED(numLocals); - assert(numLocals == 0); // TODO - if (--num == 0) return; + auto sectionPos = pos; + while (pos < sectionPos + payloadLen) { + auto nameType = getU32LEB(); + auto subsectionSize = getU32LEB(); + auto subsectionPos = pos; + if (nameType != BinaryConsts::UserSections::Subsection::NameFunction) { + // TODO: locals + std::cerr << "unknown name subsection at " << pos << std::endl; + pos = subsectionPos + subsectionSize; + continue; } + auto num = getU32LEB(); + uint32_t importedFunctions = 0; + for (auto& import : wasm.imports) { + if (import->kind != ExternalKind::Function) continue; + importedFunctions++; + } + for (size_t i = 0; i < num; i++) { + auto index = getU32LEB(); + if (index < importedFunctions) { + getInlineString(); // TODO: use this + } else if (index - importedFunctions < functions.size()) { + functions[index - importedFunctions]->name = getInlineString(); + } + } + assert(pos == subsectionPos + subsectionSize); } - for (size_t i = 0; i < num; i++) { - functions[i]->name = getInlineString(); - auto numLocals = getU32LEB(); - WASM_UNUSED(numLocals); - assert(numLocals == 0); // TODO - } + assert(pos == sectionPos + payloadLen); } BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { diff --git a/test/example/c-api-unused-mem.txt b/test/example/c-api-unused-mem.txt index 246aead8c..b073d4d02 100644 --- a/test/example/c-api-unused-mem.txt +++ b/test/example/c-api-unused-mem.txt @@ -46,7 +46,7 @@ (call $main) ) ) -207 +213 (module (type $0 (func)) (type $1 (func)) |