13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_LOG_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_LOG_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "objects.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "log-utils.h"
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Logger is used for collecting logging information from V8 during
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// execution. The result is dumped to a file.
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Available command line flags:
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//  --log
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Minimal logging (no API, code, or GC sample events), default is off.
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-all
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log all events to the file, default is off.  This is the same as combining
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-api, --log-code, --log-gc, and --log-regexp.
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-api
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log API events to the logfile, default is off.  --log-api implies --log.
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-code
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log code (create, move, and delete) events to the logfile, default is off.
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-code implies --log.
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-gc
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log GC heap samples after each GC that can be processed by hp2ps, default
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is off.  --log-gc implies --log.
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-regexp
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log creation and use of regular expressions, Default is off.
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-regexp implies --log.
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --logfile <filename>
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Specify the name of the logfile, default is "v8.log".
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --prof
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Collect statistical profiling information (ticks), default is off.  The
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// tick profiler requires code events, so --prof implies --log-code.
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Forward declarations.
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LogMessageBuilder;
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Profiler;
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Semaphore;
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SlidingStateWindow;
78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass Ticker;
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef LOG
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define LOG(isolate, Call)                          \
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  do {                                              \
8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    v8::internal::Logger* logger =                  \
8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        (isolate)->logger();                        \
8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (logger->is_logging())                       \
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      logger->Call;                                 \
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } while (false)
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define LOG_EVENTS_AND_TAGS_LIST(V)                                     \
90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CODE_CREATION_EVENT,            "code-creation")                    \
91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CODE_MOVE_EVENT,                "code-move")                        \
92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CODE_DELETE_EVENT,              "code-delete")                      \
93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CODE_MOVING_GC,                 "code-moving-gc")                   \
94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(SHARED_FUNC_MOVE_EVENT,         "sfi-move")                         \
95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(SNAPSHOT_POSITION_EVENT,        "snapshot-pos")                     \
96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(SNAPSHOT_CODE_NAME_EVENT,       "snapshot-code-name")               \
97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(TICK_EVENT,                     "tick")                             \
98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(REPEAT_META_EVENT,              "repeat")                           \
99257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(BUILTIN_TAG,                    "Builtin")                          \
100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_DEBUG_BREAK_TAG,           "CallDebugBreak")                   \
101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_DEBUG_PREPARE_STEP_IN_TAG, "CallDebugPrepareStepIn")           \
102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_IC_TAG,                    "CallIC")                           \
103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_INITIALIZE_TAG,            "CallInitialize")                   \
104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_MEGAMORPHIC_TAG,           "CallMegamorphic")                  \
105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_MISS_TAG,                  "CallMiss")                         \
106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_NORMAL_TAG,                "CallNormal")                       \
107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALL_PRE_MONOMORPHIC_TAG,       "CallPreMonomorphic")               \
108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_DEBUG_BREAK_TAG,     "KeyedCallDebugBreak")              \
109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_DEBUG_PREPARE_STEP_IN_TAG,                               \
110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    "KeyedCallDebugPrepareStepIn")                                      \
111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_IC_TAG,              "KeyedCallIC")                      \
112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_INITIALIZE_TAG,      "KeyedCallInitialize")              \
113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_MEGAMORPHIC_TAG,     "KeyedCallMegamorphic")             \
114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_MISS_TAG,            "KeyedCallMiss")                    \
115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_NORMAL_TAG,          "KeyedCallNormal")                  \
116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_CALL_PRE_MONOMORPHIC_TAG, "KeyedCallPreMonomorphic")          \
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CALLBACK_TAG,                   "Callback")                         \
118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(EVAL_TAG,                       "Eval")                             \
119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(FUNCTION_TAG,                   "Function")                         \
120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_LOAD_IC_TAG,              "KeyedLoadIC")                      \
121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_LOAD_MEGAMORPHIC_IC_TAG,  "KeyedLoadMegamorphicIC")           \
122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, "KeyedExternalArrayLoadIC")       \
123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_STORE_IC_TAG,             "KeyedStoreIC")                     \
124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_STORE_MEGAMORPHIC_IC_TAG, "KeyedStoreMegamorphicIC")          \
125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, "KeyedExternalArrayStoreIC")     \
126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(LAZY_COMPILE_TAG,               "LazyCompile")                      \
127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(LOAD_IC_TAG,                    "LoadIC")                           \
128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(REG_EXP_TAG,                    "RegExp")                           \
129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(SCRIPT_TAG,                     "Script")                           \
130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(STORE_IC_TAG,                   "StoreIC")                          \
131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(STUB_TAG,                       "Stub")                             \
132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(NATIVE_FUNCTION_TAG,            "Function")                         \
133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(NATIVE_LAZY_COMPILE_TAG,        "LazyCompile")                      \
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(NATIVE_SCRIPT_TAG,              "Script")
1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Note that 'NATIVE_' cases for functions and scripts are mapped onto
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// original tags when writing to the log.
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Sampler;
14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Logger {
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_ENUM(enum_item, ignore) enum_item,
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  enum LogEventsAndTags {
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    LOG_EVENTS_AND_TAGS_LIST(DECLARE_ENUM)
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    NUMBER_OF_LOG_EVENTS
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECLARE_ENUM
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Acquires resources for logging if the right flags are set.
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool SetUp();
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void EnsureTickerStarted();
15544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void EnsureTickerStopped();
15644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Sampler* sampler();
158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Frees resources acquired in SetUp.
1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // When a temporary file is used for the log, returns its stream descriptor,
1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // leaving the file open.
1623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  FILE* TearDown();
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Enable the computation of a sliding window of states.
16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void EnableSlidingStateWindow();
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event with a string value -> (name, value).
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void StringEvent(const char* name, const char* value);
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event with an int value -> (name, value).
17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IntEvent(const char* name, int value);
17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IntPtrTEvent(const char* name, intptr_t value);
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event with an handle value -> (name, location).
17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HandleEvent(const char* name, Object** location);
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits memory management events for C allocated structures.
17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void NewEvent(const char* name, void* object, size_t size);
17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void DeleteEvent(const char* name, void* object);
18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Static versions of the above, operate on current isolate's logger.
18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Used in TRACK_MEMORY(TypeName) defined in globals.h
18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void NewEventStatic(const char* name, void* object, size_t size);
18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DeleteEventStatic(const char* name, void* object);
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event with a tag, and some resource usage information.
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // -> (name, tag, <rusage information>).
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Currently, the resource usage information is a process time stamp
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // and a real time timestamp.
19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ResourceEvent(const char* name, const char* tag);
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event that an undefined property was read from an
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object.
19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SuspectReadEvent(String* name, Object* obj);
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits an event when a message is put on or read from a debugging queue.
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // DebugTag lets us put a call-site specific label on the event.
19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void DebugTag(const char* call_site_tag);
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void DebugEvent(const char* event_type, Vector<uint16_t> parameter);
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ==== Events logged by --log-api. ====
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiNamedSecurityCheck(Object* key);
20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiIndexedSecurityCheck(uint32_t index);
20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiNamedPropertyAccess(const char* tag, JSObject* holder, Object* name);
20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiIndexedPropertyAccess(const char* tag,
20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                JSObject* holder,
20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                uint32_t index);
20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiObjectAccess(const char* tag, JSObject* obj);
21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiEntryCall(const char* name);
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ==== Events logged by --log-code. ====
214d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Emits a code event for a callback function.
21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CallbackEvent(String* name, Address entry_point);
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void GetterCallbackEvent(String* name, Address entry_point);
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetterCallbackEvent(String* name, Address entry_point);
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits a code create event.
21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeCreateEvent(LogEventsAndTags tag,
22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Code* code, const char* source);
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeCreateEvent(LogEventsAndTags tag,
22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Code* code, String* name);
22344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeCreateEvent(LogEventsAndTags tag,
22444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Code* code,
22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       SharedFunctionInfo* shared,
22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       String* name);
22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeCreateEvent(LogEventsAndTags tag,
22844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Code* code,
22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       SharedFunctionInfo* shared,
23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       String* source, int line);
23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count);
23244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeMovingGCEvent();
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits a code create event for a RegExp.
23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegExpCodeCreateEvent(Code* code, String* source);
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits a code move event.
23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeMoveEvent(Address from, Address to);
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits a code delete event.
23844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CodeDeleteEvent(Address from);
239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SharedFunctionInfoMoveEvent(Address from, Address to);
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SnapshotPositionEvent(Address addr, int pos);
243e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ==== Events logged by --log-gc. ====
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Heap sampling events: start, end, and individual types.
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleBeginEvent(const char* space, const char* kind);
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleEndEvent(const char* space, const char* kind);
24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleItemEvent(const char* type, int number, int bytes);
24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleJSConstructorEvent(const char* constructor,
25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    int number, int bytes);
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleJSRetainersEvent(const char* constructor,
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                         const char* event);
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleJSProducerEvent(const char* constructor,
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                 Address* stack);
25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void HeapSampleStats(const char* space, const char* kind,
25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       intptr_t capacity, intptr_t used);
25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SharedLibraryEvent(const char* library_path,
25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                          uintptr_t start,
26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                          uintptr_t end);
26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SharedLibraryEvent(const wchar_t* library_path,
26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                          uintptr_t start,
26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                          uintptr_t end);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ==== Events logged by --log-regexp ====
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Regexp compilation and execution events.
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache);
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Log an event reported from generated code
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogRuntime(Vector<const char> format, JSArray* args);
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_logging() {
2746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return logging_nesting_ > 0;
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Pause/Resume collection of profiling data.
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // When data collection is paused, CPU Tick events are discarded until
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // data collection is Resumed.
2803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void PauseProfiler();
2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void ResumeProfiler();
2823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool IsProfilerPaused();
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
284589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  void LogExistingFunction(Handle<SharedFunctionInfo> shared,
285589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                           Handle<Code> code);
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Logs all compiled functions found in the heap.
28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogCompiledFunctions();
288d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Logs all accessor callbacks found in the heap.
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogAccessorCallbacks();
290d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Used for logging stubs found in the snapshot.
29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogCodeObjects();
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Converts tag to a corresponding NATIVE_... if the script is native.
2946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  INLINE(static LogEventsAndTags ToNativeByScript(LogEventsAndTags, Script*));
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Profiler's sampling interval (in milliseconds).
2977549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#if defined(ANDROID)
2987549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch  // Phones and tablets have processors that are much slower than desktop
2997549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch  // and laptop computers for which current heuristics are tuned.
3007549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch  static const int kSamplingIntervalMs = 5;
3017549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#else
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kSamplingIntervalMs = 1;
3037549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#endif
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Callback from Log, stops profiling in case of insufficient resources.
30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogFailure();
30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  class NameBuffer;
310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  class NameMap;
311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Logger();
31344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~Logger();
3146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits the profiler's first message.
31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ProfilerBeginEvent();
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
318d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Emits callback event messages.
31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CallbackEventInternal(const char* prefix,
32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             const char* name,
32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             Address entry_point);
322d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
323d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  // Internal configurable move event.
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MoveEventInternal(LogEventsAndTags event, Address from, Address to);
325d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
326d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  // Internal configurable move event.
32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void DeleteEventInternal(LogEventsAndTags event, Address from);
328d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits the source code of a regexp. Used by regexp events.
33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogRegExpSource(Handle<JSRegExp> regexp);
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Used for logging stubs found in the snapshot.
33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogCodeObject(Object* code_object);
3343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
335f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Emits general information about generated code.
33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LogCodeInfo();
337f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void RegisterSnapshotCodeName(Code* code, const char* name, int name_size);
339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Low-level logging support.
341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelCodeCreateEvent(Code* code, const char* name, int name_size);
343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelCodeMoveEvent(Address from, Address to);
345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelCodeDeleteEvent(Address from);
347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelSnapshotPositionEvent(Address addr, int pos);
349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelLogWriteBytes(const char* bytes, int size);
351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  template <typename T>
353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LowLevelLogWriteStruct(const T& s) {
354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    char tag = T::kTag;
355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LowLevelLogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag));
356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LowLevelLogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s));
357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
358f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emits a profiler tick event. Used by the profiler thread.
36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TickEvent(TickSample* sample, bool overflow);
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ApiEvent(const char* name, ...);
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Logs a StringEvent regardless of whether FLAG_log is true.
36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UncheckedStringEvent(const char* name, const char* value);
366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Logs an IntEvent regardless of whether FLAG_log is true.
36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UncheckedIntEvent(const char* name, int value);
36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UncheckedIntPtrTEvent(const char* name, intptr_t value);
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Returns whether profiler's sampler is active.
37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsProfilerSamplerActive();
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The sampler used by the profiler and the sliding state window.
37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Ticker* ticker_;
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // When the statistical profile is active, profiler_
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // points to a Profiler, that handles collection
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // of samples.
38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Profiler* profiler_;
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // SlidingStateWindow instance keeping a sliding window of the most
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // recent VM states.
38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SlidingStateWindow* sliding_state_window_;
38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // An array of log events names.
38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const char* const* log_events_;
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal implementation classes with access to
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // private members.
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class EventLog;
39244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class Isolate;
39344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class LogMessageBuilder;
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class TimeLog;
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class Profiler;
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class SlidingStateWindow;
397d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  friend class StackTracer;
398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class VMState;
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class LoggerTestHelper;
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int logging_nesting_;
40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int cpu_profiler_nesting_;
40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Log* log_;
40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
408257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  NameBuffer* name_buffer_;
409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  NameMap* address_to_name_map_;
411257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Guards against multiple calls to TearDown() that can happen in some tests.
4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // 'true' between SetUp() and TearDown().
41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_initialized_;
41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Support for 'incremental addresses' in compressed logs:
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //  LogMessageBuilder::AppendAddress(Address addr)
41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address last_address_;
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //  Logger::TickEvent(...)
42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address prev_sp_;
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address prev_function_;
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //  Logger::MoveEventInternal(...)
42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address prev_to_;
42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //  Logger::FunctionCreateEvent(...)
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address prev_code_;
4266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
4276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  friend class CpuProfiler;
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Process wide registry of samplers.
43244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SamplerRegistry : public AllStatic {
43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum State {
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HAS_NO_SAMPLERS,
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HAS_SAMPLERS,
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HAS_CPU_PROFILING_SAMPLERS
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  typedef void (*VisitSampler)(Sampler*, void*);
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static State GetState();
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Iterates over all active samplers keeping the internal lock held.
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns whether there are any active samplers.
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool IterateActiveSamplers(VisitSampler func, void* param);
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Adds/Removes an active sampler.
44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void AddActiveSampler(Sampler* sampler);
45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void RemoveActiveSampler(Sampler* sampler);
45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool ActiveSamplersExist() {
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return active_samplers_ != NULL && !active_samplers_->is_empty();
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static List<Sampler*>* active_samplers_;
45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_IMPLICIT_CONSTRUCTORS(SamplerRegistry);
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Class that extracts stack trace, used for profiling.
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass StackTracer : public AllStatic {
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void Trace(Isolate* isolate, TickSample* sample);
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_LOG_H_
473