#[allow(non_camel_case_types)] pub enum stat { COMPILE, COMPILE_SKIPPED_NO_NEW_ENTRY_POINTS, COMPILE_WRONG_ADDRESS_SPACE, COMPILE_CUT_OFF_AT_END_OF_PAGE, COMPILE_WITH_LOOP_SAFETY, COMPILE_PAGE, COMPILE_BASIC_BLOCK, COMPILE_DUPLICATED_BASIC_BLOCK, COMPILE_WASM_BLOCK, COMPILE_WASM_LOOP, COMPILE_DISPATCHER, COMPILE_ENTRY_POINT, COMPILE_WASM_TOTAL_BYTES, RUN_INTERPRETED, RUN_INTERPRETED_NEW_PAGE, RUN_INTERPRETED_PAGE_HAS_CODE, RUN_INTERPRETED_PAGE_HAS_ENTRY_AFTER_PAGE_WALK, RUN_INTERPRETED_NEAR_END_OF_PAGE, RUN_INTERPRETED_DIFFERENT_STATE, RUN_INTERPRETED_DIFFERENT_STATE_CPL3, RUN_INTERPRETED_DIFFERENT_STATE_FLAT, RUN_INTERPRETED_DIFFERENT_STATE_IS32, RUN_INTERPRETED_DIFFERENT_STATE_SS32, RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED, RUN_INTERPRETED_STEPS, RUN_FROM_CACHE, RUN_FROM_CACHE_STEPS, DIRECT_EXIT, INDIRECT_JUMP, INDIRECT_JUMP_NO_ENTRY, NORMAL_PAGE_CHANGE, NORMAL_FALLTHRU, NORMAL_FALLTHRU_WITH_TARGET_BLOCK, NORMAL_BRANCH, NORMAL_BRANCH_WITH_TARGET_BLOCK, CONDITIONAL_JUMP, CONDITIONAL_JUMP_PAGE_CHANGE, CONDITIONAL_JUMP_EXIT, CONDITIONAL_JUMP_FALLTHRU, CONDITIONAL_JUMP_FALLTHRU_WITH_TARGET_BLOCK, CONDITIONAL_JUMP_BRANCH, CONDITIONAL_JUMP_BRANCH_WITH_TARGET_BLOCK, DISPATCHER_SMALL, DISPATCHER_LARGE, LOOP, LOOP_SAFETY, CONDITION_OPTIMISED, CONDITION_UNOPTIMISED, CONDITION_UNOPTIMISED_PF, CONDITION_UNOPTIMISED_UNHANDLED_L, CONDITION_UNOPTIMISED_UNHANDLED_LE, FAILED_PAGE_CHANGE, SAFE_READ_FAST, SAFE_READ_SLOW_PAGE_CROSSED, SAFE_READ_SLOW_NOT_VALID, SAFE_READ_SLOW_NOT_USER, SAFE_READ_SLOW_IN_MAPPED_RANGE, SAFE_WRITE_FAST, SAFE_WRITE_SLOW_PAGE_CROSSED, SAFE_WRITE_SLOW_NOT_VALID, SAFE_WRITE_SLOW_NOT_USER, SAFE_WRITE_SLOW_IN_MAPPED_RANGE, SAFE_WRITE_SLOW_READ_ONLY, SAFE_WRITE_SLOW_HAS_CODE, SAFE_READ_WRITE_FAST, SAFE_READ_WRITE_SLOW_PAGE_CROSSED, SAFE_READ_WRITE_SLOW_NOT_VALID, SAFE_READ_WRITE_SLOW_NOT_USER, SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE, SAFE_READ_WRITE_SLOW_READ_ONLY, SAFE_READ_WRITE_SLOW_HAS_CODE, PAGE_FAULT, TLB_MISS, MAIN_LOOP, MAIN_LOOP_IDLE, DO_MANY_CYCLES, CYCLE_INTERNAL, INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES, INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED, INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE, INVALIDATE_MODULE_DIRTY_PAGE, INVALIDATE_PAGE_HAD_CODE, INVALIDATE_PAGE_HAD_ENTRY_POINTS, DIRTY_PAGE_DID_NOT_HAVE_CODE, RUN_FROM_CACHE_EXIT_SAME_PAGE, RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE, RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE, CLEAR_TLB, FULL_CLEAR_TLB, TLB_FULL, TLB_GLOBAL_FULL, MODRM_SIMPLE_REG, MODRM_SIMPLE_REG_WITH_OFFSET, MODRM_SIMPLE_CONST_OFFSET, MODRM_COMPLEX, SEG_OFFSET_OPTIMISED, SEG_OFFSET_NOT_OPTIMISED, SEG_OFFSET_NOT_OPTIMISED_ES, SEG_OFFSET_NOT_OPTIMISED_FS, SEG_OFFSET_NOT_OPTIMISED_GS, SEG_OFFSET_NOT_OPTIMISED_NOT_FLAT, } #[allow(non_upper_case_globals)] pub static mut stat_array: [u64; 500] = [0; 500]; pub fn stat_increment(stat: stat) { stat_increment_by(stat, 1); } pub fn stat_increment_by(stat: stat, by: u64) { if cfg!(feature = "profiler") { unsafe { stat_array[stat as usize] += by } } } #[no_mangle] pub fn profiler_init() { unsafe { #[allow(static_mut_refs)] for x in stat_array.iter_mut() { *x = 0 } } } #[no_mangle] pub fn profiler_stat_get(stat: stat) -> f64 { if cfg!(feature = "profiler") { unsafe { stat_array[stat as usize] as f64 } } else { 0.0 } } #[no_mangle] pub fn profiler_is_enabled() -> bool { cfg!(feature = "profiler") }