1ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_LOG_H_
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_LOG_H_
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h"
32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "objects.h"
333e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org#include "platform.h"
343e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Logger is used for collecting logging information from V8 during
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// execution. The result is dumped to a file.
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Available command line flags:
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//  --log
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Minimal logging (no API, code, or GC sample events), default is off.
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-all
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log all events to the file, default is off.  This is the same as combining
48b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-api, --log-code, --log-gc, and --log-regexp.
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-api
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log API events to the logfile, default is off.  --log-api implies --log.
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-code
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log code (create, move, and delete) events to the logfile, default is off.
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-code implies --log.
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-gc
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log GC heap samples after each GC that can be processed by hp2ps, default
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is off.  --log-gc implies --log.
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
61b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-regexp
62b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// Log creation and use of regular expressions, Default is off.
63b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-regexp implies --log.
64b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org//
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --logfile <filename>
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Specify the name of the logfile, default is "v8.log".
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --prof
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Collect statistical profiling information (ticks), default is off.  The
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// tick profiler requires code events, so --prof implies --log-code.
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Forward declarations.
737ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.orgclass CodeEventListener;
74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass CompilationInfo;
75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass CpuProfiler;
76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass Isolate;
77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass Log;
78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass PositionsRecorder;
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Profiler;
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Semaphore;
818e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgclass Ticker;
82ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstruct TickSample;
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef LOG
85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define LOG(isolate, Call)                          \
86ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  do {                                              \
87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    v8::internal::Logger* logger =                  \
88ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        (isolate)->logger();                        \
89ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (logger->is_logging())                       \
90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      logger->Call;                                 \
9137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } while (false)
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org#define LOG_CODE_EVENT(isolate, Call)               \
94355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  do {                                              \
95355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    v8::internal::Logger* logger =                  \
96355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        (isolate)->logger();                        \
97355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    if (logger->is_logging_code_events())           \
98355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org      logger->Call;                                 \
99355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  } while (false)
100355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
101355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
102ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define LOG_EVENTS_AND_TAGS_LIST(V)                                     \
103ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_CREATION_EVENT,            "code-creation")                    \
104ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_MOVE_EVENT,                "code-move")                        \
105ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_DELETE_EVENT,              "code-delete")                      \
106ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_MOVING_GC,                 "code-moving-gc")                   \
107ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SHARED_FUNC_MOVE_EVENT,         "sfi-move")                         \
108ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SNAPSHOT_POSITION_EVENT,        "snapshot-pos")                     \
109ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SNAPSHOT_CODE_NAME_EVENT,       "snapshot-code-name")               \
110ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(TICK_EVENT,                     "tick")                             \
111ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(REPEAT_META_EVENT,              "repeat")                           \
112ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(BUILTIN_TAG,                    "Builtin")                          \
113ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_DEBUG_BREAK_TAG,           "CallDebugBreak")                   \
114ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_DEBUG_PREPARE_STEP_IN_TAG, "CallDebugPrepareStepIn")           \
115ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_IC_TAG,                    "CallIC")                           \
116ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_INITIALIZE_TAG,            "CallInitialize")                   \
117ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_MEGAMORPHIC_TAG,           "CallMegamorphic")                  \
118ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_MISS_TAG,                  "CallMiss")                         \
119ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_NORMAL_TAG,                "CallNormal")                       \
120ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_PRE_MONOMORPHIC_TAG,       "CallPreMonomorphic")               \
121ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_DEBUG_BREAK_TAG,     "KeyedCallDebugBreak")              \
122ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_DEBUG_PREPARE_STEP_IN_TAG,                               \
123ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    "KeyedCallDebugPrepareStepIn")                                      \
124ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_IC_TAG,              "KeyedCallIC")                      \
125ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_INITIALIZE_TAG,      "KeyedCallInitialize")              \
126ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_MEGAMORPHIC_TAG,     "KeyedCallMegamorphic")             \
127ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_MISS_TAG,            "KeyedCallMiss")                    \
128ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_NORMAL_TAG,          "KeyedCallNormal")                  \
129ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_PRE_MONOMORPHIC_TAG, "KeyedCallPreMonomorphic")          \
130ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALLBACK_TAG,                   "Callback")                         \
131ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(EVAL_TAG,                       "Eval")                             \
132ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(FUNCTION_TAG,                   "Function")                         \
133ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_LOAD_IC_TAG,              "KeyedLoadIC")                      \
13459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  V(KEYED_LOAD_POLYMORPHIC_IC_TAG,  "KeyedLoadPolymorphicIC")           \
135ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, "KeyedExternalArrayLoadIC")       \
136ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_STORE_IC_TAG,             "KeyedStoreIC")                     \
13759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  V(KEYED_STORE_POLYMORPHIC_IC_TAG, "KeyedStorePolymorphicIC")          \
138ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, "KeyedExternalArrayStoreIC")     \
139ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(LAZY_COMPILE_TAG,               "LazyCompile")                      \
140ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(LOAD_IC_TAG,                    "LoadIC")                           \
1414a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  V(LOAD_POLYMORPHIC_IC_TAG,        "LoadPolymorphicIC")                \
142ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(REG_EXP_TAG,                    "RegExp")                           \
143ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SCRIPT_TAG,                     "Script")                           \
144ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(STORE_IC_TAG,                   "StoreIC")                          \
1452bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  V(STORE_POLYMORPHIC_IC_TAG,       "StorePolymorphicIC")               \
146ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(STUB_TAG,                       "Stub")                             \
147ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(NATIVE_FUNCTION_TAG,            "Function")                         \
148ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(NATIVE_LAZY_COMPILE_TAG,        "LazyCompile")                      \
1495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  V(NATIVE_SCRIPT_TAG,              "Script")
150c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// Note that 'NATIVE_' cases for functions and scripts are mapped onto
151c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// original tags when writing to the log.
152c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
153357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
154ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass JitLogger;
15510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgclass LowLevelLogger;
156ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Sampler;
157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Logger {
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#define DECLARE_ENUM(enum_item, ignore) enum_item,
161eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  enum LogEventsAndTags {
162eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    LOG_EVENTS_AND_TAGS_LIST(DECLARE_ENUM)
163eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    NUMBER_OF_LOG_EVENTS
164eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  };
165eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org#undef DECLARE_ENUM
166eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  // Acquires resources for logging if the right flags are set.
168ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool SetUp(Isolate* isolate);
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Sets the current code event handler.
171355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  void SetCodeEventHandler(uint32_t options,
172355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                           JitCodeEventHandler event_handler);
173355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Sampler* sampler();
175a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
176f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Frees resources acquired in SetUp.
177030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  // When a temporary file is used for the log, returns its stream descriptor,
178030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  // leaving the file open.
179030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  FILE* TearDown();
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with a string value -> (name, value).
182ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void StringEvent(const char* name, const char* value);
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with an int value -> (name, value).
185ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IntEvent(const char* name, int value);
186ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IntPtrTEvent(const char* name, intptr_t value);
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with an handle value -> (name, location).
189ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HandleEvent(const char* name, Object** location);
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits memory management events for C allocated structures.
192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void NewEvent(const char* name, void* object, size_t size);
193ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DeleteEvent(const char* name, void* object);
194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
195ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Static versions of the above, operate on current isolate's logger.
196ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Used in TRACK_MEMORY(TypeName) defined in globals.h
197ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void NewEventStatic(const char* name, void* object, size_t size);
198ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void DeleteEventStatic(const char* name, void* object);
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with a tag, and some resource usage information.
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // -> (name, tag, <rusage information>).
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Currently, the resource usage information is a process time stamp
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // and a real time timestamp.
204ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ResourceEvent(const char* name, const char* tag);
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event that an undefined property was read from an
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // object.
208750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void SuspectReadEvent(Name* name, Object* obj);
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
210769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // Emits an event when a message is put on or read from a debugging queue.
211769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // DebugTag lets us put a call-site specific label on the event.
212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DebugTag(const char* call_site_tag);
213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DebugEvent(const char* event_type, Vector<uint16_t> parameter);
214769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-api. ====
217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiNamedSecurityCheck(Object* key);
218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiIndexedSecurityCheck(uint32_t index);
219ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiNamedPropertyAccess(const char* tag, JSObject* holder, Object* name);
220ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiIndexedPropertyAccess(const char* tag,
221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                JSObject* holder,
222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                uint32_t index);
223ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiObjectAccess(const char* tag, JSObject* obj);
224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiEntryCall(const char* name);
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-code. ====
2287ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  void addCodeEventListener(CodeEventListener* listener);
2297ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  void removeCodeEventListener(CodeEventListener* listener);
2307ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  bool hasCodeEventListener(CodeEventListener* listener);
2317ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
2327ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
23301beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org  // Emits a code event for a callback function.
234750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void CallbackEvent(Name* name, Address entry_point);
235750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void GetterCallbackEvent(Name* name, Address entry_point);
236750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void SetterCallbackEvent(Name* name, Address entry_point);
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code create event.
238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code, const char* source);
240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
241750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Code* code, Name* name);
242ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code,
244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       SharedFunctionInfo* shared,
2454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org                       CompilationInfo* info,
246750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Name* name);
247ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code,
249ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       SharedFunctionInfo* shared,
2504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org                       CompilationInfo* info,
251750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Name* source, int line);
252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count);
253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeMovingGCEvent();
25471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // Emits a code create event for a RegExp.
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RegExpCodeCreateEvent(Code* code, String* source);
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code move event.
257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeMoveEvent(Address from, Address to);
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code delete event.
259ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeDeleteEvent(Address from);
260c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info add event with Postion type.
261c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
262c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                       int pc_offset,
263c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                       int position);
264c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info add event with StatementPostion type.
265c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeLinePosInfoAddStatementPositionEvent(void* jit_handler_data,
266c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                int pc_offset,
267c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                int position);
268c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info start to record event
269c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeStartLinePosInfoRecordEvent(PositionsRecorder* pos_recorder);
270c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info finish record event.
271c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // It's the callee's responsibility to dispose the parameter jit_handler_data.
272c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeEndLinePosInfoRecordEvent(Code* code, void* jit_handler_data);
2733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SharedFunctionInfoMoveEvent(Address from, Address to);
275b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
2767ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  void CodeNameEvent(Address addr, int pos, const char* code_name);
277ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SnapshotPositionEvent(Address addr, int pos);
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-gc. ====
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Heap sampling events: start, end, and individual types.
281ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleBeginEvent(const char* space, const char* kind);
282ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleEndEvent(const char* space, const char* kind);
283ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleItemEvent(const char* type, int number, int bytes);
284ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSConstructorEvent(const char* constructor,
285ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                    int number, int bytes);
286ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSRetainersEvent(const char* constructor,
2872bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com                                         const char* event);
288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSProducerEvent(const char* constructor,
289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                 Address* stack);
290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleStats(const char* space, const char* kind,
291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       intptr_t capacity, intptr_t used);
292ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
293ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SharedLibraryEvent(const char* library_path,
294ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t start,
295ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t end);
296ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SharedLibraryEvent(const wchar_t* library_path,
297ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t start,
298ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t end);
29983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
30083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  // ==== Events logged by --log-timer-events. ====
301068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  enum StartEnd { START, END };
302068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
303c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  void CodeDeoptEvent(Code* code);
304c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
305068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  void TimerEvent(StartEnd se, const char* name);
30683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
307ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void EnterExternal(Isolate* isolate);
308ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void LeaveExternal(Isolate* isolate);
3098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  class TimerEventScope {
3118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org   public:
3121f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    TimerEventScope(Isolate* isolate, const char* name)
313068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org        : isolate_(isolate), name_(name) {
314068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      if (FLAG_log_internal_timer_events) LogTimerEvent(START);
3158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    }
3168e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    ~TimerEventScope() {
318068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      if (FLAG_log_internal_timer_events) LogTimerEvent(END);
3198e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    }
3208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
321068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    void LogTimerEvent(StartEnd se);
3221f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
3238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    static const char* v8_recompile_synchronous;
3248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    static const char* v8_recompile_parallel;
3258e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    static const char* v8_compile_full_code;
3268e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    static const char* v8_execute;
327068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    static const char* v8_external;
3288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3298e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org   private:
3301f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    Isolate* isolate_;
3318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    const char* name_;
3328e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  };
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
334b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // ==== Events logged by --log-regexp ====
335b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // Regexp compilation and execution events.
336b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
337ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache);
338b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
33937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Log an event reported from generated code
340e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void LogRuntime(Vector<const char> format, JSArray* args);
341b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
342ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool is_logging() {
343ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return logging_nesting_ > 0;
3443e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  }
34537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
346355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  bool is_logging_code_events() {
347ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    return is_logging() || jit_logger_ != NULL;
348355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
349355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
350245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Pause/Resume collection of profiling data.
351b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org  // When data collection is paused, CPU Tick events are discarded until
352245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // data collection is Resumed.
3534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  void PauseProfiler();
3544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  void ResumeProfiler();
3554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  bool IsProfilerPaused();
356245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
35734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  void LogExistingFunction(Handle<SharedFunctionInfo> shared,
35834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org                           Handle<Code> code);
35971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Logs all compiled functions found in the heap.
360ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCompiledFunctions();
361ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  // Logs all accessor callbacks found in the heap.
362ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogAccessorCallbacks();
363c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Used for logging stubs found in the snapshot.
364ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCodeObjects();
36571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
366357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  // Converts tag to a corresponding NATIVE_... if the script is native.
367357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  INLINE(static LogEventsAndTags ToNativeByScript(LogEventsAndTags, Script*));
368357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
369755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Profiler's sampling interval (in milliseconds).
370ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#if defined(ANDROID)
371ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  // Phones and tablets have processors that are much slower than desktop
372ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  // and laptop computers for which current heuristics are tuned.
373ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  static const int kSamplingIntervalMs = 5;
374ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#else
375755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  static const int kSamplingIntervalMs = 1;
376ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#endif
377755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Callback from Log, stops profiling in case of insufficient resources.
379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogFailure();
380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
381c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org private:
382c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  explicit Logger(Isolate* isolate);
383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ~Logger();
384c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
385755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Emits the profiler's first message.
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ProfilerBeginEvent();
387755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
388ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  // Emits callback event messages.
389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CallbackEventInternal(const char* prefix,
390750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                             Name* name,
391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                             Address entry_point);
392ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
393b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Internal configurable move event.
394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void MoveEventInternal(LogEventsAndTags event, Address from, Address to);
395b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
396b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // Emits the source code of a regexp. Used by regexp events.
397ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogRegExpSource(Handle<JSRegExp> regexp);
398b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
3995c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Used for logging stubs found in the snapshot.
400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCodeObject(Object* code_object);
4015c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Helper method. It resets name_buffer_ and add tag name into it.
4031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void InitNameBuffer(LogEventsAndTags tag);
4041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a profiler tick event. Used by the profiler thread.
406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TickEvent(TickSample* sample, bool overflow);
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
408ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiEvent(const char* name, ...);
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4106f10e41fef1524c70846d970268de222e41c594cager@chromium.org  // Logs a StringEvent regardless of whether FLAG_log is true.
411ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedStringEvent(const char* name, const char* value);
4126f10e41fef1524c70846d970268de222e41c594cager@chromium.org
413ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Logs an IntEvent regardless of whether FLAG_log is true.
414ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedIntEvent(const char* name, int value);
415ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedIntPtrTEvent(const char* name, intptr_t value);
416755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
417c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate_;
418c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The sampler used by the profiler and the sliding state window.
420ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Ticker* ticker_;
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // When the statistical profile is active, profiler_
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // points to a Profiler, that handles collection
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // of samples.
425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Profiler* profiler_;
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // An array of log events names.
428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  const char* const* log_events_;
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Internal implementation classes with access to
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // private members.
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class EventLog;
433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class TimeLog;
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Profiler;
436ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  template <StateTag Tag> friend class VMState;
43771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
43871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  friend class LoggerTestHelper;
4393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
440ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
441ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int logging_nesting_;
442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int cpu_profiler_nesting_;
443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Log* log_;
44510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  LowLevelLogger* ll_logger_;
446ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JitLogger* jit_logger_;
4477ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  List<CodeEventListener*> listeners_;
4488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Guards against multiple calls to TearDown() that can happen in some tests.
450f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // 'true' between SetUp() and TearDown().
451ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool is_initialized_;
452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  int64_t epoch_;
4548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
45525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  friend class CpuProfiler;
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4597ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.orgclass CodeEventListener {
4607ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org public:
4617ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual ~CodeEventListener() {}
4627ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
4637ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
4647ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
4657ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               const char* comment) = 0;
4667ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
4677ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
4687ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* name) = 0;
4697ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
4707ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
4717ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               SharedFunctionInfo* shared,
4727ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               CompilationInfo* info,
4737ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* name) = 0;
4747ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
4757ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
4767ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               SharedFunctionInfo* shared,
4777ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               CompilationInfo* info,
4787ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* source,
4797ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               int line) = 0;
4807ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
4817ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
4827ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               int args_count) = 0;
4837ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CallbackEvent(Name* name, Address entry_point) = 0;
4847ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void GetterCallbackEvent(Name* name, Address entry_point) = 0;
4857ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void SetterCallbackEvent(Name* name, Address entry_point) = 0;
4867ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void RegExpCodeCreateEvent(Code* code, String* source) = 0;
4877ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeMoveEvent(Address from, Address to) = 0;
4887ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeDeleteEvent(Address from) = 0;
4897ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void SharedFunctionInfoMoveEvent(Address from, Address to) = 0;
4907ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeMovingGCEvent() = 0;
4917ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org};
4927ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
4937ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
4947ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.orgclass CodeEventLogger : public CodeEventListener {
4957ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org public:
4967ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  CodeEventLogger();
4977ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual ~CodeEventLogger();
4987ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
4997ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
5007ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
5017ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               const char* comment);
5027ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
5037ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
5047ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* name);
5057ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
5067ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
5077ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               int args_count);
5087ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
5097ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
5107ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               SharedFunctionInfo* shared,
5117ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               CompilationInfo* info,
5127ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* name);
5137ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
5147ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Code* code,
5157ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               SharedFunctionInfo* shared,
5167ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               CompilationInfo* info,
5177ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               Name* source,
5187ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                               int line);
5197ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void RegExpCodeCreateEvent(Code* code, String* source);
5207ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
5217ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CallbackEvent(Name* name, Address entry_point) { }
5227ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void GetterCallbackEvent(Name* name, Address entry_point) { }
5237ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void SetterCallbackEvent(Name* name, Address entry_point) { }
5247ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void SharedFunctionInfoMoveEvent(Address from, Address to) { }
5257ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void CodeMovingGCEvent() { }
5267ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
5277ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org private:
5287ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  class NameBuffer;
5297ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
5307ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  virtual void LogRecordedBuffer(Code* code,
5317ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                                 SharedFunctionInfo* shared,
5327ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                                 const char* name,
5337ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org                                 int length) = 0;
5347ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
5357ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org  NameBuffer* name_buffer_;
5367ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org};
5377ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
5387ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_LOG_H_
543