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