profiler.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #[allow(non_camel_case_types)]
  2. pub enum stat {
  3. COMPILE,
  4. COMPILE_SUCCESS,
  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. JIT_CACHE_OVERRIDE,
  17. JIT_CACHE_OVERRIDE_DIFFERENT_STATE_FLAGS,
  18. RUN_INTERPRETED,
  19. RUN_INTERPRETED_PENDING,
  20. RUN_INTERPRETED_NEAR_END_OF_PAGE,
  21. RUN_INTERPRETED_DIFFERENT_STATE,
  22. RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED,
  23. RUN_INTERPRETED_MISSED_COMPILED_ENTRY_LOOKUP,
  24. RUN_INTERPRETED_STEPS,
  25. RUN_FROM_CACHE,
  26. RUN_FROM_CACHE_STEPS,
  27. DIRECT_EXIT,
  28. INDIRECT_JUMP,
  29. INDIRECT_JUMP_NO_ENTRY,
  30. NORMAL_PAGE_CHANGE,
  31. NORMAL_FALLTHRU,
  32. NORMAL_FALLTHRU_WITH_TARGET_BLOCK,
  33. NORMAL_BRANCH,
  34. NORMAL_BRANCH_WITH_TARGET_BLOCK,
  35. CONDITIONAL_JUMP,
  36. CONDITIONAL_JUMP_PAGE_CHANGE,
  37. CONDITIONAL_JUMP_EXIT,
  38. CONDITIONAL_JUMP_FALLTHRU,
  39. CONDITIONAL_JUMP_FALLTHRU_WITH_TARGET_BLOCK,
  40. CONDITIONAL_JUMP_BRANCH,
  41. CONDITIONAL_JUMP_BRANCH_WITH_TARGET_BLOCK,
  42. DISPATCHER_SMALL,
  43. DISPATCHER_LARGE,
  44. LOOP,
  45. FAILED_PAGE_CHANGE,
  46. SAFE_READ_FAST,
  47. SAFE_READ_SLOW_PAGE_CROSSED,
  48. SAFE_READ_SLOW_NOT_VALID,
  49. SAFE_READ_SLOW_NOT_USER,
  50. SAFE_READ_SLOW_IN_MAPPED_RANGE,
  51. SAFE_WRITE_FAST,
  52. SAFE_WRITE_SLOW_PAGE_CROSSED,
  53. SAFE_WRITE_SLOW_NOT_VALID,
  54. SAFE_WRITE_SLOW_NOT_USER,
  55. SAFE_WRITE_SLOW_IN_MAPPED_RANGE,
  56. SAFE_WRITE_SLOW_READ_ONLY,
  57. SAFE_WRITE_SLOW_HAS_CODE,
  58. SAFE_READ_WRITE_FAST,
  59. SAFE_READ_WRITE_SLOW_PAGE_CROSSED,
  60. SAFE_READ_WRITE_SLOW_NOT_VALID,
  61. SAFE_READ_WRITE_SLOW_NOT_USER,
  62. SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE,
  63. SAFE_READ_WRITE_SLOW_READ_ONLY,
  64. SAFE_READ_WRITE_SLOW_HAS_CODE,
  65. PAGE_FAULT,
  66. TLB_MISS,
  67. DO_RUN,
  68. DO_MANY_CYCLES,
  69. CYCLE_INTERNAL,
  70. INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES,
  71. INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED,
  72. INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE,
  73. INVALIDATE_MODULE_DIRTY_PAGE,
  74. INVALIDATE_PAGE_HAD_CODE,
  75. INVALIDATE_PAGE_HAD_ENTRY_POINTS,
  76. DIRTY_PAGE_DID_NOT_HAVE_CODE,
  77. RUN_FROM_CACHE_EXIT_SAME_PAGE,
  78. RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE,
  79. RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE,
  80. CLEAR_TLB,
  81. FULL_CLEAR_TLB,
  82. TLB_FULL,
  83. TLB_GLOBAL_FULL,
  84. MODRM_SIMPLE_REG,
  85. MODRM_SIMPLE_REG_WITH_OFFSET,
  86. MODRM_SIMPLE_CONST_OFFSET,
  87. MODRM_COMPLEX,
  88. SEG_OFFSET_OPTIMISED,
  89. SEG_OFFSET_NOT_OPTIMISED,
  90. }
  91. #[no_mangle]
  92. pub static mut stat_array: [u64; 100] = [0; 100];
  93. pub fn stat_increment(stat: stat) { stat_increment_by(stat, 1); }
  94. pub fn stat_increment_by(stat: stat, by: u64) {
  95. if cfg!(feature = "profiler") {
  96. unsafe { stat_array[stat as usize] += by }
  97. }
  98. }
  99. #[no_mangle]
  100. pub fn profiler_init() {
  101. unsafe {
  102. for x in stat_array.iter_mut() {
  103. *x = 0
  104. }
  105. }
  106. }
  107. #[no_mangle]
  108. pub fn profiler_stat_get(stat: stat) -> f64 {
  109. if cfg!(feature = "profiler") {
  110. unsafe { stat_array[stat as usize] as f64 }
  111. }
  112. else {
  113. 0.0
  114. }
  115. }
  116. #[no_mangle]
  117. pub fn profiler_is_enabled() -> bool { cfg!(feature = "profiler") }
  118. #[no_mangle]
  119. pub fn profiler_stat_increment_do_run() { stat_increment(stat::DO_RUN); }