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