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

Side by Side Diff: src/deoptimizer.cc

Issue 1187533002: Fix debug printing of inputs in the deoptimizer, pull out printing into separate methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Another tweak Created 5 years, 6 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 unified diff | Download patch
« no previous file with comments | « src/deoptimizer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/codegen.h" 8 #include "src/codegen.h"
9 #include "src/cpu-profiler.h" 9 #include "src/cpu-profiler.h"
10 #include "src/deoptimizer.h" 10 #include "src/deoptimizer.h"
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 &(translated_state_.frames()[frame_index]); 830 &(translated_state_.frames()[frame_index]);
831 TranslatedFrame::iterator value_iterator = translated_frame->begin(); 831 TranslatedFrame::iterator value_iterator = translated_frame->begin();
832 int input_index = 0; 832 int input_index = 0;
833 833
834 BailoutId node_id = translated_frame->node_id(); 834 BailoutId node_id = translated_frame->node_id();
835 unsigned height = 835 unsigned height =
836 translated_frame->height() - 1; // Do not count the context. 836 translated_frame->height() - 1; // Do not count the context.
837 unsigned height_in_bytes = height * kPointerSize; 837 unsigned height_in_bytes = height * kPointerSize;
838 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); 838 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue());
839 value_iterator++; 839 value_iterator++;
840 input_index++;
840 if (trace_scope_ != NULL) { 841 if (trace_scope_ != NULL) {
841 PrintF(trace_scope_->file(), " translating frame "); 842 PrintF(trace_scope_->file(), " translating frame ");
842 function->PrintName(trace_scope_->file()); 843 function->PrintName(trace_scope_->file());
843 PrintF(trace_scope_->file(), 844 PrintF(trace_scope_->file(),
844 " => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); 845 " => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes);
845 } 846 }
846 847
847 // The 'fixed' part of the frame consists of the incoming parameters and 848 // The 'fixed' part of the frame consists of the incoming parameters and
848 // the part described by JavaScriptFrameConstants. 849 // the part described by JavaScriptFrameConstants.
849 unsigned fixed_frame_size = ComputeFixedSize(function); 850 unsigned fixed_frame_size = ComputeFixedSize(function);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 } 886 }
886 output_frame->SetTop(top_address); 887 output_frame->SetTop(top_address);
887 888
888 // Compute the incoming parameter translation. 889 // Compute the incoming parameter translation.
889 int parameter_count = 890 int parameter_count =
890 function->shared()->internal_formal_parameter_count() + 1; 891 function->shared()->internal_formal_parameter_count() + 1;
891 unsigned output_offset = output_frame_size; 892 unsigned output_offset = output_frame_size;
892 unsigned input_offset = input_frame_size; 893 unsigned input_offset = input_frame_size;
893 for (int i = 0; i < parameter_count; ++i) { 894 for (int i = 0; i < parameter_count; ++i) {
894 output_offset -= kPointerSize; 895 output_offset -= kPointerSize;
895 WriteValueToOutput(&value_iterator, &input_index, frame_index, 896 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index,
896 output_offset); 897 output_offset);
897 } 898 }
898 input_offset -= (parameter_count * kPointerSize); 899 input_offset -= (parameter_count * kPointerSize);
899 900
900 // There are no translation commands for the caller's pc and fp, the 901 // There are no translation commands for the caller's pc and fp, the
901 // context, and the function. Synthesize their values and set them up 902 // context, and the function. Synthesize their values and set them up
902 // explicitly. 903 // explicitly.
903 // 904 //
904 // The caller's pc for the bottommost output frame is the same as in the 905 // The caller's pc for the bottommost output frame is the same as in the
905 // input frame. For all subsequent output frames, it can be read from the 906 // input frame. For all subsequent output frames, it can be read from the
906 // previous one. This frame's pc can be computed from the non-optimized 907 // previous one. This frame's pc can be computed from the non-optimized
907 // function code and AST id of the bailout. 908 // function code and AST id of the bailout.
908 output_offset -= kPCOnStackSize; 909 output_offset -= kPCOnStackSize;
909 input_offset -= kPCOnStackSize; 910 input_offset -= kPCOnStackSize;
910 intptr_t value; 911 intptr_t value;
911 if (is_bottommost) { 912 if (is_bottommost) {
912 value = input_->GetFrameSlot(input_offset); 913 value = input_->GetFrameSlot(input_offset);
913 } else { 914 } else {
914 value = output_[frame_index - 1]->GetPc(); 915 value = output_[frame_index - 1]->GetPc();
915 } 916 }
916 output_frame->SetCallerPc(output_offset, value); 917 output_frame->SetCallerPc(output_offset, value);
917 if (trace_scope_ != NULL) { 918 DebugPrintOutputSlot(value, frame_index, output_offset, "caller's pc\n");
918 PrintF(trace_scope_->file(),
919 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
920 V8PRIxPTR " ; caller's pc\n",
921 top_address + output_offset, output_offset, value);
922 }
923 919
924 // The caller's frame pointer for the bottommost output frame is the same 920 // The caller's frame pointer for the bottommost output frame is the same
925 // as in the input frame. For all subsequent output frames, it can be 921 // as in the input frame. For all subsequent output frames, it can be
926 // read from the previous one. Also compute and set this frame's frame 922 // read from the previous one. Also compute and set this frame's frame
927 // pointer. 923 // pointer.
928 output_offset -= kFPOnStackSize; 924 output_offset -= kFPOnStackSize;
929 input_offset -= kFPOnStackSize; 925 input_offset -= kFPOnStackSize;
930 if (is_bottommost) { 926 if (is_bottommost) {
931 value = input_->GetFrameSlot(input_offset); 927 value = input_->GetFrameSlot(input_offset);
932 } else { 928 } else {
933 value = output_[frame_index - 1]->GetFp(); 929 value = output_[frame_index - 1]->GetFp();
934 } 930 }
935 output_frame->SetCallerFp(output_offset, value); 931 output_frame->SetCallerFp(output_offset, value);
936 intptr_t fp_value = top_address + output_offset; 932 intptr_t fp_value = top_address + output_offset;
937 DCHECK(!is_bottommost || (input_->GetRegister(fp_reg.code()) + 933 DCHECK(!is_bottommost || (input_->GetRegister(fp_reg.code()) +
938 has_alignment_padding_ * kPointerSize) == fp_value); 934 has_alignment_padding_ * kPointerSize) == fp_value);
939 output_frame->SetFp(fp_value); 935 output_frame->SetFp(fp_value);
940 if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value); 936 if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value);
941 if (trace_scope_ != NULL) { 937 DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n");
942 PrintF(trace_scope_->file(),
943 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
944 V8PRIxPTR " ; caller's fp\n",
945 fp_value, output_offset, value);
946 }
947 DCHECK(!is_bottommost || !has_alignment_padding_ || 938 DCHECK(!is_bottommost || !has_alignment_padding_ ||
948 (fp_value & kPointerSize) != 0); 939 (fp_value & kPointerSize) != 0);
949 940
950 if (FLAG_enable_embedded_constant_pool) { 941 if (FLAG_enable_embedded_constant_pool) {
951 // For the bottommost output frame the constant pool pointer can be gotten 942 // For the bottommost output frame the constant pool pointer can be gotten
952 // from the input frame. For subsequent output frames, it can be read from 943 // from the input frame. For subsequent output frames, it can be read from
953 // the previous frame. 944 // the previous frame.
954 output_offset -= kPointerSize; 945 output_offset -= kPointerSize;
955 input_offset -= kPointerSize; 946 input_offset -= kPointerSize;
956 if (is_bottommost) { 947 if (is_bottommost) {
957 value = input_->GetFrameSlot(input_offset); 948 value = input_->GetFrameSlot(input_offset);
958 } else { 949 } else {
959 value = output_[frame_index - 1]->GetConstantPool(); 950 value = output_[frame_index - 1]->GetConstantPool();
960 } 951 }
961 output_frame->SetCallerConstantPool(output_offset, value); 952 output_frame->SetCallerConstantPool(output_offset, value);
962 if (trace_scope_) { 953 DebugPrintOutputSlot(value, frame_index, output_offset,
963 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 954 "caller's constant_pool\n");
964 V8PRIxPTR "; caller's constant_pool\n",
965 top_address + output_offset, output_offset, value);
966 }
967 } 955 }
968 956
969 // For the bottommost output frame the context can be gotten from the input 957 // For the bottommost output frame the context can be gotten from the input
970 // frame. For all subsequent output frames it can be gotten from the function 958 // frame. For all subsequent output frames it can be gotten from the function
971 // so long as we don't inline functions that need local contexts. 959 // so long as we don't inline functions that need local contexts.
972 Register context_reg = JavaScriptFrame::context_register(); 960 Register context_reg = JavaScriptFrame::context_register();
973 output_offset -= kPointerSize; 961 output_offset -= kPointerSize;
974 input_offset -= kPointerSize; 962 input_offset -= kPointerSize;
975 // Read the context from the translations. 963 // Read the context from the translations.
976 WriteValueToOutput(&value_iterator, &input_index, frame_index, output_offset); 964 Object* context = value_iterator->GetRawValue();
977 value = output_frame->GetFrameSlot(output_offset);
978 // The context should not be a placeholder for a materialized object. 965 // The context should not be a placeholder for a materialized object.
979 CHECK(value != 966 CHECK(context != isolate_->heap()->arguments_marker());
980 reinterpret_cast<intptr_t>(isolate_->heap()->arguments_marker())); 967 if (context == isolate_->heap()->undefined_value()) {
981 if (value ==
982 reinterpret_cast<intptr_t>(isolate_->heap()->undefined_value())) {
983 // If the context was optimized away, just use the context from 968 // If the context was optimized away, just use the context from
984 // the activation. This should only apply to Crankshaft code. 969 // the activation. This should only apply to Crankshaft code.
985 CHECK(!compiled_code_->is_turbofanned()); 970 CHECK(!compiled_code_->is_turbofanned());
986 if (is_bottommost) { 971 context =
987 value = input_->GetFrameSlot(input_offset); 972 is_bottommost
988 } else { 973 ? reinterpret_cast<Object*>(input_->GetFrameSlot(input_offset))
989 value = reinterpret_cast<intptr_t>(function->context()); 974 : function->context();
990 }
991 output_frame->SetFrameSlot(output_offset, value);
992 } 975 }
976 value = reinterpret_cast<intptr_t>(context);
993 output_frame->SetContext(value); 977 output_frame->SetContext(value);
994 if (is_topmost) output_frame->SetRegister(context_reg.code(), value); 978 if (is_topmost) output_frame->SetRegister(context_reg.code(), value);
995 if (trace_scope_ != NULL) { 979 WriteValueToOutput(context, input_index, frame_index, output_offset,
996 PrintF(trace_scope_->file(), 980 "context ");
997 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 981 value_iterator++;
998 V8PRIxPTR "; context\n", 982 input_index++;
999 top_address + output_offset, output_offset, value);
1000 }
1001 983
1002 // The function was mentioned explicitly in the BEGIN_FRAME. 984 // The function was mentioned explicitly in the BEGIN_FRAME.
1003 output_offset -= kPointerSize; 985 output_offset -= kPointerSize;
1004 input_offset -= kPointerSize; 986 input_offset -= kPointerSize;
1005 value = reinterpret_cast<intptr_t>(function); 987 value = reinterpret_cast<intptr_t>(function);
1006 // The function for the bottommost output frame should also agree with the 988 // The function for the bottommost output frame should also agree with the
1007 // input frame. 989 // input frame.
1008 DCHECK(!is_bottommost || input_->GetFrameSlot(input_offset) == value); 990 DCHECK(!is_bottommost || input_->GetFrameSlot(input_offset) == value);
1009 output_frame->SetFrameSlot(output_offset, value); 991 WriteValueToOutput(function, 0, frame_index, output_offset, "function ");
1010 if (trace_scope_ != NULL) {
1011 PrintF(trace_scope_->file(),
1012 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1013 V8PRIxPTR "; function\n",
1014 top_address + output_offset, output_offset, value);
1015 }
1016 992
1017 // Translate the rest of the frame. 993 // Translate the rest of the frame.
1018 for (unsigned i = 0; i < height; ++i) { 994 for (unsigned i = 0; i < height; ++i) {
1019 output_offset -= kPointerSize; 995 output_offset -= kPointerSize;
1020 WriteValueToOutput(&value_iterator, &input_index, frame_index, 996 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index,
1021 output_offset); 997 output_offset);
1022 } 998 }
1023 CHECK_EQ(0u, output_offset); 999 CHECK_EQ(0u, output_offset);
1024 1000
1025 // Compute this frame's PC, state, and continuation. 1001 // Compute this frame's PC, state, and continuation.
1026 Code* non_optimized_code = function->shared()->code(); 1002 Code* non_optimized_code = function->shared()->code();
1027 FixedArray* raw_data = non_optimized_code->deoptimization_data(); 1003 FixedArray* raw_data = non_optimized_code->deoptimization_data();
1028 DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data); 1004 DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data);
1029 Address start = non_optimized_code->instruction_start(); 1005 Address start = non_optimized_code->instruction_start();
1030 unsigned pc_and_state = GetOutputInfo(data, node_id, function->shared()); 1006 unsigned pc_and_state = GetOutputInfo(data, node_id, function->shared());
1031 unsigned pc_offset = FullCodeGenerator::PcField::decode(pc_and_state); 1007 unsigned pc_offset = FullCodeGenerator::PcField::decode(pc_and_state);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 int frame_index) { 1045 int frame_index) {
1070 TranslatedFrame* translated_frame = 1046 TranslatedFrame* translated_frame =
1071 &(translated_state_.frames()[frame_index]); 1047 &(translated_state_.frames()[frame_index]);
1072 TranslatedFrame::iterator value_iterator = translated_frame->begin(); 1048 TranslatedFrame::iterator value_iterator = translated_frame->begin();
1073 int input_index = 0; 1049 int input_index = 0;
1074 1050
1075 unsigned height = translated_frame->height(); 1051 unsigned height = translated_frame->height();
1076 unsigned height_in_bytes = height * kPointerSize; 1052 unsigned height_in_bytes = height * kPointerSize;
1077 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); 1053 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue());
1078 value_iterator++; 1054 value_iterator++;
1055 input_index++;
1079 if (trace_scope_ != NULL) { 1056 if (trace_scope_ != NULL) {
1080 PrintF(trace_scope_->file(), 1057 PrintF(trace_scope_->file(),
1081 " translating arguments adaptor => height=%d\n", height_in_bytes); 1058 " translating arguments adaptor => height=%d\n", height_in_bytes);
1082 } 1059 }
1083 1060
1084 unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFrameSize; 1061 unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFrameSize;
1085 unsigned output_frame_size = height_in_bytes + fixed_frame_size; 1062 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
1086 1063
1087 // Allocate and store the output frame description. 1064 // Allocate and store the output frame description.
1088 FrameDescription* output_frame = 1065 FrameDescription* output_frame =
1089 new(output_frame_size) FrameDescription(output_frame_size, function); 1066 new(output_frame_size) FrameDescription(output_frame_size, function);
1090 output_frame->SetFrameType(StackFrame::ARGUMENTS_ADAPTOR); 1067 output_frame->SetFrameType(StackFrame::ARGUMENTS_ADAPTOR);
1091 1068
1092 // Arguments adaptor can not be topmost or bottommost. 1069 // Arguments adaptor can not be topmost or bottommost.
1093 CHECK(frame_index > 0 && frame_index < output_count_ - 1); 1070 CHECK(frame_index > 0 && frame_index < output_count_ - 1);
1094 CHECK(output_[frame_index] == NULL); 1071 CHECK(output_[frame_index] == NULL);
1095 output_[frame_index] = output_frame; 1072 output_[frame_index] = output_frame;
1096 1073
1097 // The top address of the frame is computed from the previous 1074 // The top address of the frame is computed from the previous
1098 // frame's top and this frame's size. 1075 // frame's top and this frame's size.
1099 intptr_t top_address; 1076 intptr_t top_address;
1100 top_address = output_[frame_index - 1]->GetTop() - output_frame_size; 1077 top_address = output_[frame_index - 1]->GetTop() - output_frame_size;
1101 output_frame->SetTop(top_address); 1078 output_frame->SetTop(top_address);
1102 1079
1103 // Compute the incoming parameter translation. 1080 // Compute the incoming parameter translation.
1104 int parameter_count = height; 1081 int parameter_count = height;
1105 unsigned output_offset = output_frame_size; 1082 unsigned output_offset = output_frame_size;
1106 for (int i = 0; i < parameter_count; ++i) { 1083 for (int i = 0; i < parameter_count; ++i) {
1107 output_offset -= kPointerSize; 1084 output_offset -= kPointerSize;
1108 WriteValueToOutput(&value_iterator, &input_index, frame_index, 1085 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index,
1109 output_offset); 1086 output_offset);
1110 } 1087 }
1111 1088
1112 // Read caller's PC from the previous frame. 1089 // Read caller's PC from the previous frame.
1113 output_offset -= kPCOnStackSize; 1090 output_offset -= kPCOnStackSize;
1114 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); 1091 intptr_t callers_pc = output_[frame_index - 1]->GetPc();
1115 output_frame->SetCallerPc(output_offset, callers_pc); 1092 output_frame->SetCallerPc(output_offset, callers_pc);
1116 if (trace_scope_ != NULL) { 1093 DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n");
1117 PrintF(trace_scope_->file(),
1118 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1119 V8PRIxPTR " ; caller's pc\n",
1120 top_address + output_offset, output_offset, callers_pc);
1121 }
1122 1094
1123 // Read caller's FP from the previous frame, and set this frame's FP. 1095 // Read caller's FP from the previous frame, and set this frame's FP.
1124 output_offset -= kFPOnStackSize; 1096 output_offset -= kFPOnStackSize;
1125 intptr_t value = output_[frame_index - 1]->GetFp(); 1097 intptr_t value = output_[frame_index - 1]->GetFp();
1126 output_frame->SetCallerFp(output_offset, value); 1098 output_frame->SetCallerFp(output_offset, value);
1127 intptr_t fp_value = top_address + output_offset; 1099 intptr_t fp_value = top_address + output_offset;
1128 output_frame->SetFp(fp_value); 1100 output_frame->SetFp(fp_value);
1129 if (trace_scope_ != NULL) { 1101 DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n");
1130 PrintF(trace_scope_->file(),
1131 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1132 V8PRIxPTR " ; caller's fp\n",
1133 fp_value, output_offset, value);
1134 }
1135 1102
1136 if (FLAG_enable_embedded_constant_pool) { 1103 if (FLAG_enable_embedded_constant_pool) {
1137 // Read the caller's constant pool from the previous frame. 1104 // Read the caller's constant pool from the previous frame.
1138 output_offset -= kPointerSize; 1105 output_offset -= kPointerSize;
1139 value = output_[frame_index - 1]->GetConstantPool(); 1106 value = output_[frame_index - 1]->GetConstantPool();
1140 output_frame->SetCallerConstantPool(output_offset, value); 1107 output_frame->SetCallerConstantPool(output_offset, value);
1141 if (trace_scope_) { 1108 DebugPrintOutputSlot(value, frame_index, output_offset,
1142 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1109 "caller's constant_pool\n");
1143 V8PRIxPTR "; caller's constant_pool\n",
1144 top_address + output_offset, output_offset, value);
1145 }
1146 } 1110 }
1147 1111
1148 // A marker value is used in place of the context. 1112 // A marker value is used in place of the context.
1149 output_offset -= kPointerSize; 1113 output_offset -= kPointerSize;
1150 intptr_t context = reinterpret_cast<intptr_t>( 1114 intptr_t context = reinterpret_cast<intptr_t>(
1151 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); 1115 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
1152 output_frame->SetFrameSlot(output_offset, context); 1116 output_frame->SetFrameSlot(output_offset, context);
1153 if (trace_scope_ != NULL) { 1117 DebugPrintOutputSlot(context, frame_index, output_offset,
1154 PrintF(trace_scope_->file(), 1118 "context (adaptor sentinel)\n");
1155 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1156 V8PRIxPTR " ; context (adaptor sentinel)\n",
1157 top_address + output_offset, output_offset, context);
1158 }
1159 1119
1160 // The function was mentioned explicitly in the ARGUMENTS_ADAPTOR_FRAME. 1120 // The function was mentioned explicitly in the ARGUMENTS_ADAPTOR_FRAME.
1161 output_offset -= kPointerSize; 1121 output_offset -= kPointerSize;
1162 value = reinterpret_cast<intptr_t>(function); 1122 value = reinterpret_cast<intptr_t>(function);
1163 output_frame->SetFrameSlot(output_offset, value); 1123 WriteValueToOutput(function, 0, frame_index, output_offset, "function ");
1164 if (trace_scope_ != NULL) {
1165 PrintF(trace_scope_->file(),
1166 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1167 V8PRIxPTR " ; function\n",
1168 top_address + output_offset, output_offset, value);
1169 }
1170 1124
1171 // Number of incoming arguments. 1125 // Number of incoming arguments.
1172 output_offset -= kPointerSize; 1126 output_offset -= kPointerSize;
1173 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1)); 1127 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1));
1174 output_frame->SetFrameSlot(output_offset, value); 1128 output_frame->SetFrameSlot(output_offset, value);
1175 if (trace_scope_ != NULL) { 1129 DebugPrintOutputSlot(value, frame_index, output_offset, "argc ");
1176 PrintF(trace_scope_->file(), 1130 if (trace_scope_ != nullptr) {
1177 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1131 PrintF(trace_scope_->file(), "(%d)\n", height - 1);
1178 V8PRIxPTR " ; argc (%d)\n",
1179 top_address + output_offset, output_offset, value, height - 1);
1180 } 1132 }
1181 1133
1182 DCHECK(0 == output_offset); 1134 DCHECK(0 == output_offset);
1183 1135
1184 Builtins* builtins = isolate_->builtins(); 1136 Builtins* builtins = isolate_->builtins();
1185 Code* adaptor_trampoline = 1137 Code* adaptor_trampoline =
1186 builtins->builtin(Builtins::kArgumentsAdaptorTrampoline); 1138 builtins->builtin(Builtins::kArgumentsAdaptorTrampoline);
1187 intptr_t pc_value = reinterpret_cast<intptr_t>( 1139 intptr_t pc_value = reinterpret_cast<intptr_t>(
1188 adaptor_trampoline->instruction_start() + 1140 adaptor_trampoline->instruction_start() +
1189 isolate_->heap()->arguments_adaptor_deopt_pc_offset()->value()); 1141 isolate_->heap()->arguments_adaptor_deopt_pc_offset()->value());
(...skipping 12 matching lines...) Expand all
1202 &(translated_state_.frames()[frame_index]); 1154 &(translated_state_.frames()[frame_index]);
1203 TranslatedFrame::iterator value_iterator = translated_frame->begin(); 1155 TranslatedFrame::iterator value_iterator = translated_frame->begin();
1204 int input_index = 0; 1156 int input_index = 0;
1205 1157
1206 Builtins* builtins = isolate_->builtins(); 1158 Builtins* builtins = isolate_->builtins();
1207 Code* construct_stub = builtins->builtin(Builtins::kJSConstructStubGeneric); 1159 Code* construct_stub = builtins->builtin(Builtins::kJSConstructStubGeneric);
1208 unsigned height = translated_frame->height(); 1160 unsigned height = translated_frame->height();
1209 unsigned height_in_bytes = height * kPointerSize; 1161 unsigned height_in_bytes = height * kPointerSize;
1210 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); 1162 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue());
1211 value_iterator++; 1163 value_iterator++;
1164 input_index++;
1212 if (trace_scope_ != NULL) { 1165 if (trace_scope_ != NULL) {
1213 PrintF(trace_scope_->file(), 1166 PrintF(trace_scope_->file(),
1214 " translating construct stub => height=%d\n", height_in_bytes); 1167 " translating construct stub => height=%d\n", height_in_bytes);
1215 } 1168 }
1216 1169
1217 unsigned fixed_frame_size = ConstructFrameConstants::kFrameSize; 1170 unsigned fixed_frame_size = ConstructFrameConstants::kFrameSize;
1218 unsigned output_frame_size = height_in_bytes + fixed_frame_size; 1171 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
1219 1172
1220 // Allocate and store the output frame description. 1173 // Allocate and store the output frame description.
1221 FrameDescription* output_frame = 1174 FrameDescription* output_frame =
(...skipping 12 matching lines...) Expand all
1234 output_frame->SetTop(top_address); 1187 output_frame->SetTop(top_address);
1235 1188
1236 // Compute the incoming parameter translation. 1189 // Compute the incoming parameter translation.
1237 int parameter_count = height; 1190 int parameter_count = height;
1238 unsigned output_offset = output_frame_size; 1191 unsigned output_offset = output_frame_size;
1239 for (int i = 0; i < parameter_count; ++i) { 1192 for (int i = 0; i < parameter_count; ++i) {
1240 output_offset -= kPointerSize; 1193 output_offset -= kPointerSize;
1241 // The allocated receiver of a construct stub frame is passed as the 1194 // The allocated receiver of a construct stub frame is passed as the
1242 // receiver parameter through the translation. It might be encoding 1195 // receiver parameter through the translation. It might be encoding
1243 // a captured object, override the slot address for a captured object. 1196 // a captured object, override the slot address for a captured object.
1244 WriteValueToOutput( 1197 WriteTranslatedValueToOutput(
1245 &value_iterator, &input_index, frame_index, output_offset, 1198 &value_iterator, &input_index, frame_index, output_offset, nullptr,
1246 (i == 0) ? reinterpret_cast<Address>(top_address) : nullptr); 1199 (i == 0) ? reinterpret_cast<Address>(top_address) : nullptr);
1247 } 1200 }
1248 1201
1249 // Read caller's PC from the previous frame. 1202 // Read caller's PC from the previous frame.
1250 output_offset -= kPCOnStackSize; 1203 output_offset -= kPCOnStackSize;
1251 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); 1204 intptr_t callers_pc = output_[frame_index - 1]->GetPc();
1252 output_frame->SetCallerPc(output_offset, callers_pc); 1205 output_frame->SetCallerPc(output_offset, callers_pc);
1253 if (trace_scope_ != NULL) { 1206 DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n");
1254 PrintF(trace_scope_->file(),
1255 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1256 V8PRIxPTR " ; caller's pc\n",
1257 top_address + output_offset, output_offset, callers_pc);
1258 }
1259 1207
1260 // Read caller's FP from the previous frame, and set this frame's FP. 1208 // Read caller's FP from the previous frame, and set this frame's FP.
1261 output_offset -= kFPOnStackSize; 1209 output_offset -= kFPOnStackSize;
1262 intptr_t value = output_[frame_index - 1]->GetFp(); 1210 intptr_t value = output_[frame_index - 1]->GetFp();
1263 output_frame->SetCallerFp(output_offset, value); 1211 output_frame->SetCallerFp(output_offset, value);
1264 intptr_t fp_value = top_address + output_offset; 1212 intptr_t fp_value = top_address + output_offset;
1265 output_frame->SetFp(fp_value); 1213 output_frame->SetFp(fp_value);
1266 if (trace_scope_ != NULL) { 1214 DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n");
1267 PrintF(trace_scope_->file(),
1268 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1269 V8PRIxPTR " ; caller's fp\n",
1270 fp_value, output_offset, value);
1271 }
1272 1215
1273 if (FLAG_enable_embedded_constant_pool) { 1216 if (FLAG_enable_embedded_constant_pool) {
1274 // Read the caller's constant pool from the previous frame. 1217 // Read the caller's constant pool from the previous frame.
1275 output_offset -= kPointerSize; 1218 output_offset -= kPointerSize;
1276 value = output_[frame_index - 1]->GetConstantPool(); 1219 value = output_[frame_index - 1]->GetConstantPool();
1277 output_frame->SetCallerConstantPool(output_offset, value); 1220 output_frame->SetCallerConstantPool(output_offset, value);
1278 if (trace_scope_) { 1221 DebugPrintOutputSlot(value, frame_index, output_offset,
1279 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1222 "caller's constant_pool\n");
1280 V8PRIxPTR " ; caller's constant pool\n",
1281 top_address + output_offset, output_offset, value);
1282 }
1283 } 1223 }
1284 1224
1285 // The context can be gotten from the previous frame. 1225 // The context can be gotten from the previous frame.
1286 output_offset -= kPointerSize; 1226 output_offset -= kPointerSize;
1287 value = output_[frame_index - 1]->GetContext(); 1227 value = output_[frame_index - 1]->GetContext();
1288 output_frame->SetFrameSlot(output_offset, value); 1228 output_frame->SetFrameSlot(output_offset, value);
1289 if (trace_scope_ != NULL) { 1229 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n");
1290 PrintF(trace_scope_->file(),
1291 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1292 V8PRIxPTR " ; context\n",
1293 top_address + output_offset, output_offset, value);
1294 }
1295 1230
1296 // A marker value is used in place of the function. 1231 // A marker value is used in place of the function.
1297 output_offset -= kPointerSize; 1232 output_offset -= kPointerSize;
1298 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); 1233 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT));
1299 output_frame->SetFrameSlot(output_offset, value); 1234 output_frame->SetFrameSlot(output_offset, value);
1300 if (trace_scope_ != NULL) { 1235 DebugPrintOutputSlot(value, frame_index, output_offset,
1301 PrintF(trace_scope_->file(), 1236 "function (construct sentinel)\n");
1302 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1303 V8PRIxPTR " ; function (construct sentinel)\n",
1304 top_address + output_offset, output_offset, value);
1305 }
1306 1237
1307 // The output frame reflects a JSConstructStubGeneric frame. 1238 // The output frame reflects a JSConstructStubGeneric frame.
1308 output_offset -= kPointerSize; 1239 output_offset -= kPointerSize;
1309 value = reinterpret_cast<intptr_t>(construct_stub); 1240 value = reinterpret_cast<intptr_t>(construct_stub);
1310 output_frame->SetFrameSlot(output_offset, value); 1241 output_frame->SetFrameSlot(output_offset, value);
1311 if (trace_scope_ != NULL) { 1242 DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n");
1312 PrintF(trace_scope_->file(),
1313 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1314 V8PRIxPTR " ; code object\n",
1315 top_address + output_offset, output_offset, value);
1316 }
1317 1243
1318 // Number of incoming arguments. 1244 // Number of incoming arguments.
1319 output_offset -= kPointerSize; 1245 output_offset -= kPointerSize;
1320 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1)); 1246 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1));
1321 output_frame->SetFrameSlot(output_offset, value); 1247 output_frame->SetFrameSlot(output_offset, value);
1322 if (trace_scope_ != NULL) { 1248 DebugPrintOutputSlot(value, frame_index, output_offset, "argc ");
1323 PrintF(trace_scope_->file(), 1249 if (trace_scope_ != nullptr) {
1324 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1250 PrintF(trace_scope_->file(), "(%d)\n", height - 1);
1325 V8PRIxPTR " ; argc (%d)\n",
1326 top_address + output_offset, output_offset, value, height - 1);
1327 } 1251 }
1328 1252
1329 // Constructor function being invoked by the stub (only present on some 1253 // Constructor function being invoked by the stub (only present on some
1330 // architectures, indicated by kConstructorOffset). 1254 // architectures, indicated by kConstructorOffset).
1331 if (ConstructFrameConstants::kConstructorOffset != kMinInt) { 1255 if (ConstructFrameConstants::kConstructorOffset != kMinInt) {
1332 output_offset -= kPointerSize; 1256 output_offset -= kPointerSize;
1333 value = reinterpret_cast<intptr_t>(function); 1257 WriteValueToOutput(function, 0, frame_index, output_offset,
1334 output_frame->SetFrameSlot(output_offset, value); 1258 "constructor function ");
1335 if (trace_scope_ != NULL) {
1336 PrintF(trace_scope_->file(),
1337 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1338 V8PRIxPTR " ; constructor function\n",
1339 top_address + output_offset, output_offset, value);
1340 }
1341 } 1259 }
1342 1260
1343 // The newly allocated object was passed as receiver in the artificial 1261 // The newly allocated object was passed as receiver in the artificial
1344 // constructor stub environment created by HEnvironment::CopyForInlining(). 1262 // constructor stub environment created by HEnvironment::CopyForInlining().
1345 output_offset -= kPointerSize; 1263 output_offset -= kPointerSize;
1346 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize); 1264 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize);
1347 output_frame->SetFrameSlot(output_offset, value); 1265 output_frame->SetFrameSlot(output_offset, value);
1348 if (trace_scope_ != NULL) { 1266 DebugPrintOutputSlot(value, frame_index, output_offset,
1349 PrintF(trace_scope_->file(), 1267 "allocated receiver\n");
1350 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1351 V8PRIxPTR " ; allocated receiver\n",
1352 top_address + output_offset, output_offset, value);
1353 }
1354 1268
1355 CHECK_EQ(0u, output_offset); 1269 CHECK_EQ(0u, output_offset);
1356 1270
1357 intptr_t pc = reinterpret_cast<intptr_t>( 1271 intptr_t pc = reinterpret_cast<intptr_t>(
1358 construct_stub->instruction_start() + 1272 construct_stub->instruction_start() +
1359 isolate_->heap()->construct_stub_deopt_pc_offset()->value()); 1273 isolate_->heap()->construct_stub_deopt_pc_offset()->value());
1360 output_frame->SetPc(pc); 1274 output_frame->SetPc(pc);
1361 if (FLAG_enable_embedded_constant_pool) { 1275 if (FLAG_enable_embedded_constant_pool) {
1362 intptr_t constant_pool_value = 1276 intptr_t constant_pool_value =
1363 reinterpret_cast<intptr_t>(construct_stub->constant_pool()); 1277 reinterpret_cast<intptr_t>(construct_stub->constant_pool());
1364 output_frame->SetConstantPool(constant_pool_value); 1278 output_frame->SetConstantPool(constant_pool_value);
1365 } 1279 }
1366 } 1280 }
1367 1281
1368 1282
1369 void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, 1283 void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
1370 int frame_index, 1284 int frame_index,
1371 bool is_setter_stub_frame) { 1285 bool is_setter_stub_frame) {
1372 TranslatedFrame* translated_frame = 1286 TranslatedFrame* translated_frame =
1373 &(translated_state_.frames()[frame_index]); 1287 &(translated_state_.frames()[frame_index]);
1374 TranslatedFrame::iterator value_iterator = translated_frame->begin(); 1288 TranslatedFrame::iterator value_iterator = translated_frame->begin();
1375 int input_index = 0; 1289 int input_index = 0;
1376 1290
1377 JSFunction* accessor = JSFunction::cast(value_iterator->GetRawValue()); 1291 JSFunction* accessor = JSFunction::cast(value_iterator->GetRawValue());
1378 value_iterator++; 1292 value_iterator++;
1293 input_index++;
1379 // The receiver (and the implicit return value, if any) are expected in 1294 // The receiver (and the implicit return value, if any) are expected in
1380 // registers by the LoadIC/StoreIC, so they don't belong to the output stack 1295 // registers by the LoadIC/StoreIC, so they don't belong to the output stack
1381 // frame. This means that we have to use a height of 0. 1296 // frame. This means that we have to use a height of 0.
1382 unsigned height = 0; 1297 unsigned height = 0;
1383 unsigned height_in_bytes = height * kPointerSize; 1298 unsigned height_in_bytes = height * kPointerSize;
1384 const char* kind = is_setter_stub_frame ? "setter" : "getter"; 1299 const char* kind = is_setter_stub_frame ? "setter" : "getter";
1385 if (trace_scope_ != NULL) { 1300 if (trace_scope_ != NULL) {
1386 PrintF(trace_scope_->file(), 1301 PrintF(trace_scope_->file(),
1387 " translating %s stub => height=%u\n", kind, height_in_bytes); 1302 " translating %s stub => height=%u\n", kind, height_in_bytes);
1388 } 1303 }
(...skipping 23 matching lines...) Expand all
1412 // this frame's size. 1327 // this frame's size.
1413 intptr_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size; 1328 intptr_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size;
1414 output_frame->SetTop(top_address); 1329 output_frame->SetTop(top_address);
1415 1330
1416 unsigned output_offset = output_frame_size; 1331 unsigned output_offset = output_frame_size;
1417 1332
1418 // Read caller's PC from the previous frame. 1333 // Read caller's PC from the previous frame.
1419 output_offset -= kPCOnStackSize; 1334 output_offset -= kPCOnStackSize;
1420 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); 1335 intptr_t callers_pc = output_[frame_index - 1]->GetPc();
1421 output_frame->SetCallerPc(output_offset, callers_pc); 1336 output_frame->SetCallerPc(output_offset, callers_pc);
1422 if (trace_scope_ != NULL) { 1337 DebugPrintOutputSlot(callers_pc, frame_index, output_offset, "caller's pc\n");
1423 PrintF(trace_scope_->file(),
1424 " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
1425 " ; caller's pc\n",
1426 top_address + output_offset, output_offset, callers_pc);
1427 }
1428 1338
1429 // Read caller's FP from the previous frame, and set this frame's FP. 1339 // Read caller's FP from the previous frame, and set this frame's FP.
1430 output_offset -= kFPOnStackSize; 1340 output_offset -= kFPOnStackSize;
1431 intptr_t value = output_[frame_index - 1]->GetFp(); 1341 intptr_t value = output_[frame_index - 1]->GetFp();
1432 output_frame->SetCallerFp(output_offset, value); 1342 output_frame->SetCallerFp(output_offset, value);
1433 intptr_t fp_value = top_address + output_offset; 1343 intptr_t fp_value = top_address + output_offset;
1434 output_frame->SetFp(fp_value); 1344 output_frame->SetFp(fp_value);
1435 if (trace_scope_ != NULL) { 1345 DebugPrintOutputSlot(value, frame_index, output_offset, "caller's fp\n");
1436 PrintF(trace_scope_->file(),
1437 " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
1438 " ; caller's fp\n",
1439 fp_value, output_offset, value);
1440 }
1441 1346
1442 if (FLAG_enable_embedded_constant_pool) { 1347 if (FLAG_enable_embedded_constant_pool) {
1443 // Read the caller's constant pool from the previous frame. 1348 // Read the caller's constant pool from the previous frame.
1444 output_offset -= kPointerSize; 1349 output_offset -= kPointerSize;
1445 value = output_[frame_index - 1]->GetConstantPool(); 1350 value = output_[frame_index - 1]->GetConstantPool();
1446 output_frame->SetCallerConstantPool(output_offset, value); 1351 output_frame->SetCallerConstantPool(output_offset, value);
1447 if (trace_scope_) { 1352 DebugPrintOutputSlot(value, frame_index, output_offset,
1448 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1353 "caller's constant_pool\n");
1449 V8PRIxPTR " ; caller's constant pool\n",
1450 top_address + output_offset, output_offset, value);
1451 }
1452 } 1354 }
1453 1355
1454 // The context can be gotten from the previous frame. 1356 // The context can be gotten from the previous frame.
1455 output_offset -= kPointerSize; 1357 output_offset -= kPointerSize;
1456 value = output_[frame_index - 1]->GetContext(); 1358 value = output_[frame_index - 1]->GetContext();
1457 output_frame->SetFrameSlot(output_offset, value); 1359 output_frame->SetFrameSlot(output_offset, value);
1458 if (trace_scope_ != NULL) { 1360 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n");
1459 PrintF(trace_scope_->file(),
1460 " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
1461 " ; context\n",
1462 top_address + output_offset, output_offset, value);
1463 }
1464 1361
1465 // A marker value is used in place of the function. 1362 // A marker value is used in place of the function.
1466 output_offset -= kPointerSize; 1363 output_offset -= kPointerSize;
1467 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); 1364 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL));
1468 output_frame->SetFrameSlot(output_offset, value); 1365 output_frame->SetFrameSlot(output_offset, value);
1469 if (trace_scope_ != NULL) { 1366 DebugPrintOutputSlot(value, frame_index, output_offset, "function ");
1470 PrintF(trace_scope_->file(), 1367 if (trace_scope_ != nullptr) {
1471 " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR 1368 PrintF(trace_scope_->file(), "(%s sentinel)\n", kind);
1472 " ; function (%s sentinel)\n",
1473 top_address + output_offset, output_offset, value, kind);
1474 } 1369 }
1475 1370
1476 // Get Code object from accessor stub. 1371 // Get Code object from accessor stub.
1477 output_offset -= kPointerSize; 1372 output_offset -= kPointerSize;
1478 Builtins::Name name = is_setter_stub_frame ? 1373 Builtins::Name name = is_setter_stub_frame ?
1479 Builtins::kStoreIC_Setter_ForDeopt : 1374 Builtins::kStoreIC_Setter_ForDeopt :
1480 Builtins::kLoadIC_Getter_ForDeopt; 1375 Builtins::kLoadIC_Getter_ForDeopt;
1481 Code* accessor_stub = isolate_->builtins()->builtin(name); 1376 Code* accessor_stub = isolate_->builtins()->builtin(name);
1482 value = reinterpret_cast<intptr_t>(accessor_stub); 1377 value = reinterpret_cast<intptr_t>(accessor_stub);
1483 output_frame->SetFrameSlot(output_offset, value); 1378 output_frame->SetFrameSlot(output_offset, value);
1484 if (trace_scope_ != NULL) { 1379 DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n");
1485 PrintF(trace_scope_->file(),
1486 " 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR
1487 " ; code object\n",
1488 top_address + output_offset, output_offset, value);
1489 }
1490 1380
1491 // Skip receiver. 1381 // Skip receiver.
1492 value_iterator++; 1382 value_iterator++;
1383 input_index++;
1493 1384
1494 if (is_setter_stub_frame) { 1385 if (is_setter_stub_frame) {
1495 // The implicit return value was part of the artificial setter stub 1386 // The implicit return value was part of the artificial setter stub
1496 // environment. 1387 // environment.
1497 output_offset -= kPointerSize; 1388 output_offset -= kPointerSize;
1498 WriteValueToOutput(&value_iterator, &input_index, frame_index, 1389 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index,
1499 output_offset); 1390 output_offset);
1500 } 1391 }
1501 1392
1502 CHECK_EQ(0u, output_offset); 1393 CHECK_EQ(0u, output_offset);
1503 1394
1504 Smi* offset = is_setter_stub_frame ? 1395 Smi* offset = is_setter_stub_frame ?
1505 isolate_->heap()->setter_stub_deopt_pc_offset() : 1396 isolate_->heap()->setter_stub_deopt_pc_offset() :
1506 isolate_->heap()->getter_stub_deopt_pc_offset(); 1397 isolate_->heap()->getter_stub_deopt_pc_offset();
1507 intptr_t pc = reinterpret_cast<intptr_t>( 1398 intptr_t pc = reinterpret_cast<intptr_t>(
1508 accessor_stub->instruction_start() + offset->value()); 1399 accessor_stub->instruction_start() + offset->value());
1509 output_frame->SetPc(pc); 1400 output_frame->SetPc(pc);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 Register fp_reg = StubFailureTrampolineFrame::fp_register(); 1482 Register fp_reg = StubFailureTrampolineFrame::fp_register();
1592 intptr_t top_address = input_->GetRegister(fp_reg.code()) - 1483 intptr_t top_address = input_->GetRegister(fp_reg.code()) -
1593 StandardFrameConstants::kFixedFrameSizeFromFp - height_in_bytes; 1484 StandardFrameConstants::kFixedFrameSizeFromFp - height_in_bytes;
1594 output_frame->SetTop(top_address); 1485 output_frame->SetTop(top_address);
1595 1486
1596 // Read caller's PC (JSFunction continuation) from the input frame. 1487 // Read caller's PC (JSFunction continuation) from the input frame.
1597 unsigned input_frame_offset = input_frame_size - kPCOnStackSize; 1488 unsigned input_frame_offset = input_frame_size - kPCOnStackSize;
1598 unsigned output_frame_offset = output_frame_size - kFPOnStackSize; 1489 unsigned output_frame_offset = output_frame_size - kFPOnStackSize;
1599 intptr_t value = input_->GetFrameSlot(input_frame_offset); 1490 intptr_t value = input_->GetFrameSlot(input_frame_offset);
1600 output_frame->SetCallerPc(output_frame_offset, value); 1491 output_frame->SetCallerPc(output_frame_offset, value);
1601 if (trace_scope_ != NULL) { 1492 DebugPrintOutputSlot(value, frame_index, output_frame_offset,
1602 PrintF(trace_scope_->file(), 1493 "caller's pc\n");
1603 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1604 V8PRIxPTR " ; caller's pc\n",
1605 top_address + output_frame_offset, output_frame_offset, value);
1606 }
1607 1494
1608 // Read caller's FP from the input frame, and set this frame's FP. 1495 // Read caller's FP from the input frame, and set this frame's FP.
1609 input_frame_offset -= kFPOnStackSize; 1496 input_frame_offset -= kFPOnStackSize;
1610 value = input_->GetFrameSlot(input_frame_offset); 1497 value = input_->GetFrameSlot(input_frame_offset);
1611 output_frame_offset -= kFPOnStackSize; 1498 output_frame_offset -= kFPOnStackSize;
1612 output_frame->SetCallerFp(output_frame_offset, value); 1499 output_frame->SetCallerFp(output_frame_offset, value);
1613 intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); 1500 intptr_t frame_ptr = input_->GetRegister(fp_reg.code());
1614 output_frame->SetRegister(fp_reg.code(), frame_ptr); 1501 output_frame->SetRegister(fp_reg.code(), frame_ptr);
1615 output_frame->SetFp(frame_ptr); 1502 output_frame->SetFp(frame_ptr);
1616 if (trace_scope_ != NULL) { 1503 DebugPrintOutputSlot(value, frame_index, output_frame_offset,
1617 PrintF(trace_scope_->file(), 1504 "caller's fp\n");
1618 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1619 V8PRIxPTR " ; caller's fp\n",
1620 top_address + output_frame_offset, output_frame_offset, value);
1621 }
1622 1505
1623 if (FLAG_enable_embedded_constant_pool) { 1506 if (FLAG_enable_embedded_constant_pool) {
1624 // Read the caller's constant pool from the input frame. 1507 // Read the caller's constant pool from the input frame.
1625 input_frame_offset -= kPointerSize; 1508 input_frame_offset -= kPointerSize;
1626 value = input_->GetFrameSlot(input_frame_offset); 1509 value = input_->GetFrameSlot(input_frame_offset);
1627 output_frame_offset -= kPointerSize; 1510 output_frame_offset -= kPointerSize;
1628 output_frame->SetCallerConstantPool(output_frame_offset, value); 1511 output_frame->SetCallerConstantPool(output_frame_offset, value);
1629 if (trace_scope_) { 1512 DebugPrintOutputSlot(value, frame_index, output_frame_offset,
1630 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1513 "caller's constant_pool\n");
1631 V8PRIxPTR " ; caller's constant_pool\n",
1632 top_address + output_frame_offset, output_frame_offset, value);
1633 }
1634 } 1514 }
1635 1515
1636 // The context can be gotten from the input frame. 1516 // The context can be gotten from the input frame.
1637 Register context_reg = StubFailureTrampolineFrame::context_register(); 1517 Register context_reg = StubFailureTrampolineFrame::context_register();
1638 input_frame_offset -= kPointerSize; 1518 input_frame_offset -= kPointerSize;
1639 value = input_->GetFrameSlot(input_frame_offset); 1519 value = input_->GetFrameSlot(input_frame_offset);
1640 output_frame->SetRegister(context_reg.code(), value); 1520 output_frame->SetRegister(context_reg.code(), value);
1641 output_frame_offset -= kPointerSize; 1521 output_frame_offset -= kPointerSize;
1642 output_frame->SetFrameSlot(output_frame_offset, value); 1522 output_frame->SetFrameSlot(output_frame_offset, value);
1643 CHECK(reinterpret_cast<Object*>(value)->IsContext()); 1523 CHECK(reinterpret_cast<Object*>(value)->IsContext());
1644 if (trace_scope_ != NULL) { 1524 DebugPrintOutputSlot(value, frame_index, output_frame_offset, "context\n");
1645 PrintF(trace_scope_->file(),
1646 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1647 V8PRIxPTR " ; context\n",
1648 top_address + output_frame_offset, output_frame_offset, value);
1649 }
1650 1525
1651 // A marker value is used in place of the function. 1526 // A marker value is used in place of the function.
1652 output_frame_offset -= kPointerSize; 1527 output_frame_offset -= kPointerSize;
1653 value = reinterpret_cast<intptr_t>( 1528 value = reinterpret_cast<intptr_t>(
1654 Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE)); 1529 Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE));
1655 output_frame->SetFrameSlot(output_frame_offset, value); 1530 output_frame->SetFrameSlot(output_frame_offset, value);
1656 if (trace_scope_ != NULL) { 1531 DebugPrintOutputSlot(value, frame_index, output_frame_offset,
1657 PrintF(trace_scope_->file(), 1532 "function (stub failure sentinel)\n");
1658 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1659 V8PRIxPTR " ; function (stub failure sentinel)\n",
1660 top_address + output_frame_offset, output_frame_offset, value);
1661 }
1662 1533
1663 intptr_t caller_arg_count = 0; 1534 intptr_t caller_arg_count = 0;
1664 bool arg_count_known = !descriptor.stack_parameter_count().is_valid(); 1535 bool arg_count_known = !descriptor.stack_parameter_count().is_valid();
1665 1536
1666 // Build the Arguments object for the caller's parameters and a pointer to it. 1537 // Build the Arguments object for the caller's parameters and a pointer to it.
1667 output_frame_offset -= kPointerSize; 1538 output_frame_offset -= kPointerSize;
1668 int args_arguments_offset = output_frame_offset; 1539 int args_arguments_offset = output_frame_offset;
1669 intptr_t the_hole = reinterpret_cast<intptr_t>( 1540 intptr_t the_hole = reinterpret_cast<intptr_t>(
1670 isolate_->heap()->the_hole_value()); 1541 isolate_->heap()->the_hole_value());
1671 if (arg_count_known) { 1542 if (arg_count_known) {
1672 value = frame_ptr + StandardFrameConstants::kCallerSPOffset + 1543 value = frame_ptr + StandardFrameConstants::kCallerSPOffset +
1673 (caller_arg_count - 1) * kPointerSize; 1544 (caller_arg_count - 1) * kPointerSize;
1674 } else { 1545 } else {
1675 value = the_hole; 1546 value = the_hole;
1676 } 1547 }
1677 1548
1678 output_frame->SetFrameSlot(args_arguments_offset, value); 1549 output_frame->SetFrameSlot(args_arguments_offset, value);
1679 if (trace_scope_ != NULL) { 1550 DebugPrintOutputSlot(
1680 PrintF(trace_scope_->file(), 1551 value, frame_index, args_arguments_offset,
1681 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1552 arg_count_known ? "args.arguments\n" : "args.arguments (the hole)\n");
1682 V8PRIxPTR " ; args.arguments %s\n",
1683 top_address + args_arguments_offset, args_arguments_offset, value,
1684 arg_count_known ? "" : "(the hole)");
1685 }
1686 1553
1687 output_frame_offset -= kPointerSize; 1554 output_frame_offset -= kPointerSize;
1688 int length_frame_offset = output_frame_offset; 1555 int length_frame_offset = output_frame_offset;
1689 value = arg_count_known ? caller_arg_count : the_hole; 1556 value = arg_count_known ? caller_arg_count : the_hole;
1690 output_frame->SetFrameSlot(length_frame_offset, value); 1557 output_frame->SetFrameSlot(length_frame_offset, value);
1691 if (trace_scope_ != NULL) { 1558 DebugPrintOutputSlot(
1692 PrintF(trace_scope_->file(), 1559 value, frame_index, length_frame_offset,
1693 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" 1560 arg_count_known ? "args.length\n" : "args.length (the hole)\n");
1694 V8PRIxPTR " ; args.length %s\n",
1695 top_address + length_frame_offset, length_frame_offset, value,
1696 arg_count_known ? "" : "(the hole)");
1697 }
1698 1561
1699 output_frame_offset -= kPointerSize; 1562 output_frame_offset -= kPointerSize;
1700 value = frame_ptr + StandardFrameConstants::kCallerSPOffset - 1563 value = frame_ptr + StandardFrameConstants::kCallerSPOffset -
1701 (output_frame_size - output_frame_offset) + kPointerSize; 1564 (output_frame_size - output_frame_offset) + kPointerSize;
1702 output_frame->SetFrameSlot(output_frame_offset, value); 1565 output_frame->SetFrameSlot(output_frame_offset, value);
1703 if (trace_scope_ != NULL) { 1566 DebugPrintOutputSlot(value, frame_index, output_frame_offset, "args*\n");
1704 PrintF(trace_scope_->file(),
1705 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1706 V8PRIxPTR " ; args*\n",
1707 top_address + output_frame_offset, output_frame_offset, value);
1708 }
1709 1567
1710 // Copy the register parameters to the failure frame. 1568 // Copy the register parameters to the failure frame.
1711 int arguments_length_offset = -1; 1569 int arguments_length_offset = -1;
1712 for (int i = 0; i < param_count; ++i) { 1570 for (int i = 0; i < param_count; ++i) {
1713 output_frame_offset -= kPointerSize; 1571 output_frame_offset -= kPointerSize;
1714 WriteValueToOutput(&value_iterator, &input_index, 0, output_frame_offset); 1572 WriteTranslatedValueToOutput(&value_iterator, &input_index, 0,
1573 output_frame_offset);
1715 1574
1716 if (!arg_count_known && descriptor.IsEnvironmentParameterCountRegister(i)) { 1575 if (!arg_count_known && descriptor.IsEnvironmentParameterCountRegister(i)) {
1717 arguments_length_offset = output_frame_offset; 1576 arguments_length_offset = output_frame_offset;
1718 } 1577 }
1719 } 1578 }
1720 1579
1721 CHECK_EQ(0u, output_frame_offset); 1580 CHECK_EQ(0u, output_frame_offset);
1722 1581
1723 if (!arg_count_known) { 1582 if (!arg_count_known) {
1724 CHECK_GE(arguments_length_offset, 0); 1583 CHECK_GE(arguments_length_offset, 0);
1725 // We know it's a smi because 1) the code stub guarantees the stack 1584 // We know it's a smi because 1) the code stub guarantees the stack
1726 // parameter count is in smi range, and 2) the DoTranslateCommand in the 1585 // parameter count is in smi range, and 2) the DoTranslateCommand in the
1727 // parameter loop above translated that to a tagged value. 1586 // parameter loop above translated that to a tagged value.
1728 Smi* smi_caller_arg_count = reinterpret_cast<Smi*>( 1587 Smi* smi_caller_arg_count = reinterpret_cast<Smi*>(
1729 output_frame->GetFrameSlot(arguments_length_offset)); 1588 output_frame->GetFrameSlot(arguments_length_offset));
1730 caller_arg_count = smi_caller_arg_count->value(); 1589 caller_arg_count = smi_caller_arg_count->value();
1731 output_frame->SetFrameSlot(length_frame_offset, caller_arg_count); 1590 output_frame->SetFrameSlot(length_frame_offset, caller_arg_count);
1732 if (trace_scope_ != NULL) { 1591 DebugPrintOutputSlot(caller_arg_count, frame_index, length_frame_offset,
1733 PrintF(trace_scope_->file(), 1592 "args.length\n");
1734 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1735 V8PRIxPTR " ; args.length\n",
1736 top_address + length_frame_offset, length_frame_offset,
1737 caller_arg_count);
1738 }
1739 value = frame_ptr + StandardFrameConstants::kCallerSPOffset + 1593 value = frame_ptr + StandardFrameConstants::kCallerSPOffset +
1740 (caller_arg_count - 1) * kPointerSize; 1594 (caller_arg_count - 1) * kPointerSize;
1741 output_frame->SetFrameSlot(args_arguments_offset, value); 1595 output_frame->SetFrameSlot(args_arguments_offset, value);
1742 if (trace_scope_ != NULL) { 1596 DebugPrintOutputSlot(value, frame_index, args_arguments_offset,
1743 PrintF(trace_scope_->file(), 1597 "args.arguments");
1744 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
1745 V8PRIxPTR " ; args.arguments\n",
1746 top_address + args_arguments_offset, args_arguments_offset,
1747 value);
1748 }
1749 } 1598 }
1750 1599
1751 // Copy the double registers from the input into the output frame. 1600 // Copy the double registers from the input into the output frame.
1752 CopyDoubleRegisters(output_frame); 1601 CopyDoubleRegisters(output_frame);
1753 1602
1754 // Fill registers containing handler and number of parameters. 1603 // Fill registers containing handler and number of parameters.
1755 SetPlatformCompiledStubRegisters(output_frame, &descriptor); 1604 SetPlatformCompiledStubRegisters(output_frame, &descriptor);
1756 1605
1757 // Compute this frame's PC, state, and continuation. 1606 // Compute this frame's PC, state, and continuation.
1758 Code* trampoline = NULL; 1607 Code* trampoline = NULL;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 } 1698 }
1850 1699
1851 for (int i = 0; i < expression_count; i++, iter++) { 1700 for (int i = 0; i < expression_count; i++, iter++) {
1852 if (!iter->IsMaterializedObject()) { 1701 if (!iter->IsMaterializedObject()) {
1853 info->SetExpression(i, *(iter->GetValue())); 1702 info->SetExpression(i, *(iter->GetValue()));
1854 } 1703 }
1855 } 1704 }
1856 } 1705 }
1857 1706
1858 1707
1859 void Deoptimizer::WriteValueToOutput( 1708 void Deoptimizer::WriteTranslatedValueToOutput(
1860 TranslatedFrame::iterator* iterator, int* input_index, int frame_index, 1709 TranslatedFrame::iterator* iterator, int* input_index, int frame_index,
1861 unsigned output_offset, Address output_address_for_materialization) { 1710 unsigned output_offset, const char* debug_hint_string,
1711 Address output_address_for_materialization) {
1862 Object* value = (*iterator)->GetRawValue(); 1712 Object* value = (*iterator)->GetRawValue();
1863 output_[frame_index]->SetFrameSlot(output_offset,
1864 reinterpret_cast<intptr_t>(value));
1865 1713
1866 Address output_address = 1714 WriteValueToOutput(value, *input_index, frame_index, output_offset,
1867 reinterpret_cast<Address>(output_[frame_index]->GetTop()) + output_offset; 1715 debug_hint_string);
1868 if (trace_scope_ != nullptr) {
1869 PrintF(trace_scope_->file(),
1870 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; ",
1871 reinterpret_cast<intptr_t>(output_address), output_offset,
1872 reinterpret_cast<intptr_t>(value));
1873 value->ShortPrint(trace_scope_->file());
1874 PrintF(trace_scope_->file(), " (input #%d)\n", *input_index);
1875 }
1876 1716
1877 if (value == isolate_->heap()->arguments_marker()) { 1717 if (value == isolate_->heap()->arguments_marker()) {
1718 Address output_address =
1719 reinterpret_cast<Address>(output_[frame_index]->GetTop()) +
1720 output_offset;
1878 if (output_address_for_materialization == nullptr) { 1721 if (output_address_for_materialization == nullptr) {
1879 output_address_for_materialization = output_address; 1722 output_address_for_materialization = output_address;
1880 } 1723 }
1881 values_to_materialize_.push_back( 1724 values_to_materialize_.push_back(
1882 {output_address_for_materialization, *iterator}); 1725 {output_address_for_materialization, *iterator});
1883 } 1726 }
1884 1727
1885 (*iterator)++; 1728 (*iterator)++;
1886 (*input_index)++; 1729 (*input_index)++;
1887 } 1730 }
1888 1731
1889 1732
1733 void Deoptimizer::WriteValueToOutput(Object* value, int input_index,
1734 int frame_index, unsigned output_offset,
1735 const char* debug_hint_string) {
1736 output_[frame_index]->SetFrameSlot(output_offset,
1737 reinterpret_cast<intptr_t>(value));
1738
1739 if (trace_scope_ != nullptr) {
1740 DebugPrintOutputSlot(reinterpret_cast<intptr_t>(value), frame_index,
1741 output_offset, debug_hint_string);
1742 value->ShortPrint(trace_scope_->file());
1743 PrintF(trace_scope_->file(), " (input #%d)\n", input_index);
1744 }
1745 }
1746
1747
1748 void Deoptimizer::DebugPrintOutputSlot(intptr_t value, int frame_index,
1749 unsigned output_offset,
1750 const char* debug_hint_string) {
1751 if (trace_scope_ != nullptr) {
1752 Address output_address =
1753 reinterpret_cast<Address>(output_[frame_index]->GetTop()) +
1754 output_offset;
1755 PrintF(trace_scope_->file(),
1756 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s",
1757 reinterpret_cast<intptr_t>(output_address), output_offset, value,
1758 debug_hint_string == nullptr ? "" : debug_hint_string);
1759 }
1760 }
1761
1762
1890 unsigned Deoptimizer::ComputeInputFrameSize() const { 1763 unsigned Deoptimizer::ComputeInputFrameSize() const {
1891 unsigned fixed_size = ComputeFixedSize(function_); 1764 unsigned fixed_size = ComputeFixedSize(function_);
1892 // The fp-to-sp delta already takes the context, constant pool pointer and the 1765 // The fp-to-sp delta already takes the context, constant pool pointer and the
1893 // function into account so we have to avoid double counting them. 1766 // function into account so we have to avoid double counting them.
1894 unsigned result = fixed_size + fp_to_sp_delta_ - 1767 unsigned result = fixed_size + fp_to_sp_delta_ -
1895 StandardFrameConstants::kFixedFrameSizeFromFp; 1768 StandardFrameConstants::kFixedFrameSizeFromFp;
1896 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { 1769 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) {
1897 unsigned stack_slots = compiled_code_->stack_slots(); 1770 unsigned stack_slots = compiled_code_->stack_slots();
1898 unsigned outgoing_size = ComputeOutgoingArgumentSize(); 1771 unsigned outgoing_size = ComputeOutgoingArgumentSize();
1899 CHECK(result == fixed_size + (stack_slots * kPointerSize) + outgoing_size); 1772 CHECK(result == fixed_size + (stack_slots * kPointerSize) + outgoing_size);
(...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after
3526 DCHECK(value_info->IsMaterializedObject()); 3399 DCHECK(value_info->IsMaterializedObject());
3527 3400
3528 value_info->value_ = 3401 value_info->value_ =
3529 Handle<Object>(previously_materialized_objects->get(i), isolate_); 3402 Handle<Object>(previously_materialized_objects->get(i), isolate_);
3530 } 3403 }
3531 } 3404 }
3532 } 3405 }
3533 3406
3534 } // namespace internal 3407 } // namespace internal
3535 } // namespace v8 3408 } // namespace v8
OLDNEW
« no previous file with comments | « src/deoptimizer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698