[cpu-profiler] Handlify ProfilerListener and add no_gc scopes Bug: chromium:1033407 Change-Id: I59642d64fd111884547605f7a010d40e974d2762 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1975752 Reviewed-by: Tobias Tebbi <tebbi@chromium.org> Commit-Queue: Peter Marshall <petermarshall@chromium.org> Cr-Commit-Position: refs/heads/master@{#65524}
diff --git a/src/profiler/profiler-listener.cc b/src/profiler/profiler-listener.cc index a2fb6a0..41e211c 100644 --- a/src/profiler/profiler-listener.cc +++ b/src/profiler/profiler-listener.cc
@@ -31,6 +31,7 @@ ProfilerListener::~ProfilerListener() = default; void ProfilerListener::CallbackEvent(Name name, Address entry_point) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = entry_point; @@ -41,6 +42,7 @@ void ProfilerListener::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, AbstractCode code, const char* name) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = code.InstructionStart(); @@ -54,6 +56,7 @@ void ProfilerListener::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, AbstractCode code, Name name) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = code.InstructionStart(); @@ -69,6 +72,7 @@ AbstractCode code, SharedFunctionInfo shared, Name script_name) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = code.InstructionStart(); @@ -99,43 +103,51 @@ } // namespace void ProfilerListener::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, - AbstractCode abstract_code, - SharedFunctionInfo shared, - Name script_name, int line, int column) { + AbstractCode abstract_code_unsafe, + SharedFunctionInfo shared_unsafe, + Name script_name_unsafe, int line, + int column) { + HandleScope scope(isolate_); + Handle<AbstractCode> abstract_code_handle = + handle(abstract_code_unsafe, isolate_); + Handle<SharedFunctionInfo> shared_handle = handle(shared_unsafe, isolate_); + Handle<Name> script_name_handle = handle(script_name_unsafe, isolate_); + CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; - rec->instruction_start = abstract_code.InstructionStart(); + rec->instruction_start = abstract_code_handle->InstructionStart(); std::unique_ptr<SourcePositionTable> line_table; std::unordered_map<int, std::vector<CodeEntryAndLineNumber>> inline_stacks; std::unordered_set<std::unique_ptr<CodeEntry>, CodeEntry::Hasher, CodeEntry::Equals> cached_inline_entries; bool is_shared_cross_origin = false; - if (shared.script().IsScript()) { - Script script = Script::cast(shared.script()); + if (shared_handle->script().IsScript()) { + Handle<Script> script = + handle(Script::cast(shared_handle->script()), isolate_); line_table.reset(new SourcePositionTable()); - HandleScope scope(isolate_); - is_shared_cross_origin = script.origin_options().IsSharedCrossOrigin(); + is_shared_cross_origin = script->origin_options().IsSharedCrossOrigin(); // Add each position to the source position table and store inlining stacks // for inline positions. We store almost the same information in the // profiler as is stored on the code object, except that we transform source // positions to line numbers here, because we only care about attributing // ticks to a given line. - for (SourcePositionTableIterator it(abstract_code.source_position_table()); + for (SourcePositionTableIterator it( + abstract_code_handle->source_position_table()); !it.done(); it.Advance()) { int position = it.source_position().ScriptOffset(); int inlining_id = it.source_position().InliningId(); if (inlining_id == SourcePosition::kNotInlined) { - int line_number = script.GetLineNumber(position) + 1; + int line_number = script->GetLineNumber(position) + 1; line_table->SetPosition(it.code_offset(), line_number, inlining_id); } else { - DCHECK(abstract_code.IsCode()); - Code code = abstract_code.GetCode(); + DCHECK(abstract_code_handle->IsCode()); + Handle<Code> code = handle(abstract_code_handle->GetCode(), isolate_); std::vector<SourcePositionInfo> stack = - it.source_position().InliningStack(handle(code, isolate_)); + it.source_position().InliningStack(code); DCHECK(!stack.empty()); // When we have an inlining id and we are doing cross-script inlining, @@ -171,7 +183,7 @@ std::unique_ptr<CodeEntry> inline_entry = std::make_unique<CodeEntry>( tag, GetFunctionName(*pos_info.shared), resource_name, start_pos_info.line + 1, start_pos_info.column + 1, nullptr, - code.InstructionStart(), inline_is_shared_cross_origin); + code->InstructionStart(), inline_is_shared_cross_origin); inline_entry->FillFunctionInfo(*pos_info.shared); // Create a canonical CodeEntry for each inlined frame and then re-use @@ -186,24 +198,25 @@ } } } - rec->entry = - new CodeEntry(tag, GetFunctionName(shared), - GetName(InferScriptName(script_name, shared)), line, column, - std::move(line_table), abstract_code.InstructionStart(), - is_shared_cross_origin); + rec->entry = new CodeEntry( + tag, GetFunctionName(*shared_handle), + GetName(InferScriptName(*script_name_handle, *shared_handle)), line, + column, std::move(line_table), abstract_code_handle->InstructionStart(), + is_shared_cross_origin); if (!inline_stacks.empty()) { rec->entry->SetInlineStacks(std::move(cached_inline_entries), std::move(inline_stacks)); } - rec->entry->FillFunctionInfo(shared); - rec->instruction_size = abstract_code.InstructionSize(); + rec->entry->FillFunctionInfo(*shared_handle); + rec->instruction_size = abstract_code_handle->InstructionSize(); DispatchCodeEvent(evt_rec); } void ProfilerListener::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, const wasm::WasmCode* code, wasm::WasmName name) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = code->instruction_start(); @@ -216,6 +229,7 @@ } void ProfilerListener::CodeMoveEvent(AbstractCode from, AbstractCode to) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; rec->from_instruction_start = from.InstructionStart(); @@ -225,6 +239,7 @@ void ProfilerListener::CodeDisableOptEvent(AbstractCode code, SharedFunctionInfo shared) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_DISABLE_OPT); CodeDisableOptEventRecord* rec = &evt_rec.CodeDisableOptEventRecord_; rec->instruction_start = code.InstructionStart(); @@ -234,6 +249,7 @@ void ProfilerListener::CodeDeoptEvent(Code code, DeoptimizeKind kind, Address pc, int fp_to_sp_delta) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_DEOPT); CodeDeoptEventRecord* rec = &evt_rec.CodeDeoptEventRecord_; Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(code, pc); @@ -250,6 +266,7 @@ } void ProfilerListener::GetterCallbackEvent(Name name, Address entry_point) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = entry_point; @@ -260,6 +277,7 @@ } void ProfilerListener::RegExpCodeCreateEvent(AbstractCode code, String source) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = code.InstructionStart(); @@ -272,6 +290,7 @@ } void ProfilerListener::SetterCallbackEvent(Name name, Address entry_point) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; rec->instruction_start = entry_point; @@ -282,6 +301,7 @@ } void ProfilerListener::NativeContextMoveEvent(Address from, Address to) { + DisallowHeapAllocation no_gc; CodeEventsContainer evt_rec(CodeEventRecord::NATIVE_CONTEXT_MOVE); evt_rec.NativeContextMoveEventRecord_.from_address = from; evt_rec.NativeContextMoveEventRecord_.to_address = to; @@ -297,6 +317,7 @@ } Name ProfilerListener::InferScriptName(Name name, SharedFunctionInfo info) { + DisallowHeapAllocation no_gc; if (name.IsString() && String::cast(name).length()) return name; if (!info.script().IsScript()) return name; Object source_url = Script::cast(info.script()).source_url(); @@ -315,8 +336,10 @@ } } -void ProfilerListener::AttachDeoptInlinedFrames(Code code, +void ProfilerListener::AttachDeoptInlinedFrames(Code code_unsafe, CodeDeoptEventRecord* rec) { + HandleScope scope(isolate_); + Handle<Code> code_handle = handle(code_unsafe, isolate_); int deopt_id = rec->deopt_id; SourcePosition last_position = SourcePosition::Unknown(); int mask = RelocInfo::ModeMask(RelocInfo::DEOPT_ID) | @@ -326,7 +349,7 @@ rec->deopt_frames = nullptr; rec->deopt_frame_count = 0; - for (RelocIterator it(code, mask); !it.done(); it.next()) { + for (RelocIterator it(*code_handle, mask); !it.done(); it.next()) { RelocInfo* info = it.rinfo(); if (info->rmode() == RelocInfo::DEOPT_SCRIPT_OFFSET) { int script_offset = static_cast<int>(info->data()); @@ -345,7 +368,7 @@ // scope limits their lifetime. HandleScope scope(isolate_); std::vector<SourcePositionInfo> stack = - last_position.InliningStack(handle(code, isolate_)); + last_position.InliningStack(code_handle); CpuProfileDeoptFrame* deopt_frames = new CpuProfileDeoptFrame[stack.size()];