Home | History | Annotate | Download | only in profiler
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_PROFILER_TICK_SAMPLE_H_
      6 #define V8_PROFILER_TICK_SAMPLE_H_
      7 
      8 #include "include/v8.h"
      9 
     10 #include "src/base/platform/time.h"
     11 #include "src/frames.h"
     12 #include "src/globals.h"
     13 
     14 namespace v8 {
     15 namespace internal {
     16 
     17 class Isolate;
     18 
     19 // ----------------------------------------------------------------------------
     20 // Sampler
     21 //
     22 // A sampler periodically samples the state of the VM and optionally
     23 // (if used for profiling) the program counter and stack pointer for
     24 // the thread that created it.
     25 
     26 // TickSample captures the information collected for each sample.
     27 struct TickSample {
     28   // Internal profiling (with --prof + tools/$OS-tick-processor) wants to
     29   // include the runtime function we're calling. Externally exposed tick
     30   // samples don't care.
     31   enum RecordCEntryFrame { kIncludeCEntryFrame, kSkipCEntryFrame };
     32 
     33   TickSample()
     34       : state(OTHER),
     35         pc(NULL),
     36         external_callback_entry(NULL),
     37         frames_count(0),
     38         has_external_callback(false),
     39         update_stats(true) {}
     40   void Init(Isolate* isolate, const v8::RegisterState& state,
     41             RecordCEntryFrame record_c_entry_frame, bool update_stats);
     42   static bool GetStackSample(Isolate* isolate, const v8::RegisterState& state,
     43                              RecordCEntryFrame record_c_entry_frame,
     44                              void** frames, size_t frames_limit,
     45                              v8::SampleInfo* sample_info);
     46   StateTag state;  // The state of the VM.
     47   Address pc;      // Instruction pointer.
     48   union {
     49     Address tos;   // Top stack value (*sp).
     50     Address external_callback_entry;
     51   };
     52   static const unsigned kMaxFramesCountLog2 = 8;
     53   static const unsigned kMaxFramesCount = (1 << kMaxFramesCountLog2) - 1;
     54   Address stack[kMaxFramesCount];  // Call stack.
     55   base::TimeTicks timestamp;
     56   unsigned frames_count : kMaxFramesCountLog2;  // Number of captured frames.
     57   bool has_external_callback : 1;
     58   bool update_stats : 1;  // Whether the sample should update aggregated stats.
     59 };
     60 
     61 
     62 #if defined(USE_SIMULATOR)
     63 class SimulatorHelper {
     64  public:
     65   // Returns true if register values were successfully retrieved
     66   // from the simulator, otherwise returns false.
     67   static bool FillRegisters(Isolate* isolate, v8::RegisterState* state);
     68 };
     69 #endif  // USE_SIMULATOR
     70 
     71 }  // namespace internal
     72 }  // namespace v8
     73 
     74 #endif  // V8_PROFILER_TICK_SAMPLE_H_
     75