diff options
author | Matheus Marchini <matheus@sthima.com> | 2018-06-04 09:33:17 -0700 |
---|---|---|
committer | Matheus Marchini <matheus@sthima.com> | 2018-06-22 09:42:46 -0700 |
commit | b3627560a94eaf51262cc041aebc9ef150b5fcbc (patch) | |
tree | 6f8cdb5e15f0bc7e686b018f952b21556cc6b91b /deps/v8/src/log.h | |
parent | 8689c785379293adc04ec2a3d47ed08a580fe521 (diff) | |
download | android-node-v8-b3627560a94eaf51262cc041aebc9ef150b5fcbc.tar.gz android-node-v8-b3627560a94eaf51262cc041aebc9ef150b5fcbc.tar.bz2 android-node-v8-b3627560a94eaf51262cc041aebc9ef150b5fcbc.zip |
deps: backport aa6ce3e from upstream V8
Original commit message:
[log][api] introduce public CodeEventListener API
Introduce a new public API called CodeEventListener to allow
embedders to better support external profilers and other diagnostic
tools without relying on unsupported methods like --perf-basic-prof.
Bug: v8:7694
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: I063cc965394d59401358757634c9ea84c11517e9
Co-authored-by: Daniel Beckert <daniel@sthima.com.br>
Reviewed-on: https://chromium-review.googlesource.com/1028770
Commit-Queue: Yang Guo <yangguo@chromium.org>
Reviewed-by: Hannes Payer <hpayer@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Reviewed-by: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53382}
Refs: https://github.com/v8/v8/commit/aa6ce3ee617b2f324bea3a5d8e3263aee
PR-URL: https://github.com/nodejs/node/pull/21126
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps/v8/src/log.h')
-rw-r--r-- | deps/v8/src/log.h | 86 |
1 files changed, 81 insertions, 5 deletions
diff --git a/deps/v8/src/log.h b/deps/v8/src/log.h index 6f3e1f244a..fefc4b1a2d 100644 --- a/deps/v8/src/log.h +++ b/deps/v8/src/log.h @@ -8,6 +8,7 @@ #include <set> #include <string> +#include "include/v8-profiler.h" #include "src/allocation.h" #include "src/base/compiler-specific.h" #include "src/base/platform/elapsed-timer.h" @@ -87,12 +88,33 @@ class WasmCode; if (logger->is_logging()) logger->Call; \ } while (false) -#define LOG_CODE_EVENT(isolate, Call) \ - do { \ - v8::internal::Logger* logger = (isolate)->logger(); \ - if (logger->is_logging_code_events()) logger->Call; \ +#define LOG_CODE_EVENT(isolate, Call) \ + do { \ + v8::internal::Logger* logger = (isolate)->logger(); \ + if (logger->is_listening_to_code_events()) logger->Call; \ } while (false) +class ExistingCodeLogger { + public: + explicit ExistingCodeLogger(Isolate* isolate, + CodeEventListener* listener = nullptr) + : isolate_(isolate), listener_(listener) {} + + void LogCodeObjects(); + void LogBytecodeHandlers(); + + void LogCompiledFunctions(); + void LogExistingFunction(Handle<SharedFunctionInfo> shared, + Handle<AbstractCode> code); + void LogCodeObject(Object* object); + void LogBytecodeHandler(interpreter::Bytecode bytecode, + interpreter::OperandScale operand_scale, Code* code); + + private: + Isolate* isolate_; + CodeEventListener* listener_; +}; + class Logger : public CodeEventListener { public: enum StartEnd { START = 0, END = 1, STAMP = 2 }; @@ -233,7 +255,7 @@ class Logger : public CodeEventListener { return is_logging_; } - bool is_logging_code_events() { + bool is_listening_to_code_events() { return is_logging() || jit_logger_ != nullptr; } @@ -332,6 +354,8 @@ class Logger : public CodeEventListener { // 'true' between SetUp() and TearDown(). bool is_initialized_; + ExistingCodeLogger existing_code_logger_; + base::ElapsedTimer timer_; friend class CpuProfiler; @@ -412,6 +436,58 @@ class CodeEventLogger : public CodeEventListener { NameBuffer* name_buffer_; }; +struct CodeEvent { + uintptr_t code_start_address; + size_t code_size; + Handle<String> function_name; + Handle<String> script_name; + int script_line; + int script_column; + CodeEventType code_type; + const char* comment; +}; + +class ExternalCodeEventListener : public CodeEventListener { + public: + explicit ExternalCodeEventListener(Isolate* isolate); + ~ExternalCodeEventListener() override; + + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, + const char* comment) override; + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, + Name* name) override; + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, + SharedFunctionInfo* shared, Name* name) override; + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, + SharedFunctionInfo* shared, Name* source, int line, + int column) override; + void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code, + wasm::WasmName name) override; + + void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; + void CallbackEvent(Name* name, Address entry_point) override {} + void GetterCallbackEvent(Name* name, Address entry_point) override {} + void SetterCallbackEvent(Name* name, Address entry_point) override {} + void SharedFunctionInfoMoveEvent(Address from, Address to) override {} + void CodeMoveEvent(AbstractCode* from, Address to) override {} + void CodeDisableOptEvent(AbstractCode* code, + SharedFunctionInfo* shared) override {} + void CodeMovingGCEvent() override {} + void CodeDeoptEvent(Code* code, DeoptKind kind, Address pc, + int fp_to_sp_delta) override {} + + void StartListening(CodeEventHandler* code_event_handler); + void StopListening(); + + bool is_listening_to_code_events() override { return true; } + + private: + void LogExistingCode(); + + bool is_listening_; + Isolate* isolate_; + v8::CodeEventHandler* code_event_handler_; +}; } // namespace internal } // namespace v8 |