summaryrefslogtreecommitdiff
path: root/src/ir/memory-utils.h
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2019-04-26 16:59:41 -0700
committerGitHub <noreply@github.com>2019-04-26 16:59:41 -0700
commitdb9124f1de0478dcac525009b6f1589b44a7edd8 (patch)
treefa26395a0f6cca53cf5cb6e10189f989c5bfa847 /src/ir/memory-utils.h
parent87636dccd404a340d75acb1d96301581343f29ca (diff)
downloadbinaryen-db9124f1de0478dcac525009b6f1589b44a7edd8.tar.gz
binaryen-db9124f1de0478dcac525009b6f1589b44a7edd8.tar.bz2
binaryen-db9124f1de0478dcac525009b6f1589b44a7edd8.zip
Apply format changes from #2048 (#2059)
Mass change to apply clang-format to everything. We are applying this in a PR by me so the (git) blame is all mine ;) but @aheejin did all the work to get clang-format set up and all the manual work to tidy up some things to make the output nicer in #2048
Diffstat (limited to 'src/ir/memory-utils.h')
-rw-r--r--src/ir/memory-utils.h253
1 files changed, 131 insertions, 122 deletions
diff --git a/src/ir/memory-utils.h b/src/ir/memory-utils.h
index fbf1f646c..c1edc8ce9 100644
--- a/src/ir/memory-utils.h
+++ b/src/ir/memory-utils.h
@@ -21,153 +21,162 @@
#include <vector>
#include "literal.h"
-#include "wasm.h"
#include "wasm-binary.h"
+#include "wasm.h"
namespace wasm {
namespace MemoryUtils {
- // flattens memory into a single data segment. returns true if successful
- inline bool flatten(Memory& 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);
+// flattens memory into a single data segment. returns true if successful
+inline bool flatten(Memory& 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;
}
-
- // Ensures that the memory exists (of minimal size).
- inline void ensureExists(Memory& memory) {
- if (!memory.exists) {
- memory.exists = true;
- memory.initial = memory.max = 1;
+ 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;
+}
+
+// Ensures that the memory exists (of minimal size).
+inline void ensureExists(Memory& memory) {
+ if (!memory.exists) {
+ memory.exists = true;
+ memory.initial = memory.max = 1;
}
+}
- // Try to merge segments until they fit into web limitations.
- // Return true if successful.
- inline bool ensureLimitedSegments(Module& module) {
- Memory& memory = module.memory;
- if (memory.segments.size() <= WebLimitations::MaxDataSegments) {
- return true;
- }
+// Try to merge segments until they fit into web limitations.
+// Return true if successful.
+inline bool ensureLimitedSegments(Module& module) {
+ Memory& memory = module.memory;
+ if (memory.segments.size() <= WebLimitations::MaxDataSegments) {
+ return true;
+ }
- // Conservatively refuse to change segments if there might be memory.init
- // and data.drop instructions.
- if (module.features.hasBulkMemory()) {
- return false;
- }
+ // Conservatively refuse to change segments if there might be memory.init
+ // and data.drop instructions.
+ if (module.features.hasBulkMemory()) {
+ return false;
+ }
- auto isEmpty = [](Memory::Segment& segment) {
- return segment.data.size() == 0;
- };
-
- auto isConstantOffset = [](Memory::Segment& segment) {
- return segment.offset && segment.offset->is<Const>();
- };
-
- Index numConstant = 0,
- numDynamic = 0;
- bool hasPassiveSegments = false;
- for (auto& segment : memory.segments) {
- if (!isEmpty(segment)) {
- if (isConstantOffset(segment)) {
- numConstant++;
- } else {
- numDynamic++;
- }
+ auto isEmpty = [](Memory::Segment& segment) {
+ return segment.data.size() == 0;
+ };
+
+ auto isConstantOffset = [](Memory::Segment& segment) {
+ return segment.offset && segment.offset->is<Const>();
+ };
+
+ Index numConstant = 0, numDynamic = 0;
+ bool hasPassiveSegments = false;
+ for (auto& segment : memory.segments) {
+ if (!isEmpty(segment)) {
+ if (isConstantOffset(segment)) {
+ numConstant++;
+ } else {
+ numDynamic++;
}
- hasPassiveSegments |= segment.isPassive;
}
+ hasPassiveSegments |= segment.isPassive;
+ }
- if (hasPassiveSegments) {
- return false;
- }
+ if (hasPassiveSegments) {
+ return false;
+ }
- // check if we have too many dynamic data segments, which we can do nothing about
- auto num = numConstant + numDynamic;
- if (numDynamic + 1 >= WebLimitations::MaxDataSegments) {
- return false;
- }
+ // check if we have too many dynamic data segments, which we can do nothing
+ // about
+ auto num = numConstant + numDynamic;
+ if (numDynamic + 1 >= WebLimitations::MaxDataSegments) {
+ return false;
+ }
- // we'll merge constant segments if we must
- if (numConstant + numDynamic >= WebLimitations::MaxDataSegments) {
- numConstant = WebLimitations::MaxDataSegments - numDynamic - 1;
- num = numConstant + numDynamic;
- assert(num == WebLimitations::MaxDataSegments - 1);
- }
+ // we'll merge constant segments if we must
+ if (numConstant + numDynamic >= WebLimitations::MaxDataSegments) {
+ numConstant = WebLimitations::MaxDataSegments - numDynamic - 1;
+ num = numConstant + numDynamic;
+ assert(num == WebLimitations::MaxDataSegments - 1);
+ }
+
+ std::vector<Memory::Segment> mergedSegments;
+ mergedSegments.reserve(WebLimitations::MaxDataSegments);
- std::vector<Memory::Segment> mergedSegments;
- mergedSegments.reserve(WebLimitations::MaxDataSegments);
+ // drop empty segments and pass through dynamic-offset segments
+ for (auto& segment : memory.segments) {
+ if (isEmpty(segment))
+ continue;
+ if (isConstantOffset(segment))
+ continue;
+ mergedSegments.push_back(segment);
+ }
- // drop empty segments and pass through dynamic-offset segments
- for (auto& segment : memory.segments) {
- if (isEmpty(segment)) continue;
- if (isConstantOffset(segment)) continue;
+ // from here on, we concern ourselves with non-empty constant-offset
+ // segments, the ones which we may need to merge
+ auto isRelevant = [&](Memory::Segment& segment) {
+ return !isEmpty(segment) && isConstantOffset(segment);
+ };
+ for (Index i = 0; i < memory.segments.size(); i++) {
+ auto& segment = memory.segments[i];
+ if (!isRelevant(segment))
+ continue;
+ if (mergedSegments.size() + 2 < WebLimitations::MaxDataSegments) {
mergedSegments.push_back(segment);
+ continue;
}
-
- // from here on, we concern ourselves with non-empty constant-offset
- // segments, the ones which we may need to merge
- auto isRelevant = [&](Memory::Segment& segment) {
- return !isEmpty(segment) && isConstantOffset(segment);
- };
- for (Index i = 0; i < memory.segments.size(); i++) {
- auto& segment = memory.segments[i];
- if (!isRelevant(segment)) continue;
- if (mergedSegments.size() + 2 < WebLimitations::MaxDataSegments) {
- mergedSegments.push_back(segment);
+ // we can emit only one more segment! merge everything into one
+ // start the combined segment at the bottom of them all
+ auto start = segment.offset->cast<Const>()->value.getInteger();
+ for (Index j = i + 1; j < memory.segments.size(); j++) {
+ auto& segment = memory.segments[j];
+ if (!isRelevant(segment))
continue;
+ auto offset = segment.offset->cast<Const>()->value.getInteger();
+ start = std::min(start, offset);
+ }
+ // create the segment and add in all the data
+ auto* c = module.allocator.alloc<Const>();
+ c->value = Literal(int32_t(start));
+ c->type = i32;
+
+ Memory::Segment combined(c);
+ for (Index j = i; j < memory.segments.size(); j++) {
+ auto& segment = memory.segments[j];
+ if (!isRelevant(segment))
+ continue;
+ auto offset = segment.offset->cast<Const>()->value.getInteger();
+ auto needed = offset + segment.data.size() - start;
+ if (combined.data.size() < needed) {
+ combined.data.resize(needed);
}
- // we can emit only one more segment! merge everything into one
- // start the combined segment at the bottom of them all
- auto start = segment.offset->cast<Const>()->value.getInteger();
- for (Index j = i + 1; j < memory.segments.size(); j++) {
- auto& segment = memory.segments[j];
- if (!isRelevant(segment)) continue;
- auto offset = segment.offset->cast<Const>()->value.getInteger();
- start = std::min(start, offset);
- }
- // create the segment and add in all the data
- auto* c = module.allocator.alloc<Const>();
- c->value = Literal(int32_t(start));
- c->type = i32;
-
- Memory::Segment combined(c);
- for (Index j = i; j < memory.segments.size(); j++) {
- auto& segment = memory.segments[j];
- if (!isRelevant(segment)) continue;
- auto offset = segment.offset->cast<Const>()->value.getInteger();
- auto needed = offset + segment.data.size() - start;
- if (combined.data.size() < needed) {
- combined.data.resize(needed);
- }
- std::copy(segment.data.begin(), segment.data.end(), combined.data.begin() + (offset - start));
- }
- mergedSegments.push_back(combined);
- break;
+ std::copy(segment.data.begin(),
+ segment.data.end(),
+ combined.data.begin() + (offset - start));
}
-
- memory.segments.swap(mergedSegments);
- return true;
+ mergedSegments.push_back(combined);
+ break;
}
+
+ memory.segments.swap(mergedSegments);
+ return true;
+}
} // namespace MemoryUtils
} // namespace wasm