b667dd7017
2019-08-14 Martin Liska <mliska@suse.cz> PR sanitizer/89832 PR sanitizer/91325 * All source files: Merge from upstream 368656. From-SVN: r274426
89 lines
3.8 KiB
C
89 lines
3.8 KiB
C
//===-- allocator_interface.h ---------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Public interface header for allocator used in sanitizers (ASan/TSan/MSan).
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef SANITIZER_ALLOCATOR_INTERFACE_H
|
|
#define SANITIZER_ALLOCATOR_INTERFACE_H
|
|
|
|
#include <stddef.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/* Returns the estimated number of bytes that will be reserved by allocator
|
|
for request of "size" bytes. If allocator can't allocate that much
|
|
memory, returns the maximal possible allocation size, otherwise returns
|
|
"size". */
|
|
size_t __sanitizer_get_estimated_allocated_size(size_t size);
|
|
|
|
/* Returns true if p was returned by the allocator and
|
|
is not yet freed. */
|
|
int __sanitizer_get_ownership(const volatile void *p);
|
|
|
|
/* Returns the number of bytes reserved for the pointer p.
|
|
Requires (get_ownership(p) == true) or (p == 0). */
|
|
size_t __sanitizer_get_allocated_size(const volatile void *p);
|
|
|
|
/* Number of bytes, allocated and not yet freed by the application. */
|
|
size_t __sanitizer_get_current_allocated_bytes(void);
|
|
|
|
/* Number of bytes, mmaped by the allocator to fulfill allocation requests.
|
|
Generally, for request of X bytes, allocator can reserve and add to free
|
|
lists a large number of chunks of size X to use them for future requests.
|
|
All these chunks count toward the heap size. Currently, allocator never
|
|
releases memory to OS (instead, it just puts freed chunks to free
|
|
lists). */
|
|
size_t __sanitizer_get_heap_size(void);
|
|
|
|
/* Number of bytes, mmaped by the allocator, which can be used to fulfill
|
|
allocation requests. When a user program frees memory chunk, it can first
|
|
fall into quarantine and will count toward __sanitizer_get_free_bytes()
|
|
later. */
|
|
size_t __sanitizer_get_free_bytes(void);
|
|
|
|
/* Number of bytes in unmapped pages, that are released to OS. Currently,
|
|
always returns 0. */
|
|
size_t __sanitizer_get_unmapped_bytes(void);
|
|
|
|
/* Malloc hooks that may be optionally provided by user.
|
|
__sanitizer_malloc_hook(ptr, size) is called immediately after
|
|
allocation of "size" bytes, which returned "ptr".
|
|
__sanitizer_free_hook(ptr) is called immediately before
|
|
deallocation of "ptr". */
|
|
void __sanitizer_malloc_hook(const volatile void *ptr, size_t size);
|
|
void __sanitizer_free_hook(const volatile void *ptr);
|
|
|
|
/* Installs a pair of hooks for malloc/free.
|
|
Several (currently, 5) hook pairs may be installed, they are executed
|
|
in the order they were installed and after calling
|
|
__sanitizer_malloc_hook/__sanitizer_free_hook.
|
|
Unlike __sanitizer_malloc_hook/__sanitizer_free_hook these hooks can be
|
|
chained and do not rely on weak symbols working on the platform, but
|
|
require __sanitizer_install_malloc_and_free_hooks to be called at startup
|
|
and thus will not be called on malloc/free very early in the process.
|
|
Returns the number of hooks currently installed or 0 on failure.
|
|
Not thread-safe, should be called in the main thread before starting
|
|
other threads.
|
|
*/
|
|
int __sanitizer_install_malloc_and_free_hooks(
|
|
void (*malloc_hook)(const volatile void *, size_t),
|
|
void (*free_hook)(const volatile void *));
|
|
|
|
/* Drains allocator quarantines (calling thread's and global ones), returns
|
|
freed memory back to OS and releases other non-essential internal allocator
|
|
resources in attempt to reduce process RSS.
|
|
Currently available with ASan only.
|
|
*/
|
|
void __sanitizer_purge_allocator(void);
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif
|