diff options
Diffstat (limited to 'src/wasm.h')
-rw-r--r-- | src/wasm.h | 204 |
1 files changed, 165 insertions, 39 deletions
@@ -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_ */ |