//===-- xray_allocator.h ---------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of XRay, a dynamic runtime instrumentation system. // // Defines the allocator interface for an arena allocator, used primarily for // the profiling runtime. // //===----------------------------------------------------------------------===// #ifndef XRAY_ALLOCATOR_H #define XRAY_ALLOCATOR_H #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_mutex.h" #if SANITIZER_FUCHSIA #include <zircon/process.h> #include <zircon/status.h> #include <zircon/syscalls.h> #else #include "sanitizer_common/sanitizer_posix.h" #endif #include "xray_defs.h" #include "xray_utils.h" #include <cstddef> #include <cstdint> #include <sys/mman.h> namespace __xray { // We implement our own memory allocation routine which will bypass the // internal allocator. This allows us to manage the memory directly, using // mmap'ed memory to back the allocators. template <class T> T *allocate() XRAY_NEVER_INSTRUMENT { … } template <class T> void deallocate(T *B) XRAY_NEVER_INSTRUMENT { … } template <class T = unsigned char> T *allocateBuffer(size_t S) XRAY_NEVER_INSTRUMENT { … } template <class T> void deallocateBuffer(T *B, size_t S) XRAY_NEVER_INSTRUMENT { … } template <class T, class... U> T *initArray(size_t N, U &&... Us) XRAY_NEVER_INSTRUMENT { … } /// The Allocator type hands out fixed-sized chunks of memory that are /// cache-line aligned and sized. This is useful for placement of /// performance-sensitive data in memory that's frequently accessed. The /// allocator also self-limits the peak memory usage to a dynamically defined /// maximum. /// /// N is the lower-bound size of the block of memory to return from the /// allocation function. N is used to compute the size of a block, which is /// cache-line-size multiples worth of memory. We compute the size of a block by /// determining how many cache lines worth of memory is required to subsume N. /// /// The Allocator instance will manage its own memory acquired through mmap. /// This severely constrains the platforms on which this can be used to POSIX /// systems where mmap semantics are well-defined. /// /// FIXME: Isolate the lower-level memory management to a different abstraction /// that can be platform-specific. template <size_t N> struct Allocator { … }; } // namespace __xray #endif // XRAY_ALLOCATOR_H