// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMIUMOS_WIDE_PROFILING_PERF_READER_H_
#define CHROMIUMOS_WIDE_PROFILING_PERF_READER_H_

#include <stdint.h>

#include <map>
#include <set>
#include <string>
#include <vector>

#include "base/macros.h"

#include "chromiumos-wide-profiling/kernel/perf_internals.h"
#include "chromiumos-wide-profiling/quipper_string.h"
#include "chromiumos-wide-profiling/utils.h"

namespace quipper {

// This is becoming more like a partial struct perf_evsel
struct PerfFileAttr {
  struct perf_event_attr attr;
  string name;
  std::vector<u64> ids;
};

// Based on code in tools/perf/util/header.c, the metadata are of the following
// formats:

// Based on kernel/perf_internals.h
const size_t kBuildIDArraySize = 20;
const size_t kBuildIDStringLength = kBuildIDArraySize * 2;

struct CStringWithLength {
  u32 len;
  string str;
};

struct PerfStringMetadata {
  u32 type;
  std::vector<CStringWithLength> data;
};

struct PerfUint32Metadata {
  u32 type;
  std::vector<uint32_t> data;
};

struct PerfUint64Metadata {
  u32 type;
  std::vector<uint64_t> data;
};

typedef u32 num_siblings_type;

struct PerfCPUTopologyMetadata {
  std::vector<CStringWithLength> core_siblings;
  std::vector<CStringWithLength> thread_siblings;
};

struct PerfNodeTopologyMetadata {
  u32 id;
  u64 total_memory;
  u64 free_memory;
  CStringWithLength cpu_list;
};

class BufferWithSize;
class ConstBufferWithSize;

class PerfReader {
 public:
  PerfReader() : sample_type_(0),
                 read_format_(0),
                 is_cross_endian_(0) {}
  ~PerfReader();

  // Makes |build_id| fit the perf format, by either truncating it or adding
  // zeros to the end so that it has length kBuildIDStringLength.
  static void PerfizeBuildIDString(string* build_id);

  // Changes |build_id| to the best guess of what the build id was before going
  // through perf.  Specifically, it keeps removing trailing sequences of four
  // zero bytes (or eight '0' characters) until there are no more such
  // sequences, or the build id would be empty if the process were repeated.
  static void UnperfizeBuildIDString(string* build_id);

  bool ReadFile(const string& filename);
  bool ReadFromVector(const std::vector<char>& data);
  bool ReadFromString(const string& str);
  bool ReadFromPointer(const char* perf_data, size_t size);

  // TODO(rohinmshah): GetSize should not use RegenerateHeader (so that it can
  // be const).  Ideally, RegenerateHeader would be deleted and instead of
  // having out_header_ as an instance variable, it would be computed
  // dynamically whenever needed.

  // Returns the size in bytes that would be written by any of the methods that
  // write the entire perf data file (WriteFile, WriteToPointer, etc).
  size_t GetSize();

  bool WriteFile(const string& filename);
  bool WriteToVector(std::vector<char>* data);
  bool WriteToString(string* str);
  bool WriteToPointer(char* buffer, size_t size);

  bool RegenerateHeader();

  // Stores the mapping from filenames to build ids in build_id_events_.
  // Returns true on success.
  // Note: If |filenames_to_build_ids| contains a mapping for a filename for
  // which there is already a build_id_event in build_id_events_, a duplicate
  // build_id_event will be created, and the old build_id_event will NOT be
  // deleted.
  bool InjectBuildIDs(const std::map<string, string>& filenames_to_build_ids);

  // Replaces existing filenames with filenames from |build_ids_to_filenames|
  // by joining on build ids.  If a build id in |build_ids_to_filenames| is not
  // present in this parser, it is ignored.
  bool Localize(const std::map<string, string>& build_ids_to_filenames);

  // Same as Localize, but joins on filenames instead of build ids.
  bool LocalizeUsingFilenames(const std::map<string, string>& filename_map);

  // Stores a list of unique filenames found in MMAP/MMAP2 events into
  // |filenames|.  Any existing data in |filenames| will be lost.
  void GetFilenames(std::vector<string>* filenames) const;
  void GetFilenamesAsSet(std::set<string>* filenames) const;

  // Uses build id events to populate |filenames_to_build_ids|.
  // Any existing data in |filenames_to_build_ids| will be lost.
  // Note:  A filename returned by GetFilenames need not be present in this map,
  // since there may be no build id event corresponding to the MMAP/MMAP2.
  void GetFilenamesToBuildIDs(
      std::map<string, string>* filenames_to_build_ids) const;

  static bool IsSupportedEventType(uint32_t type);

  // If a program using PerfReader calls events(), it could work with the
  // resulting events by importing kernel/perf_internals.h.  This would also
  // apply to other forms of data (attributes, event types, build ids, etc.)
  // However, there is no easy way to work with the sample info within events.
  // The following two methods have been added for this purpose.

  // Extracts from a perf event |event| info about the perf sample that
  // contains the event.  Stores info in |sample|.
  bool ReadPerfSampleInfo(const event_t& event,
                          struct perf_sample* sample) const;
  // Writes |sample| info back to a perf event |event|.
  bool WritePerfSampleInfo(const perf_sample& sample,
                           event_t* event) const;

  // Accessor funcs.
  const std::vector<PerfFileAttr>& attrs() const {
    return attrs_;
  }

  uint64_t sample_type() const {
    return sample_type_;
  }

  bool HaveEventNames() const {
    for (const auto& attr : attrs_) {
      if (attr.name.empty()) {
        return false;
      }
    }
    return true;
  }

  const std::vector<malloced_unique_ptr<event_t>>& events() const {
    return events_;
  }

  const std::vector<build_id_event*>& build_id_events() const {
    return build_id_events_;
  }

  const std::vector<char>& tracing_data() const {
    return tracing_data_;
  }

  uint64_t metadata_mask() const {
    return metadata_mask_;
  }

 protected:
  bool ReadHeader(const ConstBufferWithSize& data);

  bool ReadAttrs(const ConstBufferWithSize& data);
  bool ReadAttr(const ConstBufferWithSize& data, size_t* offset);
  bool ReadEventAttr(const ConstBufferWithSize& data, size_t* offset,
                     perf_event_attr* attr);
  bool ReadUniqueIDs(const ConstBufferWithSize& data, size_t num_ids,
                     size_t* offset, std::vector<u64>* ids);

  bool ReadEventTypes(const ConstBufferWithSize& data);
  // if event_size == 0, then not in an event.
  bool ReadEventType(const ConstBufferWithSize& data, size_t attr_idx,
                     size_t event_size, size_t* offset);

  bool ReadData(const ConstBufferWithSize& data);

  // Reads metadata in normal mode.
  bool ReadMetadata(const ConstBufferWithSize& data);
  bool ReadTracingMetadata(const ConstBufferWithSize& data,
                           size_t offset, size_t size);
  bool ReadBuildIDMetadata(const ConstBufferWithSize& data, u32 type,
                           size_t offset, size_t size);
  bool ReadStringMetadata(const ConstBufferWithSize& data, u32 type,
                          size_t offset, size_t size);
  bool ReadUint32Metadata(const ConstBufferWithSize& data, u32 type,
                          size_t offset, size_t size);
  bool ReadUint64Metadata(const ConstBufferWithSize& data, u32 type,
                          size_t offset, size_t size);
  bool ReadCPUTopologyMetadata(const ConstBufferWithSize& data, u32 type,
                               size_t offset, size_t size);
  bool ReadNUMATopologyMetadata(const ConstBufferWithSize& data, u32 type,
                                size_t offset, size_t size);
  bool ReadEventDescMetadata(const ConstBufferWithSize& data, u32 type,
                             size_t offset, size_t size);

  // Read perf data from piped perf output data.
  bool ReadPipedData(const ConstBufferWithSize& data);
  bool ReadTracingMetadataEvent(const ConstBufferWithSize& data, size_t offset);

  // Like WriteToPointer, but does not check if the buffer is large enough.
  bool WriteToPointerWithoutCheckingSize(char* buffer, size_t size);

  bool WriteHeader(const BufferWithSize& data) const;
  bool WriteAttrs(const BufferWithSize& data) const;
  bool WriteEventTypes(const BufferWithSize& data) const;
  bool WriteData(const BufferWithSize& data) const;
  bool WriteMetadata(const BufferWithSize& data) const;

  // For writing the various types of metadata.
  bool WriteBuildIDMetadata(u32 type, size_t* offset,
                            const BufferWithSize& data) const;
  bool WriteStringMetadata(u32 type, size_t* offset,
                           const BufferWithSize& data) const;
  bool WriteUint32Metadata(u32 type, size_t* offset,
                           const BufferWithSize& data) const;
  bool WriteUint64Metadata(u32 type, size_t* offset,
                           const BufferWithSize& data) const;
  bool WriteEventDescMetadata(u32 type, size_t* offset,
                              const BufferWithSize& data) const;
  bool WriteCPUTopologyMetadata(u32 type, size_t* offset,
                                const BufferWithSize& data) const;
  bool WriteNUMATopologyMetadata(u32 type, size_t* offset,
                                 const BufferWithSize& data) const;

  // For reading event blocks within piped perf data.
  bool ReadAttrEventBlock(const ConstBufferWithSize& data, size_t offset,
                          size_t size);

  // Swaps byte order for non-header fields of the data structure pointed to by
  // |event|, if |is_cross_endian_| is true. Otherwise leaves the data the same.
  void MaybeSwapEventFields(event_t* event);

  // Returns the number of types of metadata stored.
  size_t GetNumMetadata() const;

  // For computing the sizes of the various types of metadata.
  size_t GetBuildIDMetadataSize() const;
  size_t GetStringMetadataSize() const;
  size_t GetUint32MetadataSize() const;
  size_t GetUint64MetadataSize() const;
  size_t GetEventDescMetadataSize() const;
  size_t GetCPUTopologyMetadataSize() const;
  size_t GetNUMATopologyMetadataSize() const;

  // Returns true if we should write the number of strings for the string
  // metadata of type |type|.
  bool NeedsNumberOfStringData(u32 type) const;

  // Replaces existing filenames in MMAP/MMAP2 events based on |filename_map|.
  // This method does not change |build_id_events_|.
  bool LocalizeMMapFilenames(const std::map<string, string>& filename_map);

  std::vector<PerfFileAttr> attrs_;
  std::vector<malloced_unique_ptr<event_t>> events_;
  std::vector<build_id_event*> build_id_events_;
  std::vector<PerfStringMetadata> string_metadata_;
  std::vector<PerfUint32Metadata> uint32_metadata_;
  std::vector<PerfUint64Metadata> uint64_metadata_;
  PerfCPUTopologyMetadata cpu_topology_;
  std::vector<PerfNodeTopologyMetadata> numa_topology_;
  std::vector<char> tracing_data_;
  uint64_t sample_type_;
  uint64_t read_format_;
  uint64_t metadata_mask_;

  // Indicates that the perf data being read is from machine with a different
  // endianness than the current machine.
  bool is_cross_endian_;

 private:
  u32 ReadPerfEventAttrSize(const ConstBufferWithSize& data,
                            size_t attr_offset);

  // The file header is either a normal header or a piped header.
  union {
    struct perf_file_header header_;
    struct perf_pipe_file_header piped_header_;
  };
  struct perf_file_header out_header_;

  DISALLOW_COPY_AND_ASSIGN(PerfReader);
};

}  // namespace quipper

#endif  // CHROMIUMOS_WIDE_PROFILING_PERF_READER_H_
