d23ab23b05
1) create beefy RelocInfo table when cpu profiler is active, so if a function was optimized when profiler was active RelocInfo would get separate DeoptInfo for the each deopt case. 2) push DeoptInfo from CodeEntry to ProfileNode. When deopt happens we put the info collected on #1 into CodeEntry and record stack sample. On the sampling thread we grab the deopt data and append it to the corresponding ProfileNode deopts list. Sample profile dump. [Top down]: 0 (root) 0 #1 1 29 #2 1 test 29 #3 2 opt_function 29 #4 2 opt_function 29 #5 deopted at 118 with reason 'not a heap number' deopted at 137 with reason 'division by zero' BUG=452067 LOG=n Committed: https://crrev.com/ce8701b247d3c6604f24f17a90c02d17b4417f54 Cr-Commit-Position: refs/heads/master@{#26615} Review URL: https://codereview.chromium.org/919953002 Cr-Commit-Position: refs/heads/master@{#26630}
88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
// Copyright 2010 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_CPU_PROFILER_INL_H_
|
|
#define V8_CPU_PROFILER_INL_H_
|
|
|
|
#include "src/cpu-profiler.h"
|
|
|
|
#include <new>
|
|
#include "src/circular-queue-inl.h"
|
|
#include "src/profile-generator-inl.h"
|
|
#include "src/unbound-queue-inl.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
void CodeCreateEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
code_map->AddCode(start, entry, size);
|
|
if (shared != NULL) {
|
|
entry->set_shared_id(code_map->GetSharedId(shared));
|
|
}
|
|
}
|
|
|
|
|
|
void CodeMoveEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
code_map->MoveCode(from, to);
|
|
}
|
|
|
|
|
|
void CodeDisableOptEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
CodeEntry* entry = code_map->FindEntry(start);
|
|
if (entry != NULL) {
|
|
entry->set_bailout_reason(bailout_reason);
|
|
}
|
|
}
|
|
|
|
|
|
void CodeDeoptEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
CodeEntry* entry = code_map->FindEntry(start);
|
|
if (entry != NULL) entry->set_deopt_info(deopt_reason, raw_position);
|
|
}
|
|
|
|
|
|
void SharedFunctionInfoMoveEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
code_map->MoveCode(from, to);
|
|
}
|
|
|
|
|
|
void ReportBuiltinEventRecord::UpdateCodeMap(CodeMap* code_map) {
|
|
CodeEntry* entry = code_map->FindEntry(start);
|
|
if (!entry) {
|
|
// Code objects for builtins should already have been added to the map but
|
|
// some of them have been filtered out by CpuProfiler.
|
|
return;
|
|
}
|
|
entry->SetBuiltinId(builtin_id);
|
|
}
|
|
|
|
|
|
TickSample* CpuProfiler::StartTickSample() {
|
|
if (is_profiling_) return processor_->StartTickSample();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void CpuProfiler::FinishTickSample() {
|
|
processor_->FinishTickSample();
|
|
}
|
|
|
|
|
|
TickSample* ProfilerEventsProcessor::StartTickSample() {
|
|
void* address = ticks_buffer_.StartEnqueue();
|
|
if (address == NULL) return NULL;
|
|
TickSampleEventRecord* evt =
|
|
new(address) TickSampleEventRecord(last_code_event_id_);
|
|
return &evt->sample;
|
|
}
|
|
|
|
|
|
void ProfilerEventsProcessor::FinishTickSample() {
|
|
ticks_buffer_.FinishEnqueue();
|
|
}
|
|
|
|
} } // namespace v8::internal
|
|
|
|
#endif // V8_CPU_PROFILER_INL_H_
|