1ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_LOG_H_
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_LOG_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org#include <string>
91845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/elapsed-timer.h"
125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects.h"
143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
165de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
175de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgnamespace base {
185de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgclass Semaphore;
195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org}
205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
2171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Logger is used for collecting logging information from V8 during
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// execution. The result is dumped to a file.
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Available command line flags:
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//  --log
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Minimal logging (no API, code, or GC sample events), default is off.
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-all
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log all events to the file, default is off.  This is the same as combining
33b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-api, --log-code, --log-gc, and --log-regexp.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-api
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log API events to the logfile, default is off.  --log-api implies --log.
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-code
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log code (create, move, and delete) events to the logfile, default is off.
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-code implies --log.
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-gc
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Log GC heap samples after each GC that can be processed by hp2ps, default
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is off.  --log-gc implies --log.
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
46b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-regexp
47b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// Log creation and use of regular expressions, Default is off.
48b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// --log-regexp implies --log.
49b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org//
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --logfile <filename>
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Specify the name of the logfile, default is "v8.log".
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --prof
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Collect statistical profiling information (ticks), default is off.  The
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// tick profiler requires code events, so --prof implies --log-code.
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Forward declarations.
58d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgclass CodeEventListener;
59ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass CompilationInfo;
60ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass CpuProfiler;
61ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass Isolate;
62ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass Log;
63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass PositionsRecorder;
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Profiler;
658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgclass Ticker;
66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstruct TickSample;
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef LOG
69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define LOG(isolate, Call)                          \
70ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  do {                                              \
71ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    v8::internal::Logger* logger =                  \
72ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        (isolate)->logger();                        \
73ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (logger->is_logging())                       \
74ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      logger->Call;                                 \
7537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } while (false)
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org#define LOG_CODE_EVENT(isolate, Call)               \
78355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  do {                                              \
79355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    v8::internal::Logger* logger =                  \
80355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        (isolate)->logger();                        \
81355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    if (logger->is_logging_code_events())           \
82355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org      logger->Call;                                 \
83355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  } while (false)
84355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
85355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
86ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define LOG_EVENTS_AND_TAGS_LIST(V)                                     \
87ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_CREATION_EVENT,            "code-creation")                    \
88fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  V(CODE_DISABLE_OPT_EVENT,         "code-disable-optimization")        \
89ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_MOVE_EVENT,                "code-move")                        \
90ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_DELETE_EVENT,              "code-delete")                      \
91ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CODE_MOVING_GC,                 "code-moving-gc")                   \
92ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SHARED_FUNC_MOVE_EVENT,         "sfi-move")                         \
93ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SNAPSHOT_POSITION_EVENT,        "snapshot-pos")                     \
94ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SNAPSHOT_CODE_NAME_EVENT,       "snapshot-code-name")               \
95ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(TICK_EVENT,                     "tick")                             \
96ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(REPEAT_META_EVENT,              "repeat")                           \
97ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(BUILTIN_TAG,                    "Builtin")                          \
98ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_DEBUG_BREAK_TAG,           "CallDebugBreak")                   \
99ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_DEBUG_PREPARE_STEP_IN_TAG, "CallDebugPrepareStepIn")           \
100ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_INITIALIZE_TAG,            "CallInitialize")                   \
101ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_MEGAMORPHIC_TAG,           "CallMegamorphic")                  \
102ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_MISS_TAG,                  "CallMiss")                         \
103ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_NORMAL_TAG,                "CallNormal")                       \
104ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALL_PRE_MONOMORPHIC_TAG,       "CallPreMonomorphic")               \
1059cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(LOAD_INITIALIZE_TAG,            "LoadInitialize")                   \
1069cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(LOAD_PREMONOMORPHIC_TAG,        "LoadPreMonomorphic")               \
1079cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(LOAD_MEGAMORPHIC_TAG,           "LoadMegamorphic")                  \
1089cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(STORE_INITIALIZE_TAG,           "StoreInitialize")                  \
1099cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(STORE_PREMONOMORPHIC_TAG,       "StorePreMonomorphic")              \
1109cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(STORE_GENERIC_TAG,              "StoreGeneric")                     \
1119cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  V(STORE_MEGAMORPHIC_TAG,          "StoreMegamorphic")                 \
112ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_DEBUG_BREAK_TAG,     "KeyedCallDebugBreak")              \
113ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_DEBUG_PREPARE_STEP_IN_TAG,                               \
114ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    "KeyedCallDebugPrepareStepIn")                                      \
115ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_INITIALIZE_TAG,      "KeyedCallInitialize")              \
116ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_MEGAMORPHIC_TAG,     "KeyedCallMegamorphic")             \
117ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_MISS_TAG,            "KeyedCallMiss")                    \
118ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_NORMAL_TAG,          "KeyedCallNormal")                  \
119ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_CALL_PRE_MONOMORPHIC_TAG, "KeyedCallPreMonomorphic")          \
120ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(CALLBACK_TAG,                   "Callback")                         \
121ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(EVAL_TAG,                       "Eval")                             \
122ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(FUNCTION_TAG,                   "Function")                         \
12332aa03c4b5fe6e129df7529ecdaaeefce3ecee29jkummerow@chromium.org  V(HANDLER_TAG,                    "Handler")                          \
124ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_LOAD_IC_TAG,              "KeyedLoadIC")                      \
12559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  V(KEYED_LOAD_POLYMORPHIC_IC_TAG,  "KeyedLoadPolymorphicIC")           \
126ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, "KeyedExternalArrayLoadIC")       \
127ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_STORE_IC_TAG,             "KeyedStoreIC")                     \
12859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  V(KEYED_STORE_POLYMORPHIC_IC_TAG, "KeyedStorePolymorphicIC")          \
129ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, "KeyedExternalArrayStoreIC")     \
130ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(LAZY_COMPILE_TAG,               "LazyCompile")                      \
131a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  V(CALL_IC_TAG,                    "CallIC")                           \
132ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(LOAD_IC_TAG,                    "LoadIC")                           \
1334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  V(LOAD_POLYMORPHIC_IC_TAG,        "LoadPolymorphicIC")                \
134ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(REG_EXP_TAG,                    "RegExp")                           \
135ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(SCRIPT_TAG,                     "Script")                           \
136ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(STORE_IC_TAG,                   "StoreIC")                          \
1372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  V(STORE_POLYMORPHIC_IC_TAG,       "StorePolymorphicIC")               \
138ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(STUB_TAG,                       "Stub")                             \
139ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(NATIVE_FUNCTION_TAG,            "Function")                         \
140ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(NATIVE_LAZY_COMPILE_TAG,        "LazyCompile")                      \
1415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  V(NATIVE_SCRIPT_TAG,              "Script")
142c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// Note that 'NATIVE_' cases for functions and scripts are mapped onto
143c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org// original tags when writing to the log.
144c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
145357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
146ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgclass JitLogger;
147f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgclass PerfBasicLogger;
14810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgclass LowLevelLogger;
149f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgclass PerfJitLogger;
150ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Sampler;
151ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Logger {
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  enum StartEnd { START = 0, END = 1 };
1554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1565f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#define DECLARE_ENUM(enum_item, ignore) enum_item,
157eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  enum LogEventsAndTags {
158eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    LOG_EVENTS_AND_TAGS_LIST(DECLARE_ENUM)
159eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    NUMBER_OF_LOG_EVENTS
160eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  };
161eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org#undef DECLARE_ENUM
162eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1639085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  // Acquires resources for logging if the right flags are set.
164ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool SetUp(Isolate* isolate);
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Sets the current code event handler.
167355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  void SetCodeEventHandler(uint32_t options,
168355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                           JitCodeEventHandler event_handler);
169355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
170ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Sampler* sampler();
171a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
172f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Frees resources acquired in SetUp.
173030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  // When a temporary file is used for the log, returns its stream descriptor,
174030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  // leaving the file open.
175030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  FILE* TearDown();
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with a string value -> (name, value).
178ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void StringEvent(const char* name, const char* value);
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with an int value -> (name, value).
181ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IntEvent(const char* name, int value);
182ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IntPtrTEvent(const char* name, intptr_t value);
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with an handle value -> (name, location).
185ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HandleEvent(const char* name, Object** location);
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits memory management events for C allocated structures.
188ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void NewEvent(const char* name, void* object, size_t size);
189ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DeleteEvent(const char* name, void* object);
190ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
191ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Static versions of the above, operate on current isolate's logger.
192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Used in TRACK_MEMORY(TypeName) defined in globals.h
193ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void NewEventStatic(const char* name, void* object, size_t size);
194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void DeleteEventStatic(const char* name, void* object);
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event with a tag, and some resource usage information.
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // -> (name, tag, <rusage information>).
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Currently, the resource usage information is a process time stamp
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // and a real time timestamp.
200ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ResourceEvent(const char* name, const char* tag);
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits an event that an undefined property was read from an
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // object.
204750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void SuspectReadEvent(Name* name, Object* obj);
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
206769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // Emits an event when a message is put on or read from a debugging queue.
207769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // DebugTag lets us put a call-site specific label on the event.
208ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DebugTag(const char* call_site_tag);
209ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void DebugEvent(const char* event_type, Vector<uint16_t> parameter);
210769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-api. ====
213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiNamedSecurityCheck(Object* key);
214ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiIndexedSecurityCheck(uint32_t index);
215ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiNamedPropertyAccess(const char* tag, JSObject* holder, Object* name);
216ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiIndexedPropertyAccess(const char* tag,
217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                JSObject* holder,
218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                uint32_t index);
219ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiObjectAccess(const char* tag, JSObject* obj);
220ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiEntryCall(const char* name);
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-code. ====
224d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  void addCodeEventListener(CodeEventListener* listener);
225d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  void removeCodeEventListener(CodeEventListener* listener);
226d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool hasCodeEventListener(CodeEventListener* listener);
227d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
228d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
22901beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org  // Emits a code event for a callback function.
230750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void CallbackEvent(Name* name, Address entry_point);
231750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void GetterCallbackEvent(Name* name, Address entry_point);
232750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void SetterCallbackEvent(Name* name, Address entry_point);
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code create event.
234ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code, const char* source);
236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
237750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Code* code, Name* name);
238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code,
240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       SharedFunctionInfo* shared,
2414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org                       CompilationInfo* info,
242750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Name* name);
243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag,
244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       Code* code,
245ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       SharedFunctionInfo* shared,
2464e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org                       CompilationInfo* info,
2471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                       Name* source, int line, int column);
248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count);
249fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  // Emits a code deoptimization event.
250fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  void CodeDisableOptEvent(Code* code, SharedFunctionInfo* shared);
251ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeMovingGCEvent();
25271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // Emits a code create event for a RegExp.
253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RegExpCodeCreateEvent(Code* code, String* source);
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code move event.
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeMoveEvent(Address from, Address to);
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a code delete event.
257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CodeDeleteEvent(Address from);
258c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info add event with Postion type.
259c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
260c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                       int pc_offset,
261c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                       int position);
262c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info add event with StatementPostion type.
263c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeLinePosInfoAddStatementPositionEvent(void* jit_handler_data,
264c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                int pc_offset,
265c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                int position);
266c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info start to record event
267c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeStartLinePosInfoRecordEvent(PositionsRecorder* pos_recorder);
268c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Emits a code line info finish record event.
269c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // It's the callee's responsibility to dispose the parameter jit_handler_data.
270c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void CodeEndLinePosInfoRecordEvent(Code* code, void* jit_handler_data);
2713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
272ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SharedFunctionInfoMoveEvent(Address from, Address to);
273b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
274d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  void CodeNameEvent(Address addr, int pos, const char* code_name);
275ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SnapshotPositionEvent(Address addr, int pos);
27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ==== Events logged by --log-gc. ====
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Heap sampling events: start, end, and individual types.
279ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleBeginEvent(const char* space, const char* kind);
280ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleEndEvent(const char* space, const char* kind);
281ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleItemEvent(const char* type, int number, int bytes);
282ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSConstructorEvent(const char* constructor,
283ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                    int number, int bytes);
284ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSRetainersEvent(const char* constructor,
2852bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com                                         const char* event);
286ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleJSProducerEvent(const char* constructor,
287ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                 Address* stack);
288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void HeapSampleStats(const char* space, const char* kind,
289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       intptr_t capacity, intptr_t used);
290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2911845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  void SharedLibraryEvent(const std::string& library_path,
292ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t start,
293ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          uintptr_t end);
29483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
295c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  void CodeDeoptEvent(Code* code);
29670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org  void CurrentTimeEvent();
297c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
298068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  void TimerEvent(StartEnd se, const char* name);
29983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
300ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void EnterExternal(Isolate* isolate);
301ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void LeaveExternal(Isolate* isolate);
3028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  static void EmptyTimerEventsLogger(const char* name, int se) {}
3044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  static void DefaultTimerEventsLogger(const char* name, int se);
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
306b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // ==== Events logged by --log-regexp ====
307b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // Regexp compilation and execution events.
308b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache);
310b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool is_logging() {
312dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    return is_logging_;
3133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  }
31437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
315355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  bool is_logging_code_events() {
316ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    return is_logging() || jit_logger_ != NULL;
317355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
318355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
319dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // Stop collection of profiling data.
320dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // When data collection is paused, CPU Tick events are discarded.
321dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  void StopProfiler();
322245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
32334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  void LogExistingFunction(Handle<SharedFunctionInfo> shared,
32434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org                           Handle<Code> code);
32571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Logs all compiled functions found in the heap.
326ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCompiledFunctions();
327ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  // Logs all accessor callbacks found in the heap.
328ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogAccessorCallbacks();
329c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Used for logging stubs found in the snapshot.
330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCodeObjects();
33171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
332357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  // Converts tag to a corresponding NATIVE_... if the script is native.
333357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  INLINE(static LogEventsAndTags ToNativeByScript(LogEventsAndTags, Script*));
334357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
335755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Profiler's sampling interval (in milliseconds).
336ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#if defined(ANDROID)
337ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  // Phones and tablets have processors that are much slower than desktop
338ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  // and laptop computers for which current heuristics are tuned.
339ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  static const int kSamplingIntervalMs = 5;
340ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#else
341755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  static const int kSamplingIntervalMs = 1;
342ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org#endif
343755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
344ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Callback from Log, stops profiling in case of insufficient resources.
345ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogFailure();
346ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
347c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org private:
348c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  explicit Logger(Isolate* isolate);
349ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ~Logger();
350c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
351755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Emits the profiler's first message.
352ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ProfilerBeginEvent();
353755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
354ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  // Emits callback event messages.
355ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CallbackEventInternal(const char* prefix,
356750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                             Name* name,
357ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                             Address entry_point);
358ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
359b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Internal configurable move event.
360ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void MoveEventInternal(LogEventsAndTags event, Address from, Address to);
361b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
362b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  // Emits the source code of a regexp. Used by regexp events.
363ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogRegExpSource(Handle<JSRegExp> regexp);
364b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
3655c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Used for logging stubs found in the snapshot.
366ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void LogCodeObject(Object* code_object);
3675c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Helper method. It resets name_buffer_ and add tag name into it.
3691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void InitNameBuffer(LogEventsAndTags tag);
3701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Emits a profiler tick event. Used by the profiler thread.
372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TickEvent(TickSample* sample, bool overflow);
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
374ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ApiEvent(const char* name, ...);
37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3766f10e41fef1524c70846d970268de222e41c594cager@chromium.org  // Logs a StringEvent regardless of whether FLAG_log is true.
377ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedStringEvent(const char* name, const char* value);
3786f10e41fef1524c70846d970268de222e41c594cager@chromium.org
379ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Logs an IntEvent regardless of whether FLAG_log is true.
380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedIntEvent(const char* name, int value);
381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UncheckedIntPtrTEvent(const char* name, intptr_t value);
382755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
383c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate_;
384c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The sampler used by the profiler and the sliding state window.
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Ticker* ticker_;
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // When the statistical profile is active, profiler_
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // points to a Profiler, that handles collection
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // of samples.
391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Profiler* profiler_;
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
393ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // An array of log events names.
394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  const char* const* log_events_;
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Internal implementation classes with access to
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // private members.
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class EventLog;
399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class TimeLog;
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Profiler;
402ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  template <StateTag Tag> friend class VMState;
40371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  friend class LoggerTestHelper;
4043e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
405dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  bool is_logging_;
406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Log* log_;
407f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  PerfBasicLogger* perf_basic_logger_;
408f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  PerfJitLogger* perf_jit_logger_;
40910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  LowLevelLogger* ll_logger_;
410ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JitLogger* jit_logger_;
411d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  List<CodeEventListener*> listeners_;
4128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Guards against multiple calls to TearDown() that can happen in some tests.
414f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // 'true' between SetUp() and TearDown().
415ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool is_initialized_;
416ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4175de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::ElapsedTimer timer_;
4188e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
41925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  friend class CpuProfiler;
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#define TIMER_EVENTS_LIST(V)    \
4244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(RecompileSynchronous, true) \
4254c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(RecompileConcurrent, true)  \
4264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(CompileFullCode, true)      \
4274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(Execute, true)              \
4284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(External, true)             \
4294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  V(IcMiss, false)
4304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#define V(TimerName, expose)                                                  \
4324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  class TimerEvent##TimerName : public AllStatic {                            \
4334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org   public:                                                                    \
4344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    static const char* name(void* unused = NULL) { return "V8." #TimerName; } \
4354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    static bool expose_to_api() { return expose; }                            \
4364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  };
4374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgTIMER_EVENTS_LIST(V)
4384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#undef V
4394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgtemplate <class TimerEvent>
4424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgclass TimerEventScope {
4434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org public:
4444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  explicit TimerEventScope(Isolate* isolate) : isolate_(isolate) {
4454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    LogTimerEvent(Logger::START);
4464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  }
4474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  ~TimerEventScope() { LogTimerEvent(Logger::END); }
4494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  void LogTimerEvent(Logger::StartEnd se);
4514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org private:
4534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Isolate* isolate_;
4544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org};
4554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
4564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
457d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgclass CodeEventListener {
458d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org public:
459d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual ~CodeEventListener() {}
460d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
461d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
462d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
463d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               const char* comment) = 0;
464d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
465d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
466d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* name) = 0;
467d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
468d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
469d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               SharedFunctionInfo* shared,
470d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               CompilationInfo* info,
471d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* name) = 0;
472d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
473d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
474d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               SharedFunctionInfo* shared,
475d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               CompilationInfo* info,
476d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* source,
477dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org                               int line, int column) = 0;
478d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
479d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
480d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               int args_count) = 0;
481d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CallbackEvent(Name* name, Address entry_point) = 0;
482d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void GetterCallbackEvent(Name* name, Address entry_point) = 0;
483d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void SetterCallbackEvent(Name* name, Address entry_point) = 0;
484d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void RegExpCodeCreateEvent(Code* code, String* source) = 0;
485d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeMoveEvent(Address from, Address to) = 0;
486d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeDeleteEvent(Address from) = 0;
487d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void SharedFunctionInfoMoveEvent(Address from, Address to) = 0;
488d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeMovingGCEvent() = 0;
489fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  virtual void CodeDisableOptEvent(Code* code, SharedFunctionInfo* shared) = 0;
490d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org};
491d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
492d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
493d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgclass CodeEventLogger : public CodeEventListener {
494d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org public:
495d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CodeEventLogger();
496d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual ~CodeEventLogger();
497d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
498d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
499d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
500d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               const char* comment);
501d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
502d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
503d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* name);
504d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
505d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
506d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               int args_count);
507d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
508d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
509d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               SharedFunctionInfo* shared,
510d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               CompilationInfo* info,
511d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* name);
512d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeCreateEvent(Logger::LogEventsAndTags tag,
513d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Code* code,
514d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               SharedFunctionInfo* shared,
515d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               CompilationInfo* info,
516d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                               Name* source,
517dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org                               int line, int column);
518d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void RegExpCodeCreateEvent(Code* code, String* source);
519d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
520d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CallbackEvent(Name* name, Address entry_point) { }
521d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void GetterCallbackEvent(Name* name, Address entry_point) { }
522d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void SetterCallbackEvent(Name* name, Address entry_point) { }
523d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void SharedFunctionInfoMoveEvent(Address from, Address to) { }
524d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void CodeMovingGCEvent() { }
525d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
526d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org private:
527d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  class NameBuffer;
528d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
529d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual void LogRecordedBuffer(Code* code,
530d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                 SharedFunctionInfo* shared,
531d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                 const char* name,
532d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                 int length) = 0;
533d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
534d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  NameBuffer* name_buffer_;
535d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org};
536d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
537d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_LOG_H_
542