diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 117 | ||||
-rw-r--r-- | src/binaryen-c.h | 22 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 29 |
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 = ''; |