1*7c3d14c8STreehugger Robot //===-- tsan_mman.h ---------------------------------------------*- C++ -*-===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot //
10*7c3d14c8STreehugger Robot // This file is a part of ThreadSanitizer (TSan), a race detector.
11*7c3d14c8STreehugger Robot //
12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
13*7c3d14c8STreehugger Robot #ifndef TSAN_MMAN_H
14*7c3d14c8STreehugger Robot #define TSAN_MMAN_H
15*7c3d14c8STreehugger Robot
16*7c3d14c8STreehugger Robot #include "tsan_defs.h"
17*7c3d14c8STreehugger Robot
18*7c3d14c8STreehugger Robot namespace __tsan {
19*7c3d14c8STreehugger Robot
20*7c3d14c8STreehugger Robot const uptr kDefaultAlignment = 16;
21*7c3d14c8STreehugger Robot
22*7c3d14c8STreehugger Robot void InitializeAllocator();
23*7c3d14c8STreehugger Robot void InitializeAllocatorLate();
24*7c3d14c8STreehugger Robot void ReplaceSystemMalloc();
25*7c3d14c8STreehugger Robot void AllocatorProcStart(Processor *proc);
26*7c3d14c8STreehugger Robot void AllocatorProcFinish(Processor *proc);
27*7c3d14c8STreehugger Robot void AllocatorPrintStats();
28*7c3d14c8STreehugger Robot
29*7c3d14c8STreehugger Robot // For user allocations.
30*7c3d14c8STreehugger Robot void *user_alloc(ThreadState *thr, uptr pc, uptr sz,
31*7c3d14c8STreehugger Robot uptr align = kDefaultAlignment, bool signal = true);
32*7c3d14c8STreehugger Robot void *user_calloc(ThreadState *thr, uptr pc, uptr sz, uptr n);
33*7c3d14c8STreehugger Robot // Does not accept NULL.
34*7c3d14c8STreehugger Robot void user_free(ThreadState *thr, uptr pc, void *p, bool signal = true);
35*7c3d14c8STreehugger Robot void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz);
36*7c3d14c8STreehugger Robot void *user_alloc_aligned(ThreadState *thr, uptr pc, uptr sz, uptr align);
37*7c3d14c8STreehugger Robot uptr user_alloc_usable_size(const void *p);
38*7c3d14c8STreehugger Robot
39*7c3d14c8STreehugger Robot // Invoking malloc/free hooks that may be installed by the user.
40*7c3d14c8STreehugger Robot void invoke_malloc_hook(void *ptr, uptr size);
41*7c3d14c8STreehugger Robot void invoke_free_hook(void *ptr);
42*7c3d14c8STreehugger Robot
43*7c3d14c8STreehugger Robot enum MBlockType {
44*7c3d14c8STreehugger Robot MBlockScopedBuf,
45*7c3d14c8STreehugger Robot MBlockString,
46*7c3d14c8STreehugger Robot MBlockStackTrace,
47*7c3d14c8STreehugger Robot MBlockShadowStack,
48*7c3d14c8STreehugger Robot MBlockSync,
49*7c3d14c8STreehugger Robot MBlockClock,
50*7c3d14c8STreehugger Robot MBlockThreadContex,
51*7c3d14c8STreehugger Robot MBlockDeadInfo,
52*7c3d14c8STreehugger Robot MBlockRacyStacks,
53*7c3d14c8STreehugger Robot MBlockRacyAddresses,
54*7c3d14c8STreehugger Robot MBlockAtExit,
55*7c3d14c8STreehugger Robot MBlockFlag,
56*7c3d14c8STreehugger Robot MBlockReport,
57*7c3d14c8STreehugger Robot MBlockReportMop,
58*7c3d14c8STreehugger Robot MBlockReportThread,
59*7c3d14c8STreehugger Robot MBlockReportMutex,
60*7c3d14c8STreehugger Robot MBlockReportLoc,
61*7c3d14c8STreehugger Robot MBlockReportStack,
62*7c3d14c8STreehugger Robot MBlockSuppression,
63*7c3d14c8STreehugger Robot MBlockExpectRace,
64*7c3d14c8STreehugger Robot MBlockSignal,
65*7c3d14c8STreehugger Robot MBlockJmpBuf,
66*7c3d14c8STreehugger Robot
67*7c3d14c8STreehugger Robot // This must be the last.
68*7c3d14c8STreehugger Robot MBlockTypeCount
69*7c3d14c8STreehugger Robot };
70*7c3d14c8STreehugger Robot
71*7c3d14c8STreehugger Robot // For internal data structures.
72*7c3d14c8STreehugger Robot void *internal_alloc(MBlockType typ, uptr sz);
73*7c3d14c8STreehugger Robot void internal_free(void *p);
74*7c3d14c8STreehugger Robot
75*7c3d14c8STreehugger Robot template<typename T>
DestroyAndFree(T * & p)76*7c3d14c8STreehugger Robot void DestroyAndFree(T *&p) {
77*7c3d14c8STreehugger Robot p->~T();
78*7c3d14c8STreehugger Robot internal_free(p);
79*7c3d14c8STreehugger Robot p = 0;
80*7c3d14c8STreehugger Robot }
81*7c3d14c8STreehugger Robot
82*7c3d14c8STreehugger Robot } // namespace __tsan
83*7c3d14c8STreehugger Robot #endif // TSAN_MMAN_H
84