1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARM64_INSTRUMENT_ARM64_H_
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARM64_INSTRUMENT_ARM64_H_
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/globals.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/constants-arm64.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/decoder-arm64.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kCounterNameMaxLength = 256;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint64_t kDefaultInstrumentationSamplingPeriod = 1 << 22;
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum InstrumentState {
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentStateDisable = 0,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentStateEnable = 1
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum CounterType {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Gauge = 0,      // Gauge counters reset themselves after reading.
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Cumulative = 1  // Cumulative counters keep their value after reading.
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Counter {
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit Counter(const char* name, CounterType type = Gauge);
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Increment();
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Enable();
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Disable();
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsEnabled();
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t count();
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* name();
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CounterType type();
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  char name_[kCounterNameMaxLength];
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t count_;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool enabled_;
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CounterType type_;
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Instrument: public DecoderVisitor {
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit Instrument(const char* datafile = NULL,
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint64_t sample_period = kDefaultInstrumentationSamplingPeriod);
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~Instrument();
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Declare all Visitor functions.
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define DECLARE(A) void Visit##A(Instruction* instr);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VISITOR_LIST(DECLARE)
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #undef DECLARE
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Update();
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Enable();
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Disable();
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void DumpCounters();
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void DumpCounterNames();
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void DumpEventMarker(unsigned marker);
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void HandleInstrumentationEvent(unsigned event);
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Counter* GetCounter(const char* name);
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InstrumentLoadStore(Instruction* instr);
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InstrumentLoadStorePair(Instruction* instr);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*> counters_;
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE *output_stream_;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t sample_period_;
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} }  // namespace v8::internal
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_ARM64_INSTRUMENT_ARM64_H_
86