// Copyright 2013 the V8 project 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 V8_CODEGEN_ARM64_INSTRUMENT_ARM64_H_
#define V8_CODEGEN_ARM64_INSTRUMENT_ARM64_H_

#include "src/common/globals.h"
#include "src/utils/utils.h"

#include "src/codegen/arm64/constants-arm64.h"
#include "src/codegen/arm64/decoder-arm64.h"

namespace v8 {
namespace internal {

const int kCounterNameMaxLength = 256;
const uint64_t kDefaultInstrumentationSamplingPeriod = 1 << 22;

enum InstrumentState { InstrumentStateDisable = 0, InstrumentStateEnable = 1 };

enum CounterType {
  Gauge = 0,      // Gauge counters reset themselves after reading.
  Cumulative = 1  // Cumulative counters keep their value after reading.
};

class Counter {
 public:
  explicit Counter(const char* name, CounterType type = Gauge);

  void Increment();
  void Enable();
  void Disable();
  bool IsEnabled();
  uint64_t count();
  const char* name();
  CounterType type();

 private:
  char name_[kCounterNameMaxLength];
  uint64_t count_;
  bool enabled_;
  CounterType type_;
};

class Instrument : public DecoderVisitor {
 public:
  explicit Instrument(
      const char* datafile = nullptr,
      uint64_t sample_period = kDefaultInstrumentationSamplingPeriod);
  ~Instrument();

// Declare all Visitor functions.
#define DECLARE(A) void Visit##A(Instruction* instr);
  VISITOR_LIST(DECLARE)
#undef DECLARE

 private:
  void Update();
  void Enable();
  void Disable();
  void DumpCounters();
  void DumpCounterNames();
  void DumpEventMarker(unsigned marker);
  void HandleInstrumentationEvent(unsigned event);
  Counter* GetCounter(const char* name);

  void InstrumentLoadStore(Instruction* instr);
  void InstrumentLoadStorePair(Instruction* instr);

  std::list<Counter*> counters_;

  FILE* output_stream_;
  uint64_t sample_period_;
};

}  // namespace internal
}  // namespace v8

#endif  // V8_CODEGEN_ARM64_INSTRUMENT_ARM64_H_
