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