| // Copyright 2013 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_PROFILER_TICK_SAMPLE_H_ |
| #define V8_PROFILER_TICK_SAMPLE_H_ |
| |
| #include "include/v8.h" |
| |
| #include "src/base/platform/time.h" |
| #include "src/frames.h" |
| #include "src/globals.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| class Isolate; |
| |
| // ---------------------------------------------------------------------------- |
| // Sampler |
| // |
| // A sampler periodically samples the state of the VM and optionally |
| // (if used for profiling) the program counter and stack pointer for |
| // the thread that created it. |
| |
| // TickSample captures the information collected for each sample. |
| struct TickSample { |
| // Internal profiling (with --prof + tools/$OS-tick-processor) wants to |
| // include the runtime function we're calling. Externally exposed tick |
| // samples don't care. |
| enum RecordCEntryFrame { kIncludeCEntryFrame, kSkipCEntryFrame }; |
| |
| TickSample() |
| : state(OTHER), |
| pc(NULL), |
| external_callback_entry(NULL), |
| frames_count(0), |
| has_external_callback(false), |
| update_stats(true) {} |
| void Init(Isolate* isolate, const v8::RegisterState& state, |
| RecordCEntryFrame record_c_entry_frame, bool update_stats); |
| static bool GetStackSample(Isolate* isolate, const v8::RegisterState& state, |
| RecordCEntryFrame record_c_entry_frame, |
| void** frames, size_t frames_limit, |
| v8::SampleInfo* sample_info); |
| StateTag state; // The state of the VM. |
| Address pc; // Instruction pointer. |
| union { |
| Address tos; // Top stack value (*sp). |
| Address external_callback_entry; |
| }; |
| static const unsigned kMaxFramesCountLog2 = 8; |
| static const unsigned kMaxFramesCount = (1 << kMaxFramesCountLog2) - 1; |
| Address stack[kMaxFramesCount]; // Call stack. |
| base::TimeTicks timestamp; |
| unsigned frames_count : kMaxFramesCountLog2; // Number of captured frames. |
| bool has_external_callback : 1; |
| bool update_stats : 1; // Whether the sample should update aggregated stats. |
| }; |
| |
| |
| #if defined(USE_SIMULATOR) |
| class SimulatorHelper { |
| public: |
| // Returns true if register values were successfully retrieved |
| // from the simulator, otherwise returns false. |
| static bool FillRegisters(Isolate* isolate, v8::RegisterState* state); |
| }; |
| #endif // USE_SIMULATOR |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_PROFILER_TICK_SAMPLE_H_ |