Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1783)

Unified Diff: src/profiler/profile-generator.cc

Issue 1973993002: [compiler] Profiler reconstructs inlined frames for deopts. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix build. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/profiler/profile-generator.h ('k') | src/s390/assembler-s390.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/profiler/profile-generator.cc
diff --git a/src/profiler/profile-generator.cc b/src/profiler/profile-generator.cc
index 15265a6e714851f8393003a4ab5dacaa4a6df1a7..8b1de230fa63bffdd4334da77add327acd2d5a3e 100644
--- a/src/profiler/profile-generator.cc
+++ b/src/profiler/profile-generator.cc
@@ -5,6 +5,7 @@
#include "src/profiler/profile-generator.h"
#include "src/ast/scopeinfo.h"
+#include "src/base/adapters.h"
#include "src/debug/debug.h"
#include "src/deoptimizer.h"
#include "src/global-handles.h"
@@ -118,6 +119,19 @@ const std::vector<CodeEntry*>* CodeEntry::GetInlineStack(int pc_offset) const {
return it != inline_locations_.end() ? &it->second : NULL;
}
+void CodeEntry::AddDeoptInlinedFrames(
+ int deopt_id, std::vector<DeoptInlinedFrame>& inlined_frames) {
+ // It's better to use std::move to place the vector into the map,
+ // but it's not supported by the current stdlibc++ on MacOS.
+ deopt_inlined_frames_
+ .insert(std::make_pair(deopt_id, std::vector<DeoptInlinedFrame>()))
+ .first->second.swap(inlined_frames);
+}
+
+bool CodeEntry::HasDeoptInlinedFramesFor(int deopt_id) const {
+ return deopt_inlined_frames_.find(deopt_id) != deopt_inlined_frames_.end();
+}
+
void CodeEntry::FillFunctionInfo(SharedFunctionInfo* shared) {
if (!shared->script()->IsScript()) return;
Script* script = Script::cast(shared->script());
@@ -131,21 +145,19 @@ CpuProfileDeoptInfo CodeEntry::GetDeoptInfo() {
CpuProfileDeoptInfo info;
info.deopt_reason = deopt_reason_;
- if (inlined_function_infos_.empty()) {
+ DCHECK_NE(Deoptimizer::DeoptInfo::kNoDeoptId, deopt_id_);
+ if (deopt_inlined_frames_.find(deopt_id_) == deopt_inlined_frames_.end()) {
info.stack.push_back(CpuProfileDeoptFrame(
{script_id_, position_ + deopt_position_.position()}));
- return info;
- }
- // Copy the only branch from the inlining tree where the deopt happened.
- SourcePosition position = deopt_position_;
- int inlining_id = deopt_inlining_id_;
- while (inlining_id != InlinedFunctionInfo::kNoParentId) {
- InlinedFunctionInfo& inlined_info = inlined_function_infos_.at(inlining_id);
- info.stack.push_back(
- CpuProfileDeoptFrame({inlined_info.script_id,
- inlined_info.start_position + position.raw()}));
- position = inlined_info.inline_position;
- inlining_id = inlined_info.parent_id;
+ } else {
+ size_t deopt_position = deopt_position_.raw();
+ // Copy stack of inlined frames where the deopt happened.
+ std::vector<DeoptInlinedFrame>& frames = deopt_inlined_frames_[deopt_id_];
+ for (DeoptInlinedFrame& inlined_frame : base::Reversed(frames)) {
+ info.stack.push_back(CpuProfileDeoptFrame(
+ {inlined_frame.script_id, deopt_position + inlined_frame.position}));
+ deopt_position = 0; // Done with innermost frame.
+ }
}
return info;
}
« no previous file with comments | « src/profiler/profile-generator.h ('k') | src/s390/assembler-s390.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698