13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "atomicops.h"
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
4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define CODE_EVENTS_TYPE_LIST(V)                                   \
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CODE_CREATION,    CodeCreateEventRecord)                       \
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CODE_MOVE,        CodeMoveEventRecord)                         \
5044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(SHARED_FUNC_MOVE, SharedFunctionInfoMoveEventRecord)
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;
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address shared;
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
8844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SharedFunctionInfoMoveEventRecord : public CodeEventRecord {
896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
90e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Address from;
91e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Address to;
926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(void UpdateCodeMap(CodeMap* code_map));
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass TickSampleEventRecord {
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // The parameterless constructor is used when we dequeue data from
1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // the ticks buffer.
1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  TickSampleEventRecord() { }
1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit TickSampleEventRecord(unsigned order)
1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : filler(1),
1043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        order(order) {
1057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(filler != SamplingCircularQueue::kClear);
1067f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
1077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // The first machine word of a TickSampleEventRecord must not ever
1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // become equal to SamplingCircularQueue::kClear.  As both order and
1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // TickSample's first field are not reliable in this sense (order
1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // can overflow, TickSample can have all fields reset), we are
1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // forced to use an artificial filler field.
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int filler;
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned order;
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  TickSample sample;
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TickSampleEventRecord* cast(void* value) {
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return reinterpret_cast<TickSampleEventRecord*>(value);
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class implements both the profile events processor thread and
1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// methods called by event producers: VM and stack sampler threads.
1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfilerEventsProcessor : public Thread {
1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit ProfilerEventsProcessor(ProfileGenerator* generator);
128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual ~ProfilerEventsProcessor() {}
1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Thread control.
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  virtual void Run();
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline void Stop() { running_ = false; }
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(bool running()) { return running_; }
1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Events adding methods. Called by VM threads.
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CallbackCreateEvent(Logger::LogEventsAndTags tag,
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           const char* prefix, String* name,
1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                           Address start);
1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* name,
1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       String* resource_name, int line_number,
142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                       Address start, unsigned size,
14344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Address shared);
1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       const char* name,
1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeCreateEvent(Logger::LogEventsAndTags tag,
1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       int args_count,
1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                       Address start, unsigned size);
1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeMoveEvent(Address from, Address to);
1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void CodeDeleteEvent(Address from);
15244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SharedFunctionInfoMoveEvent(Address from, Address to);
1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  void RegExpCodeCreateEvent(Logger::LogEventsAndTags tag,
1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             const char* prefix, String* name,
1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                             Address start, unsigned size);
1567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  // Puts current stack into tick sample events buffer.
1577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  void AddCurrentStack();
1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Tick sample events are filled directly in the buffer of the circular
1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // queue (because the structure is of fixed width, but usually not all
1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // stack frame entries are filled.) This method returns a pointer to the
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // next record of the buffer.
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(TickSample* TickSampleEvent());
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  union CodeEventsContainer {
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CodeEventRecord generic;
1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_CLASS(ignore, type) type type##_;
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Called from events processing thread (Run() method.)
1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessCodeEvent(unsigned* dequeue_order);
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool ProcessTicks(unsigned dequeue_order);
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag));
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool running_;
181f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  UnboundQueue<CodeEventsContainer> events_buffer_;
1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  SamplingCircularQueue ticks_buffer_;
1837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  UnboundQueue<TickSampleEventRecord> ticks_from_vm_buffer_;
1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned enqueue_order_;
1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define PROFILE(isolate, Call)                                \
191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOG(isolate, Call);                                         \
192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  do {                                                        \
193257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (v8::internal::CpuProfiler::is_profiling(isolate)) {   \
194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      v8::internal::CpuProfiler::Call;                        \
195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }                                                         \
1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  } while (false)
1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1996ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// TODO(isolates): isolatify this class.
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfiler {
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static void SetUp();
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void TearDown();
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(const char* title);
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(String* title);
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static CpuProfile* StopProfiling(const char* title);
212f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* StopProfiling(Object* security_token, String* title);
2136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static int GetProfilesCount();
214f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* GetProfile(Object* security_token, int index);
215f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static CpuProfile* FindProfile(Object* security_token, unsigned uid);
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DeleteAllProfiles();
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DeleteProfile(CpuProfile* profile);
21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool HasDetachedProfiles();
2196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Invoked from stack sampler (thread or signal handler.)
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static TickSample* TickSampleEvent(Isolate* isolate);
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,
231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                              Code* code,
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              SharedFunctionInfo* shared,
233e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                              String* name);
234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
235e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                              Code* code,
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              SharedFunctionInfo* shared,
2376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              String* source, int line);
2386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeCreateEvent(Logger::LogEventsAndTags tag,
2396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                              Code* code, int args_count);
240f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  static void CodeMovingGCEvent() {}
2416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeMoveEvent(Address from, Address to);
2426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void CodeDeleteEvent(Address from);
2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void GetterCallbackEvent(String* name, Address entry_point);
2446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void RegExpCodeCreateEvent(Code* code, String* source);
2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void SetterCallbackEvent(String* name, Address entry_point);
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SharedFunctionInfoMoveEvent(Address from, Address to);
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // TODO(isolates): this doesn't have to use atomics anymore.
2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static INLINE(bool is_profiling(Isolate* isolate)) {
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    CpuProfiler* profiler = isolate->cpu_profiler();
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return profiler != NULL && NoBarrier_Load(&profiler->is_profiling_);
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);
26444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void StopProcessor();
26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ResetProfiles();
2666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CpuProfilesCollection* profiles_;
2686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned next_profile_uid_;
269f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  TokenEnumerator* token_enumerator_;
2706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfileGenerator* generator_;
2716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ProfilerEventsProcessor* processor_;
2726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int saved_logging_nesting_;
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_to_stop_sampler_;
27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Atomic32 is_profiling_;
2756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
2776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  DISALLOW_COPY_AND_ASSIGN(CpuProfiler);
2786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
2796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
2816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // V8_CPU_PROFILER_H_
284