1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_PROFILER_PROFILER_LISTENER_H_ 6 #define V8_PROFILER_PROFILER_LISTENER_H_ 7 8 #include <memory> 9 #include <vector> 10 11 #include "src/code-events.h" 12 #include "src/profiler/profile-generator.h" 13 14 namespace v8 { 15 namespace internal { 16 17 class CodeEventsContainer; 18 class CodeDeoptEventRecord; 19 20 class CodeEventObserver { 21 public: 22 virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0; 23 virtual ~CodeEventObserver() = default; 24 }; 25 26 class ProfilerListener : public CodeEventListener { 27 public: 28 ProfilerListener(Isolate*, CodeEventObserver*); 29 ~ProfilerListener() override; 30 31 void CallbackEvent(Name* name, Address entry_point) override; 32 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 33 AbstractCode* code, const char* comment) override; 34 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 35 AbstractCode* code, Name* name) override; 36 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 37 AbstractCode* code, SharedFunctionInfo* shared, 38 Name* script_name) override; 39 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 40 AbstractCode* code, SharedFunctionInfo* shared, 41 Name* script_name, int line, int column) override; 42 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 43 const wasm::WasmCode* code, 44 wasm::WasmName name) override; 45 CodeMovingGCEvent()46 void CodeMovingGCEvent() override {} 47 void CodeMoveEvent(AbstractCode* from, AbstractCode* to) override; 48 void CodeDisableOptEvent(AbstractCode* code, 49 SharedFunctionInfo* shared) override; 50 void CodeDeoptEvent(Code* code, DeoptimizeKind kind, Address pc, 51 int fp_to_sp_delta) override; 52 void GetterCallbackEvent(Name* name, Address entry_point) override; 53 void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; 54 void SetterCallbackEvent(Name* name, Address entry_point) override; SharedFunctionInfoMoveEvent(Address from,Address to)55 void SharedFunctionInfoMoveEvent(Address from, Address to) override {} 56 57 CodeEntry* NewCodeEntry( 58 CodeEventListener::LogEventsAndTags tag, const char* name, 59 const char* resource_name = CodeEntry::kEmptyResourceName, 60 int line_number = v8::CpuProfileNode::kNoLineNumberInfo, 61 int column_number = v8::CpuProfileNode::kNoColumnNumberInfo, 62 std::unique_ptr<SourcePositionTable> line_info = nullptr, 63 Address instruction_start = kNullAddress); 64 GetName(Name * name)65 const char* GetName(Name* name) { 66 return function_and_resource_names_.GetName(name); 67 } GetName(int args_count)68 const char* GetName(int args_count) { 69 return function_and_resource_names_.GetName(args_count); 70 } GetName(const char * name)71 const char* GetName(const char* name) { 72 return function_and_resource_names_.GetCopy(name); 73 } GetConsName(const char * prefix,Name * name)74 const char* GetConsName(const char* prefix, Name* name) { 75 return function_and_resource_names_.GetConsName(prefix, name); 76 } 77 78 private: 79 void RecordInliningInfo(CodeEntry* entry, AbstractCode* abstract_code); 80 void AttachDeoptInlinedFrames(Code* code, CodeDeoptEventRecord* rec); 81 Name* InferScriptName(Name* name, SharedFunctionInfo* info); DispatchCodeEvent(const CodeEventsContainer & evt_rec)82 V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) { 83 observer_->CodeEventHandler(evt_rec); 84 } 85 86 Isolate* isolate_; 87 CodeEventObserver* observer_; 88 StringsStorage function_and_resource_names_; 89 90 DISALLOW_COPY_AND_ASSIGN(ProfilerListener); 91 }; 92 93 } // namespace internal 94 } // namespace v8 95 96 #endif // V8_PROFILER_PROFILER_LISTENER_H_ 97