2
0

helgrind.odin 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. //+build amd64
  2. package sys_valgrind
  3. import "core:intrinsics"
  4. Helgrind_Client_Request :: enum uintptr {
  5. Clean_Memory = 'H'<<24 | 'G'<<16,
  6. Set_My_pthread_t = ('H'<<25 | 'G'<<16)+256,
  7. Pthread_Join_Post,
  8. Pthread_Mutex_Init_Post,
  9. Pthread_Mutex_Destroy_Pre,
  10. Pthread_Mutex_Unlock_Pre,
  11. Pthread_Mutex_Unlock_Post,
  12. Pthread_Mutex_Lock_Pre,
  13. Pthread_Mutex_Lock_Post,
  14. Pthread_Cond_Signal_Pre,
  15. Pthread_Cond_Broadcast_Pre,
  16. Pthread_Cond_Wait_Pre,
  17. Pthread_Cond_Wait_Post,
  18. Pthread_Cond_Destroy_Pre,
  19. Pthread_Rwlock_Init_Post,
  20. Pthread_Rwlock_Destroy_Pre,
  21. Pthread_Rwlock_Lock_Pre,
  22. Pthread_Rwlock_Lock_Post,
  23. Pthread_Rwlock_Unlock_Pre,
  24. Pthread_Rwlock_Unlock_Post,
  25. Posix_Sem_Init_Post,
  26. Posix_Sem_Destroy_Pre,
  27. Posix_Sem_Post_Pre,
  28. Posix_Sem_Wait_Post,
  29. Pthread_Barrier_Init_Pre,
  30. Pthread_Barrier_Wait_Pre,
  31. Pthread_Barrier_Destroy_Pre,
  32. Pthread_Spin_Init_Or_Unlock_Pre,
  33. Pthread_Spin_Init_Or_Unlock_Post,
  34. Pthread_Spin_Lock_Pre,
  35. Pthread_Spin_Lock_Post,
  36. Pthread_Spin_Destroy_Pre,
  37. Clientreq_Unimp,
  38. Userso_Send_Pre,
  39. Userso_Recv_Post,
  40. Userso_Forget_All,
  41. Reserved2,
  42. Reserved3,
  43. Reserved4,
  44. Arange_Make_Untracked,
  45. Arange_Make_Tracked,
  46. Pthread_Barrier_Resize_Pre,
  47. Clean_Memory_Heapblock,
  48. Pthread_Cond_Init_Post,
  49. }
  50. @(require_results)
  51. helgrind_client_request_expr :: #force_inline proc "c" (default: uintptr, request: Helgrind_Client_Request, a0, a1, a2, a3, a4: uintptr) -> uintptr {
  52. return intrinsics.valgrind_client_request(default, uintptr(request), a0, a1, a2, a3, a4)
  53. }
  54. helgrind_client_request_stmt :: #force_inline proc "c" (request: Helgrind_Client_Request, a0, a1, a2, a3, a4: uintptr) {
  55. _ = intrinsics.valgrind_client_request(0, uintptr(request), a0, a1, a2, a3, a4)
  56. }
  57. helgrind_mutex_init_post :: proc "c" (mutex: rawptr, mb_rec: uint) {
  58. helgrind_client_request_stmt(.Pthread_Mutex_Init_Post, uintptr(mutex), uintptr(mb_rec), 0, 0, 0)
  59. }
  60. helgrind_mutex_destroy_pre :: proc "c" (mutex: rawptr) {
  61. helgrind_client_request_stmt(.Pthread_Mutex_Destroy_Pre, uintptr(mutex), 0, 0, 0, 0)
  62. }
  63. helgrind_mutex_lock_pre :: proc "c" (mutex: rawptr, is_try_lock: bool) {
  64. helgrind_client_request_stmt(.Pthread_Mutex_Lock_Pre, uintptr(mutex), uintptr(is_try_lock), 0, 0, 0)
  65. }
  66. helgrind_mutex_lock_post :: proc "c" (mutex: rawptr) {
  67. helgrind_client_request_stmt(.Pthread_Mutex_Lock_Post, uintptr(mutex), 0, 0, 0, 0)
  68. }
  69. helgrind_mutex_unlock_pre :: proc "c" (mutex: rawptr) {
  70. helgrind_client_request_stmt(.Pthread_Mutex_Unlock_Pre, uintptr(mutex), 0, 0, 0, 0)
  71. }
  72. helgrind_mutex_unlock_post :: proc "c" (mutex: rawptr) {
  73. helgrind_client_request_stmt(.Pthread_Mutex_Unlock_Post, uintptr(mutex), 0, 0, 0, 0)
  74. }
  75. helgrind_rwlock_init_post :: proc "c" (lock: rawptr) {
  76. helgrind_client_request_stmt(.Pthread_Rwlock_Init_Post, uintptr(lock), 0, 0, 0, 0)
  77. }
  78. helgrind_rwlock_destroy_pre :: proc "c" (lock: rawptr) {
  79. helgrind_client_request_stmt(.Pthread_Rwlock_Destroy_Pre, uintptr(lock), 0, 0, 0, 0)
  80. }
  81. helgrind_rwlock_lock_pre :: proc "c" (lock: rawptr, is_w: bool) {
  82. helgrind_client_request_stmt(.Pthread_Rwlock_Lock_Pre, uintptr(lock), uintptr(is_w), 0, 0, 0)
  83. }
  84. helgrind_rwlock_unlock_post :: proc "c" (lock: rawptr, is_w: bool) {
  85. helgrind_client_request_stmt(.Pthread_Rwlock_Unlock_Pre, uintptr(lock), uintptr(is_w), 0, 0, 0)
  86. }
  87. helgrind_sem_init_post :: proc "c" (sem: rawptr, value: uint) {
  88. helgrind_client_request_stmt(.Posix_Sem_Init_Post, uintptr(sem), uintptr(value), 0, 0, 0)
  89. }
  90. helgrind_sem_wait_post :: proc "c" (sem: rawptr) {
  91. helgrind_client_request_stmt(.Posix_Sem_Wait_Post, uintptr(sem), 0, 0, 0, 0)
  92. }
  93. helgrind_sem_post_pre :: proc "c" (sem: rawptr) {
  94. helgrind_client_request_stmt(.Posix_Sem_Post_Pre, uintptr(sem), 0, 0, 0, 0)
  95. }
  96. helgrind_sem_destroy_pre :: proc "c" (sem: rawptr) {
  97. helgrind_client_request_stmt(.Posix_Sem_Destroy_Pre, uintptr(sem), 0, 0, 0, 0)
  98. }
  99. helgrind_barrier_init_pre :: proc "c" (bar: rawptr, count: uint, resizable: bool) {
  100. helgrind_client_request_stmt(.Pthread_Barrier_Init_Pre, uintptr(bar), uintptr(count), uintptr(resizable), 0, 0)
  101. }
  102. helgrind_barrier_wait_pre :: proc "c" (bar: rawptr) {
  103. helgrind_client_request_stmt(.Pthread_Barrier_Wait_Pre, uintptr(bar), 0, 0, 0, 0)
  104. }
  105. helgrind_barrier_resize_pre :: proc "c" (bar: rawptr, new_count: uint) {
  106. helgrind_client_request_stmt(.Pthread_Barrier_Resize_Pre, uintptr(bar), uintptr(new_count), 0, 0, 0)
  107. }
  108. helgrind_barrier_destroy_pre :: proc "c" (bar: rawptr) {
  109. helgrind_client_request_stmt(.Pthread_Barrier_Destroy_Pre, uintptr(bar), 0, 0, 0, 0)
  110. }
  111. helgrind_clean_memory :: proc "c" (qzz_start: rawptr, qzz_len: uint) {
  112. helgrind_client_request_stmt(.Clean_Memory, uintptr(qzz_start), uintptr(qzz_len), 0, 0, 0)
  113. }
  114. helgrind_clean_memory_slice :: proc "c" (qzz: []byte) {
  115. helgrind_client_request_stmt(.Clean_Memory, uintptr(raw_data(qzz)), uintptr(len(qzz)), 0, 0, 0)
  116. }
  117. helgrind_clean_memory_heap_block :: proc "c" (qzz_blockstart: rawptr) -> int {
  118. return int(helgrind_client_request_expr(~uintptr(1), .Clean_Memory_Heapblock, uintptr(qzz_blockstart), 0, 0, 0, 0))
  119. }
  120. helgrind_disable_checking :: proc "c" (qzz_start: rawptr, qzz_len: uint) {
  121. helgrind_client_request_stmt(.Arange_Make_Untracked, uintptr(qzz_start), uintptr(qzz_len), 0, 0, 0)
  122. }
  123. helgrind_enable_checking :: proc "c" (qzz_start: rawptr, qzz_len: uint) {
  124. helgrind_client_request_stmt(.Arange_Make_Tracked, uintptr(qzz_start), uintptr(qzz_len), 0, 0, 0)
  125. }
  126. helgrind_cond_init_post :: proc "c" (cond: rawptr) {
  127. helgrind_client_request_stmt(.Pthread_Cond_Init_Post, uintptr(cond), 0, 0, 0, 0)
  128. }
  129. helgrind_cond_destroy_pre :: proc "c" (cond: rawptr) {
  130. helgrind_client_request_stmt(.Pthread_Cond_Destroy_Pre, uintptr(cond), 0, 0, 0, 0)
  131. }
  132. helgrind_cond_signal_pre :: proc "c" (cond: rawptr) {
  133. helgrind_client_request_stmt(.Pthread_Cond_Signal_Pre, uintptr(cond), 0, 0, 0, 0)
  134. }
  135. helgrind_cond_broadcast_pre :: proc "c" (cond: rawptr) {
  136. helgrind_client_request_stmt(.Pthread_Cond_Broadcast_Pre, uintptr(cond), 0, 0, 0, 0)
  137. }
  138. helgrind_cond_wait_pre :: proc "c" (cond: rawptr, lock: rawptr) -> bool {
  139. return 0 != helgrind_client_request_expr(0, .Pthread_Cond_Wait_Pre, uintptr(cond), uintptr(lock), 0, 0, 0)
  140. }
  141. helgrind_cond_wait_post :: proc "c" (cond: rawptr, lock: rawptr) -> bool {
  142. return 0 != helgrind_client_request_expr(0, .Pthread_Cond_Wait_Post, uintptr(cond), uintptr(lock), 0, 0, 0)
  143. }
  144. helgrind_client_request_unimp :: #force_inline proc "c" (msg: cstring) {
  145. helgrind_client_request_stmt(.Clientreq_Unimp, uintptr(rawptr(msg)), 0, 0, 0, 0)
  146. }
  147. helgrind_annotate_condvar_lock_wait :: #force_inline proc "c" (cv: rawptr, lock: rawptr) {
  148. helgrind_client_request_unimp("ANNOTATE_CONDVAR_LOCK_WAIT")
  149. }
  150. helgrind_annotate_condvar_wait :: proc "c" (cv: rawptr) {
  151. helgrind_client_request_unimp("ANNOTATE_CONDVAR_WAIT")
  152. }
  153. helgrind_annotate_condvar_signal :: proc "c" (cv: rawptr) {
  154. helgrind_client_request_unimp("ANNOTATE_CONDVAR_SIGNAL")
  155. }
  156. helgrind_annotate_condvar_signal_all :: proc "c" (cv: rawptr) {
  157. helgrind_client_request_unimp("ANNOTATE_CONDVAR_SIGNAL_ALL")
  158. }