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