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 812 : class CodeEventObserver {
21 : public:
22 : virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0;
23 807 : virtual ~CodeEventObserver() = default;
24 : };
25 :
26 1574 : class V8_EXPORT_PRIVATE 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 223 : 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 : const char* GetName(Name name) {
58 1223542 : return function_and_resource_names_.GetName(name);
59 : }
60 : const char* GetName(int args_count) {
61 : return function_and_resource_names_.GetName(args_count);
62 : }
63 : const char* GetName(const char* name) {
64 26244 : return function_and_resource_names_.GetCopy(name);
65 : }
66 : const char* GetConsName(const char* prefix, Name name) {
67 18226 : return function_and_resource_names_.GetConsName(prefix, name);
68 : }
69 :
70 15 : void set_observer(CodeEventObserver* observer) { observer_ = observer; }
71 :
72 : private:
73 : void AttachDeoptInlinedFrames(Code code, CodeDeoptEventRecord* rec);
74 : Name InferScriptName(Name name, SharedFunctionInfo info);
75 : V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) {
76 663972 : observer_->CodeEventHandler(evt_rec);
77 : }
78 :
79 : Isolate* isolate_;
80 : CodeEventObserver* observer_;
81 : StringsStorage function_and_resource_names_;
82 :
83 : DISALLOW_COPY_AND_ASSIGN(ProfilerListener);
84 : };
85 :
86 : } // namespace internal
87 : } // namespace v8
88 :
89 : #endif // V8_PROFILER_PROFILER_LISTENER_H_
|