Skip to content

Commit 073073b

Browse files
hashseedCommit Bot
authored andcommitted
[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. [email protected] Change-Id: Ie74ea41f600cf6e31acbe802116df4976ccf1c75 Reviewed-on: https://chromium-review.googlesource.com/c/1319757 Commit-Queue: Yang Guo <[email protected]> Reviewed-by: Peter Marshall <[email protected]> Cr-Commit-Position: refs/heads/master@{#57380}
1 parent ff06752 commit 073073b

5 files changed

Lines changed: 71 additions & 2 deletions

File tree

include/v8-profiler.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,12 @@ class V8_EXPORT CpuProfiler {
341341
V8_DEPRECATED("Use Isolate::SetIdle(bool) instead.",
342342
void SetIdle(bool is_idle));
343343

344+
/**
345+
* Generate more detailed source positions to code objects. This results in
346+
* better results when mapping profiling samples to script source.
347+
*/
348+
static void UseDetailedSourcePositionsForProfiling(Isolate* isolate);
349+
344350
private:
345351
CpuProfiler();
346352
~CpuProfiler();

src/api.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10083,6 +10083,11 @@ void CpuProfiler::SetIdle(bool is_idle) {
1008310083
isolate->SetIdle(is_idle);
1008410084
}
1008510085

10086+
void CpuProfiler::UseDetailedSourcePositionsForProfiling(Isolate* isolate) {
10087+
reinterpret_cast<i::Isolate*>(isolate)
10088+
->set_detailed_source_positions_for_profiling(true);
10089+
}
10090+
1008610091
uintptr_t CodeEvent::GetCodeStartAddress() {
1008710092
return reinterpret_cast<i::CodeEvent*>(this)->code_start_address;
1008810093
}

src/isolate.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3395,7 +3395,8 @@ bool Isolate::use_optimizer() {
33953395
}
33963396

33973397
bool Isolate::NeedsDetailedOptimizedCodeLineInfo() const {
3398-
return NeedsSourcePositionsForProfiling() || FLAG_detailed_line_info;
3398+
return NeedsSourcePositionsForProfiling() ||
3399+
detailed_source_positions_for_profiling();
33993400
}
34003401

34013402
bool Isolate::NeedsSourcePositionsForProfiling() const {

src/isolate.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,8 @@ typedef std::vector<HeapObject*> DebugObjectCache;
480480
V(int, last_console_context_id, 0) \
481481
V(v8_inspector::V8Inspector*, inspector, nullptr) \
482482
V(bool, next_v8_call_is_safe_for_termination, false) \
483-
V(bool, only_terminate_in_safe_scope, false)
483+
V(bool, only_terminate_in_safe_scope, false) \
484+
V(bool, detailed_source_positions_for_profiling, FLAG_detailed_line_info)
484485

485486
#define THREAD_LOCAL_TOP_ACCESSOR(type, name) \
486487
inline void set_##name(type v) { thread_local_top_.name##_ = v; } \

test/cctest/test-cpu-profiler.cc

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "src/objects-inl.h"
4141
#include "src/profiler/cpu-profiler-inl.h"
4242
#include "src/profiler/profiler-listener.h"
43+
#include "src/source-position-table.h"
4344
#include "src/utils.h"
4445
#include "test/cctest/cctest.h"
4546
#include "test/cctest/profiler-extension.h"
@@ -2599,6 +2600,61 @@ TEST(MultipleIsolates) {
25992600
thread2.Join();
26002601
}
26012602

2603+
int GetSourcePositionEntryCount(i::Isolate* isolate, const char* source) {
2604+
i::Handle<i::JSFunction> function = i::Handle<i::JSFunction>::cast(
2605+
v8::Utils::OpenHandle(*CompileRun(source)));
2606+
if (function->IsInterpreted()) return -1;
2607+
i::Handle<i::Code> code(function->code(), isolate);
2608+
i::SourcePositionTableIterator iterator(
2609+
ByteArray::cast(code->source_position_table()));
2610+
int count = 0;
2611+
while (!iterator.done()) {
2612+
count++;
2613+
iterator.Advance();
2614+
}
2615+
return count;
2616+
}
2617+
2618+
UNINITIALIZED_TEST(DetailedSourcePositionAPI) {
2619+
i::FLAG_detailed_line_info = false;
2620+
i::FLAG_allow_natives_syntax = true;
2621+
v8::Isolate::CreateParams create_params;
2622+
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
2623+
v8::Isolate* isolate = v8::Isolate::New(create_params);
2624+
2625+
const char* source =
2626+
"function fib(i) {"
2627+
" if (i <= 1) return 1; "
2628+
" return fib(i - 1) +"
2629+
" fib(i - 2);"
2630+
"}"
2631+
"fib(5);"
2632+
"%OptimizeFunctionOnNextCall(fib);"
2633+
"fib(5);"
2634+
"fib";
2635+
{
2636+
v8::Isolate::Scope isolate_scope(isolate);
2637+
v8::HandleScope handle_scope(isolate);
2638+
v8::Local<v8::Context> context = v8::Context::New(isolate);
2639+
v8::Context::Scope context_scope(context);
2640+
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
2641+
2642+
CHECK(!i_isolate->NeedsDetailedOptimizedCodeLineInfo());
2643+
2644+
int non_detailed_positions = GetSourcePositionEntryCount(i_isolate, source);
2645+
2646+
v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate);
2647+
CHECK(i_isolate->NeedsDetailedOptimizedCodeLineInfo());
2648+
2649+
int detailed_positions = GetSourcePositionEntryCount(i_isolate, source);
2650+
2651+
CHECK((non_detailed_positions == -1 && detailed_positions == -1) ||
2652+
non_detailed_positions < detailed_positions);
2653+
}
2654+
2655+
isolate->Dispose();
2656+
}
2657+
26022658
} // namespace test_cpu_profiler
26032659
} // namespace internal
26042660
} // namespace v8

0 commit comments

Comments
 (0)