• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TickSampleTickSample33   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