summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorericvergnaud <eric.vergnaud@wanadoo.fr>2024-02-01 19:48:06 +0100
committerGitHub <noreply@github.com>2024-02-01 10:48:06 -0800
commit2b3a2e8c341395e4cb0f76db6ad4f31fb17720cc (patch)
treecca37d0a307f56b351611fb11e604d347c0ba301 /src
parent6c70fcdf246ba5619c75b56e2ffddd8256dfd857 (diff)
downloadbinaryen-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.cpp56
-rw-r--r--src/binaryen-c.h29
-rw-r--r--src/js/binaryen.js-post.js53
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);