xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- sanitizer_allocator.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 // Specialized memory allocator for ThreadSanitizer, MemorySanitizer, etc.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick 
133cab2bb3Spatrick #ifndef SANITIZER_ALLOCATOR_H
143cab2bb3Spatrick #define SANITIZER_ALLOCATOR_H
153cab2bb3Spatrick 
163cab2bb3Spatrick #include "sanitizer_common.h"
17*810390e3Srobert #include "sanitizer_flat_map.h"
183cab2bb3Spatrick #include "sanitizer_internal_defs.h"
193cab2bb3Spatrick #include "sanitizer_lfstack.h"
203cab2bb3Spatrick #include "sanitizer_libc.h"
213cab2bb3Spatrick #include "sanitizer_list.h"
223cab2bb3Spatrick #include "sanitizer_local_address_space_view.h"
233cab2bb3Spatrick #include "sanitizer_mutex.h"
243cab2bb3Spatrick #include "sanitizer_procmaps.h"
253cab2bb3Spatrick #include "sanitizer_type_traits.h"
263cab2bb3Spatrick 
273cab2bb3Spatrick namespace __sanitizer {
283cab2bb3Spatrick 
293cab2bb3Spatrick // Allows the tools to name their allocations appropriately.
303cab2bb3Spatrick extern const char *PrimaryAllocatorName;
313cab2bb3Spatrick extern const char *SecondaryAllocatorName;
323cab2bb3Spatrick 
333cab2bb3Spatrick // Since flags are immutable and allocator behavior can be changed at runtime
343cab2bb3Spatrick // (unit tests or ASan on Android are some examples), allocator_may_return_null
353cab2bb3Spatrick // flag value is cached here and can be altered later.
363cab2bb3Spatrick bool AllocatorMayReturnNull();
373cab2bb3Spatrick void SetAllocatorMayReturnNull(bool may_return_null);
383cab2bb3Spatrick 
393cab2bb3Spatrick // Returns true if allocator detected OOM condition. Can be used to avoid memory
403cab2bb3Spatrick // hungry operations.
413cab2bb3Spatrick bool IsAllocatorOutOfMemory();
423cab2bb3Spatrick // Should be called by a particular allocator when OOM is detected.
433cab2bb3Spatrick void SetAllocatorOutOfMemory();
443cab2bb3Spatrick 
453cab2bb3Spatrick void PrintHintAllocatorCannotReturnNull();
463cab2bb3Spatrick 
473cab2bb3Spatrick // Callback type for iterating over chunks.
483cab2bb3Spatrick typedef void (*ForEachChunkCallback)(uptr chunk, void *arg);
493cab2bb3Spatrick 
Rand(u32 * state)50d89ec533Spatrick inline u32 Rand(u32 *state) {  // ANSI C linear congruential PRNG.
513cab2bb3Spatrick   return (*state = *state * 1103515245 + 12345) >> 16;
523cab2bb3Spatrick }
533cab2bb3Spatrick 
RandN(u32 * state,u32 n)54d89ec533Spatrick inline u32 RandN(u32 *state, u32 n) { return Rand(state) % n; }  // [0, n)
553cab2bb3Spatrick 
563cab2bb3Spatrick template<typename T>
RandomShuffle(T * a,u32 n,u32 * rand_state)57d89ec533Spatrick inline void RandomShuffle(T *a, u32 n, u32 *rand_state) {
583cab2bb3Spatrick   if (n <= 1) return;
593cab2bb3Spatrick   u32 state = *rand_state;
603cab2bb3Spatrick   for (u32 i = n - 1; i > 0; i--)
613cab2bb3Spatrick     Swap(a[i], a[RandN(&state, i + 1)]);
623cab2bb3Spatrick   *rand_state = state;
633cab2bb3Spatrick }
643cab2bb3Spatrick 
653cab2bb3Spatrick #include "sanitizer_allocator_size_class_map.h"
663cab2bb3Spatrick #include "sanitizer_allocator_stats.h"
673cab2bb3Spatrick #include "sanitizer_allocator_primary64.h"
683cab2bb3Spatrick #include "sanitizer_allocator_primary32.h"
693cab2bb3Spatrick #include "sanitizer_allocator_local_cache.h"
703cab2bb3Spatrick #include "sanitizer_allocator_secondary.h"
713cab2bb3Spatrick #include "sanitizer_allocator_combined.h"
723cab2bb3Spatrick 
73*810390e3Srobert bool IsRssLimitExceeded();
74*810390e3Srobert void SetRssLimitExceeded(bool limit_exceeded);
75*810390e3Srobert 
763cab2bb3Spatrick } // namespace __sanitizer
773cab2bb3Spatrick 
783cab2bb3Spatrick #endif // SANITIZER_ALLOCATOR_H
79