tsan_interface.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //===-- tsan_interface.cpp ------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file is a part of ThreadSanitizer (TSan), a race detector.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "tsan_interface.h"
  13. #include "tsan_interface_ann.h"
  14. #include "tsan_rtl.h"
  15. #include "sanitizer_common/sanitizer_internal_defs.h"
  16. #include "sanitizer_common/sanitizer_ptrauth.h"
  17. #define CALLERPC ((uptr)__builtin_return_address(0))
  18. using namespace __tsan;
  19. void __tsan_init() { Initialize(cur_thread_init()); }
  20. void __tsan_flush_memory() {
  21. FlushShadowMemory();
  22. }
  23. void __tsan_read16(void *addr) {
  24. uptr pc = CALLERPC;
  25. ThreadState *thr = cur_thread();
  26. MemoryAccess(thr, pc, (uptr)addr, 8, kAccessRead);
  27. MemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessRead);
  28. }
  29. void __tsan_write16(void *addr) {
  30. uptr pc = CALLERPC;
  31. ThreadState *thr = cur_thread();
  32. MemoryAccess(thr, pc, (uptr)addr, 8, kAccessWrite);
  33. MemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessWrite);
  34. }
  35. void __tsan_read16_pc(void *addr, void *pc) {
  36. uptr pc_no_pac = STRIP_PAC_PC(pc);
  37. ThreadState *thr = cur_thread();
  38. MemoryAccess(thr, pc_no_pac, (uptr)addr, 8, kAccessRead);
  39. MemoryAccess(thr, pc_no_pac, (uptr)addr + 8, 8, kAccessRead);
  40. }
  41. void __tsan_write16_pc(void *addr, void *pc) {
  42. uptr pc_no_pac = STRIP_PAC_PC(pc);
  43. ThreadState *thr = cur_thread();
  44. MemoryAccess(thr, pc_no_pac, (uptr)addr, 8, kAccessWrite);
  45. MemoryAccess(thr, pc_no_pac, (uptr)addr + 8, 8, kAccessWrite);
  46. }
  47. // __tsan_unaligned_read/write calls are emitted by compiler.
  48. void __tsan_unaligned_read16(const void *addr) {
  49. uptr pc = CALLERPC;
  50. ThreadState *thr = cur_thread();
  51. UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessRead);
  52. UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessRead);
  53. }
  54. void __tsan_unaligned_write16(void *addr) {
  55. uptr pc = CALLERPC;
  56. ThreadState *thr = cur_thread();
  57. UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessWrite);
  58. UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessWrite);
  59. }
  60. extern "C" {
  61. SANITIZER_INTERFACE_ATTRIBUTE
  62. void *__tsan_get_current_fiber() {
  63. return cur_thread();
  64. }
  65. SANITIZER_INTERFACE_ATTRIBUTE
  66. void *__tsan_create_fiber(unsigned flags) {
  67. return FiberCreate(cur_thread(), CALLERPC, flags);
  68. }
  69. SANITIZER_INTERFACE_ATTRIBUTE
  70. void __tsan_destroy_fiber(void *fiber) {
  71. FiberDestroy(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber));
  72. }
  73. SANITIZER_INTERFACE_ATTRIBUTE
  74. void __tsan_switch_to_fiber(void *fiber, unsigned flags) {
  75. FiberSwitch(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber), flags);
  76. }
  77. SANITIZER_INTERFACE_ATTRIBUTE
  78. void __tsan_set_fiber_name(void *fiber, const char *name) {
  79. ThreadSetName(static_cast<ThreadState *>(fiber), name);
  80. }
  81. } // extern "C"
  82. void __tsan_acquire(void *addr) {
  83. Acquire(cur_thread(), CALLERPC, (uptr)addr);
  84. }
  85. void __tsan_release(void *addr) {
  86. Release(cur_thread(), CALLERPC, (uptr)addr);
  87. }