Skip to main content

native_v86_core/
profiler.rs

1#[allow(non_camel_case_types)]
2pub enum stat {
3    COMPILE,
4    COMPILE_SKIPPED_NO_NEW_ENTRY_POINTS,
5    COMPILE_WRONG_ADDRESS_SPACE,
6    COMPILE_CUT_OFF_AT_END_OF_PAGE,
7    COMPILE_WITH_LOOP_SAFETY,
8    COMPILE_PAGE,
9    COMPILE_BASIC_BLOCK,
10    COMPILE_DUPLICATED_BASIC_BLOCK,
11    COMPILE_WASM_BLOCK,
12    COMPILE_WASM_LOOP,
13    COMPILE_DISPATCHER,
14    COMPILE_ENTRY_POINT,
15    COMPILE_WASM_TOTAL_BYTES,
16
17    RUN_INTERPRETED,
18    RUN_INTERPRETED_NEW_PAGE,
19    RUN_INTERPRETED_PAGE_HAS_CODE,
20    RUN_INTERPRETED_PAGE_HAS_ENTRY_AFTER_PAGE_WALK,
21    RUN_INTERPRETED_NEAR_END_OF_PAGE,
22    RUN_INTERPRETED_DIFFERENT_STATE,
23    RUN_INTERPRETED_DIFFERENT_STATE_CPL3,
24    RUN_INTERPRETED_DIFFERENT_STATE_FLAT,
25    RUN_INTERPRETED_DIFFERENT_STATE_IS32,
26    RUN_INTERPRETED_DIFFERENT_STATE_SS32,
27    RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED,
28    RUN_INTERPRETED_STEPS,
29
30    RUN_FROM_CACHE,
31    RUN_FROM_CACHE_STEPS,
32
33    DIRECT_EXIT,
34    INDIRECT_JUMP,
35    INDIRECT_JUMP_NO_ENTRY,
36    NORMAL_PAGE_CHANGE,
37    NORMAL_FALLTHRU,
38    NORMAL_FALLTHRU_WITH_TARGET_BLOCK,
39    NORMAL_BRANCH,
40    NORMAL_BRANCH_WITH_TARGET_BLOCK,
41    CONDITIONAL_JUMP,
42    CONDITIONAL_JUMP_PAGE_CHANGE,
43    CONDITIONAL_JUMP_EXIT,
44    CONDITIONAL_JUMP_FALLTHRU,
45    CONDITIONAL_JUMP_FALLTHRU_WITH_TARGET_BLOCK,
46    CONDITIONAL_JUMP_BRANCH,
47    CONDITIONAL_JUMP_BRANCH_WITH_TARGET_BLOCK,
48    DISPATCHER_SMALL,
49    DISPATCHER_LARGE,
50    LOOP,
51
52    LOOP_SAFETY,
53
54    CONDITION_OPTIMISED,
55    CONDITION_UNOPTIMISED,
56    CONDITION_UNOPTIMISED_PF,
57    CONDITION_UNOPTIMISED_UNHANDLED_L,
58    CONDITION_UNOPTIMISED_UNHANDLED_LE,
59
60    FAILED_PAGE_CHANGE,
61
62    SAFE_READ_FAST,
63    SAFE_READ_SLOW_PAGE_CROSSED,
64    SAFE_READ_SLOW_NOT_VALID,
65    SAFE_READ_SLOW_NOT_USER,
66    SAFE_READ_SLOW_IN_MAPPED_RANGE,
67
68    SAFE_WRITE_FAST,
69    SAFE_WRITE_SLOW_PAGE_CROSSED,
70    SAFE_WRITE_SLOW_NOT_VALID,
71    SAFE_WRITE_SLOW_NOT_USER,
72    SAFE_WRITE_SLOW_IN_MAPPED_RANGE,
73    SAFE_WRITE_SLOW_READ_ONLY,
74    SAFE_WRITE_SLOW_HAS_CODE,
75
76    SAFE_READ_WRITE_FAST,
77    SAFE_READ_WRITE_SLOW_PAGE_CROSSED,
78    SAFE_READ_WRITE_SLOW_NOT_VALID,
79    SAFE_READ_WRITE_SLOW_NOT_USER,
80    SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE,
81    SAFE_READ_WRITE_SLOW_READ_ONLY,
82    SAFE_READ_WRITE_SLOW_HAS_CODE,
83
84    PAGE_FAULT,
85    TLB_MISS,
86
87    MAIN_LOOP,
88    MAIN_LOOP_IDLE,
89    DO_MANY_CYCLES,
90    CYCLE_INTERNAL,
91
92    INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES,
93    INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED,
94    INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE,
95    INVALIDATE_MODULE_DIRTY_PAGE,
96
97    INVALIDATE_PAGE_HAD_CODE,
98    INVALIDATE_PAGE_HAD_ENTRY_POINTS,
99    DIRTY_PAGE_DID_NOT_HAVE_CODE,
100
101    RUN_FROM_CACHE_EXIT_SAME_PAGE,
102    RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE,
103    RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE,
104
105    CLEAR_TLB,
106    FULL_CLEAR_TLB,
107    TLB_FULL,
108    TLB_GLOBAL_FULL,
109
110    MODRM_SIMPLE_REG,
111    MODRM_SIMPLE_REG_WITH_OFFSET,
112    MODRM_SIMPLE_CONST_OFFSET,
113    MODRM_COMPLEX,
114
115    SEG_OFFSET_OPTIMISED,
116    SEG_OFFSET_NOT_OPTIMISED,
117    SEG_OFFSET_NOT_OPTIMISED_ES,
118    SEG_OFFSET_NOT_OPTIMISED_FS,
119    SEG_OFFSET_NOT_OPTIMISED_GS,
120    SEG_OFFSET_NOT_OPTIMISED_NOT_FLAT,
121}
122
123#[allow(non_upper_case_globals)]
124pub static mut stat_array: [u64; 500] = [0; 500];
125
126pub fn stat_increment(stat: stat) { stat_increment_by(stat, 1); }
127
128pub fn stat_increment_by(stat: stat, by: u64) {
129    if cfg!(feature = "profiler") {
130        unsafe { stat_array[stat as usize] += by }
131    }
132}
133
134#[no_mangle]
135pub fn profiler_init() {
136    unsafe {
137        #[allow(static_mut_refs)]
138        for x in stat_array.iter_mut() {
139            *x = 0
140        }
141    }
142}
143
144#[no_mangle]
145pub fn profiler_stat_get(stat: stat) -> f64 {
146    if cfg!(feature = "profiler") {
147        unsafe { stat_array[stat as usize] as f64 }
148    }
149    else {
150        0.0
151    }
152}
153
154#[no_mangle]
155pub fn profiler_is_enabled() -> bool { cfg!(feature = "profiler") }