summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/binaryen-c.cpp13
-rw-r--r--src/binaryen-c.h3
-rw-r--r--src/js/binaryen.js-post.js6
-rw-r--r--test/binaryen.js/memory-info.js.txt8
-rw-r--r--test/example/c-api-kitchen-sink.c2
-rw-r--r--test/example/c-api-relooper-unreachable-if.cpp2
-rw-r--r--test/example/c-api-unused-mem.cpp2
-rw-r--r--test/example/relooper-fuzz.c2
-rw-r--r--test/example/relooper-fuzz1.c2
-rw-r--r--test/example/relooper-fuzz2.c2
-rw-r--r--test/example/relooper-merge1.c2
-rw-r--r--test/example/relooper-merge2.c2
-rw-r--r--test/example/relooper-merge3.c2
-rw-r--r--test/example/relooper-merge4.c2
-rw-r--r--test/example/relooper-merge5.c2
-rw-r--r--test/example/relooper-merge6.c2
17 files changed, 41 insertions, 15 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01791498a..568753d63 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,8 @@ full changeset diff at the end of each section.
Current Trunk
-------------
+- Add extra `memory64` argument for `BinaryenSetMemory` and new `BinaryenMemoryIs64` C-API method to determine 64-bit memory. (#4963)
+
v110
----
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 914e37695..50e2e9a3c 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -4242,12 +4242,14 @@ void BinaryenSetMemory(BinaryenModuleRef module,
BinaryenIndex* segmentSizes,
BinaryenIndex numSegments,
bool shared,
+ bool memory64,
const char* name) {
auto memory = std::make_unique<Memory>();
memory->name = name ? name : "0";
memory->initial = initial;
memory->max = int32_t(maximum); // Make sure -1 extends.
memory->shared = shared;
+ memory->indexType = memory64 ? Type::i64 : Type::i32;
if (exportName) {
auto memoryExport = make_unique<Export>();
memoryExport->name = exportName;
@@ -4389,6 +4391,17 @@ bool BinaryenMemoryIsShared(BinaryenModuleRef module, const char* name) {
}
return memory->shared;
}
+bool BinaryenMemoryIs64(BinaryenModuleRef module, const char* name) {
+ // Maintaining compatibility for instructions with a single memory
+ if (name == nullptr && module->memories.size() == 1) {
+ name = module->memories[0]->name.c_str();
+ }
+ auto* memory = ((Module*)module)->getMemoryOrNull(name);
+ if (memory == nullptr) {
+ Fatal() << "invalid memory '" << name << "'.";
+ }
+ return memory->is64();
+}
size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,
BinaryenIndex id) {
const auto& segments = ((Module*)module)->dataSegments;
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 4e37b177a..d7555fc57 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -2485,6 +2485,7 @@ BINARYEN_API void BinaryenSetMemory(BinaryenModuleRef module,
BinaryenIndex* segmentSizes,
BinaryenIndex numSegments,
bool shared,
+ bool memory64,
const char* name);
BINARYEN_API bool BinaryenHasMemory(BinaryenModuleRef module);
@@ -2500,6 +2501,8 @@ BINARYEN_API const char* BinaryenMemoryImportGetBase(BinaryenModuleRef module,
const char* name);
BINARYEN_API bool BinaryenMemoryIsShared(BinaryenModuleRef module,
const char* name);
+BINARYEN_API bool BinaryenMemoryIs64(BinaryenModuleRef module,
+ const char* name);
// Memory segments. Query utilities.
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 158e3f29b..5634a8b9e 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2566,7 +2566,7 @@ function wrapModule(module, self = {}) {
self['removeExport'] = function(externalName) {
return preserveStack(() => Module['_BinaryenRemoveExport'](module, strToStack(externalName)));
};
- self['setMemory'] = function(initial, maximum, exportName, segments = [], shared = false, internalName) {
+ self['setMemory'] = function(initial, maximum, exportName, segments = [], shared = false, memory64 = false, internalName) {
// segments are assumed to be { passive: bool, offset: expression ref, data: array of 8-bit data }
return preserveStack(() => {
const segmentsLen = segments.length;
@@ -2590,6 +2590,7 @@ function wrapModule(module, self = {}) {
i32sToStack(segmentDataLen),
segmentsLen,
shared,
+ memory64,
strToStack(internalName)
);
});
@@ -2602,7 +2603,8 @@ function wrapModule(module, self = {}) {
'module': UTF8ToString(Module['_BinaryenMemoryImportGetModule'](module, strToStack(name))),
'base': UTF8ToString(Module['_BinaryenMemoryImportGetBase'](module, strToStack(name))),
'initial': Module['_BinaryenMemoryGetInitial'](module, strToStack(name)),
- 'shared': Boolean(Module['_BinaryenMemoryIsShared'](module, strToStack(name)))
+ 'shared': Boolean(Module['_BinaryenMemoryIsShared'](module, strToStack(name))),
+ 'is64': Boolean(Module['_BinaryenMemoryIs64'](module, strToStack(name))),
};
if (Module['_BinaryenMemoryHasMax'](module, strToStack(name))) {
memoryInfo['max'] = Module['_BinaryenMemoryGetMax'](module, strToStack(name));
diff --git a/test/binaryen.js/memory-info.js.txt b/test/binaryen.js/memory-info.js.txt
index ba04d7442..079b7aba9 100644
--- a/test/binaryen.js/memory-info.js.txt
+++ b/test/binaryen.js/memory-info.js.txt
@@ -1,9 +1,9 @@
false
true
-{"module":"","base":"","initial":1,"shared":false,"max":64}
+{"module":"","base":"","initial":1,"shared":false,"is64":false,"max":64}
true
-{"module":"","base":"","initial":1,"shared":true,"max":64}
+{"module":"","base":"","initial":1,"shared":true,"is64":false,"max":64}
true
-{"module":"env","base":"memory","initial":0,"shared":false,"max":65536}
+{"module":"env","base":"memory","initial":0,"shared":false,"is64":false,"max":65536}
true
-{"module":"env","base":"memory","initial":0,"shared":true,"max":65536}
+{"module":"env","base":"memory","initial":0,"shared":true,"is64":false,"max":65536}
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 37aa15bf8..267e0763d 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -511,6 +511,7 @@ void test_core() {
segmentSizes,
2,
1,
+ 0,
"0");
BinaryenExpressionRef valueList[] = {
@@ -1991,6 +1992,7 @@ void test_for_each() {
segmentSizes,
2,
0,
+ 0,
"0");
BinaryenAddGlobal(module,
"a-global",
diff --git a/test/example/c-api-relooper-unreachable-if.cpp b/test/example/c-api-relooper-unreachable-if.cpp
index c63ca0204..1c5708835 100644
--- a/test/example/c-api-relooper-unreachable-if.cpp
+++ b/test/example/c-api-relooper-unreachable-if.cpp
@@ -29,6 +29,7 @@ int main() {
segmentSizes,
0,
0,
+ 0,
"0");
}
the_relooper = RelooperCreate(the_module);
@@ -598,6 +599,7 @@ int main() {
segmentSizes,
0,
0,
+ 0,
"0");
}
expressions[157] = BinaryenConst(the_module, BinaryenLiteralInt32(65535));
diff --git a/test/example/c-api-unused-mem.cpp b/test/example/c-api-unused-mem.cpp
index 6c0fd14c1..a0970a8ca 100644
--- a/test/example/c-api-unused-mem.cpp
+++ b/test/example/c-api-unused-mem.cpp
@@ -30,6 +30,7 @@ int main() {
segmentSizes,
0,
0,
+ 0,
"0");
}
the_relooper = RelooperCreate(the_module);
@@ -94,6 +95,7 @@ int main() {
segmentSizes,
0,
0,
+ 0,
"0");
}
expressions[11] = BinaryenConst(the_module, BinaryenLiteralInt32(65535));
diff --git a/test/example/relooper-fuzz.c b/test/example/relooper-fuzz.c
index f0b727f4c..a648e61b4 100644
--- a/test/example/relooper-fuzz.c
+++ b/test/example/relooper-fuzz.c
@@ -369,7 +369,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
assert(BinaryenModuleValidate(module));
diff --git a/test/example/relooper-fuzz1.c b/test/example/relooper-fuzz1.c
index f481fe713..a524922d7 100644
--- a/test/example/relooper-fuzz1.c
+++ b/test/example/relooper-fuzz1.c
@@ -366,7 +366,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
assert(BinaryenModuleValidate(module));
diff --git a/test/example/relooper-fuzz2.c b/test/example/relooper-fuzz2.c
index c179606a0..8d129b77b 100644
--- a/test/example/relooper-fuzz2.c
+++ b/test/example/relooper-fuzz2.c
@@ -690,7 +690,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge1.c b/test/example/relooper-merge1.c
index f7939adc6..4086de438 100644
--- a/test/example/relooper-merge1.c
+++ b/test/example/relooper-merge1.c
@@ -232,7 +232,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge2.c b/test/example/relooper-merge2.c
index be8fba500..d85f9d71c 100644
--- a/test/example/relooper-merge2.c
+++ b/test/example/relooper-merge2.c
@@ -247,7 +247,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge3.c b/test/example/relooper-merge3.c
index f1e3d8a54..9347e0fde 100644
--- a/test/example/relooper-merge3.c
+++ b/test/example/relooper-merge3.c
@@ -231,7 +231,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge4.c b/test/example/relooper-merge4.c
index b379800dd..b4373454d 100644
--- a/test/example/relooper-merge4.c
+++ b/test/example/relooper-merge4.c
@@ -231,7 +231,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge5.c b/test/example/relooper-merge5.c
index d678a630e..79ee6abc8 100644
--- a/test/example/relooper-merge5.c
+++ b/test/example/relooper-merge5.c
@@ -231,7 +231,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)
diff --git a/test/example/relooper-merge6.c b/test/example/relooper-merge6.c
index 9d9d33361..774dd934c 100644
--- a/test/example/relooper-merge6.c
+++ b/test/example/relooper-merge6.c
@@ -234,7 +234,7 @@ int main() {
BinaryenTypeNone());
// memory
- BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, "0");
+ BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, NULL, 0, 0, 0, "0");
// optionally, optimize
if (0)