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

Unified Diff: src/frames.cc

Issue 1907443002: Introduce approximate mode for StandardFrame::Summarize. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed review feedback Created 4 years, 8 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/frames.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/frames.cc
diff --git a/src/frames.cc b/src/frames.cc
index e4ca9346b997d48c72cef1da71adfd54df82ed8d..2a1a26461d3b032b0efd5afa995cc363e20762e5 100644
--- a/src/frames.cc
+++ b/src/frames.cc
@@ -617,7 +617,8 @@ void ExitFrame::FillState(Address fp, Address sp, State* state) {
state->constant_pool_address = NULL;
}
-void StandardFrame::Summarize(List<FrameSummary>* functions) const {
+void StandardFrame::Summarize(List<FrameSummary>* functions,
+ FrameSummary::Mode mode) const {
DCHECK(functions->length() == 0);
// default implementation: no summary added
}
@@ -860,13 +861,14 @@ void JavaScriptFrame::GetFunctions(List<JSFunction*>* functions) const {
functions->Add(function());
}
-void JavaScriptFrame::Summarize(List<FrameSummary>* functions) const {
+void JavaScriptFrame::Summarize(List<FrameSummary>* functions,
+ FrameSummary::Mode mode) const {
DCHECK(functions->length() == 0);
Code* code = LookupCode();
int offset = static_cast<int>(pc() - code->instruction_start());
AbstractCode* abstract_code = AbstractCode::cast(code);
FrameSummary summary(receiver(), function(), abstract_code, offset,
- IsConstructor());
+ IsConstructor(), mode);
functions->Add(summary);
}
@@ -966,7 +968,7 @@ bool CannotDeoptFromAsmCode(Code* code, JSFunction* function) {
FrameSummary::FrameSummary(Object* receiver, JSFunction* function,
AbstractCode* abstract_code, int code_offset,
- bool is_constructor)
+ bool is_constructor, Mode mode)
: receiver_(receiver, function->GetIsolate()),
function_(function),
abstract_code_(abstract_code),
@@ -974,7 +976,8 @@ FrameSummary::FrameSummary(Object* receiver, JSFunction* function,
is_constructor_(is_constructor) {
DCHECK(abstract_code->IsBytecodeArray() ||
Code::cast(abstract_code)->kind() != Code::OPTIMIZED_FUNCTION ||
- CannotDeoptFromAsmCode(Code::cast(abstract_code), function));
+ CannotDeoptFromAsmCode(Code::cast(abstract_code), function) ||
+ mode == kApproximateSummary);
}
FrameSummary FrameSummary::GetFirst(JavaScriptFrame* frame) {
@@ -994,8 +997,12 @@ void FrameSummary::Print() {
Code* code = abstract_code_->GetCode();
if (code->kind() == Code::FUNCTION) PrintF(" UNOPT ");
if (code->kind() == Code::OPTIMIZED_FUNCTION) {
- DCHECK(CannotDeoptFromAsmCode(code, *function()));
- PrintF(" ASM ");
+ if (function()->shared()->asm_function()) {
+ DCHECK(CannotDeoptFromAsmCode(code, *function()));
+ PrintF(" ASM ");
+ } else {
+ PrintF(" OPT (approximate)");
+ }
}
} else {
PrintF(" BYTECODE ");
@@ -1003,7 +1010,8 @@ void FrameSummary::Print() {
PrintF("\npc: %d\n", code_offset_);
}
-void OptimizedFrame::Summarize(List<FrameSummary>* frames) const {
+void OptimizedFrame::Summarize(List<FrameSummary>* frames,
+ FrameSummary::Mode mode) const {
DCHECK(frames->length() == 0);
DCHECK(is_optimized());
@@ -1018,6 +1026,13 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) const {
DisallowHeapAllocation no_gc;
int deopt_index = Safepoint::kNoDeoptimizationIndex;
DeoptimizationInputData* const data = GetDeoptimizationData(&deopt_index);
+ if (deopt_index == Safepoint::kNoDeoptimizationIndex) {
+ DCHECK(data == nullptr);
+ if (mode == FrameSummary::kApproximateSummary) {
+ return JavaScriptFrame::Summarize(frames, mode);
+ }
+ FATAL("Missing deoptimization information for OptimizedFrame::Summarize.");
+ }
FixedArray* const literal_array = data->LiteralArray();
TranslationIterator it(data->TranslationByteArray(),
@@ -1140,9 +1155,10 @@ DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData(
SafepointEntry safepoint_entry = code->GetSafepointEntry(pc());
*deopt_index = safepoint_entry.deoptimization_index();
- DCHECK(*deopt_index != Safepoint::kNoDeoptimizationIndex);
-
- return DeoptimizationInputData::cast(code->deoptimization_data());
+ if (*deopt_index != Safepoint::kNoDeoptimizationIndex) {
+ return DeoptimizationInputData::cast(code->deoptimization_data());
+ }
+ return nullptr;
}
@@ -1161,6 +1177,7 @@ void OptimizedFrame::GetFunctions(List<JSFunction*>* functions) const {
DisallowHeapAllocation no_gc;
int deopt_index = Safepoint::kNoDeoptimizationIndex;
DeoptimizationInputData* const data = GetDeoptimizationData(&deopt_index);
+ DCHECK(data != nullptr && deopt_index != Safepoint::kNoDeoptimizationIndex);
FixedArray* const literal_array = data->LiteralArray();
TranslationIterator it(data->TranslationByteArray(),
@@ -1267,7 +1284,8 @@ void InterpretedFrame::WriteInterpreterRegister(int register_index,
return SetExpression(index + register_index, value);
}
-void InterpretedFrame::Summarize(List<FrameSummary>* functions) const {
+void InterpretedFrame::Summarize(List<FrameSummary>* functions,
+ FrameSummary::Mode mode) const {
DCHECK(functions->length() == 0);
AbstractCode* abstract_code =
AbstractCode::cast(function()->shared()->bytecode_array());
@@ -1333,7 +1351,8 @@ JSFunction* WasmFrame::function() const {
return *fun;
}
-void WasmFrame::Summarize(List<FrameSummary>* functions) const {
+void WasmFrame::Summarize(List<FrameSummary>* functions,
+ FrameSummary::Mode mode) const {
DCHECK(functions->length() == 0);
Code* code = LookupCode();
int offset = static_cast<int>(pc() - code->instruction_start());
« no previous file with comments | « src/frames.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698