@@ -118,39 +118,76 @@ struct AsanMapUnmapCallback {
118
118
void OnUnmap (uptr p, uptr size) const ;
119
119
};
120
120
121
- #if SANITIZER_CAN_USE_ALLOCATOR64
121
+ #if defined(__aarch64__)
122
+ // AArch64 supports 39, 42 and 48-bit VMA.
123
+ const uptr kAllocatorSpace = ~(uptr)0 ;
124
+ #if SANITIZER_ANDROID
125
+ const uptr kAllocatorSize = 0x2000000000ULL ; // 128G.
126
+ typedef VeryCompactSizeClassMap SizeClassMap64;
127
+ #else
128
+ const uptr kAllocatorSize = 0x40000000000ULL ; // 4T.
129
+ typedef DefaultSizeClassMap SizeClassMap64;
130
+ #endif
131
+
132
+ template <typename AddressSpaceViewTy>
133
+ struct AP64 { // Allocator64 parameters. Deliberately using a short name.
134
+ static const uptr kSpaceBeg = kAllocatorSpace ;
135
+ static const uptr kSpaceSize = kAllocatorSize ;
136
+ static const uptr kMetadataSize = 0 ;
137
+ typedef __asan::SizeClassMap64 SizeClassMap;
138
+ typedef AsanMapUnmapCallback MapUnmapCallback;
139
+ static const uptr kFlags = 0 ;
140
+ using AddressSpaceView = AddressSpaceViewTy;
141
+ };
142
+ template <typename AddressSpaceView>
143
+ using Allocator64ASVT = SizeClassAllocator64<AP64<AddressSpaceView>>;
144
+ using Allocator64 = Allocator64ASVT<LocalAddressSpaceView>;
145
+
146
+ typedef CompactSizeClassMap SizeClassMap32;
147
+ template <typename AddressSpaceViewTy>
148
+ struct AP32 {
149
+ static const uptr kSpaceBeg = 0 ;
150
+ static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;
151
+ static const uptr kMetadataSize = 16 ;
152
+ typedef __asan::SizeClassMap32 SizeClassMap;
153
+ static const uptr kRegionSizeLog = 20 ;
154
+ using AddressSpaceView = AddressSpaceViewTy;
155
+ typedef AsanMapUnmapCallback MapUnmapCallback;
156
+ static const uptr kFlags = 0 ;
157
+ };
158
+ template <typename AddressSpaceView>
159
+ using Allocator32ASVT = SizeClassAllocator32<AP32<AddressSpaceView>>;
160
+ using Allocator32 = Allocator32ASVT<LocalAddressSpaceView>;
161
+ using Allocator32or64 = RuntimeSelectAllocator<Allocator32, Allocator64>;
162
+
163
+ static const uptr kMaxNumberOfSizeClasses =
164
+ SizeClassMap32::kNumClasses < SizeClassMap64::kNumClasses
165
+ ? SizeClassMap64::kNumClasses
166
+ : SizeClassMap32::kNumClasses ;
167
+
168
+ template <typename AddressSpaceView>
169
+ using PrimaryAllocatorASVT =
170
+ RuntimeSelectAllocator<Allocator32ASVT<AddressSpaceView>,
171
+ Allocator64ASVT<AddressSpaceView>>;
172
+ #elif SANITIZER_CAN_USE_ALLOCATOR64
122
173
# if SANITIZER_FUCHSIA
123
174
const uptr kAllocatorSpace = ~(uptr)0 ;
124
175
const uptr kAllocatorSize = 0x40000000000ULL ; // 4T.
125
- typedef DefaultSizeClassMap SizeClassMap;
126
176
# elif defined(__powerpc64__)
127
177
const uptr kAllocatorSpace = ~(uptr)0 ;
128
178
const uptr kAllocatorSize = 0x20000000000ULL ; // 2T.
129
- typedef DefaultSizeClassMap SizeClassMap;
130
- # elif defined(__aarch64__) && SANITIZER_ANDROID
131
- // Android needs to support 39, 42 and 48 bit VMA.
132
- const uptr kAllocatorSpace = ~(uptr)0 ;
133
- const uptr kAllocatorSize = 0x2000000000ULL ; // 128G.
134
- typedef VeryCompactSizeClassMap SizeClassMap;
135
- # elif defined(__aarch64__)
136
- // AArch64/SANITIZER_CAN_USE_ALLOCATOR64 is only for 42-bit VMA
137
- // so no need to different values for different VMA.
138
- const uptr kAllocatorSpace = 0x10000000000ULL ;
139
- const uptr kAllocatorSize = 0x10000000000ULL ; // 3T.
140
- typedef DefaultSizeClassMap SizeClassMap;
141
- #elif defined(__sparc__)
179
+ # elif defined(__sparc__)
142
180
const uptr kAllocatorSpace = ~(uptr)0 ;
143
181
const uptr kAllocatorSize = 0x20000000000ULL ; // 2T.
144
- typedef DefaultSizeClassMap SizeClassMap;
145
182
# elif SANITIZER_WINDOWS
146
183
const uptr kAllocatorSpace = ~(uptr)0 ;
147
184
const uptr kAllocatorSize = 0x8000000000ULL ; // 500G
148
- typedef DefaultSizeClassMap SizeClassMap;
149
185
# else
150
186
const uptr kAllocatorSpace = 0x600000000000ULL ;
151
187
const uptr kAllocatorSize = 0x40000000000ULL ; // 4T.
152
- typedef DefaultSizeClassMap SizeClassMap;
153
188
# endif
189
+ typedef DefaultSizeClassMap SizeClassMap;
190
+ static const uptr kMaxNumberOfSizeClasses = SizeClassMap::kNumClasses ;
154
191
template <typename AddressSpaceViewTy>
155
192
struct AP64 { // Allocator64 parameters. Deliberately using a short name.
156
193
static const uptr kSpaceBeg = kAllocatorSpace ;
@@ -164,9 +201,9 @@ struct AP64 { // Allocator64 parameters. Deliberately using a short name.
164
201
165
202
template <typename AddressSpaceView>
166
203
using PrimaryAllocatorASVT = SizeClassAllocator64<AP64<AddressSpaceView>>;
167
- using PrimaryAllocator = PrimaryAllocatorASVT<LocalAddressSpaceView>;
168
204
#else // Fallback to SizeClassAllocator32.
169
205
typedef CompactSizeClassMap SizeClassMap;
206
+ static const uptr kMaxNumberOfSizeClasses = SizeClassMap::kNumClasses ;
170
207
template <typename AddressSpaceViewTy>
171
208
struct AP32 {
172
209
static const uptr kSpaceBeg = 0 ;
@@ -180,16 +217,14 @@ struct AP32 {
180
217
};
181
218
template <typename AddressSpaceView>
182
219
using PrimaryAllocatorASVT = SizeClassAllocator32<AP32<AddressSpaceView> >;
183
- using PrimaryAllocator = PrimaryAllocatorASVT<LocalAddressSpaceView>;
184
220
#endif // SANITIZER_CAN_USE_ALLOCATOR64
185
221
186
- static const uptr kNumberOfSizeClasses = SizeClassMap::kNumClasses ;
187
-
188
222
template <typename AddressSpaceView>
189
223
using AsanAllocatorASVT =
190
224
CombinedAllocator<PrimaryAllocatorASVT<AddressSpaceView>>;
191
225
using AsanAllocator = AsanAllocatorASVT<LocalAddressSpaceView>;
192
226
using AllocatorCache = AsanAllocator::AllocatorCache;
227
+ using PrimaryAllocator = PrimaryAllocatorASVT<LocalAddressSpaceView>;
193
228
194
229
struct AsanThreadLocalMallocStorage {
195
230
uptr quarantine_cache[16 ];
@@ -226,5 +261,7 @@ void asan_mz_force_unlock();
226
261
void PrintInternalAllocatorStats ();
227
262
void AsanSoftRssLimitExceededCallback (bool exceeded);
228
263
264
+ AsanAllocator &get_allocator ();
265
+
229
266
} // namespace __asan
230
267
#endif // ASAN_ALLOCATOR_H
0 commit comments