summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
authorAshley Nelson <nashley@google.com>2022-06-21 20:57:43 -0700
committerGitHub <noreply@github.com>2022-06-21 20:57:43 -0700
commit3b9c2e85fa5d97ba08a95c0c7cce7d041e699cde (patch)
treec01eb86869401931006b6503e47d60b9a44511b0 /src/wasm/wasm-s-parser.cpp
parent7fa4c0841c31930759fbad2efb8ada3ef0e6f3ef (diff)
downloadbinaryen-3b9c2e85fa5d97ba08a95c0c7cce7d041e699cde.tar.gz
binaryen-3b9c2e85fa5d97ba08a95c0c7cce7d041e699cde.tar.bz2
binaryen-3b9c2e85fa5d97ba08a95c0c7cce7d041e699cde.zip
First class Data Segments (#4733)
* Updating wasm.h/cpp for DataSegments * Updating wasm-binary.h/cpp for DataSegments * Removed link from Memory to DataSegments and updated module-utils, Metrics and wasm-traversal * checking isPassive when copying data segments to know whether to construct the data segment with an offset or not * Removing memory member var from DataSegment class as there is only one memory rn. Updated wasm-validator.cpp * Updated wasm-interpreter * First look at updating Passes * Updated wasm-s-parser * Updated files in src/ir * Updating tools files * Last pass on src files before building * added visitDataSegment * Fixing build errors * Data segments need a name * fixing var name * ran clang-format * Ensuring a name on DataSegment * Ensuring more datasegments have names * Adding explicit name support * Fix fuzzing name * Outputting data name in wasm binary only if explicit * Checking temp dataSegments vector to validateBinary because it's the one with the segments before we processNames * Pass on when data segment names are explicitly set * Ran auto_update_tests.py and check.py, success all around * Removed an errant semi-colon and corrected a counter. Everything still passes * Linting * Fixing processing memory names after parsed from binary * Updating the test from the last fix * Correcting error comment * Impl kripken@ comments * Impl tlively@ comments * Updated tests that remove data print when == 0 * Ran clang format * Impl tlively@ comments * Ran clang-format
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r--src/wasm/wasm-s-parser.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index dd92278c6..b59319be2 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -3038,8 +3038,9 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
} else {
offset->set(Literal(int32_t(0)));
}
- parseInnerData(inner, j, {}, offset, false);
- wasm.memory.initial = wasm.memory.segments[0].data.size();
+ parseInnerData(
+ inner, j, Name::fromInt(dataCounter++), false, offset, false);
+ wasm.memory.initial = wasm.dataSegments[0]->data.size();
return;
}
}
@@ -3073,9 +3074,15 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
if (auto size = strlen(input)) {
std::vector<char> data;
stringToBinary(input, size, data);
- wasm.memory.segments.emplace_back(offset, data.data(), data.size());
+ auto segment = Builder::makeDataSegment(
+ Name::fromInt(dataCounter++), false, offset, data.data(), data.size());
+ segment->hasExplicitName = false;
+ wasm.dataSegments.push_back(std::move(segment));
} else {
- wasm.memory.segments.emplace_back(offset, "", 0);
+ auto segment =
+ Builder::makeDataSegment(Name::fromInt(dataCounter++), false, offset);
+ segment->hasExplicitName = false;
+ wasm.dataSegments.push_back(std::move(segment));
}
i++;
}
@@ -3085,13 +3092,15 @@ void SExpressionWasmBuilder::parseData(Element& s) {
if (!wasm.memory.exists) {
throw ParseException("data but no memory", s.line, s.col);
}
+ Index i = 1;
+ Name name = Name::fromInt(dataCounter++);
+ bool hasExplicitName = false;
bool isPassive = true;
Expression* offset = nullptr;
- Index i = 1;
- Name name;
if (s[i]->isStr() && s[i]->dollared()) {
name = s[i++]->str();
+ hasExplicitName = true;
}
if (s[i]->isList()) {
@@ -3112,11 +3121,15 @@ void SExpressionWasmBuilder::parseData(Element& s) {
isPassive = false;
}
- parseInnerData(s, i, name, offset, isPassive);
+ parseInnerData(s, i, name, hasExplicitName, offset, isPassive);
}
-void SExpressionWasmBuilder::parseInnerData(
- Element& s, Index i, Name name, Expression* offset, bool isPassive) {
+void SExpressionWasmBuilder::parseInnerData(Element& s,
+ Index i,
+ Name name,
+ bool hasExplicitName,
+ Expression* offset,
+ bool isPassive) {
std::vector<char> data;
while (i < s.size()) {
const char* input = s[i++]->c_str();
@@ -3124,8 +3137,10 @@ void SExpressionWasmBuilder::parseInnerData(
stringToBinary(input, size, data);
}
}
- wasm.memory.segments.emplace_back(
- name, isPassive, offset, data.data(), data.size());
+ auto curr =
+ Builder::makeDataSegment(name, isPassive, offset, data.data(), data.size());
+ curr->hasExplicitName = hasExplicitName;
+ wasm.dataSegments.push_back(std::move(curr));
}
void SExpressionWasmBuilder::parseExport(Element& s) {