diff options
-rw-r--r-- | dwasm-cpp/wasm.h | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/dwasm-cpp/wasm.h b/dwasm-cpp/wasm.h new file mode 100644 index 0000000..0380303 --- /dev/null +++ b/dwasm-cpp/wasm.h @@ -0,0 +1,213 @@ + +/***************************************************Project Mutator****************************************************/ +/*first line intentionally left blank.*/ +/*bruiser's wasm interface implementation*/ +/*Copyright (C) 2018 Farzad Sadeghi + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 3 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/ +/**********************************************************************************************************************/ +#ifndef WASM_H +#define WASM_H +#include <inttypes.h> +//#include <Python.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint8_t varint1; +typedef uint8_t varint7; +typedef uint32_t varint32; +typedef int8_t varuint1; +typedef int8_t varuint7; +typedef int32_t varuint32; + + enum value_type_t {f64_vt = -4, f32_vt, i64_vt, i32_vt}; + enum external_kind_t {Function, Table, Memory, Global}; + enum type_ctor_t {i32_ctor = -1, i64_ctor = -2, f32_ctor = -3, f64_ctor = -4, anyfunc_ctor = -16, func_ctor = -32, block_type_ctor = -64}; + + typedef struct { + varuint32 size; + char* code; + }init_expr_t; + + typedef struct { + varuint1 flags; + varuint32 initial; + varuint32 maximum; + } resizable_limit_t; + + typedef struct { + enum value_type_t value_type; + varuint1 mutability; + }global_type_t; + + typedef struct { + varint7 element_type; + resizable_limit_t* resizable_limit; + }table_type_t; + + typedef struct { + resizable_limit_t* resizable_limit; + }memory_type_t; + + // func_type + typedef struct { + varint7 form; + varuint32 param_count; + varint7* param_types; + varuint1 return_count; + varint7 * return_types; + }W_Type_Section_Entry; + + typedef struct { + varuint32 count; + W_Type_Section_Entry** entries; + }W_Type_Section; + + typedef struct { + varuint32 module_length; + char* module_str; + varuint32 field_len; + char* field_str; + enum external_kind_t kind; + // based on external_kind it can be 4 different types. thats why im casting to void*. + void* type; + }W_Import_Section_Entry; + + typedef struct { + varuint32 count; + W_Import_Section_Entry** entries; + }W_Import_Section; + + typedef struct { + varuint32 count; + // indexes into the type section + varuint32* types; + }W_Function_Section; + + typedef struct W_Table_Section { + varuint32 count; + table_type_t** entries; + }W_Table_Section; + + typedef struct { + varuint32 count; + memory_type_t** entries; + }W_Memory_Section; + + typedef struct { + global_type_t* type; + init_expr_t* init; + }W_Global_Entry; + + typedef struct { + varuint32 count; + W_Global_Entry** globals; + }W_Global_Section; + + typedef struct { + varuint32 field_len; + char* field_str; + enum external_kind_t kind; + varuint32 index; + }W_Export_Entry; + + typedef struct { + int count; + W_Export_Entry** entries; + }W_Export_Section; + + typedef struct { + varuint32 index; + }W_Start_Section; + + typedef struct { + varuint32 index; + init_expr_t* offset; + varuint32 num_length; + varuint32* elems; + }W_Elem_Segment; + + typedef struct { + varuint32 count; + W_Elem_Segment** entries; + }W_Element_Section; + + typedef struct { + varuint32 count; + enum value_type_t type; + }W_Local_Entry; + + typedef struct W_Function_Body { + varuint32 body_size; + varuint32 local_count; + W_Local_Entry** locals; + char* code; + //char end = 0x0b; + }W_Function_Body; + + typedef struct { + varuint32 count; + W_Function_Body** bodies; + }W_Code_Section; + + typedef struct { + varuint32 index; + init_expr_t* offset; + varuint32 size; + char* data; + }W_Data_Segment; + + typedef struct { + varuint32 count; + W_Data_Segment** entries; + }W_Data_Section; + +#if 0 + typedef struct W_Custom_Section {}; + typedef struct W_Name_Section {}; + typedef struct W_Relocation_Section {}; +#endif + + typedef struct Wasm_Module { + W_Type_Section* type_section; + W_Import_Section* import_section; + W_Function_Section* function_section; + W_Table_Section* table_section; + W_Memory_Section* memory_section; + W_Global_Section* global_section; + W_Export_Section* export_section; + W_Start_Section* start_section; + W_Element_Section* element_section; + W_Code_Section* code_section; + W_Data_Section* data_section; + void** W_Custom_Sections; + char* name; + }Wasm_Module; + + // get the raw binary of the wasm module + // char* getWRaw(); + + // get wasm section raw binary by name + // char* get_W_Section_Raw(const char* section_name); + +#ifdef __cplusplus +} +#endif // end of extern c +#endif // end of header guard +/**********************************************************************************************************************/ +/*last line intentionally left blank.*/ + |