summaryrefslogtreecommitdiff
path: root/deps/v8/src/logging/code-events.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/logging/code-events.h')
-rw-r--r--deps/v8/src/logging/code-events.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/deps/v8/src/logging/code-events.h b/deps/v8/src/logging/code-events.h
new file mode 100644
index 0000000000..262ddf7df3
--- /dev/null
+++ b/deps/v8/src/logging/code-events.h
@@ -0,0 +1,187 @@
+// 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_LOGGING_CODE_EVENTS_H_
+#define V8_LOGGING_CODE_EVENTS_H_
+
+#include <unordered_set>
+
+#include "src/base/platform/mutex.h"
+#include "src/common/globals.h"
+#include "src/objects/code.h"
+#include "src/objects/name.h"
+#include "src/objects/shared-function-info.h"
+#include "src/objects/string.h"
+#include "src/utils/vector.h"
+
+namespace v8 {
+namespace internal {
+
+class AbstractCode;
+class Name;
+class SharedFunctionInfo;
+class String;
+
+namespace wasm {
+class WasmCode;
+using WasmName = Vector<const char>;
+} // namespace wasm
+
+#define LOG_EVENTS_LIST(V) \
+ V(CODE_CREATION_EVENT, code-creation) \
+ V(CODE_DISABLE_OPT_EVENT, code-disable-optimization) \
+ V(CODE_MOVE_EVENT, code-move) \
+ V(CODE_DELETE_EVENT, code-delete) \
+ V(CODE_MOVING_GC, code-moving-gc) \
+ V(SHARED_FUNC_MOVE_EVENT, sfi-move) \
+ V(SNAPSHOT_CODE_NAME_EVENT, snapshot-code-name) \
+ V(TICK_EVENT, tick)
+
+#define TAGS_LIST(V) \
+ V(BUILTIN_TAG, Builtin) \
+ V(CALLBACK_TAG, Callback) \
+ V(EVAL_TAG, Eval) \
+ V(FUNCTION_TAG, Function) \
+ V(INTERPRETED_FUNCTION_TAG, InterpretedFunction) \
+ V(HANDLER_TAG, Handler) \
+ V(BYTECODE_HANDLER_TAG, BytecodeHandler) \
+ V(LAZY_COMPILE_TAG, LazyCompile) \
+ V(REG_EXP_TAG, RegExp) \
+ V(SCRIPT_TAG, Script) \
+ V(STUB_TAG, Stub) \
+ V(NATIVE_FUNCTION_TAG, Function) \
+ V(NATIVE_LAZY_COMPILE_TAG, LazyCompile) \
+ V(NATIVE_SCRIPT_TAG, Script)
+// Note that 'NATIVE_' cases for functions and scripts are mapped onto
+// original tags when writing to the log.
+
+#define LOG_EVENTS_AND_TAGS_LIST(V) \
+ LOG_EVENTS_LIST(V) \
+ TAGS_LIST(V)
+
+#define PROFILE(the_isolate, Call) (the_isolate)->code_event_dispatcher()->Call;
+
+class CodeEventListener {
+ public:
+#define DECLARE_ENUM(enum_item, _) enum_item,
+ enum LogEventsAndTags {
+ LOG_EVENTS_AND_TAGS_LIST(DECLARE_ENUM) NUMBER_OF_LOG_EVENTS
+ };
+#undef DECLARE_ENUM
+
+ virtual ~CodeEventListener() = default;
+
+ virtual void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ const char* comment) = 0;
+ virtual void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ Name name) = 0;
+ virtual void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ SharedFunctionInfo shared, Name source) = 0;
+ virtual void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ SharedFunctionInfo shared, Name source, int line,
+ int column) = 0;
+ virtual void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
+ wasm::WasmName name) = 0;
+ virtual void CallbackEvent(Name name, Address entry_point) = 0;
+ virtual void GetterCallbackEvent(Name name, Address entry_point) = 0;
+ virtual void SetterCallbackEvent(Name name, Address entry_point) = 0;
+ virtual void RegExpCodeCreateEvent(AbstractCode code, String source) = 0;
+ virtual void CodeMoveEvent(AbstractCode from, AbstractCode to) = 0;
+ virtual void SharedFunctionInfoMoveEvent(Address from, Address to) = 0;
+ virtual void CodeMovingGCEvent() = 0;
+ virtual void CodeDisableOptEvent(AbstractCode code,
+ SharedFunctionInfo shared) = 0;
+ virtual void CodeDeoptEvent(Code code, DeoptimizeKind kind, Address pc,
+ int fp_to_sp_delta) = 0;
+
+ virtual bool is_listening_to_code_events() { return false; }
+};
+
+class CodeEventDispatcher {
+ public:
+ using LogEventsAndTags = CodeEventListener::LogEventsAndTags;
+
+ CodeEventDispatcher() = default;
+
+ bool AddListener(CodeEventListener* listener) {
+ base::MutexGuard guard(&mutex_);
+ return listeners_.insert(listener).second;
+ }
+ void RemoveListener(CodeEventListener* listener) {
+ base::MutexGuard guard(&mutex_);
+ listeners_.erase(listener);
+ }
+ bool IsListeningToCodeEvents() {
+ for (auto it : listeners_) {
+ if (it->is_listening_to_code_events()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+#define CODE_EVENT_DISPATCH(code) \
+ base::MutexGuard guard(&mutex_); \
+ for (auto it = listeners_.begin(); it != listeners_.end(); ++it) (*it)->code
+
+ void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ const char* comment) {
+ CODE_EVENT_DISPATCH(CodeCreateEvent(tag, code, comment));
+ }
+ void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code, Name name) {
+ CODE_EVENT_DISPATCH(CodeCreateEvent(tag, code, name));
+ }
+ void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ SharedFunctionInfo shared, Name name) {
+ CODE_EVENT_DISPATCH(CodeCreateEvent(tag, code, shared, name));
+ }
+ void CodeCreateEvent(LogEventsAndTags tag, AbstractCode code,
+ SharedFunctionInfo shared, Name source, int line,
+ int column) {
+ CODE_EVENT_DISPATCH(
+ CodeCreateEvent(tag, code, shared, source, line, column));
+ }
+ void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
+ wasm::WasmName name) {
+ CODE_EVENT_DISPATCH(CodeCreateEvent(tag, code, name));
+ }
+ void CallbackEvent(Name name, Address entry_point) {
+ CODE_EVENT_DISPATCH(CallbackEvent(name, entry_point));
+ }
+ void GetterCallbackEvent(Name name, Address entry_point) {
+ CODE_EVENT_DISPATCH(GetterCallbackEvent(name, entry_point));
+ }
+ void SetterCallbackEvent(Name name, Address entry_point) {
+ CODE_EVENT_DISPATCH(SetterCallbackEvent(name, entry_point));
+ }
+ void RegExpCodeCreateEvent(AbstractCode code, String source) {
+ CODE_EVENT_DISPATCH(RegExpCodeCreateEvent(code, source));
+ }
+ void CodeMoveEvent(AbstractCode from, AbstractCode to) {
+ CODE_EVENT_DISPATCH(CodeMoveEvent(from, to));
+ }
+ void SharedFunctionInfoMoveEvent(Address from, Address to) {
+ CODE_EVENT_DISPATCH(SharedFunctionInfoMoveEvent(from, to));
+ }
+ void CodeMovingGCEvent() { CODE_EVENT_DISPATCH(CodeMovingGCEvent()); }
+ void CodeDisableOptEvent(AbstractCode code, SharedFunctionInfo shared) {
+ CODE_EVENT_DISPATCH(CodeDisableOptEvent(code, shared));
+ }
+ void CodeDeoptEvent(Code code, DeoptimizeKind kind, Address pc,
+ int fp_to_sp_delta) {
+ CODE_EVENT_DISPATCH(CodeDeoptEvent(code, kind, pc, fp_to_sp_delta));
+ }
+#undef CODE_EVENT_DISPATCH
+
+ private:
+ std::unordered_set<CodeEventListener*> listeners_;
+ base::Mutex mutex_;
+
+ DISALLOW_COPY_AND_ASSIGN(CodeEventDispatcher);
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_LOGGING_CODE_EVENTS_H_