summaryrefslogtreecommitdiff
path: root/src/binaryen-c.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/binaryen-c.h')
-rw-r--r--src/binaryen-c.h247
1 files changed, 247 insertions, 0 deletions
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
new file mode 100644
index 000000000..475c65613
--- /dev/null
+++ b/src/binaryen-c.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2016 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//================
+// Binaryen C API
+//
+// The first part of the API lets you create modules and their parts.
+// The second part of the API lets you perform operations on modules.
+//================
+
+#ifndef binaryen_h
+#define binaryen_h
+
+#include <stddef.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//
+// ========== Module Creation ==========
+//
+
+// BinaryenIndex
+//
+// Used for internal indexes and list sizes.
+
+typedef uint32_t BinaryenIndex;
+
+// Core types (call to get the value of each; you can cache them, they
+// never change)
+
+typedef uint32_t BinaryenType;
+
+BinaryenType BinaryenNone(void);
+BinaryenType BinaryenInt32(void);
+BinaryenType BinaryenInt64(void);
+BinaryenType BinaryenFloat32(void);
+BinaryenType BinaryenFloat64(void);
+
+// Modules
+//
+// Modules contain lists of functions, imports, exports, function types. The
+// Add* methods create them on a module. The module owns them and will free their
+// memory when the module is disposed of.
+//
+// Expressions are also allocated inside modules, and freed with the module. They
+// are not created by Add* methods, since they are not added directly on the
+// module, instead, they are arguments to other expressions (and then they are
+// the children of that AST node), or to a function (and then they are the body
+// of that function).
+//
+// A module can also contain a function table for indirect calls, a memory,
+// and a start method.
+
+typedef void* BinaryenModuleRef;
+
+BinaryenModuleRef BinaryenModuleCreate();
+void BinaryenModuleDispose(BinaryenModuleRef module);
+
+// Function types
+
+typedef void* BinaryenFunctionTypeRef;
+
+BinaryenFunctionTypeRef BinaryenAddFunctionType(BinaryenModuleRef module, const char* name, BinaryenType result, BinaryenType* paramTypes, BinaryenIndex numParams);
+
+// Literals. These are passed by value.
+
+struct BinaryenLiteral {
+ int type; // size of enum in c++
+ union {
+ int32_t i32;
+ int64_t i64;
+ float f32;
+ double f64;
+ };
+};
+
+struct BinaryenLiteral BinaryenLiteralInt32(int32_t x);
+struct BinaryenLiteral BinaryenLiteralInt64(int64_t x);
+struct BinaryenLiteral BinaryenLiteralFloat32(float x);
+struct BinaryenLiteral BinaryenLiteralFloat64(double x);
+struct BinaryenLiteral BinaryenLiteralFloat32Bits(int32_t x);
+struct BinaryenLiteral BinaryenLiteralFloat64Bits(int64_t x);
+
+// Expressions
+//
+// Some expressions have a BinaryenOp, which is the more
+// specific operation/opcode.
+//
+// Some expressions have optional parameters, like Return may not
+// return a value. You can supply a NULL pointer in those cases.
+
+typedef int32_t BinaryenOp;
+
+BinaryenOp BinaryenClz(void);
+BinaryenOp BinaryenCtz(void);
+BinaryenOp BinaryenPopcnt(void);
+BinaryenOp BinaryenNeg(void);
+BinaryenOp BinaryenAbs(void);
+BinaryenOp BinaryenCeil(void);
+BinaryenOp BinaryenFloor(void);
+BinaryenOp BinaryenTrunc(void);
+BinaryenOp BinaryenNearest(void);
+BinaryenOp BinaryenSqrt(void);
+BinaryenOp BinaryenEqZ(void);
+BinaryenOp BinaryenExtendSInt32(void);
+BinaryenOp BinaryenExtentUInt32(void);
+BinaryenOp BinaryenWrapInt64(void);
+BinaryenOp BinaryenTruncSFloat32(void);
+BinaryenOp BinaryenTruncUFloat32(void);
+BinaryenOp BinaryenTruncSFloat64(void);
+BinaryenOp BinaryenTruncUFloat64(void);
+BinaryenOp BinaryenReinterpretFloat(void);
+BinaryenOp BinaryenConvertSInt32(void);
+BinaryenOp BinaryenConvertUInt32(void);
+BinaryenOp BinaryenConvertSInt64(void);
+BinaryenOp BinaryenConvertUInt64(void);
+BinaryenOp BinaryenPromoteFloat32(void);
+BinaryenOp BinaryenDemoteFloat64(void);
+BinaryenOp BinaryenReinterpretInt(void);
+BinaryenOp BinaryenAdd(void);
+BinaryenOp BinaryenSub(void);
+BinaryenOp BinaryenMul(void);
+BinaryenOp BinaryenDivS(void);
+BinaryenOp BinaryenDivU(void);
+BinaryenOp BinaryenRemS(void);
+BinaryenOp BinaryenRemU(void);
+BinaryenOp BinaryenAnd(void);
+BinaryenOp BinaryenOr(void);
+BinaryenOp BinaryenXor(void);
+BinaryenOp BinaryenShl(void);
+BinaryenOp BinaryenShrU(void);
+BinaryenOp BinaryenShrS(void);
+BinaryenOp BinaryenRotL(void);
+BinaryenOp BinaryenRotR(void);
+BinaryenOp BinaryenDiv(void);
+BinaryenOp BinaryenCopySign(void);
+BinaryenOp BinaryenMin(void);
+BinaryenOp BinaryenMax(void);
+BinaryenOp BinaryenEq(void);
+BinaryenOp BinaryenNe(void);
+BinaryenOp BinaryenLtS(void);
+BinaryenOp BinaryenLtU(void);
+BinaryenOp BinaryenLeS(void);
+BinaryenOp BinaryenLeU(void);
+BinaryenOp BinaryenGtS(void);
+BinaryenOp BinaryenGtU(void);
+BinaryenOp BinaryenGeS(void);
+BinaryenOp BinaryenGeU(void);
+BinaryenOp BinaryenLt(void);
+BinaryenOp BinaryenLe(void);
+BinaryenOp BinaryenGt(void);
+BinaryenOp BinaryenGe(void);
+BinaryenOp BinaryenPageSize(void);
+BinaryenOp BinaryenCurrentMemory(void);
+BinaryenOp BinaryenGrowMemory(void);
+BinaryenOp BinaryenHasFeature(void);
+
+typedef void* BinaryenExpressionRef;
+
+// Block: name can be NULL
+BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module, const char* name, BinaryenExpressionRef* children, BinaryenIndex numChildren);
+// If: ifFalse can be NULL
+BinaryenExpressionRef BinaryenIf(BinaryenModuleRef module, BinaryenExpressionRef condition, BinaryenExpressionRef ifTrue, BinaryenExpressionRef ifFalse);
+// Loop: both out and in can be NULL, or just out can be NULL
+BinaryenExpressionRef BinaryenLoop(BinaryenModuleRef module, const char* out, const char* in, BinaryenExpressionRef body);
+// Break: value and condition can be NULL
+BinaryenExpressionRef BinaryenBreak(BinaryenModuleRef module, const char* name, BinaryenExpressionRef value, BinaryenExpressionRef condition);
+// Switch: value can be NULL
+BinaryenExpressionRef BinaryenSwitch(BinaryenModuleRef module, const char **names, BinaryenIndex numNames, const char* defaultName, BinaryenExpressionRef condition, BinaryenExpressionRef value);
+BinaryenExpressionRef BinaryenCall(BinaryenModuleRef module, const char *target, BinaryenExpressionRef* operands, BinaryenIndex numOperands);
+BinaryenExpressionRef BinaryenCallImport(BinaryenModuleRef module, const char *target, BinaryenExpressionRef* operands, BinaryenIndex numOperands);
+BinaryenExpressionRef BinaryenCallIndirect(BinaryenModuleRef module, BinaryenExpressionRef target, BinaryenExpressionRef* operands, BinaryenIndex numOperands, BinaryenFunctionTypeRef type);
+BinaryenExpressionRef BinaryenGetLocal(BinaryenModuleRef module, BinaryenIndex index, BinaryenType type);
+BinaryenExpressionRef BinaryenSetLocal(BinaryenModuleRef module, BinaryenIndex index, BinaryenExpressionRef value);
+BinaryenExpressionRef BinaryenLoad(BinaryenModuleRef module, uint32_t bytes, int8_t signed_, uint32_t offset, uint32_t align, BinaryenType type, BinaryenExpressionRef ptr);
+BinaryenExpressionRef BinaryenStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, uint32_t align, BinaryenExpressionRef ptr, BinaryenExpressionRef value);
+BinaryenExpressionRef BinaryenConst(BinaryenModuleRef module, struct BinaryenLiteral value);
+BinaryenExpressionRef BinaryenUnary(BinaryenModuleRef module, BinaryenOp op, BinaryenExpressionRef value, BinaryenType type);
+BinaryenExpressionRef BinaryenBinary(BinaryenModuleRef module, BinaryenOp op, BinaryenExpressionRef left, BinaryenExpressionRef right);
+BinaryenExpressionRef BinaryenSelect(BinaryenModuleRef module, BinaryenExpressionRef condition, BinaryenExpressionRef ifTrue, BinaryenExpressionRef ifFalse);
+// Return: value can be NULL
+BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressionRef value);
+// Host: name may be NULL
+BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands);
+BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module);
+BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module);
+
+// Functions
+
+typedef void* BinaryenFunctionRef;
+
+BinaryenFunctionRef BinaryenAddFunction(BinaryenModuleRef module, const char* name, BinaryenFunctionTypeRef type, BinaryenType* localTypes, BinaryenIndex numLocalTypes, BinaryenExpressionRef body);
+
+// Imports
+
+typedef void* BinaryenImportRef;
+
+BinaryenImportRef BinaryenAddImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef type);
+
+// Exports
+
+typedef void* BinaryenExportRef;
+
+BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
+
+// Function table. One per module
+
+void BinaryenSetFunctionTable(BinaryenModuleRef module, BinaryenFunctionRef* functions, BinaryenIndex numFunctions);
+
+// Memory. One per module
+
+// Each segment has data in segments, a start offset in segmentOffsets, and a size in segmentSizes.
+// exportName can be NULL
+void BinaryenSetMemory(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char* exportName, const char **segments, BinaryenIndex* segmentOffsets, BinaryenIndex* segmentSizes, BinaryenIndex numSegments);
+
+// Start function. One per module
+
+void BinaryenSetStart(BinaryenModuleRef module, const char* name);
+
+//
+// ========== Module Operations ==========
+//
+
+// Print a module to stdout.
+void BinaryenModulePrint(BinaryenModuleRef module);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // binaryen_h