diff options
author | ericvergnaud <eric.vergnaud@wanadoo.fr> | 2024-02-01 19:48:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-01 10:48:06 -0800 |
commit | 2b3a2e8c341395e4cb0f76db6ad4f31fb17720cc (patch) | |
tree | cca37d0a307f56b351611fb11e604d347c0ba301 /src | |
parent | 6c70fcdf246ba5619c75b56e2ffddd8256dfd857 (diff) | |
download | binaryen-2b3a2e8c341395e4cb0f76db6ad4f31fb17720cc.tar.gz binaryen-2b3a2e8c341395e4cb0f76db6ad4f31fb17720cc.tar.bz2 binaryen-2b3a2e8c341395e4cb0f76db6ad4f31fb17720cc.zip |
C API: Use segment names (#6254)
Move from segment indexes to names. This is a breaking change to make the API more
capable and consistent. An effort has been made to reduce the burden on C API users
where possible (specifically, you can avoid providing names and let Binaryen make them
for you, which will basically be numbers that match the indexes from before).
Fixes #6247
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 56 | ||||
-rw-r--r-- | src/binaryen-c.h | 29 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 53 |
3 files changed, 74 insertions, 64 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 76a97e9da..8cbb969d6 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -5329,8 +5329,9 @@ void BinaryenSetMemory(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char* exportName, - const char** segments, - bool* segmentPassive, + const char** segmentNames, + const char** segmentDatas, + bool* segmentPassives, BinaryenExpressionRef* segmentOffsets, BinaryenIndex* segmentSizes, BinaryenIndex numSegments, @@ -5354,13 +5355,15 @@ void BinaryenSetMemory(BinaryenModuleRef module, return true; }); for (BinaryenIndex i = 0; i < numSegments; i++) { - auto curr = Builder::makeDataSegment(Name::fromInt(i), + auto explicitName = segmentNames && segmentNames[i]; + auto name = explicitName ? Name(segmentNames[i]) : Name::fromInt(i); + auto curr = Builder::makeDataSegment(name, memory->name, - segmentPassive[i], + segmentPassives[i], (Expression*)segmentOffsets[i], - segments[i], + segmentDatas[i], segmentSizes[i]); - curr->hasExplicitName = false; + curr->hasExplicitName = explicitName; ((Module*)module)->addDataSegment(std::move(curr)); } ((Module*)module)->removeMemories([&](Memory* curr) { return true; }); @@ -5373,10 +5376,11 @@ uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module) { return ((Module*)module)->dataSegments.size(); } uint32_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module, - BinaryenIndex id) { + const char* segmentName) { auto* wasm = (Module*)module; - if (wasm->dataSegments.size() <= id) { - Fatal() << "invalid segment id."; + const auto* segment = wasm->getDataSegmentOrNull(Name(segmentName)); + if (segment == NULL) { + Fatal() << "invalid segment name."; } auto globalOffset = [&](const Expression* const& expr, @@ -5388,8 +5392,6 @@ uint32_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module, return false; }; - const auto& segment = wasm->dataSegments[id]; - int64_t ret; if (globalOffset(segment->offset, ret)) { return ret; @@ -5496,29 +5498,31 @@ bool BinaryenMemoryIs64(BinaryenModuleRef module, const char* name) { return memory->is64(); } size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module, - BinaryenIndex id) { - const auto& segments = ((Module*)module)->dataSegments; - if (segments.size() <= id) { - Fatal() << "invalid segment id."; + const char* segmentName) { + auto* wasm = (Module*)module; + const auto* segment = wasm->getDataSegmentOrNull(Name(segmentName)); + if (segment == NULL) { + Fatal() << "invalid segment name."; } - return segments[id]->data.size(); + return segment->data.size(); } bool BinaryenGetMemorySegmentPassive(BinaryenModuleRef module, - BinaryenIndex id) { - const auto& segments = ((Module*)module)->dataSegments; - if (segments.size() <= id) { - Fatal() << "invalid segment id."; + const char* segmentName) { + auto* wasm = (Module*)module; + const auto* segment = wasm->getDataSegmentOrNull(Name(segmentName)); + if (segment == NULL) { + Fatal() << "invalid segment name."; } - return segments[id]->isPassive; + return segment->isPassive; } void BinaryenCopyMemorySegmentData(BinaryenModuleRef module, - BinaryenIndex id, + const char* segmentName, char* buffer) { - const auto& segments = ((Module*)module)->dataSegments; - if (segments.size() <= id) { - Fatal() << "invalid segment id."; + auto* wasm = (Module*)module; + const auto* segment = wasm->getDataSegmentOrNull(Name(segmentName)); + if (segment == NULL) { + Fatal() << "invalid segment name."; } - const auto& segment = segments[id]; std::copy(segment->data.cbegin(), segment->data.cend(), buffer); } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index b2c59cfbd..07a81a4c8 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -2028,11 +2028,11 @@ BINARYEN_API bool BinaryenSIMDLoadStoreLaneIsStore(BinaryenExpressionRef expr); // MemoryInit -// Gets the index of the segment being initialized by a `memory.init` +// Gets the name of the segment being initialized by a `memory.init` // expression. BINARYEN_API const char* BinaryenMemoryInitGetSegment(BinaryenExpressionRef expr); -// Sets the index of the segment being initialized by a `memory.init` +// Sets the name of the segment being initialized by a `memory.init` // expression. BINARYEN_API void BinaryenMemoryInitSetSegment(BinaryenExpressionRef expr, const char* segment); @@ -2057,9 +2057,9 @@ BINARYEN_API void BinaryenMemoryInitSetSize(BinaryenExpressionRef expr, // DataDrop -// Gets the index of the segment being dropped by a `data.drop` expression. +// Gets the name of the segment being dropped by a `data.drop` expression. BINARYEN_API const char* BinaryenDataDropGetSegment(BinaryenExpressionRef expr); -// Sets the index of the segment being dropped by a `data.drop` expression. +// Sets the name of the segment being dropped by a `data.drop` expression. BINARYEN_API void BinaryenDataDropSetSegment(BinaryenExpressionRef expr, const char* segment); @@ -2906,14 +2906,17 @@ BINARYEN_API BinaryenElementSegmentRef BinaryenGetElementSegmentByIndex(BinaryenModuleRef module, BinaryenIndex index); // This will create a memory, overwriting any existing memory -// Each memory has data in segments, a start offset in segmentOffsets, and a -// size in segmentSizes. exportName can be NULL +// Each memory segment has a name in segmentNames, data in segmentDatas, +// a start offset in segmentOffsets, a passive flag in segmentPassives +// and a size in segmentSizes. segmentNames and exportName can be NULL +// If segmentNames is null, BinaryenSetMemory creates names from indices BINARYEN_API void BinaryenSetMemory(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char* exportName, - const char** segments, - bool* segmentPassive, + const char** segmentNames, + const char** segmentDatas, + bool* segmentPassives, BinaryenExpressionRef* segmentOffsets, BinaryenIndex* segmentSizes, BinaryenIndex numSegments, @@ -2940,14 +2943,14 @@ BINARYEN_API bool BinaryenMemoryIs64(BinaryenModuleRef module, // Memory segments. Query utilities. BINARYEN_API uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module); -BINARYEN_API uint32_t -BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module, BinaryenIndex id); +BINARYEN_API uint32_t BinaryenGetMemorySegmentByteOffset( + BinaryenModuleRef module, const char* segmentName); BINARYEN_API size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module, - BinaryenIndex id); + const char* segmentName); BINARYEN_API bool BinaryenGetMemorySegmentPassive(BinaryenModuleRef module, - BinaryenIndex id); + const char* segmentName); BINARYEN_API void BinaryenCopyMemorySegmentData(BinaryenModuleRef module, - BinaryenIndex id, + const char* segmentName, char* buffer); // Start function. One per module diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 4ff719b30..111c020b3 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2565,31 +2565,34 @@ function wrapModule(module, self = {}) { // segments are assumed to be { passive: bool, offset: expression ref, data: array of 8-bit data } return preserveStack(() => { const segmentsLen = segments.length; - const segmentData = new Array(segmentsLen); - const segmentDataLen = new Array(segmentsLen); - const segmentPassive = new Array(segmentsLen); - const segmentOffset = new Array(segmentsLen); + const names = new Array(segmentsLen); + const datas = new Array(segmentsLen); + const lengths = new Array(segmentsLen); + const passives = new Array(segmentsLen); + const offsets = new Array(segmentsLen); for (let i = 0; i < segmentsLen; i++) { - const { data, offset, passive } = segments[i]; - segmentData[i] = _malloc(data.length); - HEAP8.set(data, segmentData[i]); - segmentDataLen[i] = data.length; - segmentPassive[i] = passive; - segmentOffset[i] = offset; + const { name, data, offset, passive } = segments[i]; + names[i] = name ? strToStack(name) : null; + datas[i] = _malloc(data.length); + HEAP8.set(data, datas[i]); + lengths[i] = data.length; + passives[i] = passive; + offsets[i] = offset; } const ret = Module['_BinaryenSetMemory']( module, initial, maximum, strToStack(exportName), - i32sToStack(segmentData), - i8sToStack(segmentPassive), - i32sToStack(segmentOffset), - i32sToStack(segmentDataLen), - segmentsLen, - shared, - memory64, - strToStack(internalName) - ); + i32sToStack(names), + i32sToStack(datas), + i8sToStack(passives), + i32sToStack(offsets), + i32sToStack(lengths), + segmentsLen, + shared, + memory64, + strToStack(internalName) + ); for (let i = 0; i < segmentsLen; i++) { - _free(segmentData[i]); + _free(datas[i]); } return ret; }); @@ -2613,18 +2616,18 @@ function wrapModule(module, self = {}) { self['getNumMemorySegments'] = function() { return Module['_BinaryenGetNumMemorySegments'](module); }; - self['getMemorySegmentInfoByIndex'] = function(id) { - const passive = Boolean(Module['_BinaryenGetMemorySegmentPassive'](module, id)); + self['getMemorySegmentInfo'] = function(name) { + const passive = Boolean(Module['_BinaryenGetMemorySegmentPassive'](module, strToStack(name))); let offset = null; if (!passive) { - offset = Module['_BinaryenGetMemorySegmentByteOffset'](module, id); + offset = Module['_BinaryenGetMemorySegmentByteOffset'](module, strToStack(name)); } return { 'offset': offset, 'data': (function(){ - const size = Module['_BinaryenGetMemorySegmentByteLength'](module, id); + const size = Module['_BinaryenGetMemorySegmentByteLength'](module, strToStack(name)); const ptr = _malloc(size); - Module['_BinaryenCopyMemorySegmentData'](module, id, ptr); + Module['_BinaryenCopyMemorySegmentData'](module, strToStack(name), ptr); const res = new Uint8Array(size); res.set(HEAP8.subarray(ptr, ptr + size)); _free(ptr); |