Path: blob/main/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interface.h
35268 views
//===-- tsan_interface.h ----------------------------------------*- C++ -*-===//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// The functions declared in this header will be inserted by the instrumentation11// module.12// This header can be included by the instrumented program or by TSan tests.13//===----------------------------------------------------------------------===//14#ifndef TSAN_INTERFACE_H15#define TSAN_INTERFACE_H1617#include <sanitizer_common/sanitizer_internal_defs.h>18using __sanitizer::uptr;19using __sanitizer::tid_t;2021// This header should NOT include any other headers.22// All functions in this header are extern "C" and start with __tsan_.2324#ifdef __cplusplus25extern "C" {26#endif2728#if !SANITIZER_GO2930// This function should be called at the very beginning of the process,31// before any instrumented code is executed and before any call to malloc.32SANITIZER_INTERFACE_ATTRIBUTE void __tsan_init();3334SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE const char *35__tsan_default_options();3637SANITIZER_INTERFACE_ATTRIBUTE void __tsan_flush_memory();3839SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1(void *addr);40SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2(void *addr);41SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4(void *addr);42SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8(void *addr);43SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16(void *addr);4445SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1(void *addr);46SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2(void *addr);47SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4(void *addr);48SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8(void *addr);49SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16(void *addr);5051SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read2(const void *addr);52SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read4(const void *addr);53SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read8(const void *addr);54SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read16(const void *addr);5556SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write2(void *addr);57SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write4(void *addr);58SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write8(void *addr);59SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write16(void *addr);6061SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1_pc(void *addr, void *pc);62SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2_pc(void *addr, void *pc);63SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4_pc(void *addr, void *pc);64SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8_pc(void *addr, void *pc);65SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16_pc(void *addr, void *pc);6667SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1_pc(void *addr, void *pc);68SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2_pc(void *addr, void *pc);69SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4_pc(void *addr, void *pc);70SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8_pc(void *addr, void *pc);71SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16_pc(void *addr, void *pc);7273SANITIZER_INTERFACE_ATTRIBUTE void __tsan_vptr_read(void **vptr_p);74SANITIZER_INTERFACE_ATTRIBUTE75void __tsan_vptr_update(void **vptr_p, void *new_val);7677SANITIZER_INTERFACE_ATTRIBUTE78void *__tsan_memcpy(void *dest, const void *src, uptr count);79SANITIZER_INTERFACE_ATTRIBUTE80void *__tsan_memset(void *dest, int ch, uptr count);81SANITIZER_INTERFACE_ATTRIBUTE82void *__tsan_memmove(void *dest, const void *src, uptr count);8384SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_entry(void *call_pc);85SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_exit();8687SANITIZER_INTERFACE_ATTRIBUTE void __tsan_ignore_thread_begin();88SANITIZER_INTERFACE_ATTRIBUTE void __tsan_ignore_thread_end();8990SANITIZER_INTERFACE_ATTRIBUTE void __tsan_on_thread_idle();9192SANITIZER_INTERFACE_ATTRIBUTE93void *__tsan_external_register_tag(const char *object_type);94SANITIZER_INTERFACE_ATTRIBUTE95void __tsan_external_register_header(void *tag, const char *header);96SANITIZER_INTERFACE_ATTRIBUTE97void __tsan_external_assign_tag(void *addr, void *tag);98SANITIZER_INTERFACE_ATTRIBUTE99void __tsan_external_read(void *addr, void *caller_pc, void *tag);100SANITIZER_INTERFACE_ATTRIBUTE101void __tsan_external_write(void *addr, void *caller_pc, void *tag);102103SANITIZER_INTERFACE_ATTRIBUTE104void __tsan_read_range(void *addr, unsigned long size);105SANITIZER_INTERFACE_ATTRIBUTE106void __tsan_write_range(void *addr, unsigned long size);107108SANITIZER_INTERFACE_ATTRIBUTE109void __tsan_read_range_pc(void *addr, unsigned long size, void *pc);110SANITIZER_INTERFACE_ATTRIBUTE111void __tsan_write_range_pc(void *addr, unsigned long size, void *pc);112113// User may provide function that would be called right when TSan detects114// an error. The argument 'report' is an opaque pointer that can be used to115// gather additional information using other TSan report API functions.116SANITIZER_INTERFACE_ATTRIBUTE117void __tsan_on_report(void *report);118119// If TSan is currently reporting a detected issue on the current thread,120// returns an opaque pointer to the current report. Otherwise returns NULL.121SANITIZER_INTERFACE_ATTRIBUTE122void *__tsan_get_current_report();123124// Returns a report's description (issue type), number of duplicate issues125// found, counts of array data (stack traces, memory operations, locations,126// mutexes, threads, unique thread IDs) and a stack trace of a sleep() call (if127// one was involved in the issue).128SANITIZER_INTERFACE_ATTRIBUTE129int __tsan_get_report_data(void *report, const char **description, int *count,130int *stack_count, int *mop_count, int *loc_count,131int *mutex_count, int *thread_count,132int *unique_tid_count, void **sleep_trace,133uptr trace_size);134135/// Retrieves the "tag" from a report (for external-race report types). External136/// races can be associated with a tag which give them more meaning. For example137/// tag value '1' means "Swift access race". Tag value '0' indicated a plain138/// external race.139///140/// \param report opaque pointer to the current report (obtained as argument in141/// __tsan_on_report, or from __tsan_get_current_report)142/// \param [out] tag points to storage that will be filled with the tag value143///144/// \returns non-zero value on success, zero on failure145SANITIZER_INTERFACE_ATTRIBUTE146int __tsan_get_report_tag(void *report, uptr *tag);147148// Returns information about stack traces included in the report.149SANITIZER_INTERFACE_ATTRIBUTE150int __tsan_get_report_stack(void *report, uptr idx, void **trace,151uptr trace_size);152153// Returns information about memory operations included in the report.154SANITIZER_INTERFACE_ATTRIBUTE155int __tsan_get_report_mop(void *report, uptr idx, int *tid, void **addr,156int *size, int *write, int *atomic, void **trace,157uptr trace_size);158159// Returns information about locations included in the report.160SANITIZER_INTERFACE_ATTRIBUTE161int __tsan_get_report_loc(void *report, uptr idx, const char **type,162void **addr, uptr *start, uptr *size, int *tid,163int *fd, int *suppressable, void **trace,164uptr trace_size);165166SANITIZER_INTERFACE_ATTRIBUTE167int __tsan_get_report_loc_object_type(void *report, uptr idx,168const char **object_type);169170// Returns information about mutexes included in the report.171SANITIZER_INTERFACE_ATTRIBUTE172int __tsan_get_report_mutex(void *report, uptr idx, uptr *mutex_id, void **addr,173int *destroyed, void **trace, uptr trace_size);174175// Returns information about threads included in the report.176SANITIZER_INTERFACE_ATTRIBUTE177int __tsan_get_report_thread(void *report, uptr idx, int *tid, tid_t *os_id,178int *running, const char **name, int *parent_tid,179void **trace, uptr trace_size);180181// Returns information about unique thread IDs included in the report.182SANITIZER_INTERFACE_ATTRIBUTE183int __tsan_get_report_unique_tid(void *report, uptr idx, int *tid);184185// Returns the type of the pointer (heap, stack, global, ...) and if possible186// also the starting address (e.g. of a heap allocation) and size.187SANITIZER_INTERFACE_ATTRIBUTE188const char *__tsan_locate_address(uptr addr, char *name, uptr name_size,189uptr *region_address, uptr *region_size);190191// Returns the allocation stack for a heap pointer.192SANITIZER_INTERFACE_ATTRIBUTE193int __tsan_get_alloc_stack(uptr addr, uptr *trace, uptr size, int *thread_id,194tid_t *os_id);195196#endif // SANITIZER_GO197198#ifdef __cplusplus199} // extern "C"200#endif201202namespace __tsan {203204// These should match declarations from public tsan_interface_atomic.h header.205typedef unsigned char a8;206typedef unsigned short a16;207typedef unsigned int a32;208typedef unsigned long long a64;209#if !SANITIZER_GO && (defined(__SIZEOF_INT128__) \210|| (__clang_major__ * 100 + __clang_minor__ >= 302)) && \211!defined(__mips64) && !defined(__s390x__)212__extension__ typedef __int128 a128;213# define __TSAN_HAS_INT128 1214#else215# define __TSAN_HAS_INT128 0216#endif217218// Part of ABI, do not change.219// https://github.com/llvm/llvm-project/blob/main/libcxx/include/atomic220typedef enum {221mo_relaxed,222mo_consume,223mo_acquire,224mo_release,225mo_acq_rel,226mo_seq_cst227} morder;228229struct ThreadState;230231extern "C" {232SANITIZER_INTERFACE_ATTRIBUTE233a8 __tsan_atomic8_load(const volatile a8 *a, morder mo);234SANITIZER_INTERFACE_ATTRIBUTE235a16 __tsan_atomic16_load(const volatile a16 *a, morder mo);236SANITIZER_INTERFACE_ATTRIBUTE237a32 __tsan_atomic32_load(const volatile a32 *a, morder mo);238SANITIZER_INTERFACE_ATTRIBUTE239a64 __tsan_atomic64_load(const volatile a64 *a, morder mo);240#if __TSAN_HAS_INT128241SANITIZER_INTERFACE_ATTRIBUTE242a128 __tsan_atomic128_load(const volatile a128 *a, morder mo);243#endif244245SANITIZER_INTERFACE_ATTRIBUTE246void __tsan_atomic8_store(volatile a8 *a, a8 v, morder mo);247SANITIZER_INTERFACE_ATTRIBUTE248void __tsan_atomic16_store(volatile a16 *a, a16 v, morder mo);249SANITIZER_INTERFACE_ATTRIBUTE250void __tsan_atomic32_store(volatile a32 *a, a32 v, morder mo);251SANITIZER_INTERFACE_ATTRIBUTE252void __tsan_atomic64_store(volatile a64 *a, a64 v, morder mo);253#if __TSAN_HAS_INT128254SANITIZER_INTERFACE_ATTRIBUTE255void __tsan_atomic128_store(volatile a128 *a, a128 v, morder mo);256#endif257258SANITIZER_INTERFACE_ATTRIBUTE259a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, morder mo);260SANITIZER_INTERFACE_ATTRIBUTE261a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, morder mo);262SANITIZER_INTERFACE_ATTRIBUTE263a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, morder mo);264SANITIZER_INTERFACE_ATTRIBUTE265a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, morder mo);266#if __TSAN_HAS_INT128267SANITIZER_INTERFACE_ATTRIBUTE268a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, morder mo);269#endif270271SANITIZER_INTERFACE_ATTRIBUTE272a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, morder mo);273SANITIZER_INTERFACE_ATTRIBUTE274a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, morder mo);275SANITIZER_INTERFACE_ATTRIBUTE276a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, morder mo);277SANITIZER_INTERFACE_ATTRIBUTE278a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, morder mo);279#if __TSAN_HAS_INT128280SANITIZER_INTERFACE_ATTRIBUTE281a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, morder mo);282#endif283284SANITIZER_INTERFACE_ATTRIBUTE285a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, morder mo);286SANITIZER_INTERFACE_ATTRIBUTE287a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, morder mo);288SANITIZER_INTERFACE_ATTRIBUTE289a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, morder mo);290SANITIZER_INTERFACE_ATTRIBUTE291a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, morder mo);292#if __TSAN_HAS_INT128293SANITIZER_INTERFACE_ATTRIBUTE294a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, morder mo);295#endif296297SANITIZER_INTERFACE_ATTRIBUTE298a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, morder mo);299SANITIZER_INTERFACE_ATTRIBUTE300a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, morder mo);301SANITIZER_INTERFACE_ATTRIBUTE302a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, morder mo);303SANITIZER_INTERFACE_ATTRIBUTE304a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, morder mo);305#if __TSAN_HAS_INT128306SANITIZER_INTERFACE_ATTRIBUTE307a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, morder mo);308#endif309310SANITIZER_INTERFACE_ATTRIBUTE311a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, morder mo);312SANITIZER_INTERFACE_ATTRIBUTE313a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, morder mo);314SANITIZER_INTERFACE_ATTRIBUTE315a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, morder mo);316SANITIZER_INTERFACE_ATTRIBUTE317a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, morder mo);318#if __TSAN_HAS_INT128319SANITIZER_INTERFACE_ATTRIBUTE320a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, morder mo);321#endif322323SANITIZER_INTERFACE_ATTRIBUTE324a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, morder mo);325SANITIZER_INTERFACE_ATTRIBUTE326a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, morder mo);327SANITIZER_INTERFACE_ATTRIBUTE328a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, morder mo);329SANITIZER_INTERFACE_ATTRIBUTE330a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, morder mo);331#if __TSAN_HAS_INT128332SANITIZER_INTERFACE_ATTRIBUTE333a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, morder mo);334#endif335336SANITIZER_INTERFACE_ATTRIBUTE337a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, morder mo);338SANITIZER_INTERFACE_ATTRIBUTE339a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, morder mo);340SANITIZER_INTERFACE_ATTRIBUTE341a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, morder mo);342SANITIZER_INTERFACE_ATTRIBUTE343a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, morder mo);344#if __TSAN_HAS_INT128345SANITIZER_INTERFACE_ATTRIBUTE346a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, morder mo);347#endif348349SANITIZER_INTERFACE_ATTRIBUTE350int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v,351morder mo, morder fmo);352SANITIZER_INTERFACE_ATTRIBUTE353int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v,354morder mo, morder fmo);355SANITIZER_INTERFACE_ATTRIBUTE356int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v,357morder mo, morder fmo);358SANITIZER_INTERFACE_ATTRIBUTE359int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v,360morder mo, morder fmo);361#if __TSAN_HAS_INT128362SANITIZER_INTERFACE_ATTRIBUTE363int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v,364morder mo, morder fmo);365#endif366367SANITIZER_INTERFACE_ATTRIBUTE368int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, morder mo,369morder fmo);370SANITIZER_INTERFACE_ATTRIBUTE371int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v,372morder mo, morder fmo);373SANITIZER_INTERFACE_ATTRIBUTE374int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v,375morder mo, morder fmo);376SANITIZER_INTERFACE_ATTRIBUTE377int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v,378morder mo, morder fmo);379#if __TSAN_HAS_INT128380SANITIZER_INTERFACE_ATTRIBUTE381int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v,382morder mo, morder fmo);383#endif384385SANITIZER_INTERFACE_ATTRIBUTE386a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, morder mo,387morder fmo);388SANITIZER_INTERFACE_ATTRIBUTE389a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v,390morder mo, morder fmo);391SANITIZER_INTERFACE_ATTRIBUTE392a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v,393morder mo, morder fmo);394SANITIZER_INTERFACE_ATTRIBUTE395a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v,396morder mo, morder fmo);397#if __TSAN_HAS_INT128398SANITIZER_INTERFACE_ATTRIBUTE399a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v,400morder mo, morder fmo);401#endif402403SANITIZER_INTERFACE_ATTRIBUTE404void __tsan_atomic_thread_fence(morder mo);405SANITIZER_INTERFACE_ATTRIBUTE406void __tsan_atomic_signal_fence(morder mo);407408SANITIZER_INTERFACE_ATTRIBUTE409void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);410SANITIZER_INTERFACE_ATTRIBUTE411void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);412SANITIZER_INTERFACE_ATTRIBUTE413void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);414SANITIZER_INTERFACE_ATTRIBUTE415void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);416SANITIZER_INTERFACE_ATTRIBUTE417void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);418SANITIZER_INTERFACE_ATTRIBUTE419void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);420SANITIZER_INTERFACE_ATTRIBUTE421void __tsan_go_atomic32_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a);422SANITIZER_INTERFACE_ATTRIBUTE423void __tsan_go_atomic64_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a);424SANITIZER_INTERFACE_ATTRIBUTE425void __tsan_go_atomic32_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a);426SANITIZER_INTERFACE_ATTRIBUTE427void __tsan_go_atomic64_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a);428SANITIZER_INTERFACE_ATTRIBUTE429void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);430SANITIZER_INTERFACE_ATTRIBUTE431void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);432SANITIZER_INTERFACE_ATTRIBUTE433void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,434u8 *a);435SANITIZER_INTERFACE_ATTRIBUTE436void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,437u8 *a);438439} // extern "C"440441} // namespace __tsan442443#endif // TSAN_INTERFACE_H444445446