xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/memprof/memprof_internal.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
1*e8d8bef9SDimitry Andric //===-- memprof_internal.h -------------------------------------*- C++ -*-===//
2*e8d8bef9SDimitry Andric //
3*e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e8d8bef9SDimitry Andric //
7*e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
8*e8d8bef9SDimitry Andric //
9*e8d8bef9SDimitry Andric // This file is a part of MemProfiler, a memory profiler.
10*e8d8bef9SDimitry Andric //
11*e8d8bef9SDimitry Andric // MemProf-private header which defines various general utilities.
12*e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
13*e8d8bef9SDimitry Andric #ifndef MEMPROF_INTERNAL_H
14*e8d8bef9SDimitry Andric #define MEMPROF_INTERNAL_H
15*e8d8bef9SDimitry Andric 
16*e8d8bef9SDimitry Andric #include "memprof_flags.h"
17*e8d8bef9SDimitry Andric #include "memprof_interface_internal.h"
18*e8d8bef9SDimitry Andric #include "sanitizer_common/sanitizer_common.h"
19*e8d8bef9SDimitry Andric #include "sanitizer_common/sanitizer_internal_defs.h"
20*e8d8bef9SDimitry Andric #include "sanitizer_common/sanitizer_libc.h"
21*e8d8bef9SDimitry Andric #include "sanitizer_common/sanitizer_stacktrace.h"
22*e8d8bef9SDimitry Andric 
23*e8d8bef9SDimitry Andric #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
24*e8d8bef9SDimitry Andric #error "The MemProfiler run-time should not be instrumented by MemProfiler"
25*e8d8bef9SDimitry Andric #endif
26*e8d8bef9SDimitry Andric 
27*e8d8bef9SDimitry Andric // Build-time configuration options.
28*e8d8bef9SDimitry Andric 
29*e8d8bef9SDimitry Andric // If set, memprof will intercept C++ exception api call(s).
30*e8d8bef9SDimitry Andric #ifndef MEMPROF_HAS_EXCEPTIONS
31*e8d8bef9SDimitry Andric #define MEMPROF_HAS_EXCEPTIONS 1
32*e8d8bef9SDimitry Andric #endif
33*e8d8bef9SDimitry Andric 
34*e8d8bef9SDimitry Andric #ifndef MEMPROF_DYNAMIC
35*e8d8bef9SDimitry Andric #ifdef PIC
36*e8d8bef9SDimitry Andric #define MEMPROF_DYNAMIC 1
37*e8d8bef9SDimitry Andric #else
38*e8d8bef9SDimitry Andric #define MEMPROF_DYNAMIC 0
39*e8d8bef9SDimitry Andric #endif
40*e8d8bef9SDimitry Andric #endif
41*e8d8bef9SDimitry Andric 
42*e8d8bef9SDimitry Andric // All internal functions in memprof reside inside the __memprof namespace
43*e8d8bef9SDimitry Andric // to avoid namespace collisions with the user programs.
44*e8d8bef9SDimitry Andric // Separate namespace also makes it simpler to distinguish the memprof
45*e8d8bef9SDimitry Andric // run-time functions from the instrumented user code in a profile.
46*e8d8bef9SDimitry Andric namespace __memprof {
47*e8d8bef9SDimitry Andric 
48*e8d8bef9SDimitry Andric class MemprofThread;
49*e8d8bef9SDimitry Andric using __sanitizer::StackTrace;
50*e8d8bef9SDimitry Andric 
51*e8d8bef9SDimitry Andric void MemprofInitFromRtl();
52*e8d8bef9SDimitry Andric 
53*e8d8bef9SDimitry Andric // memprof_rtl.cpp
54*e8d8bef9SDimitry Andric void PrintAddressSpaceLayout();
55*e8d8bef9SDimitry Andric 
56*e8d8bef9SDimitry Andric // memprof_shadow_setup.cpp
57*e8d8bef9SDimitry Andric void InitializeShadowMemory();
58*e8d8bef9SDimitry Andric 
59*e8d8bef9SDimitry Andric // memprof_malloc_linux.cpp
60*e8d8bef9SDimitry Andric void ReplaceSystemMalloc();
61*e8d8bef9SDimitry Andric 
62*e8d8bef9SDimitry Andric // memprof_linux.cpp
63*e8d8bef9SDimitry Andric uptr FindDynamicShadowStart();
64*e8d8bef9SDimitry Andric void *MemprofDoesNotSupportStaticLinkage();
65*e8d8bef9SDimitry Andric 
66*e8d8bef9SDimitry Andric // memprof_thread.cpp
67*e8d8bef9SDimitry Andric MemprofThread *CreateMainThread();
68*e8d8bef9SDimitry Andric 
69*e8d8bef9SDimitry Andric void ReadContextStack(void *context, uptr *stack, uptr *ssize);
70*e8d8bef9SDimitry Andric 
71*e8d8bef9SDimitry Andric // Wrapper for TLS/TSD.
72*e8d8bef9SDimitry Andric void TSDInit(void (*destructor)(void *tsd));
73*e8d8bef9SDimitry Andric void *TSDGet();
74*e8d8bef9SDimitry Andric void TSDSet(void *tsd);
75*e8d8bef9SDimitry Andric void PlatformTSDDtor(void *tsd);
76*e8d8bef9SDimitry Andric 
77*e8d8bef9SDimitry Andric void *MemprofDlSymNext(const char *sym);
78*e8d8bef9SDimitry Andric 
79*e8d8bef9SDimitry Andric // Add convenient macro for interface functions that may be represented as
80*e8d8bef9SDimitry Andric // weak hooks.
81*e8d8bef9SDimitry Andric #define MEMPROF_MALLOC_HOOK(ptr, size)                                         \
82*e8d8bef9SDimitry Andric   do {                                                                         \
83*e8d8bef9SDimitry Andric     if (&__sanitizer_malloc_hook)                                              \
84*e8d8bef9SDimitry Andric       __sanitizer_malloc_hook(ptr, size);                                      \
85*e8d8bef9SDimitry Andric     RunMallocHooks(ptr, size);                                                 \
86*e8d8bef9SDimitry Andric   } while (false)
87*e8d8bef9SDimitry Andric #define MEMPROF_FREE_HOOK(ptr)                                                 \
88*e8d8bef9SDimitry Andric   do {                                                                         \
89*e8d8bef9SDimitry Andric     if (&__sanitizer_free_hook)                                                \
90*e8d8bef9SDimitry Andric       __sanitizer_free_hook(ptr);                                              \
91*e8d8bef9SDimitry Andric     RunFreeHooks(ptr);                                                         \
92*e8d8bef9SDimitry Andric   } while (false)
93*e8d8bef9SDimitry Andric 
94*e8d8bef9SDimitry Andric extern int memprof_inited;
95*e8d8bef9SDimitry Andric extern int memprof_timestamp_inited;
96*e8d8bef9SDimitry Andric extern int memprof_init_done;
97*e8d8bef9SDimitry Andric // Used to avoid infinite recursion in __memprof_init().
98*e8d8bef9SDimitry Andric extern bool memprof_init_is_running;
99*e8d8bef9SDimitry Andric extern void (*death_callback)(void);
100*e8d8bef9SDimitry Andric extern long memprof_init_timestamp_s;
101*e8d8bef9SDimitry Andric 
102*e8d8bef9SDimitry Andric } // namespace __memprof
103*e8d8bef9SDimitry Andric 
104*e8d8bef9SDimitry Andric #endif // MEMPROF_INTERNAL_H
105