summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Wirtz <dcode@dcode.io>2017-11-11 19:39:21 +0100
committerAlon Zakai <alonzakai@gmail.com>2017-11-11 10:39:21 -0800
commit5e4ea073ed1f6000197fab70041544ea73a8b4a0 (patch)
treed14dd69237f24a43a924ffba1a006ff6a829ca9b /src
parent5b44a8bbf43bb4f1bd8c27d8eceae0111e729c89 (diff)
downloadbinaryen-5e4ea073ed1f6000197fab70041544ea73a8b4a0.tar.gz
binaryen-5e4ea073ed1f6000197fab70041544ea73a8b4a0.tar.bz2
binaryen-5e4ea073ed1f6000197fab70041544ea73a8b4a0.zip
Added expression utility functions to binaryen-c/.js (#1269)
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp47
-rw-r--r--src/binaryen-c.h37
-rw-r--r--src/js/binaryen.js-post.js37
3 files changed, 121 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 03bc3fac7..08136d059 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -106,6 +106,37 @@ BinaryenType BinaryenFloat32(void) { return f32; }
BinaryenType BinaryenFloat64(void) { return f64; }
BinaryenType BinaryenUndefined(void) { return uint32_t(-1); }
+// Expression ids
+
+BinaryenExpressionId BinaryenInvalidId(void) { return Expression::Id::InvalidId; }
+BinaryenExpressionId BinaryenBlockId(void) { return Expression::Id::BlockId; }
+BinaryenExpressionId BinaryenIfId(void) { return Expression::Id::IfId; }
+BinaryenExpressionId BinaryenLoopId(void) { return Expression::Id::LoopId; }
+BinaryenExpressionId BinaryenBreakId(void) { return Expression::Id::BreakId; }
+BinaryenExpressionId BinaryenSwitchId(void) { return Expression::Id::SwitchId; }
+BinaryenExpressionId BinaryenCallId(void) { return Expression::Id::CallId; }
+BinaryenExpressionId BinaryenCallImportId(void) { return Expression::Id::CallImportId; }
+BinaryenExpressionId BinaryenCallIndirectId(void) { return Expression::Id::CallIndirectId; }
+BinaryenExpressionId BinaryenGetLocalId(void) { return Expression::Id::GetLocalId; }
+BinaryenExpressionId BinaryenSetLocalId(void) { return Expression::Id::SetLocalId; }
+BinaryenExpressionId BinaryenGetGlobalId(void) { return Expression::Id::GetGlobalId; }
+BinaryenExpressionId BinaryenSetGlobalId(void) { return Expression::Id::SetGlobalId; }
+BinaryenExpressionId BinaryenLoadId(void) { return Expression::Id::LoadId; }
+BinaryenExpressionId BinaryenStoreId(void) { return Expression::Id::StoreId; }
+BinaryenExpressionId BinaryenConstId(void) { return Expression::Id::ConstId; }
+BinaryenExpressionId BinaryenUnaryId(void) { return Expression::Id::UnaryId; }
+BinaryenExpressionId BinaryenBinaryId(void) { return Expression::Id::BinaryId; }
+BinaryenExpressionId BinaryenSelectId(void) { return Expression::Id::SelectId; }
+BinaryenExpressionId BinaryenDropId(void) { return Expression::Id::DropId; }
+BinaryenExpressionId BinaryenReturnId(void) { return Expression::Id::ReturnId; }
+BinaryenExpressionId BinaryenHostId(void) { return Expression::Id::HostId; }
+BinaryenExpressionId BinaryenNopId(void) { return Expression::Id::NopId; }
+BinaryenExpressionId BinaryenUnreachableId(void) { return Expression::Id::UnreachableId; }
+BinaryenExpressionId BinaryenAtomicCmpxchgId(void) { return Expression::Id::AtomicCmpxchgId; }
+BinaryenExpressionId BinaryenAtomicRMWId(void) { return Expression::Id::AtomicRMWId; }
+BinaryenExpressionId BinaryenAtomicWaitId(void) { return Expression::Id::AtomicWaitId; }
+BinaryenExpressionId BinaryenAtomicWakeId(void) { return Expression::Id::AtomicWakeId; }
+
// Modules
BinaryenModuleRef BinaryenModuleCreate(void) {
@@ -742,6 +773,22 @@ BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpre
return static_cast<Expression*>(ret);
}
+// Expression utility
+
+BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenExpressionGetId(expressions[" << expressions[expr] << "]);\n";
+ }
+
+ return ((Expression*)expr)->_id;
+}
+BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenExpressionGetType(expressions[" << expressions[expr] << "]);\n";
+ }
+
+ return ((Expression*)expr)->type;
+}
void BinaryenExpressionPrint(BinaryenExpressionRef expr) {
if (tracing) {
std::cout << " BinaryenExpressionPrint(expressions[" << expressions[expr] << "]);\n";
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index d95d013ed..c136b5f70 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -76,6 +76,39 @@ BinaryenType BinaryenFloat64(void);
// the API figure out the type instead of providing one.
BinaryenType BinaryenUndefined(void);
+// Expression ids (call to get the value of each; you can cache them)
+
+typedef uint32_t BinaryenExpressionId;
+
+BinaryenExpressionId BinaryenInvalidId(void);
+BinaryenExpressionId BinaryenBlockId(void);
+BinaryenExpressionId BinaryenIfId(void);
+BinaryenExpressionId BinaryenLoopId(void);
+BinaryenExpressionId BinaryenBreakId(void);
+BinaryenExpressionId BinaryenSwitchId(void);
+BinaryenExpressionId BinaryenCallId(void);
+BinaryenExpressionId BinaryenCallImportId(void);
+BinaryenExpressionId BinaryenCallIndirectId(void);
+BinaryenExpressionId BinaryenGetLocalId(void);
+BinaryenExpressionId BinaryenSetLocalId(void);
+BinaryenExpressionId BinaryenGetGlobalId(void);
+BinaryenExpressionId BinaryenSetGlobalId(void);
+BinaryenExpressionId BinaryenLoadId(void);
+BinaryenExpressionId BinaryenStoreId(void);
+BinaryenExpressionId BinaryenConstId(void);
+BinaryenExpressionId BinaryenUnaryId(void);
+BinaryenExpressionId BinaryenBinaryId(void);
+BinaryenExpressionId BinaryenSelectId(void);
+BinaryenExpressionId BinaryenDropId(void);
+BinaryenExpressionId BinaryenReturnId(void);
+BinaryenExpressionId BinaryenHostId(void);
+BinaryenExpressionId BinaryenNopId(void);
+BinaryenExpressionId BinaryenUnreachableId(void);
+BinaryenExpressionId BinaryenAtomicCmpxchgId(void);
+BinaryenExpressionId BinaryenAtomicRMWId(void);
+BinaryenExpressionId BinaryenAtomicWaitId(void);
+BinaryenExpressionId BinaryenAtomicWakeId(void);
+
// Modules
//
// Modules contain lists of functions, imports, exports, function types. The
@@ -332,6 +365,10 @@ BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIn
BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType type);
BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount);
+// Gets the id (kind) of the specified expression.
+BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr);
+// Gets the type of the specified expression.
+BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr);
// Print an expression to stdout. Useful for debugging.
void BinaryenExpressionPrint(BinaryenExpressionRef expr);
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index d4e2cbf80..e5ee24f4d 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -29,6 +29,35 @@
Module['f64'] = Module['_BinaryenFloat64']();
Module['undefined'] = Module['_BinaryenUndefined']();
+ Module['InvalidId'] = Module['_BinaryenInvalidId']();
+ Module['BlockId'] = Module['_BinaryenBlockId']();
+ Module['IfId'] = Module['_BinaryenIfId']();
+ Module['LoopId'] = Module['_BinaryenLoopId']();
+ Module['BreakId'] = Module['_BinaryenBreakId']();
+ Module['SwitchId'] = Module['_BinaryenSwitchId']();
+ Module['CallId'] = Module['_BinaryenCallId']();
+ Module['CallImportId'] = Module['_BinaryenCallImportId']();
+ Module['CallIndirectId'] = Module['_BinaryenCallIndirectId']();
+ Module['GetLocalId'] = Module['_BinaryenGetLocalId']();
+ Module['SetLocalId'] = Module['_BinaryenSetLocalId']();
+ Module['GetGlobalId'] = Module['_BinaryenGetGlobalId']();
+ Module['SetGlobalId'] = Module['_BinaryenSetGlobalId']();
+ Module['LoadId'] = Module['_BinaryenLoadId']();
+ Module['StoreId'] = Module['_BinaryenStoreId']();
+ Module['ConstId'] = Module['_BinaryenConstId']();
+ Module['UnaryId'] = Module['_BinaryenUnaryId']();
+ Module['BinaryId'] = Module['_BinaryenBinaryId']();
+ Module['SelectId'] = Module['_BinaryenSelectId']();
+ Module['DropId'] = Module['_BinaryenDropId']();
+ Module['ReturnId'] = Module['_BinaryenReturnId']();
+ Module['HostId'] = Module['_BinaryenHostId']();
+ Module['NopId'] = Module['_BinaryenNopId']();
+ Module['UnreachableId'] = Module['_BinaryenUnreachableId']();
+ Module['AtomicCmpxchgId'] = Module['_BinaryenAtomicCmpxchgId']();
+ Module['AtomicRMWId'] = Module['_BinaryenAtomicRMWId']();
+ Module['AtomicWaitId'] = Module['_BinaryenAtomicWaitId']();
+ Module['AtomicWakeId'] = Module['_BinaryenAtomicWakeId']();
+
Module['ClzInt32'] = Module['_BinaryenClzInt32']();
Module['CtzInt32'] = Module['_BinaryenCtzInt32']();
Module['PopcntInt32'] = Module['_BinaryenPopcntInt32']();
@@ -894,6 +923,14 @@
};
};
+ Module['getExpressionId'] = function(expr) {
+ return Module['_BinaryenExpressionGetId'](expr);
+ };
+
+ Module['getExpressionType'] = function(expr) {
+ return Module['_BinaryenExpressionGetType'](expr);
+ };
+
// emit text of an expression or a module
Module['emitText'] = function(expr) {
if (typeof expr === 'object') {