xref: /openbsd-src/gnu/llvm/compiler-rt/lib/tsan/rtl/tsan_mman.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #ifndef TSAN_MMAN_H
133cab2bb3Spatrick #define TSAN_MMAN_H
143cab2bb3Spatrick 
153cab2bb3Spatrick #include "tsan_defs.h"
163cab2bb3Spatrick 
173cab2bb3Spatrick namespace __tsan {
183cab2bb3Spatrick 
193cab2bb3Spatrick const uptr kDefaultAlignment = 16;
203cab2bb3Spatrick 
213cab2bb3Spatrick void InitializeAllocator();
223cab2bb3Spatrick void InitializeAllocatorLate();
233cab2bb3Spatrick void ReplaceSystemMalloc();
243cab2bb3Spatrick void AllocatorProcStart(Processor *proc);
253cab2bb3Spatrick void AllocatorProcFinish(Processor *proc);
263cab2bb3Spatrick void AllocatorPrintStats();
27*810390e3Srobert void AllocatorLock();
28*810390e3Srobert void AllocatorUnlock();
29*810390e3Srobert void GlobalProcessorLock();
30*810390e3Srobert void GlobalProcessorUnlock();
313cab2bb3Spatrick 
323cab2bb3Spatrick // For user allocations.
333cab2bb3Spatrick void *user_alloc_internal(ThreadState *thr, uptr pc, uptr sz,
343cab2bb3Spatrick                           uptr align = kDefaultAlignment, bool signal = true);
353cab2bb3Spatrick // Does not accept NULL.
363cab2bb3Spatrick void user_free(ThreadState *thr, uptr pc, void *p, bool signal = true);
373cab2bb3Spatrick // Interceptor implementations.
383cab2bb3Spatrick void *user_alloc(ThreadState *thr, uptr pc, uptr sz);
393cab2bb3Spatrick void *user_calloc(ThreadState *thr, uptr pc, uptr sz, uptr n);
403cab2bb3Spatrick void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
413cab2bb3Spatrick void *user_reallocarray(ThreadState *thr, uptr pc, void *p, uptr sz, uptr n);
423cab2bb3Spatrick void *user_memalign(ThreadState *thr, uptr pc, uptr align, uptr sz);
433cab2bb3Spatrick int user_posix_memalign(ThreadState *thr, uptr pc, void **memptr, uptr align,
443cab2bb3Spatrick                         uptr sz);
453cab2bb3Spatrick void *user_aligned_alloc(ThreadState *thr, uptr pc, uptr align, uptr sz);
463cab2bb3Spatrick void *user_valloc(ThreadState *thr, uptr pc, uptr sz);
473cab2bb3Spatrick void *user_pvalloc(ThreadState *thr, uptr pc, uptr sz);
483cab2bb3Spatrick uptr user_alloc_usable_size(const void *p);
493cab2bb3Spatrick 
503cab2bb3Spatrick // Invoking malloc/free hooks that may be installed by the user.
513cab2bb3Spatrick void invoke_malloc_hook(void *ptr, uptr size);
523cab2bb3Spatrick void invoke_free_hook(void *ptr);
533cab2bb3Spatrick 
543cab2bb3Spatrick // For internal data structures.
55*810390e3Srobert void *Alloc(uptr sz);
56*810390e3Srobert void FreeImpl(void *p);
57*810390e3Srobert 
58*810390e3Srobert template <typename T, typename... Args>
New(Args &&...args)59*810390e3Srobert T *New(Args &&...args) {
60*810390e3Srobert   return new (Alloc(sizeof(T))) T(static_cast<Args &&>(args)...);
61*810390e3Srobert }
623cab2bb3Spatrick 
633cab2bb3Spatrick template <typename T>
Free(T * & p)64*810390e3Srobert void Free(T *&p) {
65*810390e3Srobert   if (p == nullptr)
66*810390e3Srobert     return;
67*810390e3Srobert   FreeImpl(p);
68*810390e3Srobert   p = nullptr;
69*810390e3Srobert }
70*810390e3Srobert 
71*810390e3Srobert template <typename T>
DestroyAndFree(T * & p)72*810390e3Srobert void DestroyAndFree(T *&p) {
73*810390e3Srobert   if (p == nullptr)
74*810390e3Srobert     return;
753cab2bb3Spatrick   p->~T();
76*810390e3Srobert   Free(p);
773cab2bb3Spatrick }
783cab2bb3Spatrick 
793cab2bb3Spatrick }  // namespace __tsan
803cab2bb3Spatrick #endif  // TSAN_MMAN_H
81