summaryrefslogtreecommitdiff
path: root/src/wasm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm.h')
-rw-r--r--src/wasm.h204
1 files changed, 165 insertions, 39 deletions
diff --git a/src/wasm.h b/src/wasm.h
index febcfc04..35410515 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -47,50 +47,158 @@ typedef enum WasmMemSize {
WASM_MEM_SIZE_64 = 64,
} WasmMemSize;
-typedef enum WasmSigned {
- WASM_SIGNED,
- WASM_UNSIGNED,
-} WasmSigned;
-
typedef enum WasmUnaryOpType {
- WASM_UNARY_OP_TYPE_NOT,
- WASM_UNARY_OP_TYPE_CLZ,
- WASM_UNARY_OP_TYPE_CTZ,
- WASM_UNARY_OP_TYPE_POPCNT,
- WASM_UNARY_OP_TYPE_NEG,
- WASM_UNARY_OP_TYPE_ABS,
- WASM_UNARY_OP_TYPE_SQRT,
- WASM_UNARY_OP_TYPE_CEIL,
- WASM_UNARY_OP_TYPE_FLOOR,
- WASM_UNARY_OP_TYPE_TRUNC,
- WASM_UNARY_OP_TYPE_NEAREST,
+ WASM_UNARY_OP_TYPE_F32_ABS,
+ WASM_UNARY_OP_TYPE_F32_CEIL,
+ WASM_UNARY_OP_TYPE_F32_FLOOR,
+ WASM_UNARY_OP_TYPE_F32_NEAREST,
+ WASM_UNARY_OP_TYPE_F32_NEG,
+ WASM_UNARY_OP_TYPE_F32_SQRT,
+ WASM_UNARY_OP_TYPE_F32_TRUNC,
+ WASM_UNARY_OP_TYPE_F64_ABS,
+ WASM_UNARY_OP_TYPE_F64_CEIL,
+ WASM_UNARY_OP_TYPE_F64_FLOOR,
+ WASM_UNARY_OP_TYPE_F64_NEAREST,
+ WASM_UNARY_OP_TYPE_F64_NEG,
+ WASM_UNARY_OP_TYPE_F64_SQRT,
+ WASM_UNARY_OP_TYPE_F64_TRUNC,
+ WASM_UNARY_OP_TYPE_I32_CLZ,
+ WASM_UNARY_OP_TYPE_I32_CTZ,
+ WASM_UNARY_OP_TYPE_I32_NOT,
+ WASM_UNARY_OP_TYPE_I32_POPCNT,
+ WASM_UNARY_OP_TYPE_I64_CLZ,
+ WASM_UNARY_OP_TYPE_I64_CTZ,
+ WASM_UNARY_OP_TYPE_I64_POPCNT,
} WasmUnaryOpType;
typedef enum WasmBinaryOpType {
- WASM_BINARY_OP_TYPE_ADD,
- WASM_BINARY_OP_TYPE_SUB,
- WASM_BINARY_OP_TYPE_MUL,
- WASM_BINARY_OP_TYPE_DIV,
- WASM_BINARY_OP_TYPE_REM,
- WASM_BINARY_OP_TYPE_AND,
- WASM_BINARY_OP_TYPE_OR,
- WASM_BINARY_OP_TYPE_XOR,
- WASM_BINARY_OP_TYPE_SHL,
- WASM_BINARY_OP_TYPE_SHR,
- WASM_BINARY_OP_TYPE_MIN,
- WASM_BINARY_OP_TYPE_MAX,
- WASM_BINARY_OP_TYPE_COPYSIGN,
+ WASM_BINARY_OP_TYPE_F32_ADD,
+ WASM_BINARY_OP_TYPE_F32_COPYSIGN,
+ WASM_BINARY_OP_TYPE_F32_DIV,
+ WASM_BINARY_OP_TYPE_F32_MAX,
+ WASM_BINARY_OP_TYPE_F32_MIN,
+ WASM_BINARY_OP_TYPE_F32_MUL,
+ WASM_BINARY_OP_TYPE_F32_SUB,
+ WASM_BINARY_OP_TYPE_F64_ADD,
+ WASM_BINARY_OP_TYPE_F64_COPYSIGN,
+ WASM_BINARY_OP_TYPE_F64_DIV,
+ WASM_BINARY_OP_TYPE_F64_MAX,
+ WASM_BINARY_OP_TYPE_F64_MIN,
+ WASM_BINARY_OP_TYPE_F64_MUL,
+ WASM_BINARY_OP_TYPE_F64_SUB,
+ WASM_BINARY_OP_TYPE_I32_ADD,
+ WASM_BINARY_OP_TYPE_I32_AND,
+ WASM_BINARY_OP_TYPE_I32_DIV_S,
+ WASM_BINARY_OP_TYPE_I32_DIV_U,
+ WASM_BINARY_OP_TYPE_I32_MUL,
+ WASM_BINARY_OP_TYPE_I32_OR,
+ WASM_BINARY_OP_TYPE_I32_REM_S,
+ WASM_BINARY_OP_TYPE_I32_REM_U,
+ WASM_BINARY_OP_TYPE_I32_SHL,
+ WASM_BINARY_OP_TYPE_I32_SHR_S,
+ WASM_BINARY_OP_TYPE_I32_SHR_U,
+ WASM_BINARY_OP_TYPE_I32_SUB,
+ WASM_BINARY_OP_TYPE_I32_XOR,
+ WASM_BINARY_OP_TYPE_I64_ADD,
+ WASM_BINARY_OP_TYPE_I64_AND,
+ WASM_BINARY_OP_TYPE_I64_DIV_S,
+ WASM_BINARY_OP_TYPE_I64_DIV_U,
+ WASM_BINARY_OP_TYPE_I64_MUL,
+ WASM_BINARY_OP_TYPE_I64_OR,
+ WASM_BINARY_OP_TYPE_I64_REM_S,
+ WASM_BINARY_OP_TYPE_I64_REM_U,
+ WASM_BINARY_OP_TYPE_I64_SHL,
+ WASM_BINARY_OP_TYPE_I64_SHR_S,
+ WASM_BINARY_OP_TYPE_I64_SHR_U,
+ WASM_BINARY_OP_TYPE_I64_SUB,
+ WASM_BINARY_OP_TYPE_I64_XOR,
} WasmBinaryOpType;
typedef enum WasmCompareOpType {
- WASM_COMPARE_OP_TYPE_EQ,
- WASM_COMPARE_OP_TYPE_NE,
- WASM_COMPARE_OP_TYPE_LT,
- WASM_COMPARE_OP_TYPE_LE,
- WASM_COMPARE_OP_TYPE_GT,
- WASM_COMPARE_OP_TYPE_GE,
+ WASM_COMPARE_OP_TYPE_F32_EQ,
+ WASM_COMPARE_OP_TYPE_F32_GE,
+ WASM_COMPARE_OP_TYPE_F32_GT,
+ WASM_COMPARE_OP_TYPE_F32_LE,
+ WASM_COMPARE_OP_TYPE_F32_LT,
+ WASM_COMPARE_OP_TYPE_F32_NE,
+ WASM_COMPARE_OP_TYPE_F64_EQ,
+ WASM_COMPARE_OP_TYPE_F64_GE,
+ WASM_COMPARE_OP_TYPE_F64_GT,
+ WASM_COMPARE_OP_TYPE_F64_LE,
+ WASM_COMPARE_OP_TYPE_F64_LT,
+ WASM_COMPARE_OP_TYPE_F64_NE,
+ WASM_COMPARE_OP_TYPE_I32_EQ,
+ WASM_COMPARE_OP_TYPE_I32_GE_S,
+ WASM_COMPARE_OP_TYPE_I32_GE_U,
+ WASM_COMPARE_OP_TYPE_I32_GT_S,
+ WASM_COMPARE_OP_TYPE_I32_GT_U,
+ WASM_COMPARE_OP_TYPE_I32_LE_S,
+ WASM_COMPARE_OP_TYPE_I32_LE_U,
+ WASM_COMPARE_OP_TYPE_I32_LT_S,
+ WASM_COMPARE_OP_TYPE_I32_LT_U,
+ WASM_COMPARE_OP_TYPE_I32_NE,
+ WASM_COMPARE_OP_TYPE_I64_EQ,
+ WASM_COMPARE_OP_TYPE_I64_GE_S,
+ WASM_COMPARE_OP_TYPE_I64_GE_U,
+ WASM_COMPARE_OP_TYPE_I64_GT_S,
+ WASM_COMPARE_OP_TYPE_I64_GT_U,
+ WASM_COMPARE_OP_TYPE_I64_LE_S,
+ WASM_COMPARE_OP_TYPE_I64_LE_U,
+ WASM_COMPARE_OP_TYPE_I64_LT_S,
+ WASM_COMPARE_OP_TYPE_I64_LT_U,
+ WASM_COMPARE_OP_TYPE_I64_NE,
} WasmCompareOpType;
+typedef enum WasmMemOpType {
+ WASM_MEM_OP_TYPE_F32_LOAD,
+ WASM_MEM_OP_TYPE_F32_STORE,
+ WASM_MEM_OP_TYPE_F64_LOAD,
+ WASM_MEM_OP_TYPE_F64_STORE,
+ WASM_MEM_OP_TYPE_I32_LOAD,
+ WASM_MEM_OP_TYPE_I32_LOAD8_S,
+ WASM_MEM_OP_TYPE_I32_LOAD8_U,
+ WASM_MEM_OP_TYPE_I32_LOAD16_S,
+ WASM_MEM_OP_TYPE_I32_LOAD16_U,
+ WASM_MEM_OP_TYPE_I32_STORE,
+ WASM_MEM_OP_TYPE_I32_STORE8,
+ WASM_MEM_OP_TYPE_I32_STORE16,
+ WASM_MEM_OP_TYPE_I64_LOAD,
+ WASM_MEM_OP_TYPE_I64_LOAD8_S,
+ WASM_MEM_OP_TYPE_I64_LOAD8_U,
+ WASM_MEM_OP_TYPE_I64_LOAD16_S,
+ WASM_MEM_OP_TYPE_I64_LOAD16_U,
+ WASM_MEM_OP_TYPE_I64_LOAD32_S,
+ WASM_MEM_OP_TYPE_I64_LOAD32_U,
+ WASM_MEM_OP_TYPE_I64_STORE,
+ WASM_MEM_OP_TYPE_I64_STORE8,
+ WASM_MEM_OP_TYPE_I64_STORE16,
+ WASM_MEM_OP_TYPE_I64_STORE32,
+} WasmMemOpType;
+
+typedef enum WasmConvertOpType {
+ WASM_CONVERT_OP_TYPE_F32_CONVERT_S_I32,
+ WASM_CONVERT_OP_TYPE_F32_CONVERT_S_I64,
+ WASM_CONVERT_OP_TYPE_F32_CONVERT_U_I32,
+ WASM_CONVERT_OP_TYPE_F32_CONVERT_U_I64,
+ WASM_CONVERT_OP_TYPE_F32_DEMOTE_F64,
+ WASM_CONVERT_OP_TYPE_F64_CONVERT_S_I32,
+ WASM_CONVERT_OP_TYPE_F64_CONVERT_S_I64,
+ WASM_CONVERT_OP_TYPE_F64_CONVERT_U_I32,
+ WASM_CONVERT_OP_TYPE_F64_CONVERT_U_I64,
+ WASM_CONVERT_OP_TYPE_F64_PROMOTE_F32,
+ WASM_CONVERT_OP_TYPE_I32_TRUNC_S_F32,
+ WASM_CONVERT_OP_TYPE_I32_TRUNC_S_F64,
+ WASM_CONVERT_OP_TYPE_I32_TRUNC_U_F32,
+ WASM_CONVERT_OP_TYPE_I32_TRUNC_U_F64,
+ WASM_CONVERT_OP_TYPE_I32_WRAP_I64,
+ WASM_CONVERT_OP_TYPE_I64_EXTEND_S_I32,
+ WASM_CONVERT_OP_TYPE_I64_EXTEND_U_I32,
+ WASM_CONVERT_OP_TYPE_I64_TRUNC_S_F32,
+ WASM_CONVERT_OP_TYPE_I64_TRUNC_S_F64,
+ WASM_CONVERT_OP_TYPE_I64_TRUNC_U_F32,
+ WASM_CONVERT_OP_TYPE_I64_TRUNC_U_F64,
+} WasmConvertOpType;
+
typedef struct WasmUnaryOp {
WasmType type;
WasmUnaryOpType op_type;
@@ -99,19 +207,17 @@ typedef struct WasmUnaryOp {
typedef struct WasmBinaryOp {
WasmType type;
WasmBinaryOpType op_type;
- WasmSigned sign;
} WasmBinaryOp;
typedef struct WasmCompareOp {
WasmType type;
WasmCompareOpType op_type;
- WasmSigned sign;
} WasmCompareOp;
typedef struct WasmConvertOp {
WasmType type;
+ WasmConvertOpType op_type;
WasmType type2;
- WasmSigned sign;
} WasmConvertOp;
typedef struct WasmCastOp {
@@ -121,8 +227,8 @@ typedef struct WasmCastOp {
typedef struct WasmMemOp {
WasmType type;
+ WasmMemOpType op_type;
WasmMemSize size;
- WasmSigned sign;
} WasmMemOp;
typedef enum WasmVarType {
@@ -430,8 +536,28 @@ typedef struct WasmParser {
int errors;
} WasmParser;
+typedef struct WasmBinaryWriter {
+ void* user_data;
+ void (*write_data)(size_t offset,
+ const void* data,
+ size_t size,
+ void* user_data);
+ int log_writes;
+} WasmBinaryWriter;
+
WasmScanner wasm_new_scanner(const char* filename);
void wasm_free_scanner(WasmScanner scanner);
WasmResult wasm_check_script(WasmScript*);
+WasmResult wasm_write_binary(WasmBinaryWriter*, WasmScript*);
+
+int wasm_get_func_index_by_var(WasmModule* module, WasmVar* var);
+int wasm_get_func_type_index_by_var(WasmModule* module, WasmVar* var);
+int wasm_get_import_index_by_var(WasmModule* module, WasmVar* var);
+
+WasmFuncPtr wasm_get_func_by_var(WasmModule* module, WasmVar* var);
+WasmFuncTypePtr wasm_get_func_type_by_var(WasmModule* module, WasmVar* var);
+WasmImportPtr wasm_get_import_by_var(WasmModule* module, WasmVar* var);
+
+int wasm_func_is_exported(WasmModule* module, WasmFunc* func);
#endif /* WASM_H_ */