diff options
author | Yang Guo <yangguo@chromium.org> | 2018-11-20 09:16:23 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-11-23 13:25:23 +0900 |
commit | 39db8b11c0a7983d11ffbe4ec3c1d30db4da5fd3 (patch) | |
tree | 1f401f7920d94d238ed1ab09ef4e15471cf6a19d /deps | |
parent | 9eab8030ddf7ebd2703323d225e7d3005963d554 (diff) | |
download | android-node-v8-39db8b11c0a7983d11ffbe4ec3c1d30db4da5fd3.tar.gz android-node-v8-39db8b11c0a7983d11ffbe4ec3c1d30db4da5fd3.tar.bz2 android-node-v8-39db8b11c0a7983d11ffbe4ec3c1d30db4da5fd3.zip |
deps: cherry-pick 073073b from upstream V8
Original commit message:
[profiler] introduce API to enable detailed source positions
This allows Node.js to enable detailed source positions for optimized code
early on, without having to pass a flag string.
R=petermarshall@chromium.org
Change-Id: Ie74ea41f600cf6e31acbe802116df4976ccf1c75
Reviewed-on: https://chromium-review.googlesource.com/c/1319757
Commit-Queue: Yang Guo <yangguo@chromium.org>
Reviewed-by: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57380}
Refs: https://github.com/v8/v8/commit/073073b4f12b683fc0406cd15b3cb284633fe18e
PR-URL: https://github.com/nodejs/node/pull/24515
Refs: https://github.com/nodejs/node/pull/24274
Refs: https://github.com/nodejs/node/pull/24394
Refs: https://github.com/nodejs/node/issues/24393
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Peter Marshall <petermarshall@chromium.org>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Diffstat (limited to 'deps')
-rw-r--r-- | deps/v8/include/v8-profiler.h | 6 | ||||
-rw-r--r-- | deps/v8/src/api.cc | 5 | ||||
-rw-r--r-- | deps/v8/src/isolate.cc | 3 | ||||
-rw-r--r-- | deps/v8/src/isolate.h | 3 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-cpu-profiler.cc | 56 |
5 files changed, 71 insertions, 2 deletions
diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h index 9981061a44..3689a12272 100644 --- a/deps/v8/include/v8-profiler.h +++ b/deps/v8/include/v8-profiler.h @@ -341,6 +341,12 @@ class V8_EXPORT CpuProfiler { V8_DEPRECATED("Use Isolate::SetIdle(bool) instead.", void SetIdle(bool is_idle)); + /** + * Generate more detailed source positions to code objects. This results in + * better results when mapping profiling samples to script source. + */ + static void UseDetailedSourcePositionsForProfiling(Isolate* isolate); + private: CpuProfiler(); ~CpuProfiler(); diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc index c1afe8d93b..8f8aaf7bc6 100644 --- a/deps/v8/src/api.cc +++ b/deps/v8/src/api.cc @@ -10132,6 +10132,11 @@ void CpuProfiler::SetIdle(bool is_idle) { isolate->SetIdle(is_idle); } +void CpuProfiler::UseDetailedSourcePositionsForProfiling(Isolate* isolate) { + reinterpret_cast<i::Isolate*>(isolate) + ->set_detailed_source_positions_for_profiling(true); +} + uintptr_t CodeEvent::GetCodeStartAddress() { return reinterpret_cast<i::CodeEvent*>(this)->code_start_address; } diff --git a/deps/v8/src/isolate.cc b/deps/v8/src/isolate.cc index 89fecce804..eed52d9c19 100644 --- a/deps/v8/src/isolate.cc +++ b/deps/v8/src/isolate.cc @@ -3257,7 +3257,8 @@ bool Isolate::use_optimizer() { } bool Isolate::NeedsDetailedOptimizedCodeLineInfo() const { - return NeedsSourcePositionsForProfiling() || FLAG_detailed_line_info; + return NeedsSourcePositionsForProfiling() || + detailed_source_positions_for_profiling(); } bool Isolate::NeedsSourcePositionsForProfiling() const { diff --git a/deps/v8/src/isolate.h b/deps/v8/src/isolate.h index e199a93ec4..efd479c41e 100644 --- a/deps/v8/src/isolate.h +++ b/deps/v8/src/isolate.h @@ -553,7 +553,8 @@ typedef std::vector<HeapObject*> DebugObjectCache; V(int, last_console_context_id, 0) \ V(v8_inspector::V8Inspector*, inspector, nullptr) \ V(bool, next_v8_call_is_safe_for_termination, false) \ - V(bool, only_terminate_in_safe_scope, false) + V(bool, only_terminate_in_safe_scope, false) \ + V(bool, detailed_source_positions_for_profiling, FLAG_detailed_line_info) #define THREAD_LOCAL_TOP_ACCESSOR(type, name) \ inline void set_##name(type v) { thread_local_top_.name##_ = v; } \ diff --git a/deps/v8/test/cctest/test-cpu-profiler.cc b/deps/v8/test/cctest/test-cpu-profiler.cc index 75af3f6d98..e08bec375e 100644 --- a/deps/v8/test/cctest/test-cpu-profiler.cc +++ b/deps/v8/test/cctest/test-cpu-profiler.cc @@ -40,6 +40,7 @@ #include "src/objects-inl.h" #include "src/profiler/cpu-profiler-inl.h" #include "src/profiler/profiler-listener.h" +#include "src/source-position-table.h" #include "src/utils.h" #include "test/cctest/cctest.h" #include "test/cctest/profiler-extension.h" @@ -2544,6 +2545,61 @@ TEST(MultipleProfilers) { profiler2->StopProfiling("2"); } +int GetSourcePositionEntryCount(i::Isolate* isolate, const char* source) { + i::Handle<i::JSFunction> function = i::Handle<i::JSFunction>::cast( + v8::Utils::OpenHandle(*CompileRun(source))); + if (function->IsInterpreted()) return -1; + i::Handle<i::Code> code(function->code(), isolate); + i::SourcePositionTableIterator iterator( + ByteArray::cast(code->source_position_table())); + int count = 0; + while (!iterator.done()) { + count++; + iterator.Advance(); + } + return count; +} + +UNINITIALIZED_TEST(DetailedSourcePositionAPI) { + i::FLAG_detailed_line_info = false; + i::FLAG_allow_natives_syntax = true; + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + + const char* source = + "function fib(i) {" + " if (i <= 1) return 1; " + " return fib(i - 1) +" + " fib(i - 2);" + "}" + "fib(5);" + "%OptimizeFunctionOnNextCall(fib);" + "fib(5);" + "fib"; + { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + v8::Local<v8::Context> context = v8::Context::New(isolate); + v8::Context::Scope context_scope(context); + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); + + CHECK(!i_isolate->NeedsDetailedOptimizedCodeLineInfo()); + + int non_detailed_positions = GetSourcePositionEntryCount(i_isolate, source); + + v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate); + CHECK(i_isolate->NeedsDetailedOptimizedCodeLineInfo()); + + int detailed_positions = GetSourcePositionEntryCount(i_isolate, source); + + CHECK((non_detailed_positions == -1 && detailed_positions == -1) || + non_detailed_positions < detailed_positions); + } + + isolate->Dispose(); +} + } // namespace test_cpu_profiler } // namespace internal } // namespace v8 |