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_OPTIONAL
35#define SECONDARY_OPTIONAL(...)
36#endif
37#ifndef SECONDARY_CACHE_OPTIONAL
38#define SECONDARY_CACHE_OPTIONAL(...)
39#endif
40
41// BASE_REQUIRED_TEMPLATE_TYPE(NAME)
42//
43// Thread-Specific Data Registry used, shared or exclusive.
44BASE_REQUIRED_TEMPLATE_TYPE(TSDRegistryT)
45
46// Defines the type of Primary allocator to use.
47BASE_REQUIRED_TEMPLATE_TYPE(PrimaryT)
48
49// Defines the type of Secondary allocator to use.
50BASE_REQUIRED_TEMPLATE_TYPE(SecondaryT)
51
52// BASE_OPTIONAL(TYPE, NAME, DEFAULT)
53//
54// Indicates possible support for Memory Tagging.
55BASE_OPTIONAL(const bool, MaySupportMemoryTagging, false)
56
57// Disable the quarantine code.
58BASE_OPTIONAL(const bool, QuarantineDisabled, false)
59
60// If set to true, malloc_usable_size returns the exact size of the allocation.
61// If set to false, return the total available size in the allocation.
62BASE_OPTIONAL(const bool, ExactUsableSize, true)
63
64#if SCUDO_FUCHSIA
65// Writes zeros to the memory slot when a allocation is returned to
66// the allocator. This decommits memory on operating systems that
67// detects pages full of zero."
68BASE_OPTIONAL(const bool, EnableZeroOnDealloc, false)
69#endif
70
71// Abort if there is a mismatch between the function type that allocates memory
72// and the function type that deallocates memory.
73// These conditions will abort with an error message:
74// new/any C free operation
75// any C allocation operation/any delete operation
76// new/delete[]
77// new[]/delete
78// aligned alloc/free_sized
79// non-aligned alloc/free_aligned_sized
80BASE_OPTIONAL(const bool, AbortOnDeallocTypeMismatch, true)
81
82// Abort if there is free function that takes a size value but that size
83// does not match the allocation size.
84BASE_OPTIONAL(const bool, AbortOnDeallocSizeMismatch, true)
85
86// Abort if there is free function that takes an alignment value but that
87// alignment does not match the allocation alignment.
88BASE_OPTIONAL(const bool, AbortOnDeallocAlignmentMismatch, true)
89
90// PRIMARY_REQUIRED_TYPE(NAME)
91//
92// SizeClassMap to use with the Primary.
93PRIMARY_REQUIRED_TYPE(SizeClassMap)
94
95// PRIMARY_REQUIRED(TYPE, NAME)
96//
97// Log2 of the size of a size class region, as used by the Primary.
98PRIMARY_REQUIRED(const uptr, RegionSizeLog)
99
100// Conceptually, a region will be divided into groups based on the address
101// range. Each allocation consumes blocks in the same group until exhaustion
102// then it pops out blocks in a new group. Therefore, `GroupSizeLog` is always
103// smaller or equal to `RegionSizeLog`. Note that `GroupSizeLog` needs to be
104// equal to `RegionSizeLog` for SizeClassAllocator32 because of certain
105// constraints.
106PRIMARY_REQUIRED(const uptr, GroupSizeLog)
107
108// Call map for user memory with at least this size. Only used with primary64.
109PRIMARY_REQUIRED(const uptr, MapSizeIncrement)
110
111// Defines the minimal & maximal release interval that can be set.
112PRIMARY_REQUIRED(const s32, MinReleaseToOsIntervalMs)
113PRIMARY_REQUIRED(const s32, MaxReleaseToOsIntervalMs)
114
115// PRIMARY_OPTIONAL(TYPE, NAME, DEFAULT)
116//
117
118// Enables/disables primary block caching. Batch class still caches.
119PRIMARY_OPTIONAL(const bool, EnableBlockCache, true)
120
121// The scale of a compact pointer. E.g., Ptr = Base + (CompactPtr << Scale).
122PRIMARY_OPTIONAL(const uptr, CompactPtrScale, SCUDO_MIN_ALIGNMENT_LOG)
123
124// Indicates support for offsetting the start of a region by a random number of
125// pages. This is only used if `EnableContiguousRegions` is enabled.
126PRIMARY_OPTIONAL(const bool, EnableRandomOffset, false)
127PRIMARY_OPTIONAL(const s32, DefaultReleaseToOsIntervalMs, INT32_MIN)
128
129// When `EnableContiguousRegions` is true, all regions will be be arranged in
130// adjacency. This will reduce the fragmentation caused by region allocations
131// but may require a huge amount of contiguous pages at initialization.
132PRIMARY_OPTIONAL(const bool, EnableContiguousRegions, true)
133
134// PRIMARY_OPTIONAL_TYPE(NAME, DEFAULT)
135//
136// Use condition variable to shorten the waiting time of refillment of
137// freelist. Note that this depends on the implementation of condition
138// variable on each platform and the performance may vary so that it does not
139// guarantee a performance benefit.
140PRIMARY_OPTIONAL_TYPE(ConditionVariableT, ConditionVariableDummy)
141
142// Defines the type and scale of a compact pointer. A compact pointer can
143// be understood as the offset of a pointer within the region it belongs
144// to, in increments of a power-of-2 scale. See `CompactPtrScale` also.
145PRIMARY_OPTIONAL_TYPE(CompactPtrT, uptr)
146
147// SECONDARY_REQUIRED_TEMPLATE_TYPE(NAME)
148//
149// Defines the type of Secondary Cache to use.
150SECONDARY_REQUIRED_TEMPLATE_TYPE(CacheT)
151
152// SECONDARY_OPTIONAL(TYPE, NAME, DEFAULT)
153//
154// Add one guard page at the front and back for each allocation.
155SECONDARY_OPTIONAL(const bool, EnableGuardPages, true)
156
157// SECONDARY_CACHE_OPTIONAL(TYPE, NAME, DEFAULT)
158//
159// Defines the type of cache used by the Secondary. Some additional
160// configuration entries can be necessary depending on the Cache.
161SECONDARY_CACHE_OPTIONAL(const u32, EntriesArraySize, 0)
162SECONDARY_CACHE_OPTIONAL(const u32, QuarantineSize, 0)
163SECONDARY_CACHE_OPTIONAL(const u32, DefaultMaxEntriesCount, 0)
164SECONDARY_CACHE_OPTIONAL(const uptr, DefaultMaxEntrySize, 0)
165SECONDARY_CACHE_OPTIONAL(const s32, MinReleaseToOsIntervalMs, INT32_MIN)
166SECONDARY_CACHE_OPTIONAL(const s32, MaxReleaseToOsIntervalMs, INT32_MAX)
167SECONDARY_CACHE_OPTIONAL(const s32, DefaultReleaseToOsIntervalMs, INT32_MIN)
168
169#undef SECONDARY_CACHE_OPTIONAL
170#undef SECONDARY_OPTIONAL
171#undef SECONDARY_REQUIRED_TEMPLATE_TYPE
172#undef PRIMARY_OPTIONAL_TYPE
173#undef PRIMARY_OPTIONAL
174#undef PRIMARY_REQUIRED
175#undef PRIMARY_REQUIRED_TYPE
176#undef BASE_OPTIONAL
177#undef BASE_REQUIRED_TEMPLATE_TYPE
178