summaryrefslogtreecommitdiff
path: root/src/ir/memory-utils.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2022-01-11 14:16:34 -0800
committerGitHub <noreply@github.com>2022-01-11 14:16:34 -0800
commitb63fea1feefce42be49fa28fd85d01d4a52603a2 (patch)
tree541a37da001dda677bdd9288897587a0de908ac1 /src/ir/memory-utils.cpp
parentcc36ffd13f6794cc5212a1f0ba7f58e816e8a0de (diff)
downloadbinaryen-b63fea1feefce42be49fa28fd85d01d4a52603a2.tar.gz
binaryen-b63fea1feefce42be49fa28fd85d01d4a52603a2.tar.bz2
binaryen-b63fea1feefce42be49fa28fd85d01d4a52603a2.zip
[ctor-eval] Stop if there are any memory.init instructions (#4442)
This tool depends (atm) on flattening memory segments. That is not compatible with memory.init which cares about segment identities. This changes flatten() only by adding the check for MemoryInit. The rest is unchanged, although I saw the other two params are not needed and I removed them while I was there.
Diffstat (limited to 'src/ir/memory-utils.cpp')
-rw-r--r--src/ir/memory-utils.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/ir/memory-utils.cpp b/src/ir/memory-utils.cpp
new file mode 100644
index 000000000..b7c92fe9e
--- /dev/null
+++ b/src/ir/memory-utils.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2022 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ir/memory-utils.h"
+#include "wasm.h"
+
+namespace wasm::MemoryUtils {
+
+bool flatten(Module& wasm) {
+ // The presence of any MemoryInit instructions is a problem because they care
+ // about segment identity, which flattening gets rid of ( when it merges them
+ // all into one big segment).
+ ModuleUtils::ParallelFunctionAnalysis<bool> analysis(
+ wasm, [&](Function* func, bool& hasMemoryInit) {
+ if (func->imported()) {
+ return;
+ }
+ hasMemoryInit = FindAll<MemoryInit>(func->body).list.size() > 0;
+ });
+
+ for (auto& [func, hasMemoryInit] : analysis.map) {
+ if (hasMemoryInit) {
+ return false;
+ }
+ }
+
+ auto& memory = wasm.memory;
+
+ if (memory.segments.size() == 0) {
+ return true;
+ }
+
+ std::vector<char> data;
+ for (auto& segment : memory.segments) {
+ if (segment.isPassive) {
+ return false;
+ }
+ auto* offset = segment.offset->dynCast<Const>();
+ if (!offset) {
+ return false;
+ }
+ }
+ for (auto& segment : memory.segments) {
+ auto* offset = segment.offset->dynCast<Const>();
+ Index start = offset->value.getInteger();
+ Index end = start + segment.data.size();
+ if (end > data.size()) {
+ data.resize(end);
+ }
+ std::copy(segment.data.begin(), segment.data.end(), data.begin() + start);
+ }
+ memory.segments.resize(1);
+ memory.segments[0].offset->cast<Const>()->value = Literal(int32_t(0));
+ memory.segments[0].data.swap(data);
+
+ return true;
+}
+
+} // namespace wasm::MemoryUtils