1//===-- allocator_config.def ------------------------------------*- 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// This file defines all the flags and types supported in Scudo. For optional
10// flags and types, only explicitly define them when interested (i.e., unused
11// optional flags or types can be skipped).
12
13#ifndef BASE_REQUIRED_TEMPLATE_TYPE
14#define BASE_REQUIRED_TEMPLATE_TYPE(...)
15#endif
16#ifndef BASE_OPTIONAL
17#define BASE_OPTIONAL(...)
18#endif
19#ifndef PRIMARY_REQUIRED_TYPE
20#define PRIMARY_REQUIRED_TYPE(...)
21#endif
22#ifndef PRIMARY_REQUIRED
23#define PRIMARY_REQUIRED(...)
24#endif
25#ifndef PRIMARY_OPTIONAL
26#define PRIMARY_OPTIONAL(...)
27#endif
28#ifndef PRIMARY_OPTIONAL_TYPE
29#define PRIMARY_OPTIONAL_TYPE(...)
30#endif
31#ifndef SECONDARY_REQUIRED_TEMPLATE_TYPE
32#define SECONDARY_REQUIRED_TEMPLATE_TYPE(...)
33#endif
34#ifndef SECONDARY_CACHE_OPTIONAL
35#define SECONDARY_CACHE_OPTIONAL(...)
36#endif
37
38// BASE_REQUIRED_TEMPLATE_TYPE(NAME)
39//
40// Thread-Specific Data Registry used, shared or exclusive.
41BASE_REQUIRED_TEMPLATE_TYPE(TSDRegistryT)
42
43// Defines the type of Primary allocator to use.
44BASE_REQUIRED_TEMPLATE_TYPE(PrimaryT)
45
46// Defines the type of Secondary allocator to use.
47BASE_REQUIRED_TEMPLATE_TYPE(SecondaryT)
48
49// BASE_OPTIONAL(TYPE, NAME, DEFAULT)
50//
51// Indicates possible support for Memory Tagging.
52BASE_OPTIONAL(const bool, MaySupportMemoryTagging, false)
53
54// PRIMARY_REQUIRED_TYPE(NAME)
55//
56// SizeClassMap to use with the Primary.
57PRIMARY_REQUIRED_TYPE(SizeClassMap)
58
59// PRIMARY_REQUIRED(TYPE, NAME)
60//
61// Log2 of the size of a size class region, as used by the Primary.
62PRIMARY_REQUIRED(const uptr, RegionSizeLog)
63
64// Conceptually, a region will be divided into groups based on the address
65// range. Each allocation consumes blocks in the same group until exhaustion
66// then it pops out blocks in a new group. Therefore, `GroupSizeLog` is always
67// smaller or equal to `RegionSizeLog`. Note that `GroupSizeLog` needs to be
68// equal to `RegionSizeLog` for SizeClassAllocator32 because of certain
69// constraints.
70PRIMARY_REQUIRED(const uptr, GroupSizeLog)
71
72// Call map for user memory with at least this size. Only used with primary64.
73PRIMARY_REQUIRED(const uptr, MapSizeIncrement)
74
75// Defines the minimal & maximal release interval that can be set.
76PRIMARY_REQUIRED(const s32, MinReleaseToOsIntervalMs)
77PRIMARY_REQUIRED(const s32, MaxReleaseToOsIntervalMs)
78
79// PRIMARY_OPTIONAL(TYPE, NAME, DEFAULT)
80//
81// The scale of a compact pointer. E.g., Ptr = Base + (CompactPtr << Scale).
82PRIMARY_OPTIONAL(const uptr, CompactPtrScale, SCUDO_MIN_ALIGNMENT_LOG)
83
84// Indicates support for offsetting the start of a region by a random number of
85// pages. This is only used if `EnableContiguousRegions` is enabled.
86PRIMARY_OPTIONAL(const bool, EnableRandomOffset, false)
87PRIMARY_OPTIONAL(const s32, DefaultReleaseToOsIntervalMs, INT32_MIN)
88
89// When `EnableContiguousRegions` is true, all regions will be be arranged in
90// adjacency. This will reduce the fragmentation caused by region allocations
91// but may require a huge amount of contiguous pages at initialization.
92PRIMARY_OPTIONAL(const bool, EnableContiguousRegions, true)
93
94// PRIMARY_OPTIONAL_TYPE(NAME, DEFAULT)
95//
96// Use condition variable to shorten the waiting time of refillment of
97// freelist. Note that this depends on the implementation of condition
98// variable on each platform and the performance may vary so that it does not
99// guarantee a performance benefit.
100PRIMARY_OPTIONAL_TYPE(ConditionVariableT, ConditionVariableDummy)
101
102// Defines the type and scale of a compact pointer. A compact pointer can
103// be understood as the offset of a pointer within the region it belongs
104// to, in increments of a power-of-2 scale. See `CompactPtrScale` also.
105PRIMARY_OPTIONAL_TYPE(CompactPtrT, uptr)
106
107// SECONDARY_REQUIRED_TEMPLATE_TYPE(NAME)
108//
109// Defines the type of Secondary Cache to use.
110SECONDARY_REQUIRED_TEMPLATE_TYPE(CacheT)
111
112// SECONDARY_CACHE_OPTIONAL(TYPE, NAME, DEFAULT)
113//
114// Defines the type of cache used by the Secondary. Some additional
115// configuration entries can be necessary depending on the Cache.
116SECONDARY_CACHE_OPTIONAL(const u32, EntriesArraySize, 0)
117SECONDARY_CACHE_OPTIONAL(const u32, QuarantineSize, 0)
118SECONDARY_CACHE_OPTIONAL(const u32, DefaultMaxEntriesCount, 0)
119SECONDARY_CACHE_OPTIONAL(const uptr, DefaultMaxEntrySize, 0)
120SECONDARY_CACHE_OPTIONAL(const s32, MinReleaseToOsIntervalMs, INT32_MIN)
121SECONDARY_CACHE_OPTIONAL(const s32, MaxReleaseToOsIntervalMs, INT32_MAX)
122SECONDARY_CACHE_OPTIONAL(const s32, DefaultReleaseToOsIntervalMs, INT32_MIN)
123
124#undef SECONDARY_CACHE_OPTIONAL
125#undef SECONDARY_REQUIRED_TEMPLATE_TYPE
126#undef PRIMARY_OPTIONAL_TYPE
127#undef PRIMARY_OPTIONAL
128#undef PRIMARY_REQUIRED
129#undef PRIMARY_REQUIRED_TYPE
130#undef BASE_OPTIONAL
131#undef BASE_REQUIRED_TEMPLATE_TYPE
132