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