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

Side by Side Diff: src/deoptimizer.cc

Issue 9304001: Implement inlining of constructor calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed moar comments by Vyacheslav Egorov. Created 8 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/deoptimizer.h ('k') | src/flag-definitions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 ASSERT_LT(jsframe_index, deoptimizer->jsframe_count()); 163 ASSERT_LT(jsframe_index, deoptimizer->jsframe_count());
164 164
165 // Convert JS frame index into frame index. 165 // Convert JS frame index into frame index.
166 int frame_index = deoptimizer->ConvertJSFrameIndexToFrameIndex(jsframe_index); 166 int frame_index = deoptimizer->ConvertJSFrameIndexToFrameIndex(jsframe_index);
167 167
168 bool has_arguments_adaptor = 168 bool has_arguments_adaptor =
169 frame_index > 0 && 169 frame_index > 0 &&
170 deoptimizer->output_[frame_index - 1]->GetFrameType() == 170 deoptimizer->output_[frame_index - 1]->GetFrameType() ==
171 StackFrame::ARGUMENTS_ADAPTOR; 171 StackFrame::ARGUMENTS_ADAPTOR;
172 172
173 DeoptimizedFrameInfo* info = 173 int construct_offset = has_arguments_adaptor ? 2 : 1;
174 new DeoptimizedFrameInfo(deoptimizer, frame_index, has_arguments_adaptor); 174 bool has_construct_stub =
175 frame_index >= construct_offset &&
176 deoptimizer->output_[frame_index - construct_offset]->GetFrameType() ==
177 StackFrame::CONSTRUCT;
178
179 DeoptimizedFrameInfo* info = new DeoptimizedFrameInfo(deoptimizer,
180 frame_index,
181 has_arguments_adaptor,
182 has_construct_stub);
175 isolate->deoptimizer_data()->deoptimized_frame_info_ = info; 183 isolate->deoptimizer_data()->deoptimized_frame_info_ = info;
176 184
177 // Get the "simulated" top and size for the requested frame. 185 // Get the "simulated" top and size for the requested frame.
178 FrameDescription* parameters_frame = 186 FrameDescription* parameters_frame =
179 deoptimizer->output_[ 187 deoptimizer->output_[
180 has_arguments_adaptor ? (frame_index - 1) : frame_index]; 188 has_arguments_adaptor ? (frame_index - 1) : frame_index];
181 189
182 uint32_t parameters_size = (info->parameters_count() + 1) * kPointerSize; 190 uint32_t parameters_size = (info->parameters_count() + 1) * kPointerSize;
183 Address parameters_top = reinterpret_cast<Address>( 191 Address parameters_top = reinterpret_cast<Address>(
184 parameters_frame->GetTop() + (parameters_frame->GetFrameSize() - 192 parameters_frame->GetTop() + (parameters_frame->GetFrameSize() -
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 Translation::Opcode opcode = 571 Translation::Opcode opcode =
564 static_cast<Translation::Opcode>(iterator.Next()); 572 static_cast<Translation::Opcode>(iterator.Next());
565 switch (opcode) { 573 switch (opcode) {
566 case Translation::JS_FRAME: 574 case Translation::JS_FRAME:
567 DoComputeJSFrame(&iterator, i); 575 DoComputeJSFrame(&iterator, i);
568 jsframe_count_++; 576 jsframe_count_++;
569 break; 577 break;
570 case Translation::ARGUMENTS_ADAPTOR_FRAME: 578 case Translation::ARGUMENTS_ADAPTOR_FRAME:
571 DoComputeArgumentsAdaptorFrame(&iterator, i); 579 DoComputeArgumentsAdaptorFrame(&iterator, i);
572 break; 580 break;
581 case Translation::CONSTRUCT_STUB_FRAME:
582 DoComputeConstructStubFrame(&iterator, i);
583 break;
573 default: 584 default:
574 UNREACHABLE(); 585 UNREACHABLE();
575 break; 586 break;
576 } 587 }
577 } 588 }
578 589
579 // Print some helpful diagnostic information. 590 // Print some helpful diagnostic information.
580 if (FLAG_trace_deopt) { 591 if (FLAG_trace_deopt) {
581 double ms = static_cast<double>(OS::Ticks() - start) / 1000; 592 double ms = static_cast<double>(OS::Ticks() - start) / 1000;
582 int index = output_count_ - 1; // Index of the topmost frame. 593 int index = output_count_ - 1; // Index of the topmost frame.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 while (opcode == Translation::DUPLICATE) { 690 while (opcode == Translation::DUPLICATE) {
680 opcode = static_cast<Translation::Opcode>(iterator->Next()); 691 opcode = static_cast<Translation::Opcode>(iterator->Next());
681 iterator->Skip(Translation::NumberOfOperandsFor(opcode)); 692 iterator->Skip(Translation::NumberOfOperandsFor(opcode));
682 opcode = static_cast<Translation::Opcode>(iterator->Next()); 693 opcode = static_cast<Translation::Opcode>(iterator->Next());
683 } 694 }
684 695
685 switch (opcode) { 696 switch (opcode) {
686 case Translation::BEGIN: 697 case Translation::BEGIN:
687 case Translation::JS_FRAME: 698 case Translation::JS_FRAME:
688 case Translation::ARGUMENTS_ADAPTOR_FRAME: 699 case Translation::ARGUMENTS_ADAPTOR_FRAME:
700 case Translation::CONSTRUCT_STUB_FRAME:
689 case Translation::DUPLICATE: 701 case Translation::DUPLICATE:
690 UNREACHABLE(); 702 UNREACHABLE();
691 return; 703 return;
692 704
693 case Translation::REGISTER: { 705 case Translation::REGISTER: {
694 int input_reg = iterator->Next(); 706 int input_reg = iterator->Next();
695 intptr_t input_value = input_->GetRegister(input_reg); 707 intptr_t input_value = input_->GetRegister(input_reg);
696 if (FLAG_trace_deopt) { 708 if (FLAG_trace_deopt) {
697 PrintF( 709 PrintF(
698 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ", 710 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ",
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 static_cast<Translation::Opcode>(iterator->Next()); 878 static_cast<Translation::Opcode>(iterator->Next());
867 bool duplicate = (opcode == Translation::DUPLICATE); 879 bool duplicate = (opcode == Translation::DUPLICATE);
868 if (duplicate) { 880 if (duplicate) {
869 opcode = static_cast<Translation::Opcode>(iterator->Next()); 881 opcode = static_cast<Translation::Opcode>(iterator->Next());
870 } 882 }
871 883
872 switch (opcode) { 884 switch (opcode) {
873 case Translation::BEGIN: 885 case Translation::BEGIN:
874 case Translation::JS_FRAME: 886 case Translation::JS_FRAME:
875 case Translation::ARGUMENTS_ADAPTOR_FRAME: 887 case Translation::ARGUMENTS_ADAPTOR_FRAME:
888 case Translation::CONSTRUCT_STUB_FRAME:
876 case Translation::DUPLICATE: 889 case Translation::DUPLICATE:
877 UNREACHABLE(); // Malformed input. 890 UNREACHABLE(); // Malformed input.
878 return false; 891 return false;
879 892
880 case Translation::REGISTER: { 893 case Translation::REGISTER: {
881 int output_reg = iterator->Next(); 894 int output_reg = iterator->Next();
882 if (FLAG_trace_osr) { 895 if (FLAG_trace_osr) {
883 PrintF(" %s <- 0x%08" V8PRIxPTR " ; [sp + %d]\n", 896 PrintF(" %s <- 0x%08" V8PRIxPTR " ; [sp + %d]\n",
884 converter.NameOfCPURegister(output_reg), 897 converter.NameOfCPURegister(output_reg),
885 input_value, 898 input_value,
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 UNREACHABLE(); 1211 UNREACHABLE();
1199 } 1212 }
1200 1213
1201 1214
1202 FrameDescription::FrameDescription(uint32_t frame_size, 1215 FrameDescription::FrameDescription(uint32_t frame_size,
1203 JSFunction* function) 1216 JSFunction* function)
1204 : frame_size_(frame_size), 1217 : frame_size_(frame_size),
1205 function_(function), 1218 function_(function),
1206 top_(kZapUint32), 1219 top_(kZapUint32),
1207 pc_(kZapUint32), 1220 pc_(kZapUint32),
1208 fp_(kZapUint32) { 1221 fp_(kZapUint32),
1222 context_(kZapUint32) {
1209 // Zap all the registers. 1223 // Zap all the registers.
1210 for (int r = 0; r < Register::kNumRegisters; r++) { 1224 for (int r = 0; r < Register::kNumRegisters; r++) {
1211 SetRegister(r, kZapUint32); 1225 SetRegister(r, kZapUint32);
1212 } 1226 }
1213 1227
1214 // Zap all the slots. 1228 // Zap all the slots.
1215 for (unsigned o = 0; o < frame_size; o += kPointerSize) { 1229 for (unsigned o = 0; o < frame_size; o += kPointerSize) {
1216 SetFrameSlot(o, kZapUint32); 1230 SetFrameSlot(o, kZapUint32);
1217 } 1231 }
1218 } 1232 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 1326
1313 Handle<ByteArray> TranslationBuffer::CreateByteArray() { 1327 Handle<ByteArray> TranslationBuffer::CreateByteArray() {
1314 int length = contents_.length(); 1328 int length = contents_.length();
1315 Handle<ByteArray> result = 1329 Handle<ByteArray> result =
1316 Isolate::Current()->factory()->NewByteArray(length, TENURED); 1330 Isolate::Current()->factory()->NewByteArray(length, TENURED);
1317 memcpy(result->GetDataStartAddress(), contents_.ToVector().start(), length); 1331 memcpy(result->GetDataStartAddress(), contents_.ToVector().start(), length);
1318 return result; 1332 return result;
1319 } 1333 }
1320 1334
1321 1335
1336 void Translation::BeginConstructStubFrame(int literal_id, unsigned height) {
1337 buffer_->Add(CONSTRUCT_STUB_FRAME);
1338 buffer_->Add(literal_id);
1339 buffer_->Add(height);
1340 }
1341
1342
1322 void Translation::BeginArgumentsAdaptorFrame(int literal_id, unsigned height) { 1343 void Translation::BeginArgumentsAdaptorFrame(int literal_id, unsigned height) {
1323 buffer_->Add(ARGUMENTS_ADAPTOR_FRAME); 1344 buffer_->Add(ARGUMENTS_ADAPTOR_FRAME);
1324 buffer_->Add(literal_id); 1345 buffer_->Add(literal_id);
1325 buffer_->Add(height); 1346 buffer_->Add(height);
1326 } 1347 }
1327 1348
1328 1349
1329 void Translation::BeginJSFrame(int node_id, int literal_id, unsigned height) { 1350 void Translation::BeginJSFrame(int node_id, int literal_id, unsigned height) {
1330 buffer_->Add(JS_FRAME); 1351 buffer_->Add(JS_FRAME);
1331 buffer_->Add(node_id); 1352 buffer_->Add(node_id);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 case REGISTER: 1415 case REGISTER:
1395 case INT32_REGISTER: 1416 case INT32_REGISTER:
1396 case DOUBLE_REGISTER: 1417 case DOUBLE_REGISTER:
1397 case STACK_SLOT: 1418 case STACK_SLOT:
1398 case INT32_STACK_SLOT: 1419 case INT32_STACK_SLOT:
1399 case DOUBLE_STACK_SLOT: 1420 case DOUBLE_STACK_SLOT:
1400 case LITERAL: 1421 case LITERAL:
1401 return 1; 1422 return 1;
1402 case BEGIN: 1423 case BEGIN:
1403 case ARGUMENTS_ADAPTOR_FRAME: 1424 case ARGUMENTS_ADAPTOR_FRAME:
1425 case CONSTRUCT_STUB_FRAME:
1404 return 2; 1426 return 2;
1405 case JS_FRAME: 1427 case JS_FRAME:
1406 return 3; 1428 return 3;
1407 } 1429 }
1408 UNREACHABLE(); 1430 UNREACHABLE();
1409 return -1; 1431 return -1;
1410 } 1432 }
1411 1433
1412 1434
1413 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 1435 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER)
1414 1436
1415 const char* Translation::StringFor(Opcode opcode) { 1437 const char* Translation::StringFor(Opcode opcode) {
1416 switch (opcode) { 1438 switch (opcode) {
1417 case BEGIN: 1439 case BEGIN:
1418 return "BEGIN"; 1440 return "BEGIN";
1419 case JS_FRAME: 1441 case JS_FRAME:
1420 return "JS_FRAME"; 1442 return "JS_FRAME";
1421 case ARGUMENTS_ADAPTOR_FRAME: 1443 case ARGUMENTS_ADAPTOR_FRAME:
1422 return "ARGUMENTS_ADAPTOR_FRAME"; 1444 return "ARGUMENTS_ADAPTOR_FRAME";
1445 case CONSTRUCT_STUB_FRAME:
1446 return "CONSTRUCT_STUB_FRAME";
1423 case REGISTER: 1447 case REGISTER:
1424 return "REGISTER"; 1448 return "REGISTER";
1425 case INT32_REGISTER: 1449 case INT32_REGISTER:
1426 return "INT32_REGISTER"; 1450 return "INT32_REGISTER";
1427 case DOUBLE_REGISTER: 1451 case DOUBLE_REGISTER:
1428 return "DOUBLE_REGISTER"; 1452 return "DOUBLE_REGISTER";
1429 case STACK_SLOT: 1453 case STACK_SLOT:
1430 return "STACK_SLOT"; 1454 return "STACK_SLOT";
1431 case INT32_STACK_SLOT: 1455 case INT32_STACK_SLOT:
1432 return "INT32_STACK_SLOT"; 1456 return "INT32_STACK_SLOT";
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 SlotRef SlotRef::ComputeSlotForNextArgument(TranslationIterator* iterator, 1492 SlotRef SlotRef::ComputeSlotForNextArgument(TranslationIterator* iterator,
1469 DeoptimizationInputData* data, 1493 DeoptimizationInputData* data,
1470 JavaScriptFrame* frame) { 1494 JavaScriptFrame* frame) {
1471 Translation::Opcode opcode = 1495 Translation::Opcode opcode =
1472 static_cast<Translation::Opcode>(iterator->Next()); 1496 static_cast<Translation::Opcode>(iterator->Next());
1473 1497
1474 switch (opcode) { 1498 switch (opcode) {
1475 case Translation::BEGIN: 1499 case Translation::BEGIN:
1476 case Translation::JS_FRAME: 1500 case Translation::JS_FRAME:
1477 case Translation::ARGUMENTS_ADAPTOR_FRAME: 1501 case Translation::ARGUMENTS_ADAPTOR_FRAME:
1502 case Translation::CONSTRUCT_STUB_FRAME:
1478 // Peeled off before getting here. 1503 // Peeled off before getting here.
1479 break; 1504 break;
1480 1505
1481 case Translation::ARGUMENTS_OBJECT: 1506 case Translation::ARGUMENTS_OBJECT:
1482 // This can be only emitted for local slots not for argument slots. 1507 // This can be only emitted for local slots not for argument slots.
1483 break; 1508 break;
1484 1509
1485 case Translation::REGISTER: 1510 case Translation::REGISTER:
1486 case Translation::INT32_REGISTER: 1511 case Translation::INT32_REGISTER:
1487 case Translation::DOUBLE_REGISTER: 1512 case Translation::DOUBLE_REGISTER:
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 // Skip over operands to advance to the next opcode. 1615 // Skip over operands to advance to the next opcode.
1591 it.Skip(Translation::NumberOfOperandsFor(opcode)); 1616 it.Skip(Translation::NumberOfOperandsFor(opcode));
1592 } 1617 }
1593 1618
1594 UNREACHABLE(); 1619 UNREACHABLE();
1595 return Vector<SlotRef>(); 1620 return Vector<SlotRef>();
1596 } 1621 }
1597 1622
1598 #ifdef ENABLE_DEBUGGER_SUPPORT 1623 #ifdef ENABLE_DEBUGGER_SUPPORT
1599 1624
1600 DeoptimizedFrameInfo::DeoptimizedFrameInfo( 1625 DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer,
1601 Deoptimizer* deoptimizer, int frame_index, bool has_arguments_adaptor) { 1626 int frame_index,
1627 bool has_arguments_adaptor,
1628 bool has_construct_stub) {
1602 FrameDescription* output_frame = deoptimizer->output_[frame_index]; 1629 FrameDescription* output_frame = deoptimizer->output_[frame_index];
1603 SetFunction(output_frame->GetFunction()); 1630 function_ = output_frame->GetFunction();
1631 has_construct_stub_ = has_construct_stub;
1604 expression_count_ = output_frame->GetExpressionCount(); 1632 expression_count_ = output_frame->GetExpressionCount();
1605 expression_stack_ = new Object*[expression_count_]; 1633 expression_stack_ = new Object*[expression_count_];
1606 pc_ = output_frame->GetPc(); 1634 pc_ = output_frame->GetPc();
1607 for (int i = 0; i < expression_count_; i++) { 1635 for (int i = 0; i < expression_count_; i++) {
1608 SetExpression(i, output_frame->GetExpression(i)); 1636 SetExpression(i, output_frame->GetExpression(i));
1609 } 1637 }
1610 1638
1611 if (has_arguments_adaptor) { 1639 if (has_arguments_adaptor) {
1612 output_frame = deoptimizer->output_[frame_index - 1]; 1640 output_frame = deoptimizer->output_[frame_index - 1];
1613 ASSERT(output_frame->GetFrameType() == StackFrame::ARGUMENTS_ADAPTOR); 1641 ASSERT(output_frame->GetFrameType() == StackFrame::ARGUMENTS_ADAPTOR);
(...skipping 14 matching lines...) Expand all
1628 1656
1629 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { 1657 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) {
1630 v->VisitPointer(BitCast<Object**>(&function_)); 1658 v->VisitPointer(BitCast<Object**>(&function_));
1631 v->VisitPointers(parameters_, parameters_ + parameters_count_); 1659 v->VisitPointers(parameters_, parameters_ + parameters_count_);
1632 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); 1660 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_);
1633 } 1661 }
1634 1662
1635 #endif // ENABLE_DEBUGGER_SUPPORT 1663 #endif // ENABLE_DEBUGGER_SUPPORT
1636 1664
1637 } } // namespace v8::internal 1665 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/deoptimizer.h ('k') | src/flag-definitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698