Home | History | Annotate | Download | only in aarch64
      1 // Copyright 2014, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 #ifndef VIXL_AARCH64_INSTRUMENT_AARCH64_H_
     28 #define VIXL_AARCH64_INSTRUMENT_AARCH64_H_
     29 
     30 #include "../globals-vixl.h"
     31 #include "../utils-vixl.h"
     32 
     33 #include "constants-aarch64.h"
     34 #include "decoder-aarch64.h"
     35 #include "instrument-aarch64.h"
     36 
     37 namespace vixl {
     38 namespace aarch64 {
     39 
     40 const int kCounterNameMaxLength = 256;
     41 const uint64_t kDefaultInstrumentationSamplingPeriod = 1 << 22;
     42 
     43 
     44 enum InstrumentState { InstrumentStateDisable = 0, InstrumentStateEnable = 1 };
     45 
     46 
     47 enum CounterType {
     48   Gauge = 0,      // Gauge counters reset themselves after reading.
     49   Cumulative = 1  // Cumulative counters keep their value after reading.
     50 };
     51 
     52 
     53 class Counter {
     54  public:
     55   explicit Counter(const char* name, CounterType type = Gauge);
     56 
     57   void Increment();
     58   void Enable();
     59   void Disable();
     60   bool IsEnabled();
     61   uint64_t GetCount();
     62   VIXL_DEPRECATED("GetCount", uint64_t count()) { return GetCount(); }
     63 
     64   const char* GetName();
     65   VIXL_DEPRECATED("GetName", const char* name()) { return GetName(); }
     66 
     67   CounterType GetType();
     68   VIXL_DEPRECATED("GetType", CounterType type()) { return GetType(); }
     69 
     70  private:
     71   char name_[kCounterNameMaxLength];
     72   uint64_t count_;
     73   bool enabled_;
     74   CounterType type_;
     75 };
     76 
     77 
     78 class Instrument : public DecoderVisitor {
     79  public:
     80   explicit Instrument(
     81       const char* datafile = NULL,
     82       uint64_t sample_period = kDefaultInstrumentationSamplingPeriod);
     83   ~Instrument();
     84 
     85   void Enable();
     86   void Disable();
     87 
     88 // Declare all Visitor functions.
     89 #define DECLARE(A) void Visit##A(const Instruction* instr) VIXL_OVERRIDE;
     90   VISITOR_LIST(DECLARE)
     91 #undef DECLARE
     92 
     93  private:
     94   void Update();
     95   void DumpCounters();
     96   void DumpCounterNames();
     97   void DumpEventMarker(unsigned marker);
     98   void HandleInstrumentationEvent(unsigned event);
     99   Counter* GetCounter(const char* name);
    100 
    101   void InstrumentLoadStore(const Instruction* instr);
    102   void InstrumentLoadStorePair(const Instruction* instr);
    103 
    104   std::list<Counter*> counters_;
    105 
    106   FILE* output_stream_;
    107 
    108   // Counter information is dumped every sample_period_ instructions decoded.
    109   // For a sample_period_ = 0 a final counter value is only produced when the
    110   // Instrumentation class is destroyed.
    111   uint64_t sample_period_;
    112 };
    113 
    114 }  // namespace aarch64
    115 }  // namespace vixl
    116 
    117 #endif  // VIXL_AARCH64_INSTRUMENT_AARCH64_H_
    118