[perf-jit] Don't use 0xFF for repeated script names
This was never supported to start with and can cause invalid script names. This CL partially reverts https://crrev.com/c/3513892 Drive-by-fix: Dehandlify more code. Change-Id: I96cf4c1244d9f00dc47738cd481b440e6bed0541 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4174074 Commit-Queue: Camillo Bruni <cbruni@chromium.org> Reviewed-by: Jakob Linke <jgruber@chromium.org> Cr-Commit-Position: refs/heads/main@{#85609}
This commit is contained in:
parent
972d103e4e
commit
7eff3cee05
@ -79,10 +79,10 @@ std::vector<SourcePositionInfo> SourcePosition::InliningStack(Isolate* isolate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SourcePositionInfo SourcePosition::FirstInfo(Isolate* isolate,
|
SourcePositionInfo SourcePosition::FirstInfo(Isolate* isolate,
|
||||||
Handle<Code> code) const {
|
Code code) const {
|
||||||
DisallowGarbageCollection no_gc;
|
DisallowGarbageCollection no_gc;
|
||||||
DeoptimizationData deopt_data =
|
DeoptimizationData deopt_data =
|
||||||
DeoptimizationData::cast(code->deoptimization_data());
|
DeoptimizationData::cast(code.deoptimization_data());
|
||||||
SourcePosition pos = *this;
|
SourcePosition pos = *this;
|
||||||
if (pos.isInlined()) {
|
if (pos.isInlined()) {
|
||||||
InliningPosition inl = deopt_data.InliningPositions().get(pos.InliningId());
|
InliningPosition inl = deopt_data.InliningPositions().get(pos.InliningId());
|
||||||
|
@ -83,7 +83,7 @@ class SourcePosition final {
|
|||||||
Code code) const;
|
Code code) const;
|
||||||
std::vector<SourcePositionInfo> InliningStack(
|
std::vector<SourcePositionInfo> InliningStack(
|
||||||
OptimizedCompilationInfo* cinfo) const;
|
OptimizedCompilationInfo* cinfo) const;
|
||||||
SourcePositionInfo FirstInfo(Isolate* isolate, Handle<Code> code) const;
|
SourcePositionInfo FirstInfo(Isolate* isolate, Code code) const;
|
||||||
|
|
||||||
void Print(std::ostream& out, InstructionStream code) const;
|
void Print(std::ostream& out, InstructionStream code) const;
|
||||||
void PrintJson(std::ostream& out) const;
|
void PrintJson(std::ostream& out) const;
|
||||||
|
@ -117,7 +117,6 @@ const char LinuxPerfJitLogger::kFilenameFormatString[] = "./jit-%d.dump";
|
|||||||
const int LinuxPerfJitLogger::kFilenameBufferPadding = 16;
|
const int LinuxPerfJitLogger::kFilenameBufferPadding = 16;
|
||||||
|
|
||||||
static const char kStringTerminator[] = {'\0'};
|
static const char kStringTerminator[] = {'\0'};
|
||||||
static const char kRepeatedNameMarker[] = {'\xff', '\0'};
|
|
||||||
|
|
||||||
base::LazyRecursiveMutex LinuxPerfJitLogger::file_mutex_;
|
base::LazyRecursiveMutex LinuxPerfJitLogger::file_mutex_;
|
||||||
// The following static variables are protected by
|
// The following static variables are protected by
|
||||||
@ -214,11 +213,11 @@ uint64_t LinuxPerfJitLogger::GetTimestamp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LinuxPerfJitLogger::LogRecordedBuffer(
|
void LinuxPerfJitLogger::LogRecordedBuffer(
|
||||||
Handle<AbstractCode> abstract_code,
|
AbstractCode abstract_code, MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared, const char* name,
|
const char* name, int length) {
|
||||||
int length) {
|
DisallowGarbageCollection no_gc;
|
||||||
if (v8_flags.perf_basic_prof_only_functions) {
|
if (v8_flags.perf_basic_prof_only_functions) {
|
||||||
CodeKind code_kind = abstract_code->kind(isolate_);
|
CodeKind code_kind = abstract_code.kind(isolate_);
|
||||||
if (code_kind != CodeKind::INTERPRETED_FUNCTION &&
|
if (code_kind != CodeKind::INTERPRETED_FUNCTION &&
|
||||||
code_kind != CodeKind::TURBOFAN && code_kind != CodeKind::MAGLEV &&
|
code_kind != CodeKind::TURBOFAN && code_kind != CodeKind::MAGLEV &&
|
||||||
code_kind != CodeKind::BASELINE) {
|
code_kind != CodeKind::BASELINE) {
|
||||||
@ -231,26 +230,27 @@ void LinuxPerfJitLogger::LogRecordedBuffer(
|
|||||||
if (perf_output_handle_ == nullptr) return;
|
if (perf_output_handle_ == nullptr) return;
|
||||||
|
|
||||||
// We only support non-interpreted functions.
|
// We only support non-interpreted functions.
|
||||||
if (!abstract_code->IsCode(isolate_)) return;
|
if (!abstract_code.IsCode(isolate_)) return;
|
||||||
Handle<Code> code = Handle<Code>::cast(abstract_code);
|
Code code = Code::cast(abstract_code);
|
||||||
|
|
||||||
// Debug info has to be emitted first.
|
// Debug info has to be emitted first.
|
||||||
Handle<SharedFunctionInfo> shared;
|
Handle<SharedFunctionInfo> shared;
|
||||||
if (v8_flags.perf_prof && maybe_shared.ToHandle(&shared)) {
|
if (v8_flags.perf_prof && maybe_shared.ToHandle(&shared)) {
|
||||||
// TODO(herhut): This currently breaks for js2wasm/wasm2js functions.
|
// TODO(herhut): This currently breaks for js2wasm/wasm2js functions.
|
||||||
if (code->kind() != CodeKind::JS_TO_WASM_FUNCTION &&
|
CodeKind kind = code.kind();
|
||||||
code->kind() != CodeKind::WASM_TO_JS_FUNCTION) {
|
if (kind != CodeKind::JS_TO_WASM_FUNCTION &&
|
||||||
|
kind != CodeKind::WASM_TO_JS_FUNCTION) {
|
||||||
LogWriteDebugInfo(code, shared);
|
LogWriteDebugInfo(code, shared);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* code_name = name;
|
const char* code_name = name;
|
||||||
uint8_t* code_pointer = reinterpret_cast<uint8_t*>(code->InstructionStart());
|
uint8_t* code_pointer = reinterpret_cast<uint8_t*>(code.InstructionStart());
|
||||||
|
|
||||||
// Unwinding info comes right after debug info.
|
// Unwinding info comes right after debug info.
|
||||||
if (v8_flags.perf_prof_unwinding_info) LogWriteUnwindingInfo(*code);
|
if (v8_flags.perf_prof_unwinding_info) LogWriteUnwindingInfo(code);
|
||||||
|
|
||||||
WriteJitCodeLoadEntry(code_pointer, code->InstructionSize(), code_name,
|
WriteJitCodeLoadEntry(code_pointer, code.InstructionSize(), code_name,
|
||||||
length);
|
length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,11 +319,11 @@ base::Vector<const char> GetScriptName(Object maybeScript,
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
SourcePositionInfo GetSourcePositionInfo(Isolate* isolate, Handle<Code> code,
|
SourcePositionInfo GetSourcePositionInfo(Isolate* isolate, Code code,
|
||||||
Handle<SharedFunctionInfo> function,
|
Handle<SharedFunctionInfo> function,
|
||||||
SourcePosition pos) {
|
SourcePosition pos) {
|
||||||
DisallowGarbageCollection disallow;
|
DisallowGarbageCollection disallow;
|
||||||
if (code->is_turbofanned()) {
|
if (code.is_turbofanned()) {
|
||||||
return pos.FirstInfo(isolate, code);
|
return pos.FirstInfo(isolate, code);
|
||||||
} else {
|
} else {
|
||||||
return SourcePositionInfo(pos, function);
|
return SourcePositionInfo(pos, function);
|
||||||
@ -332,23 +332,25 @@ SourcePositionInfo GetSourcePositionInfo(Isolate* isolate, Handle<Code> code,
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void LinuxPerfJitLogger::LogWriteDebugInfo(Handle<Code> code,
|
void LinuxPerfJitLogger::LogWriteDebugInfo(Code code,
|
||||||
Handle<SharedFunctionInfo> shared) {
|
Handle<SharedFunctionInfo> shared) {
|
||||||
// Line ends of all scripts have been initialized prior to this.
|
// Line ends of all scripts have been initialized prior to this.
|
||||||
DisallowGarbageCollection no_gc;
|
DisallowGarbageCollection no_gc;
|
||||||
// The WasmToJS wrapper stubs have source position entries.
|
// The WasmToJS wrapper stubs have source position entries.
|
||||||
if (!shared->HasSourceCode()) return;
|
SharedFunctionInfo raw_shared = *shared;
|
||||||
|
if (!raw_shared.HasSourceCode()) return;
|
||||||
|
|
||||||
PerfJitCodeDebugInfo debug_info;
|
PerfJitCodeDebugInfo debug_info;
|
||||||
uint32_t size = sizeof(debug_info);
|
uint32_t size = sizeof(debug_info);
|
||||||
|
|
||||||
ByteArray source_position_table =
|
ByteArray source_position_table =
|
||||||
code->SourcePositionTable(isolate_, *shared);
|
code.SourcePositionTable(isolate_, raw_shared);
|
||||||
// Compute the entry count and get the names of all scripts.
|
// Compute the entry count and get the names of all scripts.
|
||||||
// Avoid additional work if the script name is repeated. Multiple script
|
// Avoid additional work if the script name is repeated. Multiple script
|
||||||
// names only occur for cross-script inlining.
|
// names only occur for cross-script inlining.
|
||||||
uint32_t entry_count = 0;
|
uint32_t entry_count = 0;
|
||||||
Object last_script = Smi::zero();
|
Object last_script = Smi::zero();
|
||||||
|
size_t last_script_name_size = 0;
|
||||||
std::vector<base::Vector<const char>> script_names;
|
std::vector<base::Vector<const char>> script_names;
|
||||||
for (SourcePositionTableIterator iterator(source_position_table);
|
for (SourcePositionTableIterator iterator(source_position_table);
|
||||||
!iterator.done(); iterator.Advance()) {
|
!iterator.done(); iterator.Advance()) {
|
||||||
@ -357,13 +359,15 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(Handle<Code> code,
|
|||||||
Object current_script = *info.script;
|
Object current_script = *info.script;
|
||||||
if (current_script != last_script) {
|
if (current_script != last_script) {
|
||||||
std::unique_ptr<char[]> name_storage;
|
std::unique_ptr<char[]> name_storage;
|
||||||
auto name = GetScriptName(shared->script(), &name_storage, no_gc);
|
auto name = GetScriptName(raw_shared.script(), &name_storage, no_gc);
|
||||||
script_names.push_back(name);
|
script_names.push_back(name);
|
||||||
// Add the size of the name after each entry.
|
// Add the size of the name after each entry.
|
||||||
size += name.size() + sizeof(kStringTerminator);
|
last_script_name_size = name.size() + sizeof(kStringTerminator);
|
||||||
|
size += last_script_name_size;
|
||||||
last_script = current_script;
|
last_script = current_script;
|
||||||
} else {
|
} else {
|
||||||
size += sizeof(kRepeatedNameMarker);
|
DCHECK_LT(0, last_script_name_size);
|
||||||
|
size += last_script_name_size;
|
||||||
}
|
}
|
||||||
entry_count++;
|
entry_count++;
|
||||||
}
|
}
|
||||||
@ -371,7 +375,7 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(Handle<Code> code,
|
|||||||
|
|
||||||
debug_info.event_ = PerfJitCodeLoad::kDebugInfo;
|
debug_info.event_ = PerfJitCodeLoad::kDebugInfo;
|
||||||
debug_info.time_stamp_ = GetTimestamp();
|
debug_info.time_stamp_ = GetTimestamp();
|
||||||
debug_info.address_ = code->InstructionStart();
|
debug_info.address_ = code.InstructionStart();
|
||||||
debug_info.entry_count_ = entry_count;
|
debug_info.entry_count_ = entry_count;
|
||||||
|
|
||||||
// Add the sizes of fixed parts of entries.
|
// Add the sizes of fixed parts of entries.
|
||||||
@ -381,7 +385,7 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(Handle<Code> code,
|
|||||||
debug_info.size_ = size + padding;
|
debug_info.size_ = size + padding;
|
||||||
LogWriteBytes(reinterpret_cast<const char*>(&debug_info), sizeof(debug_info));
|
LogWriteBytes(reinterpret_cast<const char*>(&debug_info), sizeof(debug_info));
|
||||||
|
|
||||||
Address code_start = code->InstructionStart();
|
Address code_start = code.InstructionStart();
|
||||||
|
|
||||||
last_script = Smi::zero();
|
last_script = Smi::zero();
|
||||||
int script_names_index = 0;
|
int script_names_index = 0;
|
||||||
@ -398,16 +402,13 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(Handle<Code> code,
|
|||||||
entry.column_ = info.column + 1;
|
entry.column_ = info.column + 1;
|
||||||
LogWriteBytes(reinterpret_cast<const char*>(&entry), sizeof(entry));
|
LogWriteBytes(reinterpret_cast<const char*>(&entry), sizeof(entry));
|
||||||
Object current_script = *info.script;
|
Object current_script = *info.script;
|
||||||
|
auto name_string = script_names[script_names_index];
|
||||||
|
LogWriteBytes(name_string.begin(),
|
||||||
|
static_cast<uint32_t>(name_string.size()));
|
||||||
|
LogWriteBytes(kStringTerminator, sizeof(kStringTerminator));
|
||||||
if (current_script != last_script) {
|
if (current_script != last_script) {
|
||||||
auto name_string = script_names[script_names_index];
|
if (last_script != Smi::zero()) script_names_index++;
|
||||||
LogWriteBytes(name_string.begin(),
|
|
||||||
static_cast<uint32_t>(name_string.size()));
|
|
||||||
LogWriteBytes(kStringTerminator, sizeof(kStringTerminator));
|
|
||||||
script_names_index++;
|
|
||||||
last_script = current_script;
|
last_script = current_script;
|
||||||
} else {
|
|
||||||
// Use the much shorter kRepeatedNameMarker for repeated names.
|
|
||||||
LogWriteBytes(kRepeatedNameMarker, sizeof(kRepeatedNameMarker));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
char padding_bytes[8] = {0};
|
char padding_bytes[8] = {0};
|
||||||
|
@ -58,7 +58,7 @@ class LinuxPerfJitLogger : public CodeEventLogger {
|
|||||||
void CloseMarkerFile(void* marker_address);
|
void CloseMarkerFile(void* marker_address);
|
||||||
|
|
||||||
uint64_t GetTimestamp();
|
uint64_t GetTimestamp();
|
||||||
void LogRecordedBuffer(Handle<AbstractCode> code,
|
void LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) override;
|
const char* name, int length) override;
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -79,7 +79,7 @@ class LinuxPerfJitLogger : public CodeEventLogger {
|
|||||||
|
|
||||||
void LogWriteBytes(const char* bytes, int size);
|
void LogWriteBytes(const char* bytes, int size);
|
||||||
void LogWriteHeader();
|
void LogWriteHeader();
|
||||||
void LogWriteDebugInfo(Handle<Code> code, Handle<SharedFunctionInfo> shared);
|
void LogWriteDebugInfo(Code code, Handle<SharedFunctionInfo> shared);
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
void LogWriteDebugInfo(const wasm::WasmCode* code);
|
void LogWriteDebugInfo(const wasm::WasmCode* code);
|
||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
#endif // V8_ENABLE_WEBASSEMBLY
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "src/codegen/bailout-reason.h"
|
#include "src/codegen/bailout-reason.h"
|
||||||
#include "src/codegen/macro-assembler.h"
|
#include "src/codegen/macro-assembler.h"
|
||||||
#include "src/codegen/source-position-table.h"
|
#include "src/codegen/source-position-table.h"
|
||||||
|
#include "src/common/assert-scope.h"
|
||||||
#include "src/deoptimizer/deoptimizer.h"
|
#include "src/deoptimizer/deoptimizer.h"
|
||||||
#include "src/diagnostics/perf-jit.h"
|
#include "src/diagnostics/perf-jit.h"
|
||||||
#include "src/execution/isolate.h"
|
#include "src/execution/isolate.h"
|
||||||
@ -248,7 +249,8 @@ void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
|||||||
DCHECK(is_listening_to_code_events());
|
DCHECK(is_listening_to_code_events());
|
||||||
name_buffer_->Init(tag);
|
name_buffer_->Init(tag);
|
||||||
name_buffer_->AppendBytes(comment);
|
name_buffer_->AppendBytes(comment);
|
||||||
LogRecordedBuffer(code, MaybeHandle<SharedFunctionInfo>(),
|
DisallowGarbageCollection no_gc;
|
||||||
|
LogRecordedBuffer(*code, MaybeHandle<SharedFunctionInfo>(),
|
||||||
name_buffer_->get(), name_buffer_->size());
|
name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,7 +259,8 @@ void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
|||||||
DCHECK(is_listening_to_code_events());
|
DCHECK(is_listening_to_code_events());
|
||||||
name_buffer_->Init(tag);
|
name_buffer_->Init(tag);
|
||||||
name_buffer_->AppendName(*name);
|
name_buffer_->AppendName(*name);
|
||||||
LogRecordedBuffer(code, MaybeHandle<SharedFunctionInfo>(),
|
DisallowGarbageCollection no_gc;
|
||||||
|
LogRecordedBuffer(*code, MaybeHandle<SharedFunctionInfo>(),
|
||||||
name_buffer_->get(), name_buffer_->size());
|
name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +272,8 @@ void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
|||||||
name_buffer_->AppendBytes(ComputeMarker(*shared, *code));
|
name_buffer_->AppendBytes(ComputeMarker(*shared, *code));
|
||||||
name_buffer_->AppendByte(' ');
|
name_buffer_->AppendByte(' ');
|
||||||
name_buffer_->AppendName(*script_name);
|
name_buffer_->AppendName(*script_name);
|
||||||
LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
|
DisallowGarbageCollection no_gc;
|
||||||
|
LogRecordedBuffer(*code, shared, name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
||||||
@ -292,7 +296,8 @@ void CodeEventLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
|
|||||||
name_buffer_->AppendInt(line);
|
name_buffer_->AppendInt(line);
|
||||||
name_buffer_->AppendByte(':');
|
name_buffer_->AppendByte(':');
|
||||||
name_buffer_->AppendInt(column);
|
name_buffer_->AppendInt(column);
|
||||||
LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
|
DisallowGarbageCollection no_gc;
|
||||||
|
LogRecordedBuffer(*code, shared, name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -312,6 +317,7 @@ void CodeEventLogger::CodeCreateEvent(CodeTag tag, const wasm::WasmCode* code,
|
|||||||
}
|
}
|
||||||
name_buffer_->AppendByte('-');
|
name_buffer_->AppendByte('-');
|
||||||
name_buffer_->AppendBytes(ExecutionTierToString(code->tier()));
|
name_buffer_->AppendBytes(ExecutionTierToString(code->tier()));
|
||||||
|
DisallowGarbageCollection no_gc;
|
||||||
LogRecordedBuffer(code, name_buffer_->get(), name_buffer_->size());
|
LogRecordedBuffer(code, name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
#endif // V8_ENABLE_WEBASSEMBLY
|
||||||
@ -321,7 +327,8 @@ void CodeEventLogger::RegExpCodeCreateEvent(Handle<AbstractCode> code,
|
|||||||
DCHECK(is_listening_to_code_events());
|
DCHECK(is_listening_to_code_events());
|
||||||
name_buffer_->Init(LogEventListener::CodeTag::kRegExp);
|
name_buffer_->Init(LogEventListener::CodeTag::kRegExp);
|
||||||
name_buffer_->AppendString(*source);
|
name_buffer_->AppendString(*source);
|
||||||
LogRecordedBuffer(code, MaybeHandle<SharedFunctionInfo>(),
|
DisallowGarbageCollection no_gc;
|
||||||
|
LogRecordedBuffer(*code, MaybeHandle<SharedFunctionInfo>(),
|
||||||
name_buffer_->get(), name_buffer_->size());
|
name_buffer_->get(), name_buffer_->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,7 +345,7 @@ class LinuxPerfBasicLogger : public CodeEventLogger {
|
|||||||
Handle<SharedFunctionInfo> shared) override {}
|
Handle<SharedFunctionInfo> shared) override {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LogRecordedBuffer(Handle<AbstractCode> code,
|
void LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) override;
|
const char* name, int length) override;
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -414,18 +421,19 @@ void LinuxPerfBasicLogger::WriteLogRecordedBuffer(uintptr_t address, int size,
|
|||||||
size, name_length, name);
|
size, name_length, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinuxPerfBasicLogger::LogRecordedBuffer(Handle<AbstractCode> code,
|
void LinuxPerfBasicLogger::LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo>,
|
MaybeHandle<SharedFunctionInfo>,
|
||||||
const char* name, int length) {
|
const char* name, int length) {
|
||||||
|
DisallowGarbageCollection no_gc;
|
||||||
PtrComprCageBase cage_base(isolate_);
|
PtrComprCageBase cage_base(isolate_);
|
||||||
if (v8_flags.perf_basic_prof_only_functions &&
|
if (v8_flags.perf_basic_prof_only_functions &&
|
||||||
CodeKindIsBuiltinOrJSFunction(code->kind(cage_base))) {
|
CodeKindIsBuiltinOrJSFunction(code.kind(cage_base))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteLogRecordedBuffer(
|
WriteLogRecordedBuffer(
|
||||||
static_cast<uintptr_t>(code->InstructionStart(cage_base)),
|
static_cast<uintptr_t>(code.InstructionStart(cage_base)),
|
||||||
code->InstructionSize(cage_base), name, length);
|
code.InstructionSize(cage_base), name, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -637,7 +645,7 @@ class LowLevelLogger : public CodeEventLogger {
|
|||||||
void CodeMovingGCEvent() override;
|
void CodeMovingGCEvent() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LogRecordedBuffer(Handle<AbstractCode> code,
|
void LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) override;
|
const char* name, int length) override;
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -727,19 +735,19 @@ void LowLevelLogger::LogCodeInfo() {
|
|||||||
LogWriteBytes(arch, sizeof(arch));
|
LogWriteBytes(arch, sizeof(arch));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LowLevelLogger::LogRecordedBuffer(Handle<AbstractCode> code,
|
void LowLevelLogger::LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo>,
|
MaybeHandle<SharedFunctionInfo>,
|
||||||
const char* name, int length) {
|
const char* name, int length) {
|
||||||
|
DisallowGarbageCollection no_gc;
|
||||||
PtrComprCageBase cage_base(isolate_);
|
PtrComprCageBase cage_base(isolate_);
|
||||||
CodeCreateStruct event;
|
CodeCreateStruct event;
|
||||||
event.name_size = length;
|
event.name_size = length;
|
||||||
event.code_address = code->InstructionStart(cage_base);
|
event.code_address = code.InstructionStart(cage_base);
|
||||||
event.code_size = code->InstructionSize(cage_base);
|
event.code_size = code.InstructionSize(cage_base);
|
||||||
LogWriteStruct(event);
|
LogWriteStruct(event);
|
||||||
LogWriteBytes(name, length);
|
LogWriteBytes(name, length);
|
||||||
LogWriteBytes(
|
LogWriteBytes(reinterpret_cast<const char*>(code.InstructionStart(cage_base)),
|
||||||
reinterpret_cast<const char*>(code->InstructionStart(cage_base)),
|
code.InstructionSize(cage_base));
|
||||||
code->InstructionSize(cage_base));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -801,7 +809,7 @@ class JitLogger : public CodeEventLogger {
|
|||||||
JitCodeEvent::CodeType code_type);
|
JitCodeEvent::CodeType code_type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LogRecordedBuffer(Handle<AbstractCode> code,
|
void LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) override;
|
const char* name, int length) override;
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
@ -818,16 +826,17 @@ JitLogger::JitLogger(Isolate* isolate, JitCodeEventHandler code_event_handler)
|
|||||||
DCHECK_NOT_NULL(code_event_handler);
|
DCHECK_NOT_NULL(code_event_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitLogger::LogRecordedBuffer(Handle<AbstractCode> code,
|
void JitLogger::LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) {
|
const char* name, int length) {
|
||||||
|
DisallowGarbageCollection no_gc;
|
||||||
PtrComprCageBase cage_base(isolate_);
|
PtrComprCageBase cage_base(isolate_);
|
||||||
JitCodeEvent event;
|
JitCodeEvent event;
|
||||||
event.type = JitCodeEvent::CODE_ADDED;
|
event.type = JitCodeEvent::CODE_ADDED;
|
||||||
event.code_start = reinterpret_cast<void*>(code->InstructionStart(cage_base));
|
event.code_start = reinterpret_cast<void*>(code.InstructionStart(cage_base));
|
||||||
event.code_type = code->IsCode(cage_base) ? JitCodeEvent::JIT_CODE
|
event.code_type =
|
||||||
: JitCodeEvent::BYTE_CODE;
|
code.IsCode(cage_base) ? JitCodeEvent::JIT_CODE : JitCodeEvent::BYTE_CODE;
|
||||||
event.code_len = code->InstructionSize(cage_base);
|
event.code_len = code.InstructionSize(cage_base);
|
||||||
Handle<SharedFunctionInfo> shared;
|
Handle<SharedFunctionInfo> shared;
|
||||||
if (maybe_shared.ToHandle(&shared) &&
|
if (maybe_shared.ToHandle(&shared) &&
|
||||||
shared->script(cage_base).IsScript(cage_base)) {
|
shared->script(cage_base).IsScript(cage_base)) {
|
||||||
|
@ -448,7 +448,7 @@ class V8_EXPORT_PRIVATE CodeEventLogger : public LogEventListener {
|
|||||||
private:
|
private:
|
||||||
class NameBuffer;
|
class NameBuffer;
|
||||||
|
|
||||||
virtual void LogRecordedBuffer(Handle<AbstractCode> code,
|
virtual void LogRecordedBuffer(AbstractCode code,
|
||||||
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
MaybeHandle<SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) = 0;
|
const char* name, int length) = 0;
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
|
@ -118,10 +118,10 @@ class CodeAddressMap : public CodeEventLogger {
|
|||||||
base::HashMap impl_;
|
base::HashMap impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void LogRecordedBuffer(Handle<AbstractCode> code,
|
void LogRecordedBuffer(AbstractCode code, MaybeHandle<SharedFunctionInfo>,
|
||||||
MaybeHandle<SharedFunctionInfo>, const char* name,
|
const char* name, int length) override {
|
||||||
int length) override {
|
DisallowGarbageCollection no_gc;
|
||||||
address_to_name_map_.Insert(code->address(), name, length);
|
address_to_name_map_.Insert(code.address(), name, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
|
@ -453,7 +453,7 @@ TEST_F(LogTest, Issue539892) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LogRecordedBuffer(i::Handle<i::AbstractCode> code,
|
void LogRecordedBuffer(i::AbstractCode code,
|
||||||
i::MaybeHandle<i::SharedFunctionInfo> maybe_shared,
|
i::MaybeHandle<i::SharedFunctionInfo> maybe_shared,
|
||||||
const char* name, int length) override {}
|
const char* name, int length) override {}
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
|
Loading…
Reference in New Issue
Block a user