• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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