summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp117
-rw-r--r--src/binaryen-c.h22
-rw-r--r--src/js/binaryen.js-post.js29
3 files changed, 168 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 1cb0963a2..6bb6f6e14 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -3142,6 +3142,26 @@ void BinaryenRemoveFunction(BinaryenModuleRef module, const char* name) {
auto* wasm = (Module*)module;
wasm->removeFunction(name);
}
+uint32_t BinaryenGetNumFunctions(BinaryenModuleRef module) {
+ if (tracing) {
+ std::cout << " BinaryenGetNumFunctions(the_module);\n";
+ }
+
+ auto* wasm = (Module*)module;
+ return wasm->functions.size();
+}
+BinaryenFunctionRef BinaryenGetFunctionByIndex(BinaryenModuleRef module,
+ BinaryenIndex id) {
+ if (tracing) {
+ std::cout << " BinaryenGetFunctionByIndex(the_module, " << id << ");\n";
+ }
+
+ auto* wasm = (Module*)module;
+ if (wasm->functions.size() <= id) {
+ Fatal() << "invalid function id.";
+ }
+ return wasm->functions[id].get();
+}
// Globals
@@ -3578,6 +3598,83 @@ void BinaryenSetMemory(BinaryenModuleRef module,
}
}
+// Memory segments
+
+uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module) {
+ if (tracing) {
+ std::cout << " BinaryenGetNumMemorySegments(the_module);\n";
+ }
+
+ auto* wasm = (Module*)module;
+ return wasm->memory.segments.size();
+}
+int64_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module,
+ BinaryenIndex id) {
+ if (tracing) {
+ std::cout << " BinaryenGetMemorySegmentByteOffset(the_module, " << id
+ << ");\n";
+ }
+
+ auto* wasm = (Module*)module;
+ if (wasm->memory.segments.size() <= id) {
+ Fatal() << "invalid segment id.";
+ }
+
+ auto globalOffset = [&](const Expression* const& expr,
+ int64_t& result) -> bool {
+ if (auto* c = expr->dynCast<Const>()) {
+ result = c->value.getInteger();
+ return true;
+ }
+ return false;
+ };
+
+ const Memory::Segment& segment = wasm->memory.segments[id];
+
+ int64_t ret;
+ if (globalOffset(segment.offset, ret)) {
+ return ret;
+ }
+ if (auto* get = segment.offset->dynCast<GlobalGet>()) {
+ Global* global = wasm->getGlobal(get->name);
+ if (globalOffset(global->init, ret)) {
+ return ret;
+ }
+ }
+
+ Fatal() << "non-constant offsets aren't supported yet";
+ return 0;
+}
+size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,
+ BinaryenIndex id) {
+ if (tracing) {
+ std::cout << " BinaryenGetMemorySegmentByteLength(the_module, " << id
+ << ");\n";
+ }
+
+ auto* wasm = (Module*)module;
+ if (wasm->memory.segments.size() <= id) {
+ Fatal() << "invalid segment id.";
+ }
+ const Memory::Segment& segment = wasm->memory.segments[id];
+ return segment.data.size();
+}
+void BinaryenCopyMemorySegmentData(BinaryenModuleRef module,
+ BinaryenIndex id,
+ char* buffer) {
+ if (tracing) {
+ std::cout << " BinaryenCopyMemorySegmentData(the_module, " << id << ", "
+ << static_cast<void*>(buffer) << ");\n";
+ }
+
+ auto* wasm = (Module*)module;
+ if (wasm->memory.segments.size() <= id) {
+ Fatal() << "invalid segment id.";
+ }
+ const Memory::Segment& segment = wasm->memory.segments[id];
+ std::copy(segment.data.cbegin(), segment.data.cend(), buffer);
+}
+
// Start function. One per module
void BinaryenSetStart(BinaryenModuleRef module, BinaryenFunctionRef start) {
@@ -4305,6 +4402,26 @@ const char* BinaryenExportGetValue(BinaryenExportRef export_) {
return ((Export*)export_)->value.c_str();
}
+uint32_t BinaryenGetNumExports(BinaryenModuleRef module) {
+ if (tracing) {
+ std::cout << " BinaryenGetNumExports(the_module);\n";
+ }
+
+ auto* wasm = (Module*)module;
+ return wasm->exports.size();
+}
+BinaryenExportRef BinaryenGetExportByIndex(BinaryenModuleRef module,
+ BinaryenIndex id) {
+ if (tracing) {
+ std::cout << " BinaryenGetExportByIndex(the_module, " << id << ");\n";
+ }
+
+ auto* wasm = (Module*)module;
+ if (wasm->exports.size() <= id) {
+ Fatal() << "invalid export id.";
+ }
+ return wasm->exports[id].get();
+}
//
// ========= Custom sections =========
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 1015c65de..9dddc9ce6 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -1064,6 +1064,12 @@ BINARYEN_API BinaryenFunctionRef BinaryenGetFunction(BinaryenModuleRef module,
BINARYEN_API void BinaryenRemoveFunction(BinaryenModuleRef module,
const char* name);
+// Gets the number of functions in the module.
+BINARYEN_API uint32_t BinaryenGetNumFunctions(BinaryenModuleRef module);
+// Get function pointer from its index.
+BINARYEN_API BinaryenFunctionRef
+BinaryenGetFunctionByIndex(BinaryenModuleRef module, BinaryenIndex id);
+
// Imports
BINARYEN_API void
@@ -1168,6 +1174,17 @@ BINARYEN_API void BinaryenSetMemory(BinaryenModuleRef module,
BinaryenIndex numSegments,
uint8_t shared);
+// Memory segments. Query utilities.
+
+BINARYEN_API uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module);
+BINARYEN_API int64_t
+BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module, BinaryenIndex id);
+BINARYEN_API size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,
+ BinaryenIndex id);
+BINARYEN_API void BinaryenCopyMemorySegmentData(BinaryenModuleRef module,
+ BinaryenIndex id,
+ char* buffer);
+
// Start function. One per module
BINARYEN_API void BinaryenSetStart(BinaryenModuleRef module,
@@ -1437,6 +1454,11 @@ BinaryenExportGetKind(BinaryenExportRef export_);
BINARYEN_API const char* BinaryenExportGetName(BinaryenExportRef export_);
// Gets the internal name of the specified export.
BINARYEN_API const char* BinaryenExportGetValue(BinaryenExportRef export_);
+// Gets the number of exports in the module.
+BINARYEN_API uint32_t BinaryenGetNumExports(BinaryenModuleRef module);
+// Get export pointer from its index.
+BINARYEN_API BinaryenExportRef
+BinaryenGetExportByIndex(BinaryenModuleRef module, BinaryenIndex id);
//
// ========= Custom sections =========
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 7c99ded15..0da3f2df4 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2096,6 +2096,23 @@ function wrapModule(module, self) {
);
});
};
+ self['getNumMemorySegments'] = function() {
+ return Module['_BinaryenGetNumMemorySegments'](module);
+ }
+ self['getMemorySegmentInfoByIndex'] = function(id) {
+ return {
+ 'byteOffset': Module['_BinaryenGetMemorySegmentByteOffset'](module, id),
+ 'data': (function(){
+ var size = Module['_BinaryenGetMemorySegmentByteLength'](module, id);
+ var ptr = _malloc(size);
+ Module['_BinaryenCopyMemorySegmentData'](module, id, ptr);
+ var res = new Uint8Array(size);
+ res.set(new Uint8Array(buffer, ptr, size));
+ _free(ptr);
+ return res.buffer;
+ })()
+ };
+ }
self['setStart'] = function(start) {
return Module['_BinaryenSetStart'](module, start);
};
@@ -2110,6 +2127,18 @@ function wrapModule(module, self) {
return Module['_BinaryenAddCustomSection'](module, strToStack(name), i8sToStack(contents), contents.length);
});
};
+ self['getNumExports'] = function() {
+ return Module['_BinaryenGetNumExports'](module);
+ }
+ self['getExportByIndex'] = function(id) {
+ return Module['_BinaryenGetExportByIndex'](module, id);
+ }
+ self['getNumFunctions'] = function() {
+ return Module['_BinaryenGetNumFunctions'](module);
+ }
+ self['getFunctionByIndex'] = function(id) {
+ return Module['_BinaryenGetFunctionByIndex'](module, id);
+ }
self['emitText'] = function() {
var old = out;
var ret = '';