xref: /freebsd/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_mman.h (revision 5956d97f4b3204318ceb6aa9c77bd0bc6ea87a41)
1 //===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
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 #ifndef TSAN_MMAN_H
13 #define TSAN_MMAN_H
14 
15 #include "tsan_defs.h"
16 
17 namespace __tsan {
18 
19 const uptr kDefaultAlignment = 16;
20 
21 void InitializeAllocator();
22 void InitializeAllocatorLate();
23 void ReplaceSystemMalloc();
24 void AllocatorProcStart(Processor *proc);
25 void AllocatorProcFinish(Processor *proc);
26 void AllocatorPrintStats();
27 void AllocatorLock();
28 void AllocatorUnlock();
29 void GlobalProcessorLock();
30 void GlobalProcessorUnlock();
31 
32 // For user allocations.
33 void *user_alloc_internal(ThreadState *thr, uptr pc, uptr sz,
34                           uptr align = kDefaultAlignment, bool signal = true);
35 // Does not accept NULL.
36 void user_free(ThreadState *thr, uptr pc, void *p, bool signal = true);
37 // Interceptor implementations.
38 void *user_alloc(ThreadState *thr, uptr pc, uptr sz);
39 void *user_calloc(ThreadState *thr, uptr pc, uptr sz, uptr n);
40 void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
41 void *user_reallocarray(ThreadState *thr, uptr pc, void *p, uptr sz, uptr n);
42 void *user_memalign(ThreadState *thr, uptr pc, uptr align, uptr sz);
43 int user_posix_memalign(ThreadState *thr, uptr pc, void **memptr, uptr align,
44                         uptr sz);
45 void *user_aligned_alloc(ThreadState *thr, uptr pc, uptr align, uptr sz);
46 void *user_valloc(ThreadState *thr, uptr pc, uptr sz);
47 void *user_pvalloc(ThreadState *thr, uptr pc, uptr sz);
48 uptr user_alloc_usable_size(const void *p);
49 
50 // Invoking malloc/free hooks that may be installed by the user.
51 void invoke_malloc_hook(void *ptr, uptr size);
52 void invoke_free_hook(void *ptr);
53 
54 // For internal data structures.
55 void *Alloc(uptr sz);
56 void FreeImpl(void *p);
57 
58 template <typename T, typename... Args>
59 T *New(Args &&...args) {
60   return new (Alloc(sizeof(T))) T(static_cast<Args &&>(args)...);
61 }
62 
63 template <typename T>
64 void Free(T *&p) {
65   if (p == nullptr)
66     return;
67   FreeImpl(p);
68   p = nullptr;
69 }
70 
71 template <typename T>
72 void DestroyAndFree(T *&p) {
73   if (p == nullptr)
74     return;
75   p->~T();
76   Free(p);
77 }
78 
79 }  // namespace __tsan
80 #endif  // TSAN_MMAN_H
81