|
8 | 8 | #include <set>
|
9 | 9 | #include <string>
|
10 | 10 |
|
| 11 | +#include "include/v8-profiler.h" |
11 | 12 | #include "src/allocation.h"
|
12 | 13 | #include "src/base/compiler-specific.h"
|
13 | 14 | #include "src/base/platform/elapsed-timer.h"
|
@@ -87,12 +88,33 @@ class WasmCode;
|
87 | 88 | if (logger->is_logging()) logger->Call; \
|
88 | 89 | } while (false)
|
89 | 90 |
|
90 |
| -#define LOG_CODE_EVENT(isolate, Call) \ |
91 |
| - do { \ |
92 |
| - v8::internal::Logger* logger = (isolate)->logger(); \ |
93 |
| - if (logger->is_logging_code_events()) logger->Call; \ |
| 91 | +#define LOG_CODE_EVENT(isolate, Call) \ |
| 92 | + do { \ |
| 93 | + v8::internal::Logger* logger = (isolate)->logger(); \ |
| 94 | + if (logger->is_listening_to_code_events()) logger->Call; \ |
94 | 95 | } while (false)
|
95 | 96 |
|
| 97 | +class ExistingCodeLogger { |
| 98 | + public: |
| 99 | + explicit ExistingCodeLogger(Isolate* isolate, |
| 100 | + CodeEventListener* listener = nullptr) |
| 101 | + : isolate_(isolate), listener_(listener) {} |
| 102 | + |
| 103 | + void LogCodeObjects(); |
| 104 | + void LogBytecodeHandlers(); |
| 105 | + |
| 106 | + void LogCompiledFunctions(); |
| 107 | + void LogExistingFunction(Handle<SharedFunctionInfo> shared, |
| 108 | + Handle<AbstractCode> code); |
| 109 | + void LogCodeObject(Object* object); |
| 110 | + void LogBytecodeHandler(interpreter::Bytecode bytecode, |
| 111 | + interpreter::OperandScale operand_scale, Code* code); |
| 112 | + |
| 113 | + private: |
| 114 | + Isolate* isolate_; |
| 115 | + CodeEventListener* listener_; |
| 116 | +}; |
| 117 | + |
96 | 118 | class Logger : public CodeEventListener {
|
97 | 119 | public:
|
98 | 120 | enum StartEnd { START = 0, END = 1, STAMP = 2 };
|
@@ -233,7 +255,7 @@ class Logger : public CodeEventListener {
|
233 | 255 | return is_logging_;
|
234 | 256 | }
|
235 | 257 |
|
236 |
| - bool is_logging_code_events() { |
| 258 | + bool is_listening_to_code_events() { |
237 | 259 | return is_logging() || jit_logger_ != nullptr;
|
238 | 260 | }
|
239 | 261 |
|
@@ -332,6 +354,8 @@ class Logger : public CodeEventListener {
|
332 | 354 | // 'true' between SetUp() and TearDown().
|
333 | 355 | bool is_initialized_;
|
334 | 356 |
|
| 357 | + ExistingCodeLogger existing_code_logger_; |
| 358 | + |
335 | 359 | base::ElapsedTimer timer_;
|
336 | 360 |
|
337 | 361 | friend class CpuProfiler;
|
@@ -412,6 +436,58 @@ class CodeEventLogger : public CodeEventListener {
|
412 | 436 | NameBuffer* name_buffer_;
|
413 | 437 | };
|
414 | 438 |
|
| 439 | +struct CodeEvent { |
| 440 | + uintptr_t code_start_address; |
| 441 | + size_t code_size; |
| 442 | + Handle<String> function_name; |
| 443 | + Handle<String> script_name; |
| 444 | + int script_line; |
| 445 | + int script_column; |
| 446 | + CodeEventType code_type; |
| 447 | + const char* comment; |
| 448 | +}; |
| 449 | + |
| 450 | +class ExternalCodeEventListener : public CodeEventListener { |
| 451 | + public: |
| 452 | + explicit ExternalCodeEventListener(Isolate* isolate); |
| 453 | + ~ExternalCodeEventListener() override; |
| 454 | + |
| 455 | + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
| 456 | + const char* comment) override; |
| 457 | + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
| 458 | + Name* name) override; |
| 459 | + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
| 460 | + SharedFunctionInfo* shared, Name* name) override; |
| 461 | + void CodeCreateEvent(LogEventsAndTags tag, AbstractCode* code, |
| 462 | + SharedFunctionInfo* shared, Name* source, int line, |
| 463 | + int column) override; |
| 464 | + void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code, |
| 465 | + wasm::WasmName name) override; |
| 466 | + |
| 467 | + void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; |
| 468 | + void CallbackEvent(Name* name, Address entry_point) override {} |
| 469 | + void GetterCallbackEvent(Name* name, Address entry_point) override {} |
| 470 | + void SetterCallbackEvent(Name* name, Address entry_point) override {} |
| 471 | + void SharedFunctionInfoMoveEvent(Address from, Address to) override {} |
| 472 | + void CodeMoveEvent(AbstractCode* from, Address to) override {} |
| 473 | + void CodeDisableOptEvent(AbstractCode* code, |
| 474 | + SharedFunctionInfo* shared) override {} |
| 475 | + void CodeMovingGCEvent() override {} |
| 476 | + void CodeDeoptEvent(Code* code, DeoptKind kind, Address pc, |
| 477 | + int fp_to_sp_delta) override {} |
| 478 | + |
| 479 | + void StartListening(CodeEventHandler* code_event_handler); |
| 480 | + void StopListening(); |
| 481 | + |
| 482 | + bool is_listening_to_code_events() override { return true; } |
| 483 | + |
| 484 | + private: |
| 485 | + void LogExistingCode(); |
| 486 | + |
| 487 | + bool is_listening_; |
| 488 | + Isolate* isolate_; |
| 489 | + v8::CodeEventHandler* code_event_handler_; |
| 490 | +}; |
415 | 491 |
|
416 | 492 | } // namespace internal
|
417 | 493 | } // namespace v8
|
|
0 commit comments