Line data Source code
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 757 : class CodeEventObserver {
21 : public:
22 : virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0;
23 752 : virtual ~CodeEventObserver() = default;
24 : };
25 :
26 1484 : 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 :
46 119 : 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;
55 0 : 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 :
65 : const char* GetName(Name name) {
66 1221540 : return function_and_resource_names_.GetName(name);
67 : }
68 : const char* GetName(int args_count) {
69 : return function_and_resource_names_.GetName(args_count);
70 : }
71 : const char* GetName(const char* name) {
72 25808 : return function_and_resource_names_.GetCopy(name);
73 : }
74 : const char* GetConsName(const char* prefix, Name name) {
75 17226 : return function_and_resource_names_.GetConsName(prefix, name);
76 : }
77 :
78 10 : void set_observer(CodeEventObserver* observer) { observer_ = observer; }
79 :
80 : private:
81 : void AttachDeoptInlinedFrames(Code code, CodeDeoptEventRecord* rec);
82 : Name InferScriptName(Name name, SharedFunctionInfo info);
83 : V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) {
84 661071 : observer_->CodeEventHandler(evt_rec);
85 : }
86 :
87 : Isolate* isolate_;
88 : CodeEventObserver* observer_;
89 : StringsStorage function_and_resource_names_;
90 :
91 : DISALLOW_COPY_AND_ASSIGN(ProfilerListener);
92 : };
93 :
94 : } // namespace internal
95 : } // namespace v8
96 :
97 : #endif // V8_PROFILER_PROFILER_LISTENER_H_
|