summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Gardner <eyebrowsoffire@gmail.com>2022-05-24 09:59:47 -0700
committerGitHub <noreply@github.com>2022-05-24 09:59:47 -0700
commit721e8ffb975a6e68a56287cd46ecc19e107211c6 (patch)
tree021219639b5c4b80c235cce42c79902c40fa4794
parenta78d0e44cbcc72682ab9c45dec76d4b1c52588c9 (diff)
downloadbinaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.tar.gz
binaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.tar.bz2
binaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.zip
Add C and JS API functions for accessing memory info (#4682)
Based on #3573 plus minor fixes
-rw-r--r--src/binaryen-c.cpp31
-rw-r--r--src/binaryen-c.h9
-rw-r--r--src/js/binaryen.js-post.js19
-rw-r--r--test/binaryen.js/memory-info.js35
-rw-r--r--test/binaryen.js/memory-info.js.txt9
5 files changed, 101 insertions, 2 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 709672aa4..44f323339 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -3812,6 +3812,37 @@ uint32_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module,
Fatal() << "non-constant offsets aren't supported yet";
return 0;
}
+bool BinaryenHasMemory(BinaryenModuleRef module) {
+ return ((Module*)module)->memory.exists;
+}
+BinaryenIndex BinaryenMemoryGetInitial(BinaryenModuleRef module) {
+ return ((Module*)module)->memory.initial;
+}
+bool BinaryenMemoryHasMax(BinaryenModuleRef module) {
+ return ((Module*)module)->memory.hasMax();
+}
+BinaryenIndex BinaryenMemoryGetMax(BinaryenModuleRef module) {
+ return ((Module*)module)->memory.max;
+}
+const char* BinaryenMemoryImportGetModule(BinaryenModuleRef module) {
+ auto& memory = ((Module*)module)->memory;
+ if (memory.imported()) {
+ return memory.module.c_str();
+ } else {
+ return "";
+ }
+}
+const char* BinaryenMemoryImportGetBase(BinaryenModuleRef module) {
+ auto& memory = ((Module*)module)->memory;
+ if (memory.imported()) {
+ return memory.base.c_str();
+ } else {
+ return "";
+ }
+}
+bool BinaryenMemoryIsShared(BinaryenModuleRef module) {
+ return ((Module*)module)->memory.shared;
+}
size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,
BinaryenIndex id) {
const auto& segments = ((Module*)module)->memory.segments;
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index ed0f01f1c..715b08880 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -2285,6 +2285,15 @@ BINARYEN_API void BinaryenSetMemory(BinaryenModuleRef module,
BinaryenIndex numSegments,
bool shared);
+BINARYEN_API bool BinaryenHasMemory(BinaryenModuleRef module);
+BINARYEN_API BinaryenIndex BinaryenMemoryGetInitial(BinaryenModuleRef module);
+BINARYEN_API bool BinaryenMemoryHasMax(BinaryenModuleRef module);
+BINARYEN_API BinaryenIndex BinaryenMemoryGetMax(BinaryenModuleRef module);
+BINARYEN_API const char*
+BinaryenMemoryImportGetModule(BinaryenModuleRef module);
+BINARYEN_API const char* BinaryenMemoryImportGetBase(BinaryenModuleRef module);
+BINARYEN_API bool BinaryenMemoryIsShared(BinaryenModuleRef module);
+
// Memory segments. Query utilities.
BINARYEN_API uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module);
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 28f5b6258..b6ea7dee1 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2500,9 +2500,24 @@ function wrapModule(module, self = {}) {
);
});
};
+ self['hasMemory'] = function() {
+ return Boolean(Module['_BinaryenHasMemory'](module));
+ };
+ self['getMemoryInfo'] = function() {
+ var memoryInfo = {
+ 'module': UTF8ToString(Module['_BinaryenMemoryImportGetModule'](module)),
+ 'base': UTF8ToString(Module['_BinaryenMemoryImportGetBase'](module)),
+ 'initial': Module['_BinaryenMemoryGetInitial'](module),
+ 'shared': Boolean(Module['_BinaryenMemoryIsShared'](module))
+ };
+ if (Module['_BinaryenMemoryHasMax'](module)) {
+ memoryInfo['max'] = Module['_BinaryenMemoryGetMax'](module);
+ }
+ return memoryInfo;
+ };
self['getNumMemorySegments'] = function() {
return Module['_BinaryenGetNumMemorySegments'](module);
- }
+ };
self['getMemorySegmentInfoByIndex'] = function(id) {
return {
'offset': Module['_BinaryenGetMemorySegmentByteOffset'](module, id),
@@ -2517,7 +2532,7 @@ function wrapModule(module, self = {}) {
})(),
'passive': Boolean(Module['_BinaryenGetMemorySegmentPassive'](module, id))
};
- }
+ };
self['setStart'] = function(start) {
return Module['_BinaryenSetStart'](module, start);
};
diff --git a/test/binaryen.js/memory-info.js b/test/binaryen.js/memory-info.js
new file mode 100644
index 000000000..16ec86753
--- /dev/null
+++ b/test/binaryen.js/memory-info.js
@@ -0,0 +1,35 @@
+var module = new binaryen.Module();
+assert(module.validate());
+console.log(JSON.stringify(module.hasMemory()));
+
+var initial = 1, maximum = 64;
+
+// Not shared
+module = new binaryen.Module();
+module.setMemory(initial, maximum, '');
+assert(module.validate());
+console.log(JSON.stringify(module.hasMemory()));
+console.log(JSON.stringify(module.getMemoryInfo()));
+
+// Shared
+module = new binaryen.Module();
+module.setFeatures(binaryen.Features.MVP | binaryen.Features.Atomics);
+module.setMemory(initial, maximum, '', [], true);
+assert(module.validate());
+console.log(JSON.stringify(module.hasMemory()));
+console.log(JSON.stringify(module.getMemoryInfo()));
+
+// Imported, not shared
+module = new binaryen.Module();
+module.addMemoryImport('my_mem', 'env', 'memory', false);
+assert(module.validate());
+console.log(JSON.stringify(module.hasMemory()));
+console.log(JSON.stringify(module.getMemoryInfo()));
+
+// Imported, shared
+module = new binaryen.Module();
+module.setFeatures(binaryen.Features.MVP | binaryen.Features.Atomics);
+module.addMemoryImport('my_mem', 'env', 'memory', true);
+assert(module.validate());
+console.log(JSON.stringify(module.hasMemory()));
+console.log(JSON.stringify(module.getMemoryInfo()));
diff --git a/test/binaryen.js/memory-info.js.txt b/test/binaryen.js/memory-info.js.txt
new file mode 100644
index 000000000..39d1290ae
--- /dev/null
+++ b/test/binaryen.js/memory-info.js.txt
@@ -0,0 +1,9 @@
+false
+true
+{"module":"","base":"","initial":1,"shared":false,"max":64}
+true
+{"module":"","base":"","initial":1,"shared":true,"max":64}
+false
+{"module":"env","base":"memory","initial":0,"shared":false,"max":65536}
+false
+{"module":"env","base":"memory","initial":0,"shared":true,"max":65536}