blob: 7d2e4828624e05631ecdd0881cfd82da89d0d356 [file]
//===-- Benchmark function -----------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "LibcBenchmark.h"
#include "llvm/ADT/StringRef.h"
#ifdef LIBC_BENCHMARKS_HAS_LLVM_SUPPORT
#include "llvm/TargetParser/Host.h"
#endif
namespace llvm {
namespace libc_benchmarks {
void checkRequirements() {
const auto &CpuInfo = benchmark::CPUInfo::Get();
if (CpuInfo.scaling == benchmark::CPUInfo::ENABLED)
report_fatal_error(
"CPU scaling is enabled, the benchmark real time measurements may be "
"noisy and will incur extra overhead.");
}
HostState HostState::get() {
const auto &cpu_info = benchmark::CPUInfo::Get();
HostState h;
h.cpu_frequency = cpu_info.cycles_per_second;
#ifdef LIBC_BENCHMARKS_HAS_LLVM_SUPPORT
h.cpu_name = llvm::sys::getHostCPUName().str();
#else
h.cpu_name = "";
#endif
for (const auto &benchmark_cache_info : cpu_info.caches) {
CacheInfo ci;
ci.type = benchmark_cache_info.type;
ci.level = benchmark_cache_info.level;
ci.size = benchmark_cache_info.size;
ci.num_sharing = benchmark_cache_info.num_sharing;
h.caches.push_back(std::move(ci));
}
return h;
}
} // namespace libc_benchmarks
} // namespace llvm
#ifndef LIBC_BENCHMARKS_HAS_LLVM_SUPPORT
#include "llvm/ADT/Twine.h"
#include <cstdlib>
#include <iostream>
#include <string_view>
#if __has_include(<execinfo.h>)
#include <execinfo.h>
#include <unistd.h>
#endif
namespace llvm {
[[noreturn]] void report_fatal_error(std::string_view reason,
bool gen_crash_diag) {
std::cerr << "Fatal error: " << reason << std::endl;
#if __has_include(<execinfo.h>)
if (gen_crash_diag) {
void *buffer[64]{};
int nptrs = ::backtrace(buffer, 64);
::backtrace_symbols_fd(buffer, nptrs, STDERR_FILENO);
}
#endif
std::abort();
}
[[noreturn]] void report_fatal_error(StringRef reason, bool gen_crash_diag) {
report_fatal_error(std::string_view(reason.data(), reason.size()),
gen_crash_diag);
}
[[noreturn]] void report_fatal_error(const Twine &reason, bool gen_crash_diag) {
report_fatal_error("(unknown twine error)", gen_crash_diag);
}
} // namespace llvm
#endif