Skip to content

Commit b57ad02

Browse files
psmarshallMylesBorins
authored andcommitted
deps: V8: backport 14 CPU profiler commits from upstream
[cpu-profiler] Fix bugs and add tests for JITLineInfoTable https://chromium.googlesource.com/v8/v8/+/4feb5ce7fd5ef8c933f3f5dff2eca1173f85c1e9 [cpu-profiler] Fix incorrect line number calculation. https://chromium.googlesource.com/v8/v8/+/ddb2856f39632f9e9f623d3cdb4600e636172031 [cpu-profiler] Use std::unordered_map for hashmaps. https://chromium.googlesource.com/v8/v8/+/35985ce6abc80b85264fe3b87b246fed5f1806e6 [cpu-profiler] Do not store CodeEntries between profiling sessions. https://chromium.googlesource.com/v8/v8.git/+/8ec48b2117b8092c4956f1ee11a0c85bec3ba1f8 [cpu-profiler] Remove name_prefix field from CodeEntry https://chromium.googlesource.com/v8/v8.git/+/6f72af25fe43218b60c68129073ddcddb631566e [cpu-profiler] Extract rare used fields of CodeEntry to an optional object. https://chromium.googlesource.com/v8/v8.git/+/fcc1ebb55aab38013855834f556f6e874e0eb8b3 [profiler] Refactoring: decouple StringsStorage from Heap object. https://chromium.googlesource.com/v8/v8/+/a31320f59c911a277566d6c2fa0b0f2ac83e0748 [cpu-profiler] Add a HandleScope to limit memory consumption. https://chromium.googlesource.com/v8/v8.git/+/3e9f8a4f635e2d946651d6a4df81378266f32dc9 [cpu-profiler] Lazily create CPU profiler. https://chromium.googlesource.com/v8/v8/+/1426ea1d6d45be0b4d9476bdb5bf3f27cfe578a0 [cpu-profiler] turn several std::map's into unordered_map's. https://chromium.googlesource.com/v8/v8/+/3ed5dfb8a3cbc7aa0017bd01c2fdd6227485b8ad [cpu-profiler] Eagerly delete not used CodeEntry'es https://chromium.googlesource.com/v8/v8.git/+/c6c28f7a412a88df12055e953630a9e93cc64d49 [cpu-profiler] Move bailout reason into rare_info struct https://chromium.googlesource.com/v8/v8.git/+/29ea4d1ef5360e71c61ecf8db6a5a0a0c3391fd1 [cpu-profiler] Save space in the SourcePositionTable by using a vector. https://chromium.googlesource.com/v8/v8.git/+/1cb19f0e0a93adbac8c11bc906f951bd8098722d [cpu-profiler] Only store deopt inline frames for functions that need it https://chromium.googlesource.com/v8/v8.git/+/0bfcbdd4726920755e51dab28c18ab93e050819b PR-URL: #21558 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Myles Borins <[email protected]>
1 parent f1d9f16 commit b57ad02

19 files changed

+446
-421
lines changed

deps/v8/include/v8-version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define V8_MAJOR_VERSION 6
1212
#define V8_MINOR_VERSION 2
1313
#define V8_BUILD_NUMBER 414
14-
#define V8_PATCH_LEVEL 60
14+
#define V8_PATCH_LEVEL 61
1515

1616
// Use 1 for candidates and 0 otherwise.
1717
// (Boolean macro values are not supported by all preprocessors.)

deps/v8/src/api.cc

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8419,7 +8419,7 @@ HeapProfiler* Isolate::GetHeapProfiler() {
84198419

84208420
CpuProfiler* Isolate::GetCpuProfiler() {
84218421
i::CpuProfiler* cpu_profiler =
8422-
reinterpret_cast<i::Isolate*>(this)->cpu_profiler();
8422+
reinterpret_cast<i::Isolate*>(this)->EnsureCpuProfiler();
84238423
return reinterpret_cast<CpuProfiler*>(cpu_profiler);
84248424
}
84258425

@@ -10139,15 +10139,7 @@ Local<String> CpuProfileNode::GetFunctionName() const {
1013910139
const i::CodeEntry* entry = node->entry();
1014010140
i::Handle<i::String> name =
1014110141
isolate->factory()->InternalizeUtf8String(entry->name());
10142-
if (!entry->has_name_prefix()) {
10143-
return ToApiHandle<String>(name);
10144-
} else {
10145-
// We do not expect this to fail. Change this if it does.
10146-
i::Handle<i::String> cons = isolate->factory()->NewConsString(
10147-
isolate->factory()->InternalizeUtf8String(entry->name_prefix()),
10148-
name).ToHandleChecked();
10149-
return ToApiHandle<String>(cons);
10150-
}
10142+
return ToApiHandle<String>(name);
1015110143
}
1015210144

1015310145
int debug::Coverage::BlockData::StartOffset() const { return block_->start; }

deps/v8/src/isolate.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2689,7 +2689,6 @@ bool Isolate::Init(StartupDeserializer* des) {
26892689
call_descriptor_data_ =
26902690
new CallInterfaceDescriptorData[CallDescriptors::NUMBER_OF_DESCRIPTORS];
26912691
access_compiler_data_ = new AccessCompilerData();
2692-
cpu_profiler_ = new CpuProfiler(this);
26932692
heap_profiler_ = new HeapProfiler(heap());
26942693
interpreter_ = new interpreter::Interpreter(this);
26952694
compiler_dispatcher_ =
@@ -3686,6 +3685,13 @@ void Isolate::PrintWithTimestamp(const char* format, ...) {
36863685
va_end(arguments);
36873686
}
36883687

3688+
CpuProfiler* Isolate::EnsureCpuProfiler() {
3689+
if (!cpu_profiler_) {
3690+
cpu_profiler_ = new CpuProfiler(this);
3691+
}
3692+
return cpu_profiler_;
3693+
}
3694+
36893695
bool StackLimitCheck::JsHasOverflowed(uintptr_t gap) const {
36903696
StackGuard* stack_guard = isolate_->stack_guard();
36913697
#ifdef USE_SIMULATOR

deps/v8/src/isolate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,7 @@ class Isolate {
14491449

14501450
// TODO(alph): Remove along with the deprecated GetCpuProfiler().
14511451
friend v8::CpuProfiler* v8::Isolate::GetCpuProfiler();
1452-
CpuProfiler* cpu_profiler() const { return cpu_profiler_; }
1452+
CpuProfiler* EnsureCpuProfiler();
14531453

14541454
base::Atomic32 id_;
14551455
EntryStackItem* entry_stack_;

deps/v8/src/log.cc

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include "src/log-utils.h"
2323
#include "src/macro-assembler.h"
2424
#include "src/perf-jit.h"
25-
#include "src/profiler/profiler-listener.h"
2625
#include "src/profiler/tick-sample.h"
2726
#include "src/runtime-profiler.h"
2827
#include "src/source-position-table.h"
@@ -739,7 +738,6 @@ Logger::Logger(Isolate* isolate)
739738
perf_jit_logger_(NULL),
740739
ll_logger_(NULL),
741740
jit_logger_(NULL),
742-
listeners_(5),
743741
is_initialized_(false) {}
744742

745743
Logger::~Logger() {
@@ -1876,8 +1874,6 @@ bool Logger::SetUp(Isolate* isolate) {
18761874
profiler_->Engage();
18771875
}
18781876

1879-
profiler_listener_.reset();
1880-
18811877
if (is_logging_) {
18821878
addCodeEventListener(this);
18831879
}
@@ -1905,19 +1901,6 @@ void Logger::SetCodeEventHandler(uint32_t options,
19051901
}
19061902
}
19071903

1908-
void Logger::SetUpProfilerListener() {
1909-
if (!is_initialized_) return;
1910-
if (profiler_listener_.get() == nullptr) {
1911-
profiler_listener_.reset(new ProfilerListener(isolate_));
1912-
}
1913-
addCodeEventListener(profiler_listener_.get());
1914-
}
1915-
1916-
void Logger::TearDownProfilerListener() {
1917-
if (profiler_listener_->HasObservers()) return;
1918-
removeCodeEventListener(profiler_listener_.get());
1919-
}
1920-
19211904
sampler::Sampler* Logger::sampler() {
19221905
return ticker_;
19231906
}
@@ -1961,10 +1944,6 @@ FILE* Logger::TearDown() {
19611944
jit_logger_ = NULL;
19621945
}
19631946

1964-
if (profiler_listener_.get() != nullptr) {
1965-
removeCodeEventListener(profiler_listener_.get());
1966-
}
1967-
19681947
return log_->Close();
19691948
}
19701949

deps/v8/src/log.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ class LowLevelLogger;
7474
class PerfBasicLogger;
7575
class PerfJitLogger;
7676
class Profiler;
77-
class ProfilerListener;
7877
class RuntimeCallTimer;
7978
class Ticker;
8079

@@ -102,16 +101,8 @@ class Logger : public CodeEventListener {
102101
void SetCodeEventHandler(uint32_t options,
103102
JitCodeEventHandler event_handler);
104103

105-
// Sets up ProfilerListener.
106-
void SetUpProfilerListener();
107-
108-
// Tear down ProfilerListener if it has no observers.
109-
void TearDownProfilerListener();
110-
111104
sampler::Sampler* sampler();
112105

113-
ProfilerListener* profiler_listener() { return profiler_listener_.get(); }
114-
115106
// Frees resources acquired in SetUp.
116107
// When a temporary file is used for the log, returns its stream descriptor,
117108
// leaving the file open.
@@ -316,8 +307,6 @@ class Logger : public CodeEventListener {
316307
PerfJitLogger* perf_jit_logger_;
317308
LowLevelLogger* ll_logger_;
318309
JitLogger* jit_logger_;
319-
std::unique_ptr<ProfilerListener> profiler_listener_;
320-
List<CodeEventListener*> listeners_;
321310
std::set<int> logged_source_code_;
322311
uint32_t next_source_info_id_ = 0;
323312

deps/v8/src/profiler/cpu-profiler-inl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ void CodeDisableOptEventRecord::UpdateCodeMap(CodeMap* code_map) {
3535

3636
void CodeDeoptEventRecord::UpdateCodeMap(CodeMap* code_map) {
3737
CodeEntry* entry = code_map->FindEntry(start);
38-
if (entry != NULL) entry->set_deopt_info(deopt_reason, deopt_id);
38+
if (entry == nullptr) return;
39+
std::vector<CpuProfileDeoptFrame> frames_vector(
40+
deopt_frames, deopt_frames + deopt_frame_count);
41+
entry->set_deopt_info(deopt_reason, deopt_id, std::move(frames_vector));
42+
delete[] deopt_frames;
3943
}
4044

4145

deps/v8/src/profiler/cpu-profiler.cc

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44

55
#include "src/profiler/cpu-profiler.h"
66

7+
#include <unordered_map>
8+
#include <utility>
9+
10+
#include "src/base/lazy-instance.h"
11+
#include "src/base/platform/mutex.h"
12+
#include "src/base/template-utils.h"
713
#include "src/debug/debug.h"
814
#include "src/deoptimizer.h"
915
#include "src/frames-inl.h"
@@ -275,20 +281,19 @@ void CpuProfiler::set_sampling_interval(base::TimeDelta value) {
275281
void CpuProfiler::ResetProfiles() {
276282
profiles_.reset(new CpuProfilesCollection(isolate_));
277283
profiles_->set_cpu_profiler(this);
284+
profiler_listener_.reset();
285+
generator_.reset();
278286
}
279287

280288
void CpuProfiler::CreateEntriesForRuntimeCallStats() {
281-
static_entries_.clear();
282289
RuntimeCallStats* rcs = isolate_->counters()->runtime_call_stats();
283290
CodeMap* code_map = generator_->code_map();
284291
for (int i = 0; i < RuntimeCallStats::counters_count; ++i) {
285292
RuntimeCallCounter* counter = &(rcs->*(RuntimeCallStats::counters[i]));
286293
DCHECK(counter->name());
287-
std::unique_ptr<CodeEntry> entry(
288-
new CodeEntry(CodeEventListener::FUNCTION_TAG, counter->name(),
289-
CodeEntry::kEmptyNamePrefix, "native V8Runtime"));
290-
code_map->AddCode(reinterpret_cast<Address>(counter), entry.get(), 1);
291-
static_entries_.push_back(std::move(entry));
294+
auto entry = new CodeEntry(CodeEventListener::FUNCTION_TAG, counter->name(),
295+
"native V8Runtime");
296+
code_map->AddCode(reinterpret_cast<Address>(counter), entry, 1);
292297
}
293298
}
294299

@@ -321,13 +326,17 @@ void CpuProfiler::StartProcessorIfNotStarted() {
321326
// Disable logging when using the new implementation.
322327
saved_is_logging_ = logger->is_logging_;
323328
logger->is_logging_ = false;
324-
generator_.reset(new ProfileGenerator(profiles_.get()));
329+
if (!generator_) {
330+
generator_.reset(new ProfileGenerator(profiles_.get()));
331+
CreateEntriesForRuntimeCallStats();
332+
}
325333
processor_.reset(new ProfilerEventsProcessor(isolate_, generator_.get(),
326334
sampling_interval_));
327-
CreateEntriesForRuntimeCallStats();
328-
logger->SetUpProfilerListener();
329-
ProfilerListener* profiler_listener = logger->profiler_listener();
330-
profiler_listener->AddObserver(this);
335+
if (!profiler_listener_) {
336+
profiler_listener_.reset(new ProfilerListener(isolate_, this));
337+
}
338+
logger->addCodeEventListener(profiler_listener_.get());
339+
331340
is_profiling_ = true;
332341
isolate_->set_is_profiling(true);
333342
// Enumerate stuff we already have in the heap.
@@ -362,12 +371,9 @@ void CpuProfiler::StopProcessor() {
362371
Logger* logger = isolate_->logger();
363372
is_profiling_ = false;
364373
isolate_->set_is_profiling(false);
365-
ProfilerListener* profiler_listener = logger->profiler_listener();
366-
profiler_listener->RemoveObserver(this);
374+
logger->removeCodeEventListener(profiler_listener_.get());
367375
processor_->StopSynchronously();
368-
logger->TearDownProfilerListener();
369376
processor_.reset();
370-
generator_.reset();
371377
logger->is_logging_ = saved_is_logging_;
372378
}
373379

deps/v8/src/profiler/cpu-profiler.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ class CodeDeoptEventRecord : public CodeEventRecord {
8686
int deopt_id;
8787
void* pc;
8888
int fp_to_sp_delta;
89+
CpuProfileDeoptFrame* deopt_frames;
90+
int deopt_frame_count;
8991

9092
INLINE(void UpdateCodeMap(CodeMap* code_map));
9193
};
@@ -214,6 +216,10 @@ class CpuProfiler : public CodeEventObserver {
214216
ProfilerEventsProcessor* processor() const { return processor_.get(); }
215217
Isolate* isolate() const { return isolate_; }
216218

219+
ProfilerListener* profiler_listener_for_test() {
220+
return profiler_listener_.get();
221+
}
222+
217223
private:
218224
void StartProcessorIfNotStarted();
219225
void StopProcessorIfLastProfile(const char* title);
@@ -227,7 +233,7 @@ class CpuProfiler : public CodeEventObserver {
227233
std::unique_ptr<CpuProfilesCollection> profiles_;
228234
std::unique_ptr<ProfileGenerator> generator_;
229235
std::unique_ptr<ProfilerEventsProcessor> processor_;
230-
std::vector<std::unique_ptr<CodeEntry>> static_entries_;
236+
std::unique_ptr<ProfilerListener> profiler_listener_;
231237
bool saved_is_logging_;
232238
bool is_profiling_;
233239

@@ -237,5 +243,4 @@ class CpuProfiler : public CodeEventObserver {
237243
} // namespace internal
238244
} // namespace v8
239245

240-
241246
#endif // V8_PROFILER_CPU_PROFILER_H_

deps/v8/src/profiler/heap-profiler.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace internal {
1616

1717
HeapProfiler::HeapProfiler(Heap* heap)
1818
: ids_(new HeapObjectsMap(heap)),
19-
names_(new StringsStorage(heap)),
19+
names_(new StringsStorage(heap->HashSeed())),
2020
is_tracking_object_moves_(false),
2121
get_retainer_infos_callback_(nullptr) {}
2222

@@ -34,7 +34,7 @@ HeapProfiler::~HeapProfiler() {
3434
void HeapProfiler::DeleteAllSnapshots() {
3535
snapshots_.Iterate(DeleteHeapSnapshot);
3636
snapshots_.Clear();
37-
names_.reset(new StringsStorage(heap()));
37+
names_.reset(new StringsStorage(heap()->HashSeed()));
3838
}
3939

4040

0 commit comments

Comments
 (0)