OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/frames.h" | 5 #include "src/frames.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/ast/scopeinfo.h" | 10 #include "src/ast/scopeinfo.h" |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 } else { | 449 } else { |
450 // Look up the code object to figure out the type of the stack frame. | 450 // Look up the code object to figure out the type of the stack frame. |
451 Code* code_obj = | 451 Code* code_obj = |
452 GetContainingCode(iterator->isolate(), *(state->pc_address)); | 452 GetContainingCode(iterator->isolate(), *(state->pc_address)); |
453 if (code_obj != nullptr) { | 453 if (code_obj != nullptr) { |
454 if (code_obj->is_interpreter_entry_trampoline() || | 454 if (code_obj->is_interpreter_entry_trampoline() || |
455 code_obj->is_interpreter_enter_bytecode_dispatch()) { | 455 code_obj->is_interpreter_enter_bytecode_dispatch()) { |
456 return INTERPRETED; | 456 return INTERPRETED; |
457 } | 457 } |
458 switch (code_obj->kind()) { | 458 switch (code_obj->kind()) { |
| 459 case Code::BUILTIN: |
| 460 if (marker->IsSmi()) break; |
| 461 // We treat frames for BUILTIN Code objects as OptimizedFrame for now |
| 462 // (all the builtins with JavaScript linkage are actually generated |
| 463 // with TurboFan currently, so this is sound). |
| 464 return OPTIMIZED; |
459 case Code::FUNCTION: | 465 case Code::FUNCTION: |
460 return JAVA_SCRIPT; | 466 return JAVA_SCRIPT; |
461 case Code::OPTIMIZED_FUNCTION: | 467 case Code::OPTIMIZED_FUNCTION: |
462 return OPTIMIZED; | 468 return OPTIMIZED; |
463 case Code::WASM_FUNCTION: | 469 case Code::WASM_FUNCTION: |
464 return WASM; | 470 return WASM; |
465 case Code::WASM_TO_JS_FUNCTION: | 471 case Code::WASM_TO_JS_FUNCTION: |
466 return WASM_TO_JS; | 472 return WASM_TO_JS; |
467 case Code::JS_TO_WASM_FUNCTION: | 473 case Code::JS_TO_WASM_FUNCTION: |
468 return JS_TO_WASM; | 474 return JS_TO_WASM; |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 PrintF("\npc: %d\n", code_offset_); | 980 PrintF("\npc: %d\n", code_offset_); |
975 } | 981 } |
976 | 982 |
977 | 983 |
978 void OptimizedFrame::Summarize(List<FrameSummary>* frames) { | 984 void OptimizedFrame::Summarize(List<FrameSummary>* frames) { |
979 DCHECK(frames->length() == 0); | 985 DCHECK(frames->length() == 0); |
980 DCHECK(is_optimized()); | 986 DCHECK(is_optimized()); |
981 | 987 |
982 // Delegate to JS frame in absence of turbofan deoptimization. | 988 // Delegate to JS frame in absence of turbofan deoptimization. |
983 // TODO(turbofan): Revisit once we support deoptimization across the board. | 989 // TODO(turbofan): Revisit once we support deoptimization across the board. |
984 if (LookupCode()->is_turbofanned() && function()->shared()->asm_function() && | 990 Code* code = LookupCode(); |
985 !FLAG_turbo_asm_deoptimization) { | 991 if (code->kind() == Code::BUILTIN || |
| 992 (code->is_turbofanned() && function()->shared()->asm_function() && |
| 993 !FLAG_turbo_asm_deoptimization)) { |
986 return JavaScriptFrame::Summarize(frames); | 994 return JavaScriptFrame::Summarize(frames); |
987 } | 995 } |
988 | 996 |
989 DisallowHeapAllocation no_gc; | 997 DisallowHeapAllocation no_gc; |
990 int deopt_index = Safepoint::kNoDeoptimizationIndex; | 998 int deopt_index = Safepoint::kNoDeoptimizationIndex; |
991 DeoptimizationInputData* const data = GetDeoptimizationData(&deopt_index); | 999 DeoptimizationInputData* const data = GetDeoptimizationData(&deopt_index); |
992 FixedArray* const literal_array = data->LiteralArray(); | 1000 FixedArray* const literal_array = data->LiteralArray(); |
993 | 1001 |
994 TranslationIterator it(data->TranslationByteArray(), | 1002 TranslationIterator it(data->TranslationByteArray(), |
995 data->TranslationIndex(deopt_index)->value()); | 1003 data->TranslationIndex(deopt_index)->value()); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 it.Skip(Translation::NumberOfOperandsFor(frame_opcode)); | 1086 it.Skip(Translation::NumberOfOperandsFor(frame_opcode)); |
1079 } | 1087 } |
1080 } | 1088 } |
1081 DCHECK(!is_constructor); | 1089 DCHECK(!is_constructor); |
1082 } | 1090 } |
1083 | 1091 |
1084 | 1092 |
1085 int OptimizedFrame::LookupExceptionHandlerInTable( | 1093 int OptimizedFrame::LookupExceptionHandlerInTable( |
1086 int* stack_slots, HandlerTable::CatchPrediction* prediction) { | 1094 int* stack_slots, HandlerTable::CatchPrediction* prediction) { |
1087 Code* code = LookupCode(); | 1095 Code* code = LookupCode(); |
1088 DCHECK(code->is_optimized_code()); | |
1089 HandlerTable* table = HandlerTable::cast(code->handler_table()); | 1096 HandlerTable* table = HandlerTable::cast(code->handler_table()); |
1090 int pc_offset = static_cast<int>(pc() - code->entry()); | 1097 int pc_offset = static_cast<int>(pc() - code->entry()); |
1091 if (stack_slots) *stack_slots = code->stack_slots(); | 1098 if (stack_slots) *stack_slots = code->stack_slots(); |
1092 return table->LookupReturn(pc_offset, prediction); | 1099 return table->LookupReturn(pc_offset, prediction); |
1093 } | 1100 } |
1094 | 1101 |
1095 | 1102 |
1096 DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData( | 1103 DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData( |
1097 int* deopt_index) const { | 1104 int* deopt_index) const { |
1098 DCHECK(is_optimized()); | 1105 DCHECK(is_optimized()); |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1722 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
1716 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1723 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
1717 list.Add(frame, zone); | 1724 list.Add(frame, zone); |
1718 } | 1725 } |
1719 return list.ToVector(); | 1726 return list.ToVector(); |
1720 } | 1727 } |
1721 | 1728 |
1722 | 1729 |
1723 } // namespace internal | 1730 } // namespace internal |
1724 } // namespace v8 | 1731 } // namespace v8 |
OLD | NEW |