forked from OSchip/llvm-project
[scudo] [GWP-ASan] Add GWP-ASan variant of scudo benchmarks.
GWP-ASan is the "production" variant as compiled by compiler-rt, and it's useful to be able to benchmark changes in GWP-ASan or Scudo's GWP-ASan hooks across versions. GWP-ASan is sampled, and sampled allocations are much slower, but given the amount of allocations that happen under test here - we actually get a reasonable representation of GWP-ASan's negligent performance impact between runs. Reviewed By: cryptoad Differential Revision: https://reviews.llvm.org/D101865
This commit is contained in:
parent
18f3a14e13
commit
8936608e6f
|
@ -18,4 +18,16 @@ foreach(arch ${SCUDO_STANDALONE_SUPPORTED_ARCH})
|
|||
$<TARGET_OBJECTS:RTScudoStandalone.${arch}>)
|
||||
set_property(TARGET ScudoBenchmarks.${arch} APPEND_STRING PROPERTY
|
||||
COMPILE_FLAGS "${SCUDO_BENCHMARK_CFLAGS}")
|
||||
|
||||
if (COMPILER_RT_HAS_GWP_ASAN)
|
||||
add_benchmark(
|
||||
ScudoBenchmarksWithGwpAsan.${arch} malloc_benchmark.cpp
|
||||
$<TARGET_OBJECTS:RTScudoStandalone.${arch}>
|
||||
$<TARGET_OBJECTS:RTGwpAsan.${arch}>
|
||||
$<TARGET_OBJECTS:RTGwpAsanBacktraceLibc.${arch}>
|
||||
$<TARGET_OBJECTS:RTGwpAsanSegvHandler.${arch}>)
|
||||
set_property(
|
||||
TARGET ScudoBenchmarksWithGwpAsan.${arch} APPEND_STRING PROPERTY
|
||||
COMPILE_FLAGS "${SCUDO_BENCHMARK_CFLAGS} -DGWP_ASAN_HOOKS")
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
@ -13,15 +13,22 @@
|
|||
#include "benchmark/benchmark.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
void *CurrentAllocator;
|
||||
template <typename Config> void PostInitCallback() {
|
||||
reinterpret_cast<scudo::Allocator<Config> *>(CurrentAllocator)->initGwpAsan();
|
||||
}
|
||||
|
||||
template <typename Config> static void BM_malloc_free(benchmark::State &State) {
|
||||
using AllocatorT = scudo::Allocator<Config>;
|
||||
using AllocatorT = scudo::Allocator<Config, PostInitCallback<Config>>;
|
||||
auto Deleter = [](AllocatorT *A) {
|
||||
A->unmapTestOnly();
|
||||
delete A;
|
||||
};
|
||||
std::unique_ptr<AllocatorT, decltype(Deleter)> Allocator(new AllocatorT,
|
||||
Deleter);
|
||||
CurrentAllocator = Allocator.get();
|
||||
Allocator->reset();
|
||||
|
||||
const size_t NBytes = State.range(0);
|
||||
|
@ -55,18 +62,19 @@ BENCHMARK_TEMPLATE(BM_malloc_free, scudo::FuchsiaConfig)
|
|||
|
||||
template <typename Config>
|
||||
static void BM_malloc_free_loop(benchmark::State &State) {
|
||||
using AllocatorT = scudo::Allocator<Config>;
|
||||
using AllocatorT = scudo::Allocator<Config, PostInitCallback<Config>>;
|
||||
auto Deleter = [](AllocatorT *A) {
|
||||
A->unmapTestOnly();
|
||||
delete A;
|
||||
};
|
||||
std::unique_ptr<AllocatorT, decltype(Deleter)> Allocator(new AllocatorT,
|
||||
Deleter);
|
||||
CurrentAllocator = Allocator.get();
|
||||
Allocator->reset();
|
||||
|
||||
const size_t NumIters = State.range(0);
|
||||
size_t PageSize = scudo::getPageSizeCached();
|
||||
void *Ptrs[NumIters];
|
||||
std::vector<void *> Ptrs(NumIters);
|
||||
|
||||
for (auto _ : State) {
|
||||
size_t SizeLog2 = 0;
|
||||
|
|
|
@ -51,8 +51,7 @@ public:
|
|||
typedef typename Params::template TSDRegistryT<ThisT> TSDRegistryT;
|
||||
|
||||
void callPostInitCallback() {
|
||||
static pthread_once_t OnceControl = PTHREAD_ONCE_INIT;
|
||||
pthread_once(&OnceControl, PostInitCallback);
|
||||
pthread_once(&PostInitNonce, PostInitCallback);
|
||||
}
|
||||
|
||||
struct QuarantineCallback {
|
||||
|
@ -952,6 +951,7 @@ private:
|
|||
SecondaryT Secondary;
|
||||
QuarantineT Quarantine;
|
||||
TSDRegistryT TSDRegistry;
|
||||
pthread_once_t PostInitNonce = PTHREAD_ONCE_INIT;
|
||||
|
||||
#ifdef GWP_ASAN_HOOKS
|
||||
gwp_asan::GuardedPoolAllocator GuardedAlloc;
|
||||
|
|
Loading…
Reference in New Issue