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 <vector> 9 10 #include "src/code-events.h" 11 #include "src/profiler/profile-generator.h" 12 13 namespace v8 { 14 namespace internal { 15 16 class CodeEventsContainer; 17 18 class CodeEventObserver { 19 public: 20 virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0; ~CodeEventObserver()21 virtual ~CodeEventObserver() {} 22 }; 23 24 class ProfilerListener : public CodeEventListener { 25 public: 26 explicit ProfilerListener(Isolate* isolate); 27 ~ProfilerListener() override; 28 29 void CallbackEvent(Name* name, Address entry_point) override; 30 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 31 AbstractCode* code, const char* comment) override; 32 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 33 AbstractCode* code, Name* name) override; 34 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 35 AbstractCode* code, SharedFunctionInfo* shared, 36 Name* script_name) override; 37 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 38 AbstractCode* code, SharedFunctionInfo* shared, 39 Name* script_name, int line, int column) override; 40 void CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, 41 AbstractCode* code, int args_count) override; CodeMovingGCEvent()42 void CodeMovingGCEvent() override {} 43 void CodeMoveEvent(AbstractCode* from, Address to) override; 44 void CodeDisableOptEvent(AbstractCode* code, 45 SharedFunctionInfo* shared) override; 46 void CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) override; 47 void GetterCallbackEvent(Name* name, Address entry_point) override; 48 void RegExpCodeCreateEvent(AbstractCode* code, String* source) override; 49 void SetterCallbackEvent(Name* name, Address entry_point) override; SharedFunctionInfoMoveEvent(Address from,Address to)50 void SharedFunctionInfoMoveEvent(Address from, Address to) override {} 51 52 CodeEntry* NewCodeEntry( 53 CodeEventListener::LogEventsAndTags tag, const char* name, 54 const char* name_prefix = CodeEntry::kEmptyNamePrefix, 55 const char* resource_name = CodeEntry::kEmptyResourceName, 56 int line_number = v8::CpuProfileNode::kNoLineNumberInfo, 57 int column_number = v8::CpuProfileNode::kNoColumnNumberInfo, 58 JITLineInfoTable* line_info = NULL, Address instruction_start = NULL); 59 60 void AddObserver(CodeEventObserver* observer); 61 void RemoveObserver(CodeEventObserver* observer); HasObservers()62 V8_INLINE bool HasObservers() { return !observers_.empty(); } 63 GetName(Name * name)64 const char* GetName(Name* name) { 65 return function_and_resource_names_.GetName(name); 66 } GetName(int args_count)67 const char* GetName(int args_count) { 68 return function_and_resource_names_.GetName(args_count); 69 } GetFunctionName(Name * name)70 const char* GetFunctionName(Name* name) { 71 return function_and_resource_names_.GetFunctionName(name); 72 } GetFunctionName(const char * name)73 const char* GetFunctionName(const char* name) { 74 return function_and_resource_names_.GetFunctionName(name); 75 } 76 77 private: 78 void RecordInliningInfo(CodeEntry* entry, AbstractCode* abstract_code); 79 void RecordDeoptInlinedFrames(CodeEntry* entry, AbstractCode* abstract_code); 80 Name* InferScriptName(Name* name, SharedFunctionInfo* info); DispatchCodeEvent(const CodeEventsContainer & evt_rec)81 V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) { 82 for (auto observer : observers_) { 83 observer->CodeEventHandler(evt_rec); 84 } 85 } 86 87 StringsStorage function_and_resource_names_; 88 std::vector<CodeEntry*> code_entries_; 89 std::vector<CodeEventObserver*> observers_; 90 91 DISALLOW_COPY_AND_ASSIGN(ProfilerListener); 92 }; 93 94 } // namespace internal 95 } // namespace v8 96 97 #endif // V8_PROFILER_PROFILER_LISTENER_H_ 98