blob: 57ffd2103a74dfab74ef354c7ed49716f53d50c3 [file] [log] [blame]
// Copyright 2025 The BoringSSL Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef OPENSSL_HEADER_BENCH_BENCH_H
#define OPENSSL_HEADER_BENCH_BENCH_H
#include <stdint.h>
#include <benchmark/benchmark.h>
#include <openssl/base.h>
#include <openssl/span.h>
BSSL_NAMESPACE_BEGIN
namespace bench {
// Register a function to register benchmarks after the runtime flags are
// parsed.
//
// It is recommended to use |BSSL_BENCH_LAZY_REGISTER| for the registration,
// so that you do not have to manually wire up static initialisation with
// this function.
int RegisterBenchmark(void (*handle)());
#define BSSL_BENCH_MERGE(a, b) a##b
#define BSSL_BENCH_LABEL(a, unique) BSSL_BENCH_MERGE(a, unique)
#define BSSL_UNIQUE_NAME(a) BSSL_BENCH_LABEL(a, __LINE__)
#define BSSL_BENCH_LAZY_REGISTER_INNER(func_name, token_name) \
void func_name(); \
static int token_name = bssl::bench::RegisterBenchmark(func_name); \
void func_name()
// Lazy registration of benchmark.
//
// This macro expands into registration that resolves after runtime flag
// parsing.
// Example:
// BSSL_BENCH_LAZY_REGISTER() {
// BENCHMARK(BM_MyBench)->Apply(SetThreads);
// // Now BM_MyBench is properly configured with a number of threads
// // as instructed by the `--threads` flag.
// }
#define BSSL_BENCH_LAZY_REGISTER() \
BSSL_BENCH_LAZY_REGISTER_INNER(BSSL_UNIQUE_NAME(Register), \
BSSL_UNIQUE_NAME(register_token))
// Override thread count in parallel tests using the `--threads` flag.
// *Note* that benchmarks must be instantiated after the main function.
// Otherwise, it will default to the number of available CPUs.
//
// This function can only be used in the context of |BSSL_BENCH_LAZY_REGISTER|.
// Otherwise, the benchmark will be aborted.
void SetThreads(benchmark::internal::Benchmark *bench);
// For benchmark registration, get the input size from the runtime flag.
// This is an interim solution, until the next `google/benchmark` release,
// which contains https://github.com/google/benchmark/pull/2073.
//
// This function can only be used in the context of |BSSL_BENCH_LAZY_REGISTER|.
// Otherwise, the benchmark will be aborted.
Span<const int64_t> GetInputSizes(benchmark::internal::Benchmark *bench);
} // namespace bench
BSSL_NAMESPACE_END
#endif // OPENSSL_HEADER_BENCH_BENCH_H