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