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) {
127 stat_increment_by(stat, 1);
128}
129
130pub fn stat_increment_by(stat: stat, by: u64) {
131 if cfg!(feature = "profiler") {
132 unsafe { stat_array[stat as usize] += by }
133 }
134}
135
136#[no_mangle]
137pub fn profiler_init() {
138 unsafe {
139 #[allow(static_mut_refs)]
140 for x in stat_array.iter_mut() {
141 *x = 0
142 }
143 }
144}
145
146#[no_mangle]
147pub fn profiler_stat_get(stat: stat) -> f64 {
148 if cfg!(feature = "profiler") {
149 unsafe { stat_array[stat as usize] as f64 }
150 } else {
151 0.0
152 }
153}
154
155#[no_mangle]
156pub fn profiler_is_enabled() -> bool {
157 cfg!(feature = "profiler")
158}