blob: 9b0b3522904c9a1118bab16431864abc031e0c34 [file] [log] [blame]
// Copyright 2024 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_TRACING_CODE_TRACE_CONTEXT_H_
#define V8_TRACING_CODE_TRACE_CONTEXT_H_
#include <string>
#include "protos/perfetto/trace/chrome/v8.pbzero.h"
#include "src/base/compiler-specific.h"
#include "src/objects/tagged.h"
#include "src/tracing/code-data-source.h"
namespace v8 {
namespace internal {
class Isolate;
class Script;
class SharedFunctionInfo;
// Helper class to write V8 related trace packets.
// Used to intern various types and to set common trace proto fields.
class CodeTraceContext {
public:
CodeTraceContext(CodeDataSource::TraceContext::TracePacketHandle trace_packet,
CodeDataSourceIncrementalState* incremental_state)
: trace_packet_(std::move(trace_packet)),
incremental_state_(*incremental_state) {}
CodeTraceContext(CodeTraceContext&&) V8_NOEXCEPT = default;
~CodeTraceContext() {
if (V8_UNLIKELY(incremental_state_.has_buffered_interned_data())) {
incremental_state_.FlushInternedData(trace_packet_);
}
}
uint64_t InternIsolate(Isolate& isolate) {
return incremental_state_.InternIsolate(isolate);
}
uint64_t InternJsScript(Isolate& isolate, Tagged<Script> script) {
return incremental_state_.InternJsScript(isolate, script);
}
uint64_t InternJsFunction(Isolate& isolate, Handle<SharedFunctionInfo> info,
uint64_t v8_js_script_iid, int line_num,
int column_num) {
return incremental_state_.InternJsFunction(isolate, info, v8_js_script_iid,
line_num, column_num);
}
uint64_t InternWasmScript(Isolate& isolate, int script_id,
const std::string& url) {
return incremental_state_.InternWasmScript(isolate, script_id, url);
}
perfetto::protos::pbzero::V8JsCode* set_v8_js_code() {
return trace_packet_->set_v8_js_code();
}
perfetto::protos::pbzero::V8InternalCode* set_v8_internal_code() {
return trace_packet_->set_v8_internal_code();
}
perfetto::protos::pbzero::V8WasmCode* set_v8_wasm_code() {
return trace_packet_->set_v8_wasm_code();
}
perfetto::protos::pbzero::V8RegExpCode* set_v8_reg_exp_code() {
return trace_packet_->set_v8_reg_exp_code();
}
perfetto::protos::pbzero::V8CodeMove* set_code_move() {
return trace_packet_->set_v8_code_move();
}
bool log_script_sources() const {
return incremental_state_.log_script_sources();
}
bool log_instructions() const {
return incremental_state_.log_instructions();
}
private:
CodeDataSource::TraceContext::TracePacketHandle trace_packet_;
CodeDataSourceIncrementalState& incremental_state_;
};
} // namespace internal
} // namespace v8
#endif // V8_TRACING_CODE_TRACE_CONTEXT_H_