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 "include/v8-profiler.h" 12 #include "src/logging/code-events.h" 13 #include "src/profiler/profile-generator.h" 14 #include "src/profiler/weak-code-registry.h" 15 16 namespace v8 { 17 namespace internal { 18 19 class CodeEventsContainer; 20 class CodeDeoptEventRecord; 21 22 class CodeEventObserver { 23 public: 24 virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0; 25 virtual ~CodeEventObserver() = default; 26 }; 27 28 class V8_EXPORT_PRIVATE ProfilerListener : public CodeEventListener, 29 public WeakCodeRegistry::Listener { 30 public: 31 ProfilerListener(Isolate*, CodeEventObserver*, 32 CodeEntryStorage& code_entry_storage, 33 WeakCodeRegistry& weak_code_registry, 34 CpuProfilingNamingMode mode = kDebugNaming); 35 ~ProfilerListener() override; 36 ProfilerListener(const ProfilerListener&) = delete; 37 ProfilerListener& operator=(const ProfilerListener&) = delete; 38 39 void CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code, 40 const char* name) override; 41 void CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code, 42 Handle<Name> name) override; 43 void CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code, 44 Handle<SharedFunctionInfo> shared, 45 Handle<Name> script_name) override; 46 void CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code, 47 Handle<SharedFunctionInfo> shared, 48 Handle<Name> script_name, int line, int column) override; 49 #if V8_ENABLE_WEBASSEMBLY 50 void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code, 51 wasm::WasmName name, const char* source_url, 52 int code_offset, int script_id) override; 53 #endif // V8_ENABLE_WEBASSEMBLY 54 55 void CallbackEvent(Handle<Name> name, Address entry_point) override; 56 void GetterCallbackEvent(Handle<Name> name, Address entry_point) override; 57 void SetterCallbackEvent(Handle<Name> name, Address entry_point) override; 58 void RegExpCodeCreateEvent(Handle<AbstractCode> code, 59 Handle<String> source) override; 60 void CodeMoveEvent(AbstractCode from, AbstractCode to) override; SharedFunctionInfoMoveEvent(Address from,Address to)61 void SharedFunctionInfoMoveEvent(Address from, Address to) override {} 62 void NativeContextMoveEvent(Address from, Address to) override; CodeMovingGCEvent()63 void CodeMovingGCEvent() override {} 64 void CodeDisableOptEvent(Handle<AbstractCode> code, 65 Handle<SharedFunctionInfo> shared) override; 66 void CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind, Address pc, 67 int fp_to_sp_delta, bool reuse_code) override; CodeDependencyChangeEvent(Handle<Code> code,Handle<SharedFunctionInfo> sfi,const char * reason)68 void CodeDependencyChangeEvent(Handle<Code> code, 69 Handle<SharedFunctionInfo> sfi, 70 const char* reason) override {} 71 void WeakCodeClearEvent() override; 72 73 void OnHeapObjectDeletion(CodeEntry*) override; 74 75 // Invoked after a mark-sweep cycle. 76 void CodeSweepEvent(); 77 GetName(Name name)78 const char* GetName(Name name) { 79 return code_entries_.strings().GetName(name); 80 } GetName(int args_count)81 const char* GetName(int args_count) { 82 return code_entries_.strings().GetName(args_count); 83 } GetName(const char * name)84 const char* GetName(const char* name) { 85 return code_entries_.strings().GetCopy(name); 86 } 87 const char* GetName(base::Vector<const char> name); GetConsName(const char * prefix,Name name)88 const char* GetConsName(const char* prefix, Name name) { 89 return code_entries_.strings().GetConsName(prefix, name); 90 } 91 set_observer(CodeEventObserver * observer)92 void set_observer(CodeEventObserver* observer) { observer_ = observer; } 93 94 private: 95 const char* GetFunctionName(SharedFunctionInfo); 96 97 void AttachDeoptInlinedFrames(Handle<Code> code, CodeDeoptEventRecord* rec); 98 Name InferScriptName(Name name, SharedFunctionInfo info); DispatchCodeEvent(const CodeEventsContainer & evt_rec)99 V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) { 100 observer_->CodeEventHandler(evt_rec); 101 } 102 103 Isolate* isolate_; 104 CodeEventObserver* observer_; 105 CodeEntryStorage& code_entries_; 106 WeakCodeRegistry& weak_code_registry_; 107 const CpuProfilingNamingMode naming_mode_; 108 }; 109 110 } // namespace internal 111 } // namespace v8 112 113 #endif // V8_PROFILER_PROFILER_LISTENER_H_ 114