Path: blob/main/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interface.cpp
35266 views
//===-- tsan_interface.cpp ------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is a part of ThreadSanitizer (TSan), a race detector.9//10//===----------------------------------------------------------------------===//1112#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"1718#define CALLERPC ((uptr)__builtin_return_address(0))1920using namespace __tsan;2122void __tsan_init() { Initialize(cur_thread_init()); }2324void __tsan_flush_memory() {25FlushShadowMemory();26}2728void __tsan_read16_pc(void *addr, void *pc) {29uptr pc_no_pac = STRIP_PAC_PC(pc);30ThreadState *thr = cur_thread();31MemoryAccess(thr, pc_no_pac, (uptr)addr, 8, kAccessRead);32MemoryAccess(thr, pc_no_pac, (uptr)addr + 8, 8, kAccessRead);33}3435void __tsan_write16_pc(void *addr, void *pc) {36uptr pc_no_pac = STRIP_PAC_PC(pc);37ThreadState *thr = cur_thread();38MemoryAccess(thr, pc_no_pac, (uptr)addr, 8, kAccessWrite);39MemoryAccess(thr, pc_no_pac, (uptr)addr + 8, 8, kAccessWrite);40}4142// __tsan_unaligned_read/write calls are emitted by compiler.4344void __tsan_unaligned_read16(const void *addr) {45uptr pc = CALLERPC;46ThreadState *thr = cur_thread();47UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessRead);48UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessRead);49}5051void __tsan_unaligned_write16(void *addr) {52uptr pc = CALLERPC;53ThreadState *thr = cur_thread();54UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessWrite);55UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessWrite);56}5758extern "C" {59SANITIZER_INTERFACE_ATTRIBUTE60void *__tsan_get_current_fiber() {61return cur_thread();62}6364SANITIZER_INTERFACE_ATTRIBUTE65void *__tsan_create_fiber(unsigned flags) {66return FiberCreate(cur_thread(), CALLERPC, flags);67}6869SANITIZER_INTERFACE_ATTRIBUTE70void __tsan_destroy_fiber(void *fiber) {71FiberDestroy(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber));72}7374SANITIZER_INTERFACE_ATTRIBUTE75void __tsan_switch_to_fiber(void *fiber, unsigned flags) {76FiberSwitch(cur_thread(), CALLERPC, static_cast<ThreadState *>(fiber), flags);77}7879SANITIZER_INTERFACE_ATTRIBUTE80void __tsan_set_fiber_name(void *fiber, const char *name) {81ThreadSetName(static_cast<ThreadState *>(fiber), name);82}83} // extern "C"8485void __tsan_acquire(void *addr) {86Acquire(cur_thread(), CALLERPC, (uptr)addr);87}8889void __tsan_release(void *addr) {90Release(cur_thread(), CALLERPC, (uptr)addr);91}929394