Skip to content

Expose GC API to Binaryen.JS #7466

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 29 commits into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
555e671
Add br_on_*, struct.* and array.* functions to Binaryen.js
GulgDev Apr 5, 2025
fcb5ac7
Add TypeBuilder API
GulgDev Apr 5, 2025
49cddc8
Complete TypeBuilder API & add misc functions + basic tests
GulgDev Apr 5, 2025
25e9394
Update tests & fix GC API
GulgDev Apr 8, 2025
a9cd174
Wrap stack-allocating functions in preserveStack
GulgDev Apr 9, 2025
ad972e4
Add array.fill & array.init_(data,elem) C API + tests
GulgDev Apr 9, 2025
bb58e9d
Fix formatting
GulgDev Apr 9, 2025
eb0c88f
Fix array.init_elem test
GulgDev Apr 9, 2025
9ebe7f1
Fix formatting
GulgDev Apr 9, 2025
3d57cad
Fix kitchen sink test
GulgDev Apr 9, 2025
919dbb2
Fix null ref in kitchen sink test
GulgDev Apr 10, 2025
4c56fee
Replace table type
GulgDev Apr 10, 2025
618592f
Fix array types in test
GulgDev Apr 10, 2025
de0d956
Fix formatting & update test results
GulgDev Apr 10, 2025
ef5ed0f
Fix UB in test
GulgDev Apr 10, 2025
5143eba
Update Binaryen.js API & tests (array.new_elem, array.init_data, arra…
GulgDev Apr 11, 2025
889b941
Fix expected test results for GC
GulgDev Apr 11, 2025
8e82b0b
Add expression wrappers for `RefTest`, `RefCast` and `BrOn`
GulgDev Apr 11, 2025
1fa3a2f
Add expression wrappers for struct instructions
GulgDev Apr 11, 2025
9250d82
Add expression wrappers for `ArrayNew`, `ArrayNewFixed`, `ArrayGet`, …
GulgDev Apr 11, 2025
39f0487
Add wrappers for `ArrayNewData` and `ArrayNewElem`
GulgDev Apr 12, 2025
ddc6343
Add test for `ArrayNew` and missing expression ids
GulgDev Apr 12, 2025
1bf64dc
Add test cases for `ArrayNewFixed`, `ArrayNewData` and `ArrayNewElem`
GulgDev Apr 12, 2025
fd75d9b
Add test cases for `ArrayGet`, `ArraySet` and `ArrayLen`
GulgDev Apr 12, 2025
0915f84
Add `ArrayFill` wrapper & tests
GulgDev Apr 12, 2025
5b5084e
Add `ArrayCopy` wrapper tests
GulgDev Apr 12, 2025
49f8ad7
Add `ArrayInitData` and `ArrayInitElem` wrappers & tests
GulgDev Apr 12, 2025
3353cb2
Rename `getSigned` to `isSigned`
GulgDev Apr 13, 2025
00fe570
Add a TODO for GC instructions in `getExpressionInfo`
GulgDev Apr 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
283 changes: 282 additions & 1 deletion src/binaryen-c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1796,7 +1796,16 @@ BinaryenExpressionRef BinaryenArrayNewData(BinaryenModuleRef module,
.makeArrayNewData(
HeapType(type), name, (Expression*)offset, (Expression*)size));
}

BinaryenExpressionRef BinaryenArrayNewElem(BinaryenModuleRef module,
BinaryenHeapType type,
const char* name,
BinaryenExpressionRef offset,
BinaryenExpressionRef size) {
return static_cast<Expression*>(
Builder(*(Module*)module)
.makeArrayNewElem(
HeapType(type), name, (Expression*)offset, (Expression*)size));
}
BinaryenExpressionRef BinaryenArrayNewFixed(BinaryenModuleRef module,
BinaryenHeapType type,
BinaryenExpressionRef* values,
Expand Down Expand Up @@ -1843,6 +1852,43 @@ BinaryenExpressionRef BinaryenArrayCopy(BinaryenModuleRef module,
(Expression*)srcIndex,
(Expression*)length));
}
BinaryenExpressionRef BinaryenArrayFill(BinaryenModuleRef module,
BinaryenExpressionRef ref,
BinaryenExpressionRef index,
BinaryenExpressionRef value,
BinaryenExpressionRef size) {
return static_cast<Expression*>(Builder(*(Module*)module)
.makeArrayFill((Expression*)ref,
(Expression*)index,
(Expression*)value,
(Expression*)size));
}
BinaryenExpressionRef BinaryenArrayInitData(BinaryenModuleRef module,
const char* name,
BinaryenExpressionRef ref,
BinaryenExpressionRef index,
BinaryenExpressionRef offset,
BinaryenExpressionRef size) {
return static_cast<Expression*>(Builder(*(Module*)module)
.makeArrayInitData(name,
(Expression*)ref,
(Expression*)index,
(Expression*)offset,
(Expression*)size));
}
BinaryenExpressionRef BinaryenArrayInitElem(BinaryenModuleRef module,
const char* seg,
BinaryenExpressionRef ref,
BinaryenExpressionRef index,
BinaryenExpressionRef offset,
BinaryenExpressionRef size) {
return static_cast<Expression*>(Builder(*(Module*)module)
.makeArrayInitElem(seg,
(Expression*)ref,
(Expression*)index,
(Expression*)offset,
(Expression*)size));
}
BinaryenExpressionRef BinaryenStringNew(BinaryenModuleRef module,
BinaryenOp op,
BinaryenExpressionRef ptr,
Expand Down Expand Up @@ -4276,6 +4322,76 @@ BinaryenArrayNewFixedRemoveValueAt(BinaryenExpressionRef expr,
assert(expression->is<ArrayNewFixed>());
return static_cast<ArrayNewFixed*>(expression)->values.removeAt(index);
}
// ArrayNewData
const char* BinaryenArrayNewDataGetSegment(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
return static_cast<ArrayNewData*>(expression)->segment.str.data();
}
void BinaryenArrayNewDataSetSegment(BinaryenExpressionRef expr,
const char* segment) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
static_cast<ArrayNewData*>(expression)->segment = Name(segment);
}
BinaryenExpressionRef
BinaryenArrayNewDataGetOffset(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
return static_cast<ArrayNewData*>(expression)->offset;
}
void BinaryenArrayNewDataSetOffset(BinaryenExpressionRef expr,
BinaryenExpressionRef offset) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
static_cast<ArrayNewData*>(expression)->offset = offset;
}
BinaryenExpressionRef BinaryenArrayNewDataGetSize(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
return static_cast<ArrayNewData*>(expression)->size;
}
void BinaryenArrayNewDataSetSize(BinaryenExpressionRef expr,
BinaryenExpressionRef size) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewData>());
static_cast<ArrayNewData*>(expression)->size = size;
}
// ArrayNewElem
const char* BinaryenArrayNewElemGetSegment(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
return static_cast<ArrayNewElem*>(expression)->segment.str.data();
}
void BinaryenArrayNewElemSetSegment(BinaryenExpressionRef expr,
const char* segment) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
static_cast<ArrayNewElem*>(expression)->segment = Name(segment);
}
BinaryenExpressionRef
BinaryenArrayNewElemGetOffset(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
return static_cast<ArrayNewElem*>(expression)->offset;
}
void BinaryenArrayNewElemSetOffset(BinaryenExpressionRef expr,
BinaryenExpressionRef offset) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
static_cast<ArrayNewElem*>(expression)->offset = offset;
}
BinaryenExpressionRef BinaryenArrayNewElemGetSize(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
return static_cast<ArrayNewElem*>(expression)->size;
}
void BinaryenArrayNewElemSetSize(BinaryenExpressionRef expr,
BinaryenExpressionRef size) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayNewElem>());
static_cast<ArrayNewElem*>(expression)->size = size;
}
// ArrayGet
BinaryenExpressionRef BinaryenArrayGetGetRef(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
Expand Down Expand Up @@ -4361,6 +4477,55 @@ void BinaryenArrayLenSetRef(BinaryenExpressionRef expr,
assert(refExpr);
static_cast<ArrayLen*>(expression)->ref = (Expression*)refExpr;
}
// ArrayFill
BinaryenExpressionRef BinaryenArrayFillGetRef(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
return static_cast<ArrayFill*>(expression)->ref;
}
void BinaryenArrayFillSetRef(BinaryenExpressionRef expr,
BinaryenExpressionRef refExpr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
assert(refExpr);
static_cast<ArrayFill*>(expression)->ref = (Expression*)refExpr;
}
BinaryenExpressionRef BinaryenArrayFillGetIndex(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
return static_cast<ArrayFill*>(expression)->index;
}
void BinaryenArrayFillSetIndex(BinaryenExpressionRef expr,
BinaryenExpressionRef indexExpr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
assert(indexExpr);
static_cast<ArrayFill*>(expression)->index = (Expression*)indexExpr;
}
BinaryenExpressionRef BinaryenArrayFillGetValue(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
return static_cast<ArrayFill*>(expression)->value;
}
void BinaryenArrayFillSetValue(BinaryenExpressionRef expr,
BinaryenExpressionRef valueExpr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
assert(valueExpr);
static_cast<ArrayFill*>(expression)->value = (Expression*)valueExpr;
}
BinaryenExpressionRef BinaryenArrayFillGetSize(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
return static_cast<ArrayFill*>(expression)->size;
}
void BinaryenArrayFillSetSize(BinaryenExpressionRef expr,
BinaryenExpressionRef sizeExpr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayFill>());
assert(sizeExpr);
static_cast<ArrayFill*>(expression)->size = (Expression*)sizeExpr;
}
// ArrayCopy
BinaryenExpressionRef BinaryenArrayCopyGetDestRef(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
Expand Down Expand Up @@ -4423,6 +4588,122 @@ void BinaryenArrayCopySetLength(BinaryenExpressionRef expr,
assert(lengthExpr);
static_cast<ArrayCopy*>(expression)->length = (Expression*)lengthExpr;
}
// ArrayInitData
const char* BinaryenArrayInitDataGetSegment(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
return static_cast<ArrayInitData*>(expression)->segment.str.data();
}
void BinaryenArrayInitDataSetSegment(BinaryenExpressionRef expr,
const char* segment) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
static_cast<ArrayInitData*>(expression)->segment = Name(segment);
}
BinaryenExpressionRef BinaryenArrayInitDataGetRef(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
return static_cast<ArrayInitData*>(expression)->ref;
}
void BinaryenArrayInitDataSetRef(BinaryenExpressionRef expr,
BinaryenExpressionRef ref) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
static_cast<ArrayInitData*>(expression)->ref = ref;
}
BinaryenExpressionRef
BinaryenArrayInitDataGetIndex(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
return static_cast<ArrayInitData*>(expression)->index;
}
void BinaryenArrayInitDataSetIndex(BinaryenExpressionRef expr,
BinaryenExpressionRef index) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
static_cast<ArrayInitData*>(expression)->index = index;
}
BinaryenExpressionRef
BinaryenArrayInitDataGetOffset(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
return static_cast<ArrayInitData*>(expression)->offset;
}
void BinaryenArrayInitDataSetOffset(BinaryenExpressionRef expr,
BinaryenExpressionRef offset) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
static_cast<ArrayInitData*>(expression)->offset = offset;
}
BinaryenExpressionRef BinaryenArrayInitDataGetSize(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
return static_cast<ArrayInitData*>(expression)->size;
}
void BinaryenArrayInitDataSetSize(BinaryenExpressionRef expr,
BinaryenExpressionRef size) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitData>());
static_cast<ArrayInitData*>(expression)->size = size;
}
// ArrayInitElem
const char* BinaryenArrayInitElemGetSegment(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
return static_cast<ArrayInitElem*>(expression)->segment.str.data();
}
void BinaryenArrayInitElemSetSegment(BinaryenExpressionRef expr,
const char* segment) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
static_cast<ArrayInitElem*>(expression)->segment = Name(segment);
}
BinaryenExpressionRef BinaryenArrayInitElemGetRef(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
return static_cast<ArrayInitElem*>(expression)->ref;
}
void BinaryenArrayInitElemSetRef(BinaryenExpressionRef expr,
BinaryenExpressionRef ref) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
static_cast<ArrayInitElem*>(expression)->ref = ref;
}
BinaryenExpressionRef
BinaryenArrayInitElemGetIndex(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
return static_cast<ArrayInitElem*>(expression)->index;
}
void BinaryenArrayInitElemSetIndex(BinaryenExpressionRef expr,
BinaryenExpressionRef index) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
static_cast<ArrayInitElem*>(expression)->index = index;
}
BinaryenExpressionRef
BinaryenArrayInitElemGetOffset(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
return static_cast<ArrayInitElem*>(expression)->offset;
}
void BinaryenArrayInitElemSetOffset(BinaryenExpressionRef expr,
BinaryenExpressionRef offset) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
static_cast<ArrayInitElem*>(expression)->offset = offset;
}
BinaryenExpressionRef BinaryenArrayInitElemGetSize(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
return static_cast<ArrayInitElem*>(expression)->size;
}
void BinaryenArrayInitElemSetSize(BinaryenExpressionRef expr,
BinaryenExpressionRef size) {
auto* expression = (Expression*)expr;
assert(expression->is<ArrayInitElem>());
static_cast<ArrayInitElem*>(expression)->size = size;
}
// StringNew
BinaryenOp BinaryenStringNewGetOp(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
Expand Down
Loading
Loading