1//===-- options.h -----------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef GWP_ASAN_OPTIONS_H_
10#define GWP_ASAN_OPTIONS_H_
11
12#include <stddef.h>
13#include <stdint.h>
14
15namespace gwp_asan {
16namespace options {
17// ================================ Requirements ===============================
18// This function is required to be either implemented by the supporting
19// allocator, or one of the two provided implementations may be used
20// (RTGwpAsanBacktraceLibc or RTGwpAsanBacktraceSanitizerCommon).
21// ================================ Description ================================
22// This function shall collect the backtrace for the calling thread and place
23// the result in `TraceBuffer`. This function should elide itself and all frames
24// below itself from `TraceBuffer`, i.e. the caller's frame should be in
25// TraceBuffer[0], and subsequent frames 1..n into TraceBuffer[1..n], where a
26// maximum of `Size` frames are stored. Returns the number of frames stored into
27// `TraceBuffer`, and zero on failure. If the return value of this function is
28// equal to `Size`, it may indicate that the backtrace is truncated.
29// =================================== Notes ===================================
30// This function may directly or indirectly call malloc(), as the
31// GuardedPoolAllocator contains a reentrancy barrier to prevent infinite
32// recursion. Any allocation made inside this function will be served by the
33// supporting allocator, and will not have GWP-ASan protections.
34typedef size_t (*Backtrace_t)(uintptr_t *TraceBuffer, size_t Size);
35
36struct Options {
37 Backtrace_t Backtrace = nullptr;
38
39 // Read the options from the included definitions file.
40#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
41 Type Name = DefaultValue;
42#include "gwp_asan/options.inc"
43#undef GWP_ASAN_OPTION
44
45 void setDefaults() {
46#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
47 Name = DefaultValue;
48#include "gwp_asan/options.inc"
49#undef GWP_ASAN_OPTION
50
51 Backtrace = nullptr;
52 }
53};
54} // namespace options
55} // namespace gwp_asan
56
57#endif // GWP_ASAN_OPTIONS_H_
58