aboutsummaryrefslogblamecommitdiffstats
path: root/opcodes.py
blob: e20e1a85ce7dc4efd7cb59f05f26d1b91691cbdd (plain) (tree)
1
2

                     















                  












                                         
 





                              
 






                     

                   




                       
 





























                                     



                                                   
                             















                     




















































































































































































                                                                          
 








                                   


                                                                












                              
                                                  


                                                      
 
                                                        


                                                                
                                                  


                                                                  






                             


                                                                    


























                                 


                                                              





                            


                                                            



































                           


                                                                

































































                               


                                                              






















                                    


                                                                    





                                      
                                                    


                                                       
 













                           

                                                                        
from enum import Enum

SectionID = {
    0: "custom",
    1: "type",
    2: "import",
    3: "function",
    4: "table",
    5: "memory",
    6: "global",
    7: "export",
    8: "start",
    9: "element",
    10: "code",
    11: "data",
    63: "unknown",
}


class RelocType(Enum):
    R_WEBASSEMBLY_FUNCTION_INDEX_LEB = 0
    R_WEBASSEMBLY_TABLE_INDEX_SLEB = 1
    R_WEBASSEMBLY_TABLE_INDEX_I32 = 2
    R_WEBASSEMBLY_MEMORY_ADDR_LEB = 3
    R_WEBASSEMBLY_MEMORY_ADDR_SLEB = 4
    R_WEBASSEMBLY_MEMORY_ADDR_I32 = 5
    R_WEBASSEMBLY_TYPE_INDEX_LEB = 6
    R_WEBASSEMBLY_GLOBAL_INDEX_LEB = 7
    R_WEBASSEMPLY_FUNCTION_OFFSET_I32 = 8
    R_WEBASSEMBLY_SECTION_OFFSET_I32 = 9


class LinkingSubsection(Enum):
    WASM_SEGMENT_INFO = 5
    WASM_INIT_FUNCS = 6
    WASM_COMDAT_INFO = 7
    WASM_SYMBOL_TABLE = 8


class TypeType(Enum):
    none = 1
    lebu = 2
    lebs = 3
    flot = 4
    dobl = 5


class Syminfo_Kind:
    SYMTAB_FUNCTION = 0
    SYMTAB_DATA = 1
    SYMTAB_GLOBAL = 2
    SYMTAB_SECTION = 3


TypeKS = [
    ["uint8", 8, TypeType.none],
    ["uint16", 16, TypeType.none],
    ["uint32", 32, TypeType.none],
    ["uint64", 64, TypeType.none],
    ["varuint1", 1, TypeType.lebu],
    ["varuint7", 7, TypeType.lebu],
    ["varuint32", 32, TypeType.lebu],
    ["varuint64", 64, TypeType.lebu],
    ["varint1", 1, TypeType.lebs],
    ["varint7", 7, TypeType.lebs],
    ["varint32", 32, TypeType.lebs],
    ["varint64", 64, TypeType.lebs],
]

TypeDic = {
    "uint8": 1,
    "uint16": 2,
    "uint32": 4,
    "uint64": 8,
    "varuint1": 1,
    "varuint7": 1,
    "varuint32": 4,
    "varuint64": 8,
    "varint1": 1,
    "varint7": 1,
    "varint32": 4,
    "varint64": 8,
}


# holds the version 1.0 wasm opcodes and immediates
class WASM_OP_Code:
    version_number = 0x01
    magic_number = 0x6D736100
    PAGE_SIZE = 65536
    uint8 = 1
    uint16 = 2
    uint32 = 4
    uint64 = 8
    varuint1 = 1
    varuint7 = 1
    varuint32 = 4
    varuint64 = 8
    varint1 = 1
    varint7 = 1
    varint32 = 4
    varint64 = 8
    floatt = 4
    doublet = 8

    all_ops = [
        ("i32", "7f", False),
        ("i64", "7e", False),
        ("f32", "7d", False),
        ("f64", "7c", False),
        ("anyfunc", "7b", False),
        ("func", "60", False),
        ("empty_block_type", "40", False),
        ("unreachable", "00", False),
        ("nop", "01", False),
        ("block", "02", True, ("varuint7")),
        ("loop", "03", True, ("varuint7")),
        ("if", "04", True, ("varuint7")),
        ("else", "05", False),
        ("end", "0b", False),
        ("br", "0c", True, ("varuint32")),
        ("br_if", "0d", True, ("varuint32")),
        ("br_table", "0e", True, ("varuint32", "varuint32", "varuint32")),
        ("return", "0f", False),
        ("call", "10", True, ("varuint32")),
        ("call_indirect", "11", True, ("varuint32", "varuint1")),
        ("drop", "1a", False),
        ("select", "1b", False),
        ("get_local", "20", True, ("varuint32")),
        ("set_local", "21", True, ("varuint32")),
        ("tee_local", "22", True, ("varuint32")),
        ("get_global", "23", True, ("varuint32")),
        ("set_global", "24", True, ("varuint32")),
        ("i32.load", "28", True, ("varuint32", "varuint32")),
        ("i64.load", "29", True, ("varuint32", "varuint32")),
        ("f32.load", "2a", True, ("varuint32", "varuint32")),
        ("f64.load", "2b", True, ("varuint32", "varuint32")),
        ("i32.load8_s", "2c", True, ("varuint32", "varuint32")),
        ("i32.load8_u", "2d", True, ("varuint32", "varuint32")),
        ("i32.load16_s", "2e", True, ("varuint32", "varuint32")),
        ("i32.load16_u", "2f", True, ("varuint32", "varuint32")),
        ("i64.load8_s", "30", True, ("varuint32", "varuint32")),
        ("i64.load8_u", "31", True, ("varuint32", "varuint32")),
        ("i64.load16_s", "32", True, ("varuint32", "varuint32")),
        ("i64.load16_u", "33", True, ("varuint32", "varuint32")),
        ("i64.load32_s", "34", True, ("varuint32", "varuint32")),
        ("i64.load32_u", "35", True, ("varuint32", "varuint32")),
        ("i32.store", "36", True, ("varuint32", "varuint32")),
        ("i64.store", "37", True, ("varuint32", "varuint32")),
        ("f32.store", "38", True, ("varuint32", "varuint32")),
        ("f64.store", "39", True, ("varuint32", "varuint32")),
        ("i32.store8", "3a", True, ("varuint32", "varuint32")),
        ("i32.store16", "3b", True, ("varuint32", "varuint32")),
        ("i64.store8", "3c", True, ("varuint32", "varuint32")),
        ("i64.store16", "3d", True, ("varuint32", "varuint32")),
        ("i64.store32", "3e", True, ("varuint32", "varuint32")),
        ("current_memory", "3f", True, ("varuint1")),
        ("grow_memory", "40", True, ("varuint1")),
        ("i32.const", "41", True, ("varint32")),
        ("i64.const", "42", True, ("varint64")),
        ("f32.const", "43", True, ("uint32")),
        ("f64.const", "44", True, ("uint64")),
        ("i32.eqz", "45", False),
        ("i32.eq", "46", False),
        ("i32.ne", "47", False),
        ("i32.lt_s", "48", False),
        ("i32.lt_u", "49", False),
        ("i32.gt_s", "4a", False),
        ("i32.gt_u", "4b", False),
        ("i32.le_s", "4c", False),
        ("i32.le_u", "4d", False),
        ("i32.ge_s", "4e", False),
        ("i32.ge_u", "4f", False),
        ("i64.eqz", "50", False),
        ("i64.eq", "51", False),
        ("i64.ne", "52", False),
        ("i64.lt_s", "53", False),
        ("i64.lt_u", "54", False),
        ("i64.gt_s", "55", False),
        ("i64.gt_u", "56", False),
        ("i64.le_s", "57", False),
        ("i64.le_u", "58", False),
        ("i64.ge_s", "59", False),
        ("i64.ge_u", "5a", False),
        ("f32.eq", "5b", False),
        ("f32.ne", "5c", False),
        ("f32.lt", "5d", False),
        ("f32.gt", "5e", False),
        ("f32.le", "5f", False),
        ("f32.ge", "60", False),
        ("f64.eq", "61", False),
        ("f64.ne", "62", False),
        ("f64.lt", "63", False),
        ("f64.gt", "64", False),
        ("f64.le", "65", False),
        ("f64.ge", "66", False),
        ("i32.clz", "67", False),
        ("i32.ctz", "68", False),
        ("i32.popcnt", "69", False),
        ("i32.add", "6a", False),
        ("i32.sub", "6b", False),
        ("i32.mul", "6c", False),
        ("i32.div_s", "6d", False),
        ("i32.div_u", "6e", False),
        ("i32.rem_s", "6f", False),
        ("i32.rem_u", "70", False),
        ("i32.and", "71", False),
        ("i32.or", "72", False),
        ("i32.xor", "73", False),
        ("i32.shl", "74", False),
        ("i32.shr_s", "75", False),
        ("i32.shr_u", "76", False),
        ("i32.rotl", "77", False),
        ("i32.rotr", "78", False),
        ("i64.clz", "79", False),
        ("i64.ctz", "7a", False),
        ("i64.popcnt", "7b", False),
        ("i64.add", "7c", False),
        ("i64.sub", "7d", False),
        ("i64.mul", "7e", False),
        ("i64.div_s", "7f", False),
        ("i64.div_u", "80", False),
        ("i64.rem_s", "81", False),
        ("i64.rem_u", "82", False),
        ("i64.and", "83", False),
        ("i64.or", "84", False),
        ("i64.xor", "85", False),
        ("i64.shl", "86", False),
        ("i64.shr_s", "87", False),
        ("i64.shr_u", "88", False),
        ("i64.rotl", "89", False),
        ("i63.rotr", "8a", False),
        ("f32.abs", "8b", False),
        ("f32.neg", "8c", False),
        ("f32.ceil", "8d", False),
        ("f32.floor", "8e", False),
        ("f32.trunc", "8f", False),
        ("f32.nearest", "90", False),
        ("f32.sqrt", "91", False),
        ("f32.add", "92", False),
        ("f32.sub", "93", False),
        ("f32.mul", "94", False),
        ("f32.div", "95", False),
        ("f32.min", "96", False),
        ("f32.max", "97", False),
        ("f32.copysign", "98", False),
        ("f64.abs", "99", False),
        ("f64.neg", "9a", False),
        ("f64.ceil", "9b", False),
        ("f64.floor", "9c", False),
        ("f64.trunc", "9d", False),
        ("f64.nearest", "9e", False),
        ("f64.sqrt", "9f", False),
        ("f64.add", "a0", False),
        ("f64.sub", "a1", False),
        ("f64.mul", "a2", False),
        ("f64.div", "a3", False),
        ("f64.min", "a4", False),
        ("f64.max", "a5", False),
        ("f64.copysign", "a6", False),
        ("i32.wrap/i64", "a7", False),
        ("i32.trunc_s/f32", "a8", False),
        ("i32.trunc_u/f32", "a9", False),
        ("i32.trunc_s/f64", "aa", False),
        ("i32.trunc_u/f64", "ab", False),
        ("i64.extend_s/i32", "ac", False),
        ("i64.extend_u/i32", "ad", False),
        ("i64.trunc_s/f32", "ae", False),
        ("i64.trunc_u/f32", "af", False),
        ("i64.trunc_s/f64", "b0", False),
        ("i64.trunc_u/f64", "b1", False),
        ("f32.convert_s/i32", "b2", False),
        ("f32.convert_u/i32", "b3", False),
        ("f32.convert_s/i64", "b4", False),
        ("f32.convert_u/i64", "b5", False),
        ("f32.demote/f64", "b6", False),
        ("f64.convert_s/i32", "b7", False),
        ("f64.convert_u/i32", "b8", False),
        ("f64.convert_s/i64", "b9", False),
        ("f64.convert_u/i64", "ba", False),
        ("f64.promote/f32", "bb", False),
        ("i32.reinterpret/f32", "bc", False),
        ("i64.reinterpret/f64", "bd", False),
        ("f32.reinterpret/i32", "be", False),
        ("f64.reinterpret/i64", "bf", False),
    ]

    type_ops = [
        ("i32", "7f"),
        ("i64", "7e"),
        ("f32", "7d"),
        ("f64", "7c"),
        ("anyfunc", "7b"),
        ("func", "60"),
        ("empty_block_type", "40"),
    ]
    type_ops_dict = dict(type_ops)
    type_ops_dict_rev = {v: k for k, v in type_ops_dict.items()}

    control_flow_ops = [
        ("unreachable", "00"),
        ("nop", "01"),
        ("block", "02"),
        ("loop", "03"),
        ("if", "04"),
        ("else", "05"),
        ("end", "0b"),
        ("br", "0c"),
        ("br_if", "0d"),
        ("br_table", "0e"),
        ("return", "0f"),
    ]
    control_flow_ops_dict = dict(control_flow_ops)
    control_flow_ops_dict_rev = {
        v: k for k, v in control_flow_ops_dict.items()
    }

    call_ops = [("call", "10"), ("call_indirect", "11")]
    call_ops_dict = dict(call_ops)
    call_ops_dict_rev = {v: k for k, v in call_ops_dict.items()}

    param_ops = [("drop", "1a"), ("select", "1b")]
    param_ops_dict = dict(param_ops)
    param_ops_dict_rev = {v: k for k, v in param_ops_dict.items()}

    var_access = [
        ("get_local", "20"),
        ("set_local", "21"),
        ("tee_local", "22"),
        ("get_global", "23"),
        ("set_global", "24"),
    ]
    var_access_dict = dict(var_access)
    var_access_dict_rev = {v: k for k, v in var_access_dict.items()}

    mem_ops = [
        ("i32.load", "28"),
        ("i64.load", "29"),
        ("f32.load", "2a"),
        ("f64.load", "2b"),
        ("i32.load8_s", "2c"),
        ("i32.load8_u", "2d"),
        ("i32.load16_s", "2e"),
        ("i32.load16_u", "2f"),
        ("i64.load8_s", "30"),
        ("i64.load8_u", "31"),
        ("i64.load16_s", "32"),
        ("i64.load16_u", "33"),
        ("i64.load32_s", "34"),
        ("i64.load32_u", "35"),
        ("i32.store", "36"),
        ("i64.store", "37"),
        ("f32.store", "38"),
        ("f64.store", "39"),
        ("i32.store8", "3a"),
        ("i32.store16", "3b"),
        ("i64.store8", "3c"),
        ("i64.store16", "3d"),
        ("i64.store32", "3e"),
        ("current_memory", "3f"),
        ("grow_memory", "40"),
    ]
    mem_ops_dict = dict(mem_ops)
    mem_ops_dict_rev = {v: k for k, v in mem_ops_dict.items()}

    consts = [
        ("i32.const", "41"),
        ("i64.const", "42"),
        ("f32.const", "43"),
        ("f64", "44"),
    ]
    consts_dict = dict(consts)
    consts_dict_rev = {v: k for k, v in consts_dict.items()}

    comp_ops = [
        ("i32.eqz", "45"),
        ("i32.eq", "46"),
        ("i32.ne", "47"),
        ("i32.lt_s", "48"),
        ("i32.lt_u", "49"),
        ("i32.gt_s", "4a"),
        ("i32.gt_u", "4b"),
        ("i32.le_s", "4c"),
        ("i32.le_u", "4d"),
        ("i32.ge_s", "4e"),
        ("i32.ge_u", "4f"),
        ("i64.eqz", "50"),
        ("i64.eq", "51"),
        ("i64.ne", "52"),
        ("i64.lt_s", "53"),
        ("i64.lt_u", "54"),
        ("i64.gt_s", "55"),
        ("i64.gt_u", "56"),
        ("i64.le_s", "57"),
        ("i64.le_u", "58"),
        ("i64.ge_s", "59"),
        ("i64.ge_u", "5a"),
        ("f32.eq", "5b"),
        ("f32.ne", "5c"),
        ("f32.lt", "5d"),
        ("f32.gt", "5e"),
        ("f32.le", "5f"),
        ("f32.ge", "60"),
        ("f64.eq", "61"),
        ("f64.ne", "62"),
        ("f64.lt", "63"),
        ("f64.gt", "64"),
        ("f64.le", "65"),
        ("f64.ge", "66"),
    ]
    comp_ops_dict = dict(comp_ops)
    comp_ops_dict_rev = {v: k for k, v in comp_ops_dict.items()}

    num_ops = [
        ("i32.clz", "67"),
        ("i32.ctz", "68"),
        ("i32.popcnt", "69"),
        ("i32.add", "6a"),
        ("i32.sub", "6b"),
        ("i32.mul", "6c"),
        ("i32.div_s", "6d"),
        ("i32.div_u", "6e"),
        ("i32.rem_s", "6e"),
        ("i32.rem_u", "70"),
        ("i32.and", "71"),
        ("i32.or", "72"),
        ("i32.xor", "73"),
        ("i32.shl", "74"),
        ("i32.shr_s", "75"),
        ("i32.shr_u", "76"),
        ("i32.rotl", "77"),
        ("i32.rotr", "78"),
        ("i64.clz", "79"),
        ("i64.ctz", "7a"),
        ("i64.popcnt", "7b"),
        ("i64.add", "7c"),
        ("i64.sub", "7d"),
        ("i64.mul", "7e"),
        ("i64.div_s", "7f"),
        ("i64.div_u", "80"),
        ("i64.rem_s", "81"),
        ("i64.rem_u", "82"),
        ("i64.and", "83"),
        ("i64.or", "84"),
        ("i64.xor", "85"),
        ("i64.shl", "86"),
        ("i64.shr_s", "87"),
        ("i64.shr_u", "88"),
        ("i64.rotl", "89"),
        ("i63.rotr", "8a"),
        ("f32.abs", "8b"),
        ("f32.neg", "8c"),
        ("f32.ceil", "8d"),
        ("f32.floor", "8e"),
        ("f32.trunc", "8f"),
        ("f32.nearest", "90"),
        ("f32.sqrt", "91"),
        ("f32.add", "92"),
        ("f32.sub", "93"),
        ("f32.mul", "94"),
        ("f32.div", "95"),
        ("f32.min", "96"),
        ("f32.max", "97"),
        ("f32.copysign", "98"),
        ("f64.abs", "99"),
        ("f64.neg", "9a"),
        ("f64.ceil", "9b"),
        ("f64.floor", "9c"),
        ("f64.trunc", "9d"),
        ("f64.nearest", "9e"),
        ("f64.sqrt", "9f"),
        ("f64.add", "a0"),
        ("f64.sub", "a1"),
        ("f64.mul", "a2"),
        ("f64.div", "a3"),
        ("f64.min", "a4"),
        ("f64.max", "a5"),
        ("f64.copysign", "a6"),
    ]
    num_ops_dict = dict(num_ops)
    num_ops_dict_rev = {v: k for k, v in num_ops_dict.items()}

    conversion = [
        ("i32.wrap/i64", "a7"),
        ("i32.trunc_s/f32", "a8"),
        ("i32.trunc_u/f32", "a9"),
        ("i32.trunc_s/f64", "aa"),
        ("i32.trunc_u/f64", "ab"),
        ("i64.extend_s/i32", "ac"),
        ("i64.extend_u/i32", "ad"),
        ("i64.trunc_s/f32", "ae"),
        ("i64.trunc_u/f32", "af"),
        ("i64.trunc_s/f64", "b0"),
        ("i64.trunc_u/f64", "b1"),
        ("f32.convert_s/i32", "b2"),
        ("f32.convert_u/i32", "b3"),
        ("f32.convert_s/i64", "b4"),
        ("f32.convert_u/i64", "b5"),
        ("f32.demote/f64", "b6"),
        ("f64.convert_s/i32", "b7"),
        ("f64.convert_u/i32", "b8"),
        ("f64.convert_s/i64", "b9"),
        ("f64.convert_u/i64", "ba"),
        ("f64.promote/f32", "bb"),
    ]
    conversion_dict = dict(conversion)
    conversion_dict_rev = {v: k for k, v in conversion_dict.items()}

    reinterpretations = [
        ("i32.reinterpret/f32", "bc"),
        ("i64.reinterpret/f64", "bd"),
        ("f32.reinterpret/i32", "be"),
        ("f64.reinterpret/i64", "bf"),
    ]
    reinterpretations_dict = dict(reinterpretations)
    reinterpretations_dict_rev = {
        v: k for k, v in reinterpretations_dict.items()
    }

    section_code = [
        ("type", "01"),
        ("import", "02"),
        ("function", "03"),
        ("table", "04"),
        ("memory", "05"),
        ("global", "06"),
        ("export", "07"),
        ("start", "08"),
        ("element", "09"),
        ("code", "0a"),
        ("data", "0b"),
        ("custom", "00"),
    ]
    section_code_dict = dict(section_code)
    section_code_dict_rev = {v: k for k, v in section_code_dict.items()}