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