//===- bolt/Profile/DataAggregator.h - Perf data aggregator -----*- 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 // //===----------------------------------------------------------------------===// // // This family of functions reads profile data written by perf record, // aggregates it and then writes it back to an output file. // //===----------------------------------------------------------------------===// #ifndef BOLT_PROFILE_DATA_AGGREGATOR_H #define BOLT_PROFILE_DATA_AGGREGATOR_H #include "bolt/Profile/DataReader.h" #include "bolt/Profile/YAMLProfileWriter.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" #include "llvm/Support/Program.h" #include <unordered_map> namespace llvm { namespace bolt { class BinaryFunction; class BinaryContext; class BoltAddressTranslation; /// DataAggregator inherits all parsing logic from DataReader as well as /// its data structures used to represent aggregated profile data in memory. /// /// The aggregator works by dispatching two separate perf-script jobs that /// read perf samples and perf task annotations. Later, we read the output /// files to extract information about which PID was used for this binary. /// With the PID, we filter the samples and extract all LBR entries. /// /// To aggregate LBR entries, we rely on a BinaryFunction map to locate the /// original function where the event happened. Then, we convert a raw address /// to an offset relative to the start of this function and aggregate branch /// information for each function. /// /// This must be coordinated with RewriteInstance so we have BinaryFunctions in /// State::Disassembled. After this state, BinaryFunction will drop the /// instruction map with original addresses we rely on to validate the traces /// found in the LBR. /// /// The last step is to write the aggregated data to disk in the output file /// specified by the user. class DataAggregator : public DataReader { … }; } // namespace bolt } // namespace llvm #endif