17e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 27e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Use of this source code is governed by a BSD-style license that can be 37e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// found in the LICENSE file. 47e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 57e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#ifndef CHROMIUMOS_WIDE_PROFILING_PERF_PARSER_H_ 67e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#define CHROMIUMOS_WIDE_PROFILING_PERF_PARSER_H_ 77e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 87e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <stdint.h> 97e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 107e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <map> 117e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <set> 127e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <string> 137e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <utility> 147e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <vector> 157e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 167e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "base/macros.h" 177e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 187e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "perf_reader.h" 197e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "perf_utils.h" 207e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 217e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshnamespace quipper { 227e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 237e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshclass AddressMapper; 247e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 257e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// A struct containing all relevant info for a mapped DSO, independent of any 267e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// samples. 277e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshstruct DSOInfo { 287e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh string name; 297e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh string build_id; 307e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 317e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Comparator that allows this to be stored in a STL set. 327e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool operator<(const DSOInfo& other) const { 337e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (name == other.name) 347e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return build_id < other.build_id; 357e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return name < other.name; 367e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 377e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh}; 387e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 397e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshstruct ParsedEvent { 407e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // TODO(sque): Turn this struct into a class to privatize member variables. 417e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh ParsedEvent() : command_(NULL) {} 427e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 437e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Stores address of an event_t owned by the |PerfReader::events_| vector. 447e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh event_t* raw_event; 457e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 467e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // For mmap events, use this to count the number of samples that are in this 477e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // region. 487e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_samples_in_mmap_region; 497e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 507e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Command associated with this sample. 517e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const string* command_; 527e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 537e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Accessor for command string. 547e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const string command() const { 557e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (command_) 567e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return *command_; 577e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return string(); 587e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 597e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 607e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh void set_command(const string* command) { 617e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh command_ = command; 627e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 637e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 647e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // A struct that contains a DSO + offset pair. 657e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh struct DSOAndOffset { 667e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const DSOInfo* dso_info_; 677e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t offset_; 687e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 697e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Accessor methods. 707e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const string dso_name() const { 717e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (dso_info_) 727e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return dso_info_->name; 737e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return string(); 747e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 757e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const string build_id() const { 767e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (dso_info_) 777e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return dso_info_->build_id; 787e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return string(); 797e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 807e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t offset() const { 817e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return offset_; 827e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 837e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 847e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh DSOAndOffset() : dso_info_(NULL), 857e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh offset_(0) {} 867e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } dso_and_offset; 877e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 887e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // DSO+offset info for callchain. 897e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::vector<DSOAndOffset> callchain; 907e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 917e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // DSO + offset info for branch stack entries. 927e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh struct BranchEntry { 937e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool predicted; 947e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh DSOAndOffset from; 957e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh DSOAndOffset to; 967e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh }; 977e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::vector<BranchEntry> branch_stack; 987e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh}; 997e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1007e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshstruct PerfEventStats { 1017e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Number of each type of event. 1027e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_sample_events; 1037e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_mmap_events; 1047e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_comm_events; 1057e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_fork_events; 1067e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_exit_events; 1077e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1087e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Number of sample events that were successfully mapped using the address 1097e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // mapper. The mapping is recorded regardless of whether the address in the 1107e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // perf sample event itself was assigned the remapped address. The latter is 1117e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // indicated by |did_remap|. 1127e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t num_sample_events_mapped; 1137e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1147e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Whether address remapping was enabled during event parsing. 1157e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool did_remap; 1167e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh}; 1177e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1187e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshclass PerfParser : public PerfReader { 1197e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh public: 1207e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh PerfParser(); 1217e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh ~PerfParser(); 1227e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1237e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh struct Options { 1247e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // For synthetic address mapping. 1257e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool do_remap = false; 1267e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Set this flag to discard non-sample events that don't have any associated 1277e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // sample events. e.g. MMAP regions with no samples in them. 1287e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool discard_unused_events = false; 1297e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // When mapping perf sample events, at least this percentage of them must be 1307e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // successfully mapped in order for ProcessEvents() to return true. 1317e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // By default, most samples must be properly mapped in order for sample 1327e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // mapping to be considered successful. 1337e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh float sample_mapping_percentage_threshold = 95.0f; 1347e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh }; 1357e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1367e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Constructor that takes in options at PerfParser creation time. 1377e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh explicit PerfParser(const Options& options); 1387e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1397e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Pass in a struct containing various options. 1407e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh void set_options(const Options& options); 1417e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1427e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Gets parsed event/sample info from raw event data. 1437e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool ParseRawEvents(); 1447e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1457e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const std::vector<ParsedEvent>& parsed_events() const { 1467e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return parsed_events_; 1477e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 1487e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1497e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Returns an array of pointers to |parsed_events_| sorted by sample time. 1507e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // The first time this is called, it will create the sorted array. 1517e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const std::vector<ParsedEvent*>& GetEventsSortedByTime() const { 1527e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return parsed_events_sorted_by_time_; 1537e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 1547e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1557e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const PerfEventStats& stats() const { 1567e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return stats_; 1577e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 1587e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1597e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh protected: 1607e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Defines a type for a pid:tid pair. 1617e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh typedef std::pair<uint32_t, uint32_t> PidTid; 1627e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1637e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Sort |parsed_events_| by time, storing the results in 1647e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // |parsed_events_sorted_by_time_|. 1657e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Events can not be sorted by time if PERF_SAMPLE_TIME is not set in 1667e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // attr.sample_type (PerfReader.sample_type_). In that case, 1677e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // |parsed_events_sorted_by_time_| is not actually sorted, but has the same 1687e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // order as |parsed_events_|. 1697e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh void MaybeSortParsedEvents(); 1707e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1717e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Used for processing events. e.g. remapping with synthetic addresses. 1727e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool ProcessEvents(); 1737e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh template <typename MMapEventT> 1747e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapMmapEvent(MMapEventT* event, uint64_t id) { 1757e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return MapMmapEvent(id, 1767e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh event->pid, 1777e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh &event->start, 1787e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh &event->len, 1797e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh &event->pgoff); 1807e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 1817e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapMmapEvent(uint64_t id, 1827e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t pid, 1837e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t* p_start, 1847e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t* p_len, 1857e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t* p_pgoff); 1867e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapForkEvent(const struct fork_event& event); 1877e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapCommEvent(const struct comm_event& event); 1887e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1897e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Does a sample event remap and then returns DSO name and offset of sample. 1907e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapSampleEvent(ParsedEvent* parsed_event); 1917e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1927e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::vector<ParsedEvent> parsed_events_; 1937e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // See MaybeSortParsedEvents to see why this might not actually be sorted 1947e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // by time: 1957e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::vector<ParsedEvent*> parsed_events_sorted_by_time_; 1967e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1977e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh Options options_; // Store all option flags as one struct. 1987e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1997e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Maps pid/tid to commands. 2007e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::map<PidTid, const string*> pidtid_to_comm_map_; 2017e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2027e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // A set to store the actual command strings. 2037e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::set<string> commands_; 2047e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2057e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh PerfEventStats stats_; 2067e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2077e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // A set of unique DSOs that may be referenced by multiple events. 2087e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::set<DSOInfo> dso_set_; 2097e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2107e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh private: 2117e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Calls MapIPAndPidAndGetNameAndOffset() on the callchain of a sample event. 2127e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapCallchain(const uint64_t ip, 2137e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh const uint32_t pid, 2147e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t original_event_addr, 2157e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh struct ip_callchain* callchain, 2167e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh ParsedEvent* parsed_event); 2177e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2187e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Trims the branch stack for null entries and calls 2197e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // MapIPAndPidAndGetNameAndOffset() on each entry. 2207e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapBranchStack(const uint32_t pid, 2217e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh struct branch_stack* branch_stack, 2227e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh ParsedEvent* parsed_event); 2237e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2247e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // This maps a sample event and returns the mapped address, DSO name, and 2257e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // offset within the DSO. This is a private function because the API might 2267e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // change in the future, and we don't want derived classes to be stuck with an 2277e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // obsolete API. 2287e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh bool MapIPAndPidAndGetNameAndOffset( 2297e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t ip, 2307e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t pid, 2317e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint64_t* new_ip, 2327e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh ParsedEvent::DSOAndOffset* dso_and_offset); 2337e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2347e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Create a process mapper for a process. Optionally pass in a parent pid 2357e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // |ppid| from which to copy mappings. 2367e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Returns (mapper, true) if a new AddressMapper was created, and 2377e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // (mapper, false) if there is an existing mapper. 2387e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::pair<AddressMapper*, bool> GetOrCreateProcessMapper(uint32_t pid, 2397e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh uint32_t *ppid = NULL); 2407e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2417e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::unique_ptr<AddressMapper> kernel_mapper_; 2427e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh std::map<uint32_t, std::unique_ptr<AddressMapper>> process_mappers_; 2437e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2447e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh DISALLOW_COPY_AND_ASSIGN(PerfParser); 2457e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh}; 2467e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2477e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh} // namespace quipper 2487e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 2497e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#endif // CHROMIUMOS_WIDE_PROFILING_PERF_PARSER_H_ 250