diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/binaryen-c.cpp | 13 | ||||
-rw-r--r-- | src/binaryen-c.h | 3 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 6 | ||||
-rw-r--r-- | test/binaryen.js/memory-info.js.txt | 8 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 2 | ||||
-rw-r--r-- | test/example/c-api-relooper-unreachable-if.cpp | 2 | ||||
-rw-r--r-- | test/example/c-api-unused-mem.cpp | 2 | ||||
-rw-r--r-- | test/example/relooper-fuzz.c | 2 | ||||
-rw-r--r-- | test/example/relooper-fuzz1.c | 2 | ||||
-rw-r--r-- | test/example/relooper-fuzz2.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge1.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge2.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge3.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge4.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge5.c | 2 | ||||
-rw-r--r-- | test/example/relooper-merge6.c | 2 |
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) |