diff options
author | Sam Clegg <sbc@chromium.org> | 2020-12-09 20:54:18 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-09 20:54:18 -0800 |
commit | 57a9e77add02dc1d874fdbfee2c61cae8c0eefa1 (patch) | |
tree | bf0d6251ceea274d4a8166d2e50a02dfe5c198cf | |
parent | bdc55d3781e55f7d51d2e21751e07f9ec6161c27 (diff) | |
download | binaryen-57a9e77add02dc1d874fdbfee2c61cae8c0eefa1.tar.gz binaryen-57a9e77add02dc1d874fdbfee2c61cae8c0eefa1.tar.bz2 binaryen-57a9e77add02dc1d874fdbfee2c61cae8c0eefa1.zip |
Read and write data segments names in names section (#3435)
-rw-r--r-- | src/passes/Print.cpp | 4 | ||||
-rw-r--r-- | src/wasm.h | 2 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 40 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 7 | ||||
-rw-r--r-- | test/extended-names.wast | 6 | ||||
-rw-r--r-- | test/extended-names.wast.from-wast | 6 | ||||
-rw-r--r-- | test/extended-names.wast.fromBinary | 7 | ||||
-rw-r--r-- | test/extended-names.wast.fromBinary.noDebugInfo | 7 |
8 files changed, 78 insertions, 1 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 5c2acf3f0..0577c7c02 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2771,6 +2771,10 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> { doIndent(o, indent); o << '('; printMajor(o, "data "); + if (segment.name.is()) { + printName(segment.name, o); + o << ' '; + } if (segment.isPassive) { printMedium(o, "passive"); } else { diff --git a/src/wasm.h b/src/wasm.h index 0ea3ffeb7..c23819d51 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -1631,6 +1631,8 @@ public: (uint64_t(4) * 1024 * 1024 * 1024) / kPageSize; struct Segment { + // For use in name section only + Name name; bool isPassive = false; Expression* offset = nullptr; std::vector<char> data; // TODO: optimize diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 314364f38..6d4689056 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -690,7 +690,31 @@ void WasmBinaryWriter::writeNames() { } } - // TODO: label, type, element and data names + // memory names + if (wasm->memory.exists) { + Index count = 0; + for (auto& seg : wasm->memory.segments) { + if (seg.name.is()) { + count++; + } + } + + if (count) { + auto substart = + startSubsection(BinaryConsts::UserSections::Subsection::NameData); + o << U32LEB(count); + for (Index i = 0; i < wasm->memory.segments.size(); i++) { + auto& seg = wasm->memory.segments[i]; + if (seg.name.is()) { + o << U32LEB(i); + writeEscapedName(seg.name.str); + } + } + finishSubsection(substart); + } + } + + // TODO: label, type, and element names // see: https://github.com/WebAssembly/extended-name-section finishSection(start); @@ -2566,6 +2590,20 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) { << std::to_string(index) << std::endl; } } + } else if (nameType == BinaryConsts::UserSections::Subsection::NameData) { + auto num = getU32LEB(); + for (size_t i = 0; i < num; i++) { + auto index = getU32LEB(); + auto rawName = getInlineString(); + if (index < wasm.memory.segments.size()) { + wasm.memory.segments[i].name = rawName; + } else { + std::cerr << "warning: memory index out of bounds in name section, " + "memory subsection: " + << std::string(rawName.str) << " at index " + << std::to_string(index) << std::endl; + } + } } else if (nameType == BinaryConsts::UserSections::Subsection::NameGlobal) { auto num = getU32LEB(); std::set<Name> usedNames; diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 7efb2f2fb..3bb54f0c8 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2380,6 +2380,10 @@ void SExpressionWasmBuilder::parseData(Element& s) { bool isPassive = false; Expression* offset = nullptr; Index i = 1; + Name name; + if (s[i]->dollared()) { + name = s[i++]->str(); + } if (s[i]->isStr()) { // data is passive or named if (s[i]->str() == PASSIVE) { @@ -2394,6 +2398,9 @@ void SExpressionWasmBuilder::parseData(Element& s) { throw ParseException("Unexpected data items", s.line, s.col); } parseInnerData(s, s.size() - 1, offset, isPassive); + if (name.is()) { + wasm.memory.segments.back().name = name; + } } void SExpressionWasmBuilder::parseInnerData(Element& s, diff --git a/test/extended-names.wast b/test/extended-names.wast new file mode 100644 index 000000000..cebd598d0 --- /dev/null +++ b/test/extended-names.wast @@ -0,0 +1,6 @@ +(module $foo + (table $t1 1 funcref) + (memory $m1 1 1) + (data $mydata (i32.const 0) "a") + (data $passive_data passive "b") +) diff --git a/test/extended-names.wast.from-wast b/test/extended-names.wast.from-wast new file mode 100644 index 000000000..434940d29 --- /dev/null +++ b/test/extended-names.wast.from-wast @@ -0,0 +1,6 @@ +(module $foo + (memory $m1 1 1) + (data $mydata (i32.const 0) "a") + (data $passive_data passive "b") + (table $t1 1 funcref) +) diff --git a/test/extended-names.wast.fromBinary b/test/extended-names.wast.fromBinary new file mode 100644 index 000000000..9817d64b7 --- /dev/null +++ b/test/extended-names.wast.fromBinary @@ -0,0 +1,7 @@ +(module $foo + (memory $m1 1 1) + (data $mydata (i32.const 0) "a") + (data $passive_data passive "b") + (table $t1 1 funcref) +) + diff --git a/test/extended-names.wast.fromBinary.noDebugInfo b/test/extended-names.wast.fromBinary.noDebugInfo new file mode 100644 index 000000000..197d7c0fc --- /dev/null +++ b/test/extended-names.wast.fromBinary.noDebugInfo @@ -0,0 +1,7 @@ +(module + (memory $0 1 1) + (data (i32.const 0) "a") + (data passive "b") + (table $0 1 funcref) +) + |