blob: 917568afcada371376a84c897853bba901509d59 [file] [log] [blame]
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_PROFILER_PROFILER_LISTENER_H_
#define V8_PROFILER_PROFILER_LISTENER_H_
#include <memory>
#include "include/v8-profiler.h"
#include "src/logging/code-events.h"
#include "src/profiler/profile-generator.h"
#include "src/profiler/weak-code-registry.h"
namespace v8 {
namespace internal {
class CodeEventsContainer;
class CodeDeoptEventRecord;
class CodeEventObserver {
public:
virtual void CodeEventHandler(const CodeEventsContainer& evt_rec) = 0;
virtual ~CodeEventObserver() = default;
};
class V8_EXPORT_PRIVATE ProfilerListener : public LogEventListener,
public WeakCodeRegistry::Listener {
public:
ProfilerListener(Isolate*, CodeEventObserver*,
CodeEntryStorage& code_entry_storage,
WeakCodeRegistry& weak_code_registry,
CpuProfilingNamingMode mode = kDebugNaming);
~ProfilerListener() override;
ProfilerListener(const ProfilerListener&) = delete;
ProfilerListener& operator=(const ProfilerListener&) = delete;
void CodeCreateEvent(CodeTag tag, DirectHandle<AbstractCode> code,
const char* name) override;
void CodeCreateEvent(CodeTag tag, DirectHandle<AbstractCode> code,
DirectHandle<Name> name) override;
void CodeCreateEvent(CodeTag tag, DirectHandle<AbstractCode> code,
DirectHandle<SharedFunctionInfo> shared,
DirectHandle<Name> script_name) override;
void CodeCreateEvent(CodeTag tag, DirectHandle<AbstractCode> code,
DirectHandle<SharedFunctionInfo> shared,
DirectHandle<Name> script_name, int line,
int column) override;
#if V8_ENABLE_WEBASSEMBLY
void CodeCreateEvent(CodeTag tag, const wasm::WasmCode* code,
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override;
#endif // V8_ENABLE_WEBASSEMBLY
void CallbackEvent(DirectHandle<Name> name, Address entry_point) override;
void GetterCallbackEvent(DirectHandle<Name> name,
Address entry_point) override;
void SetterCallbackEvent(DirectHandle<Name> name,
Address entry_point) override;
void RegExpCodeCreateEvent(DirectHandle<AbstractCode> code,
DirectHandle<String> source,
RegExpFlags flags) override;
void CodeMoveEvent(Tagged<InstructionStream> from,
Tagged<InstructionStream> to) override;
void BytecodeMoveEvent(Tagged<BytecodeArray> from,
Tagged<BytecodeArray> to) override;
void SharedFunctionInfoMoveEvent(Address from, Address to) override {}
void NativeContextMoveEvent(Address from, Address to) override;
void CodeMovingGCEvent() override {}
void CodeDisableOptEvent(DirectHandle<AbstractCode> code,
DirectHandle<SharedFunctionInfo> shared) override;
void CodeDeoptEvent(DirectHandle<Code> code, DeoptimizeKind kind, Address pc,
int fp_to_sp_delta) override;
void CodeDependencyChangeEvent(DirectHandle<Code> code,
DirectHandle<SharedFunctionInfo> sfi,
const char* reason) override {}
void WeakCodeClearEvent() override;
void OnHeapObjectDeletion(CodeEntry*) override;
// Invoked after a mark-sweep cycle.
void CodeSweepEvent();
const char* GetName(Tagged<Name> name) {
return code_entries_.strings().GetName(name);
}
const char* GetName(int args_count) {
return code_entries_.strings().GetName(args_count);
}
const char* GetName(const char* name) {
return code_entries_.strings().GetCopy(name);
}
const char* GetName(base::Vector<const char> name);
const char* GetConsName(const char* prefix, Tagged<Name> name) {
return code_entries_.strings().GetConsName(prefix, name);
}
void set_observer(CodeEventObserver* observer) { observer_ = observer; }
private:
const char* GetFunctionName(Tagged<SharedFunctionInfo>);
void AttachDeoptInlinedFrames(DirectHandle<Code> code,
CodeDeoptEventRecord* rec);
Tagged<Name> InferScriptName(Tagged<Name> name,
Tagged<SharedFunctionInfo> info);
V8_INLINE void DispatchCodeEvent(const CodeEventsContainer& evt_rec) {
observer_->CodeEventHandler(evt_rec);
}
Isolate* isolate_;
CodeEventObserver* observer_;
CodeEntryStorage& code_entries_;
WeakCodeRegistry& weak_code_registry_;
const CpuProfilingNamingMode naming_mode_;
};
} // namespace internal
} // namespace v8
#endif // V8_PROFILER_PROFILER_LISTENER_H_