profiler.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #[allow(dead_code, 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_ENTRY_POINT,
  11. COMPILE_WASM_TOTAL_BYTES,
  12. CACHE_MISMATCH,
  13. RUN_INTERPRETED,
  14. RUN_INTERPRETED_PENDING,
  15. RUN_INTERPRETED_NEAR_END_OF_PAGE,
  16. RUN_INTERPRETED_DIFFERENT_STATE,
  17. RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED,
  18. RUN_INTERPRETED_MISSED_COMPILED_ENTRY_LOOKUP,
  19. RUN_INTERPRETED_STEPS,
  20. RUN_FROM_CACHE,
  21. RUN_FROM_CACHE_STEPS,
  22. FAILED_PAGE_CHANGE,
  23. SAFE_READ_FAST,
  24. SAFE_READ_SLOW_PAGE_CROSSED,
  25. SAFE_READ_SLOW_NOT_VALID,
  26. SAFE_READ_SLOW_NOT_USER,
  27. SAFE_READ_SLOW_IN_MAPPED_RANGE,
  28. SAFE_WRITE_FAST,
  29. SAFE_WRITE_SLOW_PAGE_CROSSED,
  30. SAFE_WRITE_SLOW_NOT_VALID,
  31. SAFE_WRITE_SLOW_NOT_USER,
  32. SAFE_WRITE_SLOW_IN_MAPPED_RANGE,
  33. SAFE_WRITE_SLOW_READ_ONLY,
  34. SAFE_WRITE_SLOW_HAS_CODE,
  35. SAFE_READ_WRITE_FAST,
  36. SAFE_READ_WRITE_SLOW_PAGE_CROSSED,
  37. SAFE_READ_WRITE_SLOW_NOT_VALID,
  38. SAFE_READ_WRITE_SLOW_NOT_USER,
  39. SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE,
  40. SAFE_READ_WRITE_SLOW_READ_ONLY,
  41. SAFE_READ_WRITE_SLOW_HAS_CODE,
  42. PAGE_FAULT,
  43. TLB_MISS,
  44. DO_RUN,
  45. DO_MANY_CYCLES,
  46. CYCLE_INTERNAL,
  47. INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES,
  48. INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED,
  49. INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE,
  50. INVALIDATE_MODULE_DIRTY_PAGE,
  51. INVALIDATE_PAGE_HAD_CODE,
  52. INVALIDATE_PAGE_HAD_ENTRY_POINTS,
  53. DIRTY_PAGE_DID_NOT_HAVE_CODE,
  54. RUN_FROM_CACHE_EXIT_SAME_PAGE,
  55. RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE,
  56. RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE,
  57. CLEAR_TLB,
  58. FULL_CLEAR_TLB,
  59. TLB_FULL,
  60. TLB_GLOBAL_FULL,
  61. MODRM_SIMPLE_REG,
  62. MODRM_SIMPLE_REG_WITH_OFFSET,
  63. MODRM_SIMPLE_CONST_OFFSET,
  64. MODRM_COMPLEX,
  65. SEG_OFFSET_OPTIMISED,
  66. SEG_OFFSET_NOT_OPTIMISED,
  67. }
  68. #[no_mangle]
  69. pub static mut stat_array: [u64; 100] = [0; 100];
  70. pub fn stat_increment(stat: stat) { stat_increment_by(stat, 1); }
  71. pub fn stat_increment_by(stat: stat, by: u64) {
  72. if cfg!(feature = "profiler") {
  73. unsafe { stat_array[stat as usize] += by }
  74. }
  75. }
  76. #[no_mangle]
  77. pub fn profiler_init() {
  78. unsafe {
  79. for x in stat_array.iter_mut() {
  80. *x = 0
  81. }
  82. }
  83. }
  84. #[no_mangle]
  85. pub fn profiler_stat_get(stat: stat) -> f64 {
  86. if cfg!(feature = "profiler") {
  87. unsafe { stat_array[stat as usize] as f64 }
  88. }
  89. else {
  90. 0.0
  91. }
  92. }
  93. #[no_mangle]
  94. pub fn profiler_is_enabled() -> bool { cfg!(feature = "profiler") }
  95. #[no_mangle]
  96. pub fn profiler_stat_increment_do_run() { stat_increment(stat::DO_RUN); }