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") }