binaryen
binaryen copied to clipboard
Questions Related to Preserving Data Segments in BinaryenSetMemory C API
In Wasm Specification, data segments and memory are seperated. However, in Binaryen's current C API, they are deeply coupled.
This leads to some awkward use case, suppose there is a wasm module containing only data segments, and I want to add memory into it, I have to manually copy all existing data segments and pass them into BinaryenSetMemory
, which is unnecessary if we can preserve original data segments.
Therefore, I wonder if we could add an additional argument to BinaryenSetMemory
that indicates whether we should preserve the data segments or not. If that's reasonable, I already created a pull request #6313 and maybe you can check that out ;).
suppose there is a wasm module containing only data segments
Data segments are not valid without a memory, though? Every data segment refers to a memory. Sorry, I think I'm missing something here.
suppose there is a wasm module containing only data segments
Data segments are not valid without a memory, though? Every data segment refers to a memory. Sorry, I think I'm missing something here.
Hey kripken, for active data segment, the answer is yes. But for passive data segment, it's always valid even though a memory is not present (according to https://webassembly.github.io/spec/core/valid/modules.html#data-segments)
Consider following simplified testcase from WebAssembly Core Specification:
(module
(type (;0;) (func))
(func (;0;) (type 0)
data.drop 1)
(data (;0;) "")
(data (;1;) ""))
It's valid and you can use wat2wasm
from wabt
to check that out.
I see, thanks. Yes, it sounds like we should find a way in the C API to support such modules.
I see, thanks. Yes, it sounds like we should find a way in the C API to support such modules.
@kripken Actually, Binaryen does support parsing modules which contain data segments and no memory but the C API currently does not provide a convenient way to operate data segments seperately.
Do you think it's necessary to seperate out memory operation and data segment operation?
Or we could add an ad-hoc boolean argument like keepSegment
to BinaryenSetMemory
, and if it's set to true
, we keep original data segments and the new data segments will just be appended to the internal map.
I will try to create a new PR if any of above options looks convinient for you.
I think adding an ad-hoc boolean might be more confusing. Adding a new API to just add a data segment seems simplest?
@kripken hey kripken, I added corresponding API in PR #6346, you can check that out :).