//===-- 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 #include #include #if __has_include() #include #include #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() 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