cpu-profiler.h revision 6ded16be15dd865a9b21ea304d5273c8be299c87
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"
346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
356ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
366ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Forward declarations.
396ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEntry;
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMap;
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfile;
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfilesCollection;
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfileGenerator;
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define CODE_EVENTS_TYPE_LIST(V)                \
476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_CREATION, CodeCreateEventRecord)       \
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_MOVE,     CodeMoveEventRecord)         \
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_DELETE,   CodeDeleteEventRecord)       \
506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  V(CODE_ALIAS,    CodeAliasEventRecord)
516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
536ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEventRecord {
546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_TYPE(type, ignore) type,
566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  enum Type {
576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    NONE = 0,
586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CODE_EVENTS_TYPE_LIST(DECLARE_TYPE)
596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    NUMBER_OF_TYPES
606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE
626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Type type;
646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned order;
656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
686ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeCreateEventRecord : public CodeEventRecord {
696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CodeEntry* entry;
726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned size;
736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
786ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMoveEventRecord : public CodeEventRecord {
796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address from;
816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address to;
826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
876ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeDeleteEventRecord : public CodeEventRecord {
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeAliasEventRecord : public CodeEventRecord {
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address alias;
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Address start;
996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass TickSampleEventRecord BASE_EMBEDDED {
1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // The first machine word of a TickSampleEventRecord must not ever
1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // become equal to SamplingCircularQueue::kClear.  As both order and
1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // TickSample's first field are not reliable in this sense (order
1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // can overflow, TickSample can have all fields reset), we are
1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // forced to use an artificial filler field.
1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int filler;
1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned order;
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  TickSample sample;
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TickSampleEventRecord* cast(void* value) {
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return reinterpret_cast<TickSampleEventRecord*>(value);
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static TickSampleEventRecord* init(void* value));
1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  DISALLOW_IMPLICIT_CONSTRUCTORS(TickSampleEventRecord);
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class implements both the profile events processor thread and
1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// methods called by event producers: VM and stack sampler threads.
1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfilerEventsProcessor : public Thread {
1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  explicit ProfilerEventsProcessor(ProfileGenerator* generator);
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  virtual ~ProfilerEventsProcessor() { }
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Thread control.
1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  virtual void Run();
1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline void Stop() { running_ = false; }
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(bool running()) { return running_; }
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Events adding methods. Called by VM threads.
1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CallbackCreateEvent(Logger::LogEventsAndTags tag,
1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           const char* prefix, String* name,
1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           Address start);
1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* name,
1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* resource_name, int line_number,
1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       const char* name,
1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       int args_count,
1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeMoveEvent(Address from, Address to);
1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeDeleteEvent(Address from);
1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void FunctionCreateEvent(Address alias, Address start);
1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void FunctionMoveEvent(Address from, Address to);
1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void FunctionDeleteEvent(Address from);
1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void RegExpCodeCreateEvent(Logger::LogEventsAndTags tag,
1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             const char* prefix, String* name,
1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             Address start, unsigned size);
1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Tick sample events are filled directly in the buffer of the circular
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // queue (because the structure is of fixed width, but usually not all
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // stack frame entries are filled.) This method returns a pointer to the
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // next record of the buffer.
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(TickSample* TickSampleEvent());
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  union CodeEventsContainer {
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CodeEventRecord generic;
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_CLASS(ignore, type) type type##_;
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Called from events processing thread (Run() method.)
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessCodeEvent(unsigned* dequeue_order);
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessTicks(unsigned dequeue_order);
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag));
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool running_;
1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CircularQueue<CodeEventsContainer> events_buffer_;
1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  SamplingCircularQueue ticks_buffer_;
1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned enqueue_order_;
1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call)                                  \
1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  LOG(Call);                                           \
1936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  do {                                                 \
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (v8::internal::CpuProfiler::is_profiling()) {   \
1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      v8::internal::CpuProfiler::Call;                 \
1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }                                                  \
1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  } while (false)
1986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else
1996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call) LOG(Call)
2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // ENABLE_LOGGING_AND_PROFILING
2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfiler {
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void Setup();
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void TearDown();
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef ENABLE_LOGGING_AND_PROFILING
2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(const char* title);
2136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(String* title);
2146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* StopProfiling(const char* title);
2156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* StopProfiling(String* title);
2166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static int GetProfilesCount();
2176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* GetProfile(int index);
2186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* FindProfile(unsigned uid);
2196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Invoked from stack sampler (thread or signal handler.)
2216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TickSample* TickSampleEvent();
2226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Must be called via PROFILE macro, otherwise will crash when
2246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // profiling is not enabled.
2256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CallbackEvent(String* name, Address entry_point);
2266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, const char* comment);
2286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, String* name);
2306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, String* name,
2326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              String* source, int line);
2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, int args_count);
2356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeMoveEvent(Address from, Address to);
2366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeDeleteEvent(Address from);
2376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionCreateEvent(JSFunction* function);
2386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionMoveEvent(Address from, Address to);
2396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void FunctionDeleteEvent(Address from);
2406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void GetterCallbackEvent(String* name, Address entry_point);
2416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void RegExpCodeCreateEvent(Code* code, String* source);
2426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void SetterCallbackEvent(String* name, Address entry_point);
2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static INLINE(bool is_profiling()) {
2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return singleton_ != NULL && singleton_->processor_ != NULL;
2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
2476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfiler();
2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ~CpuProfiler();
2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartCollectingProfile(const char* title);
2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartCollectingProfile(String* title);
2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StartProcessorIfNotStarted();
2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfile* StopCollectingProfile(const char* title);
2556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfile* StopCollectingProfile(String* title);
2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void StopProcessorIfLastProfile();
2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfilesCollection* profiles_;
2596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned next_profile_uid_;
2606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
2616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfilerEventsProcessor* processor_;
2626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int saved_logging_nesting_;
2636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfiler* singleton_;
2656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else
2676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static INLINE(bool is_profiling()) { return false; }
2686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // ENABLE_LOGGING_AND_PROFILING
2696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
2716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  DISALLOW_COPY_AND_ASSIGN(CpuProfiler);
2726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
2736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
2756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // V8_CPU_PROFILER_H_
278