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