Skip to content

Commit

Permalink
[scudo][standalone] Introduce the combined allocator
Browse files Browse the repository at this point in the history
Summary:
The Combined allocator hold together all the other components, and
provides a memory allocator interface based on various template
parameters. This will be in turn used by "wrappers" that will provide
the standard C and C++ memory allocation functions, but can be
used as is as well.

This doesn't depart significantly from the current Scudo implementation
except for a few details:
- Quarantine batches are now protected by a header a well;
- an Allocator instance has its own TSD registry, as opposed to a
  static one for everybody;
- a function to iterate over busy chunks has been added, for Android
  purposes;

This also adds the associated tests, and a few default configurations
for several platforms, that will likely be further tuned later on.

Reviewers: morehouse, hctim, eugenis, vitalybuka

Reviewed By: morehouse

Subscribers: srhines, mgorny, delcypher, jfb, #sanitizers, llvm-commits

Tags: #llvm, #sanitizers

Differential Revision: https://reviews.llvm.org/D63231

llvm-svn: 363569
  • Loading branch information
Kostya Kortchinsky committed Jun 17, 2019
1 parent b5ce4e5 commit e4eadf1
Show file tree
Hide file tree
Showing 5 changed files with 870 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler-rt/lib/scudo/standalone/CMakeLists.txt
Expand Up @@ -57,10 +57,12 @@ if (COMPILER_RT_HAS_MCRC_FLAG)
endif()

set(SCUDO_HEADERS
allocator_config.h
atomic_helpers.h
bytemap.h
checksum.h
chunk.h
combined.h
flags.h
flags_parser.h
fuchsia.h
Expand Down
80 changes: 80 additions & 0 deletions compiler-rt/lib/scudo/standalone/allocator_config.h
@@ -0,0 +1,80 @@
//===-- allocator_config.h --------------------------------------*- 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
//
//===----------------------------------------------------------------------===//

#ifndef SCUDO_ALLOCATOR_CONFIG_H_
#define SCUDO_ALLOCATOR_CONFIG_H_

#include "combined.h"
#include "common.h"
#include "flags.h"
#include "primary32.h"
#include "primary64.h"
#include "size_class_map.h"
#include "tsd_exclusive.h"
#include "tsd_shared.h"

namespace scudo {

// Default configurations for various platforms.

struct DefaultConfig {
using SizeClassMap = DefaultSizeClassMap;
#if SCUDO_CAN_USE_PRIMARY64
// 1GB Regions
typedef SizeClassAllocator64<SizeClassMap, 30U> Primary;
#else
// 512KB regions
typedef SizeClassAllocator32<SizeClassMap, 19U> Primary;
#endif
template <class A> using TSDRegistryT = TSDRegistryExT<A>; // Exclusive
};

struct AndroidConfig {
using SizeClassMap = AndroidSizeClassMap;
#if SCUDO_CAN_USE_PRIMARY64
// 1GB regions
typedef SizeClassAllocator64<SizeClassMap, 30U> Primary;
#else
// 512KB regions
typedef SizeClassAllocator32<SizeClassMap, 19U> Primary;
#endif
template <class A>
using TSDRegistryT = TSDRegistrySharedT<A, 2U>; // Shared, max 2 TSDs.
};

struct AndroidSvelteConfig {
using SizeClassMap = SvelteSizeClassMap;
#if SCUDO_CAN_USE_PRIMARY64
// 512MB regions
typedef SizeClassAllocator64<SizeClassMap, 29U> Primary;
#else
// 256KB regions
typedef SizeClassAllocator32<SizeClassMap, 18U> Primary;
#endif
template <class A>
using TSDRegistryT = TSDRegistrySharedT<A, 1U>; // Shared, only 1 TSD.
};

struct FuchsiaConfig {
// 1GB Regions
typedef SizeClassAllocator64<DefaultSizeClassMap, 30U> Primary;
template <class A>
using TSDRegistryT = TSDRegistrySharedT<A, 8U>; // Shared, max 8 TSDs.
};

#if SCUDO_ANDROID
typedef AndroidConfig Config;
#elif SCUDO_FUCHSIA
typedef FuchsiaConfig Config;
#else
typedef DefaultConfig Config;
#endif

} // namespace scudo

#endif // SCUDO_ALLOCATOR_CONFIG_H_

0 comments on commit e4eadf1

Please sign in to comment.