cpu-profiler.h revision 756813857a4c2a4d8ad2e805969d5768d3cf43a0
16ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Copyright 2010 the V8 project authors. All rights reserved.
26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Redistribution and use in source and binary forms, with or without
36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// modification, are permitted provided that the following conditions are
46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// met:
56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions of source code must retain the above copyright
76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       notice, this list of conditions and the following disclaimer.
86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions in binary form must reproduce the above
96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       copyright notice, this list of conditions and the following
106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       disclaimer in the documentation and/or other materials provided
116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       with the distribution.
126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Neither the name of Google Inc. nor the names of its
136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       contributors may be used to endorse or promote products derived
146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       from this software without specific prior written permission.
156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_CPU_PROFILER_H_
296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8_CPU_PROFILER_H_
306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef ENABLE_LOGGING_AND_PROFILING
326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "circular-queue.h"
34f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#include "unbound-queue.h"
356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
366ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
376ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Forward declarations.
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEntry;
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMap;
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfile;
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfilesCollection;
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfileGenerator;
45f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkeclass TokenEnumerator;
466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define CODE_EVENTS_TYPE_LIST(V)                \
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_CREATION, CodeCreateEventRecord)       \
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_MOVE,     CodeMoveEventRecord)         \
506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_DELETE,   CodeDeleteEventRecord)       \
516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_ALIAS,    CodeAliasEventRecord)
526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEventRecord {
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_TYPE(type, ignore) type,
576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  enum Type {
586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    NONE = 0,
596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CODE_EVENTS_TYPE_LIST(DECLARE_TYPE)
606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    NUMBER_OF_TYPES
616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE
636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Type type;
656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned order;
666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
696ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeCreateEventRecord : public CodeEventRecord {
706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CodeEntry* entry;
736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned size;
746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
796ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMoveEventRecord : public CodeEventRecord {
806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address from;
826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address to;
836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeDeleteEventRecord : public CodeEventRecord {
896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeAliasEventRecord : public CodeEventRecord {
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
99f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  CodeEntry* entry;
100f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  Address code_start;
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass TickSampleEventRecord BASE_EMBEDDED {
1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  TickSampleEventRecord()
1097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch      : filler(1) {
1107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(filler != SamplingCircularQueue::kClear);
1117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
1127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // The first machine word of a TickSampleEventRecord must not ever
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // become equal to SamplingCircularQueue::kClear.  As both order and
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // TickSample's first field are not reliable in this sense (order
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // can overflow, TickSample can have all fields reset), we are
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // forced to use an artificial filler field.
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int filler;
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned order;
1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  TickSample sample;
1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TickSampleEventRecord* cast(void* value) {
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return reinterpret_cast<TickSampleEventRecord*>(value);
1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static TickSampleEventRecord* init(void* value));
1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class implements both the profile events processor thread and
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// methods called by event producers: VM and stack sampler threads.
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfilerEventsProcessor : public Thread {
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  explicit ProfilerEventsProcessor(ProfileGenerator* generator);
1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  virtual ~ProfilerEventsProcessor() { }
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Thread control.
1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  virtual void Run();
1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline void Stop() { running_ = false; }
1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(bool running()) { return running_; }
1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Events adding methods. Called by VM threads.
1436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CallbackCreateEvent(Logger::LogEventsAndTags tag,
1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           const char* prefix, String* name,
1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           Address start);
1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* name,
1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* resource_name, int line_number,
1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       const char* name,
1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       int args_count,
1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeMoveEvent(Address from, Address to);
1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeDeleteEvent(Address from);
158f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  void FunctionCreateEvent(Address alias, Address start, int security_token_id);
1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void FunctionMoveEvent(Address from, Address to);
1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void FunctionDeleteEvent(Address from);
1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void RegExpCodeCreateEvent(Logger::LogEventsAndTags tag,
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             const char* prefix, String* name,
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             Address start, unsigned size);
1647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  // Puts current stack into tick sample events buffer.
1657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  void AddCurrentStack();
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Tick sample events are filled directly in the buffer of the circular
1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // queue (because the structure is of fixed width, but usually not all
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // stack frame entries are filled.) This method returns a pointer to the
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // next record of the buffer.
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(TickSample* TickSampleEvent());
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  union CodeEventsContainer {
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CodeEventRecord generic;
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_CLASS(ignore, type) type type##_;
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Called from events processing thread (Run() method.)
1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessCodeEvent(unsigned* dequeue_order);
1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessTicks(unsigned dequeue_order);
1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag));
1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool running_;
189f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  UnboundQueue<CodeEventsContainer> events_buffer_;
1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  SamplingCircularQueue ticks_buffer_;
1917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  UnboundQueue<TickSampleEventRecord> ticks_from_vm_buffer_;
1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned enqueue_order_;
1936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call)                                  \
1996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  LOG(Call);                                           \
2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  do {                                                 \
2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (v8::internal::CpuProfiler::is_profiling()) {   \
2026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      v8::internal::CpuProfiler::Call;                 \
2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }                                                  \
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  } while (false)
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call) LOG(Call)
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // ENABLE_LOGGING_AND_PROFILING
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2136ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfiler {
2146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
2156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void Setup();
2166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void TearDown();
2176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef ENABLE_LOGGING_AND_PROFILING
2196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(const char* title);
2206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(String* title);
2216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* StopProfiling(const char* title);
222f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* StopProfiling(Object* security_token, String* title);
2236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static int GetProfilesCount();
224f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* GetProfile(Object* security_token, int index);
225f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* FindProfile(Object* security_token, unsigned uid);
2266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Invoked from stack sampler (thread or signal handler.)
2286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TickSample* TickSampleEvent();
2296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Must be called via PROFILE macro, otherwise will crash when
2316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // profiling is not enabled.
2326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CallbackEvent(String* name, Address entry_point);
2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, const char* comment);
2356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, String* name);
2376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, String* name,
2396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              String* source, int line);
2406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, int args_count);
2426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeMoveEvent(Address from, Address to);
2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeDeleteEvent(Address from);
2446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionCreateEvent(JSFunction* function);
2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionMoveEvent(Address from, Address to);
2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionDeleteEvent(Address from);
2476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void GetterCallbackEvent(String* name, Address entry_point);
2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void RegExpCodeCreateEvent(Code* code, String* source);
2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void SetterCallbackEvent(String* name, Address entry_point);
2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static INLINE(bool is_profiling()) {
2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return singleton_ != NULL && singleton_->processor_ != NULL;
2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfiler();
2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ~CpuProfiler();
2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartCollectingProfile(const char* title);
2596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartCollectingProfile(String* title);
2606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartProcessorIfNotStarted();
2616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfile* StopCollectingProfile(const char* title);
262f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  CpuProfile* StopCollectingProfile(Object* security_token, String* title);
263756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  void StopProcessorIfLastProfile(const char* title);
2646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfilesCollection* profiles_;
2666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned next_profile_uid_;
267f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  TokenEnumerator* token_enumerator_;
2686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
2696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfilerEventsProcessor* processor_;
2706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int saved_logging_nesting_;
2716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfiler* singleton_;
2736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else
2756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static INLINE(bool is_profiling()) { return false; }
2766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // ENABLE_LOGGING_AND_PROFILING
2776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
2796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  DISALLOW_COPY_AND_ASSIGN(CpuProfiler);
2806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
2816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
2836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // V8_CPU_PROFILER_H_
286