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