| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 input_offset -= (parameter_count * kPointerSize); | 887 input_offset -= (parameter_count * kPointerSize); |
| 888 | 888 |
| 889 // There are no translation commands for the caller's pc and fp, the | 889 // There are no translation commands for the caller's pc and fp, the |
| 890 // context, and the function. Synthesize their values and set them up | 890 // context, and the function. Synthesize their values and set them up |
| 891 // explicitly. | 891 // explicitly. |
| 892 // | 892 // |
| 893 // The caller's pc for the bottommost output frame is the same as in the | 893 // The caller's pc for the bottommost output frame is the same as in the |
| 894 // input frame. For all subsequent output frames, it can be read from the | 894 // input frame. For all subsequent output frames, it can be read from the |
| 895 // previous one. This frame's pc can be computed from the non-optimized | 895 // previous one. This frame's pc can be computed from the non-optimized |
| 896 // function code and AST id of the bailout. | 896 // function code and AST id of the bailout. |
| 897 output_offset -= kPointerSize; | 897 output_offset -= kPCOnStackSize; |
| 898 input_offset -= kPointerSize; | 898 input_offset -= kPCOnStackSize; |
| 899 intptr_t value; | 899 intptr_t value; |
| 900 if (is_bottommost) { | 900 if (is_bottommost) { |
| 901 value = input_->GetFrameSlot(input_offset); | 901 value = input_->GetFrameSlot(input_offset); |
| 902 } else { | 902 } else { |
| 903 value = output_[frame_index - 1]->GetPc(); | 903 value = output_[frame_index - 1]->GetPc(); |
| 904 } | 904 } |
| 905 output_frame->SetFrameSlot(output_offset, value); | 905 output_frame->SetCallerPc(output_offset, value); |
| 906 if (trace_) { | 906 if (trace_) { |
| 907 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 907 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 908 V8PRIxPTR " ; caller's pc\n", | 908 V8PRIxPTR " ; caller's pc\n", |
| 909 top_address + output_offset, output_offset, value); | 909 top_address + output_offset, output_offset, value); |
| 910 } | 910 } |
| 911 | 911 |
| 912 // The caller's frame pointer for the bottommost output frame is the same | 912 // The caller's frame pointer for the bottommost output frame is the same |
| 913 // as in the input frame. For all subsequent output frames, it can be | 913 // as in the input frame. For all subsequent output frames, it can be |
| 914 // read from the previous one. Also compute and set this frame's frame | 914 // read from the previous one. Also compute and set this frame's frame |
| 915 // pointer. | 915 // pointer. |
| 916 output_offset -= kPointerSize; | 916 output_offset -= kFPOnStackSize; |
| 917 input_offset -= kPointerSize; | 917 input_offset -= kFPOnStackSize; |
| 918 if (is_bottommost) { | 918 if (is_bottommost) { |
| 919 value = input_->GetFrameSlot(input_offset); | 919 value = input_->GetFrameSlot(input_offset); |
| 920 } else { | 920 } else { |
| 921 value = output_[frame_index - 1]->GetFp(); | 921 value = output_[frame_index - 1]->GetFp(); |
| 922 } | 922 } |
| 923 output_frame->SetFrameSlot(output_offset, value); | 923 output_frame->SetCallerFp(output_offset, value); |
| 924 intptr_t fp_value = top_address + output_offset; | 924 intptr_t fp_value = top_address + output_offset; |
| 925 ASSERT(!is_bottommost || (input_->GetRegister(fp_reg.code()) + | 925 ASSERT(!is_bottommost || (input_->GetRegister(fp_reg.code()) + |
| 926 has_alignment_padding_ * kPointerSize) == fp_value); | 926 has_alignment_padding_ * kPointerSize) == fp_value); |
| 927 output_frame->SetFp(fp_value); | 927 output_frame->SetFp(fp_value); |
| 928 if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value); | 928 if (is_topmost) output_frame->SetRegister(fp_reg.code(), fp_value); |
| 929 if (trace_) { | 929 if (trace_) { |
| 930 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 930 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 931 V8PRIxPTR " ; caller's fp\n", | 931 V8PRIxPTR " ; caller's fp\n", |
| 932 fp_value, output_offset, value); | 932 fp_value, output_offset, value); |
| 933 } | 933 } |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 | 1036 |
| 1037 // Compute the incoming parameter translation. | 1037 // Compute the incoming parameter translation. |
| 1038 int parameter_count = height; | 1038 int parameter_count = height; |
| 1039 unsigned output_offset = output_frame_size; | 1039 unsigned output_offset = output_frame_size; |
| 1040 for (int i = 0; i < parameter_count; ++i) { | 1040 for (int i = 0; i < parameter_count; ++i) { |
| 1041 output_offset -= kPointerSize; | 1041 output_offset -= kPointerSize; |
| 1042 DoTranslateCommand(iterator, frame_index, output_offset); | 1042 DoTranslateCommand(iterator, frame_index, output_offset); |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 // Read caller's PC from the previous frame. | 1045 // Read caller's PC from the previous frame. |
| 1046 output_offset -= kPointerSize; | 1046 output_offset -= kPCOnStackSize; |
| 1047 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); | 1047 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); |
| 1048 output_frame->SetFrameSlot(output_offset, callers_pc); | 1048 output_frame->SetCallerPc(output_offset, callers_pc); |
| 1049 if (trace_) { | 1049 if (trace_) { |
| 1050 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1050 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1051 V8PRIxPTR " ; caller's pc\n", | 1051 V8PRIxPTR " ; caller's pc\n", |
| 1052 top_address + output_offset, output_offset, callers_pc); | 1052 top_address + output_offset, output_offset, callers_pc); |
| 1053 } | 1053 } |
| 1054 | 1054 |
| 1055 // Read caller's FP from the previous frame, and set this frame's FP. | 1055 // Read caller's FP from the previous frame, and set this frame's FP. |
| 1056 output_offset -= kPointerSize; | 1056 output_offset -= kFPOnStackSize; |
| 1057 intptr_t value = output_[frame_index - 1]->GetFp(); | 1057 intptr_t value = output_[frame_index - 1]->GetFp(); |
| 1058 output_frame->SetFrameSlot(output_offset, value); | 1058 output_frame->SetCallerFp(output_offset, value); |
| 1059 intptr_t fp_value = top_address + output_offset; | 1059 intptr_t fp_value = top_address + output_offset; |
| 1060 output_frame->SetFp(fp_value); | 1060 output_frame->SetFp(fp_value); |
| 1061 if (trace_) { | 1061 if (trace_) { |
| 1062 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1062 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1063 V8PRIxPTR " ; caller's fp\n", | 1063 V8PRIxPTR " ; caller's fp\n", |
| 1064 fp_value, output_offset, value); | 1064 fp_value, output_offset, value); |
| 1065 } | 1065 } |
| 1066 | 1066 |
| 1067 // A marker value is used in place of the context. | 1067 // A marker value is used in place of the context. |
| 1068 output_offset -= kPointerSize; | 1068 output_offset -= kPointerSize; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1139 | 1139 |
| 1140 // Compute the incoming parameter translation. | 1140 // Compute the incoming parameter translation. |
| 1141 int parameter_count = height; | 1141 int parameter_count = height; |
| 1142 unsigned output_offset = output_frame_size; | 1142 unsigned output_offset = output_frame_size; |
| 1143 for (int i = 0; i < parameter_count; ++i) { | 1143 for (int i = 0; i < parameter_count; ++i) { |
| 1144 output_offset -= kPointerSize; | 1144 output_offset -= kPointerSize; |
| 1145 DoTranslateCommand(iterator, frame_index, output_offset); | 1145 DoTranslateCommand(iterator, frame_index, output_offset); |
| 1146 } | 1146 } |
| 1147 | 1147 |
| 1148 // Read caller's PC from the previous frame. | 1148 // Read caller's PC from the previous frame. |
| 1149 output_offset -= kPointerSize; | 1149 output_offset -= kPCOnStackSize; |
| 1150 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); | 1150 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); |
| 1151 output_frame->SetFrameSlot(output_offset, callers_pc); | 1151 output_frame->SetCallerPc(output_offset, callers_pc); |
| 1152 if (trace_) { | 1152 if (trace_) { |
| 1153 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1153 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1154 V8PRIxPTR " ; caller's pc\n", | 1154 V8PRIxPTR " ; caller's pc\n", |
| 1155 top_address + output_offset, output_offset, callers_pc); | 1155 top_address + output_offset, output_offset, callers_pc); |
| 1156 } | 1156 } |
| 1157 | 1157 |
| 1158 // Read caller's FP from the previous frame, and set this frame's FP. | 1158 // Read caller's FP from the previous frame, and set this frame's FP. |
| 1159 output_offset -= kPointerSize; | 1159 output_offset -= kFPOnStackSize; |
| 1160 intptr_t value = output_[frame_index - 1]->GetFp(); | 1160 intptr_t value = output_[frame_index - 1]->GetFp(); |
| 1161 output_frame->SetFrameSlot(output_offset, value); | 1161 output_frame->SetCallerFp(output_offset, value); |
| 1162 intptr_t fp_value = top_address + output_offset; | 1162 intptr_t fp_value = top_address + output_offset; |
| 1163 output_frame->SetFp(fp_value); | 1163 output_frame->SetFp(fp_value); |
| 1164 if (trace_) { | 1164 if (trace_) { |
| 1165 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1165 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1166 V8PRIxPTR " ; caller's fp\n", | 1166 V8PRIxPTR " ; caller's fp\n", |
| 1167 fp_value, output_offset, value); | 1167 fp_value, output_offset, value); |
| 1168 } | 1168 } |
| 1169 | 1169 |
| 1170 // The context can be gotten from the previous frame. | 1170 // The context can be gotten from the previous frame. |
| 1171 output_offset -= kPointerSize; | 1171 output_offset -= kPointerSize; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1252 const char* kind = is_setter_stub_frame ? "setter" : "getter"; | 1252 const char* kind = is_setter_stub_frame ? "setter" : "getter"; |
| 1253 if (trace_) { | 1253 if (trace_) { |
| 1254 PrintF(" translating %s stub => height=%u\n", kind, height_in_bytes); | 1254 PrintF(" translating %s stub => height=%u\n", kind, height_in_bytes); |
| 1255 } | 1255 } |
| 1256 | 1256 |
| 1257 // We need 1 stack entry for the return address + 4 stack entries from | 1257 // We need 1 stack entry for the return address + 4 stack entries from |
| 1258 // StackFrame::INTERNAL (FP, context, frame type, code object, see | 1258 // StackFrame::INTERNAL (FP, context, frame type, code object, see |
| 1259 // MacroAssembler::EnterFrame). For a setter stub frame we need one additional | 1259 // MacroAssembler::EnterFrame). For a setter stub frame we need one additional |
| 1260 // entry for the implicit return value, see | 1260 // entry for the implicit return value, see |
| 1261 // StoreStubCompiler::CompileStoreViaSetter. | 1261 // StoreStubCompiler::CompileStoreViaSetter. |
| 1262 unsigned fixed_frame_entries = 1 + 4 + (is_setter_stub_frame ? 1 : 0); | 1262 unsigned fixed_frame_entries = (kPCOnStackSize/kPointerSize) + |
| 1263 (kFPOnStackSize/kPointerSize) + 3 + |
| 1264 (is_setter_stub_frame ? 1 : 0); |
| 1263 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; | 1265 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; |
| 1264 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 1266 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| 1265 | 1267 |
| 1266 // Allocate and store the output frame description. | 1268 // Allocate and store the output frame description. |
| 1267 FrameDescription* output_frame = | 1269 FrameDescription* output_frame = |
| 1268 new(output_frame_size) FrameDescription(output_frame_size, accessor); | 1270 new(output_frame_size) FrameDescription(output_frame_size, accessor); |
| 1269 output_frame->SetFrameType(StackFrame::INTERNAL); | 1271 output_frame->SetFrameType(StackFrame::INTERNAL); |
| 1270 | 1272 |
| 1271 // A frame for an accessor stub can not be the topmost or bottommost one. | 1273 // A frame for an accessor stub can not be the topmost or bottommost one. |
| 1272 ASSERT(frame_index > 0 && frame_index < output_count_ - 1); | 1274 ASSERT(frame_index > 0 && frame_index < output_count_ - 1); |
| 1273 ASSERT(output_[frame_index] == NULL); | 1275 ASSERT(output_[frame_index] == NULL); |
| 1274 output_[frame_index] = output_frame; | 1276 output_[frame_index] = output_frame; |
| 1275 | 1277 |
| 1276 // The top address of the frame is computed from the previous frame's top and | 1278 // The top address of the frame is computed from the previous frame's top and |
| 1277 // this frame's size. | 1279 // this frame's size. |
| 1278 intptr_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size; | 1280 intptr_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size; |
| 1279 output_frame->SetTop(top_address); | 1281 output_frame->SetTop(top_address); |
| 1280 | 1282 |
| 1281 unsigned output_offset = output_frame_size; | 1283 unsigned output_offset = output_frame_size; |
| 1282 | 1284 |
| 1283 // Read caller's PC from the previous frame. | 1285 // Read caller's PC from the previous frame. |
| 1284 output_offset -= kPointerSize; | 1286 output_offset -= kPCOnStackSize; |
| 1285 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); | 1287 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); |
| 1286 output_frame->SetFrameSlot(output_offset, callers_pc); | 1288 output_frame->SetCallerPc(output_offset, callers_pc); |
| 1287 if (trace_) { | 1289 if (trace_) { |
| 1288 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 1290 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 1289 " ; caller's pc\n", | 1291 " ; caller's pc\n", |
| 1290 top_address + output_offset, output_offset, callers_pc); | 1292 top_address + output_offset, output_offset, callers_pc); |
| 1291 } | 1293 } |
| 1292 | 1294 |
| 1293 // Read caller's FP from the previous frame, and set this frame's FP. | 1295 // Read caller's FP from the previous frame, and set this frame's FP. |
| 1294 output_offset -= kPointerSize; | 1296 output_offset -= kFPOnStackSize; |
| 1295 intptr_t value = output_[frame_index - 1]->GetFp(); | 1297 intptr_t value = output_[frame_index - 1]->GetFp(); |
| 1296 output_frame->SetFrameSlot(output_offset, value); | 1298 output_frame->SetCallerFp(output_offset, value); |
| 1297 intptr_t fp_value = top_address + output_offset; | 1299 intptr_t fp_value = top_address + output_offset; |
| 1298 output_frame->SetFp(fp_value); | 1300 output_frame->SetFp(fp_value); |
| 1299 if (trace_) { | 1301 if (trace_) { |
| 1300 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 1302 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 1301 " ; caller's fp\n", | 1303 " ; caller's fp\n", |
| 1302 fp_value, output_offset, value); | 1304 fp_value, output_offset, value); |
| 1303 } | 1305 } |
| 1304 | 1306 |
| 1305 // The context can be gotten from the previous frame. | 1307 // The context can be gotten from the previous frame. |
| 1306 output_offset -= kPointerSize; | 1308 output_offset -= kPointerSize; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1422 | 1424 |
| 1423 // The top address for the output frame can be computed from the input | 1425 // The top address for the output frame can be computed from the input |
| 1424 // frame pointer and the output frame's height. Subtract space for the | 1426 // frame pointer and the output frame's height. Subtract space for the |
| 1425 // context and function slots. | 1427 // context and function slots. |
| 1426 Register fp_reg = StubFailureTrampolineFrame::fp_register(); | 1428 Register fp_reg = StubFailureTrampolineFrame::fp_register(); |
| 1427 intptr_t top_address = input_->GetRegister(fp_reg.code()) - | 1429 intptr_t top_address = input_->GetRegister(fp_reg.code()) - |
| 1428 (2 * kPointerSize) - height_in_bytes; | 1430 (2 * kPointerSize) - height_in_bytes; |
| 1429 output_frame->SetTop(top_address); | 1431 output_frame->SetTop(top_address); |
| 1430 | 1432 |
| 1431 // Read caller's PC (JSFunction continuation) from the input frame. | 1433 // Read caller's PC (JSFunction continuation) from the input frame. |
| 1432 unsigned input_frame_offset = input_frame_size - kPointerSize; | 1434 unsigned input_frame_offset = input_frame_size - kPCOnStackSize; |
| 1433 unsigned output_frame_offset = output_frame_size - kPointerSize; | 1435 unsigned output_frame_offset = output_frame_size - kFPOnStackSize; |
| 1434 intptr_t value = input_->GetFrameSlot(input_frame_offset); | 1436 intptr_t value = input_->GetFrameSlot(input_frame_offset); |
| 1435 output_frame->SetFrameSlot(output_frame_offset, value); | 1437 output_frame->SetCallerPc(output_frame_offset, value); |
| 1436 if (trace_) { | 1438 if (trace_) { |
| 1437 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1439 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1438 V8PRIxPTR " ; caller's pc\n", | 1440 V8PRIxPTR " ; caller's pc\n", |
| 1439 top_address + output_frame_offset, output_frame_offset, value); | 1441 top_address + output_frame_offset, output_frame_offset, value); |
| 1440 } | 1442 } |
| 1441 | 1443 |
| 1442 // Read caller's FP from the input frame, and set this frame's FP. | 1444 // Read caller's FP from the input frame, and set this frame's FP. |
| 1443 input_frame_offset -= kPointerSize; | 1445 input_frame_offset -= kFPOnStackSize; |
| 1444 value = input_->GetFrameSlot(input_frame_offset); | 1446 value = input_->GetFrameSlot(input_frame_offset); |
| 1445 output_frame_offset -= kPointerSize; | 1447 output_frame_offset -= kFPOnStackSize; |
| 1446 output_frame->SetFrameSlot(output_frame_offset, value); | 1448 output_frame->SetCallerFp(output_frame_offset, value); |
| 1447 intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); | 1449 intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); |
| 1448 output_frame->SetRegister(fp_reg.code(), frame_ptr); | 1450 output_frame->SetRegister(fp_reg.code(), frame_ptr); |
| 1449 output_frame->SetFp(frame_ptr); | 1451 output_frame->SetFp(frame_ptr); |
| 1450 if (trace_) { | 1452 if (trace_) { |
| 1451 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1453 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
| 1452 V8PRIxPTR " ; caller's fp\n", | 1454 V8PRIxPTR " ; caller's fp\n", |
| 1453 top_address + output_frame_offset, output_frame_offset, value); | 1455 top_address + output_frame_offset, output_frame_offset, value); |
| 1454 } | 1456 } |
| 1455 | 1457 |
| 1456 // The context can be gotten from the input frame. | 1458 // The context can be gotten from the input frame. |
| (...skipping 1635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3092 | 3094 |
| 3093 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { | 3095 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { |
| 3094 v->VisitPointer(BitCast<Object**>(&function_)); | 3096 v->VisitPointer(BitCast<Object**>(&function_)); |
| 3095 v->VisitPointers(parameters_, parameters_ + parameters_count_); | 3097 v->VisitPointers(parameters_, parameters_ + parameters_count_); |
| 3096 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); | 3098 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); |
| 3097 } | 3099 } |
| 3098 | 3100 |
| 3099 #endif // ENABLE_DEBUGGER_SUPPORT | 3101 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3100 | 3102 |
| 3101 } } // namespace v8::internal | 3103 } } // namespace v8::internal |
| OLD | NEW |