| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/code_generator.h" | 5 #include "vm/code_generator.h" |
| 6 | 6 |
| 7 #include "vm/assembler_macros.h" | 7 #include "vm/assembler_macros.h" |
| 8 #include "vm/ast.h" | 8 #include "vm/ast.h" |
| 9 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
| 11 #include "vm/compiler.h" | 11 #include "vm/compiler.h" |
| (...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1481 if (ContainsCid(classes, owner_cid)) { | 1481 if (ContainsCid(classes, owner_cid)) { |
| 1482 DeoptimizeAt(optimized_code, frame->pc()); | 1482 DeoptimizeAt(optimized_code, frame->pc()); |
| 1483 } | 1483 } |
| 1484 } | 1484 } |
| 1485 } | 1485 } |
| 1486 } | 1486 } |
| 1487 | 1487 |
| 1488 | 1488 |
| 1489 // Copy saved registers into the isolate buffer. | 1489 // Copy saved registers into the isolate buffer. |
| 1490 static void CopySavedRegisters(uword saved_registers_address) { | 1490 static void CopySavedRegisters(uword saved_registers_address) { |
| 1491 double* xmm_registers_copy = new double[kNumberOfXmmRegisters]; | 1491 double* fpu_registers_copy = new double[kNumberOfFpuRegisters]; |
| 1492 ASSERT(xmm_registers_copy != NULL); | 1492 ASSERT(fpu_registers_copy != NULL); |
| 1493 for (intptr_t i = 0; i < kNumberOfXmmRegisters; i++) { | 1493 for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) { |
| 1494 xmm_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address); | 1494 fpu_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address); |
| 1495 saved_registers_address += kDoubleSize; | 1495 saved_registers_address += kDoubleSize; |
| 1496 } | 1496 } |
| 1497 Isolate::Current()->set_deopt_xmm_registers_copy(xmm_registers_copy); | 1497 Isolate::Current()->set_deopt_fpu_registers_copy(fpu_registers_copy); |
| 1498 | 1498 |
| 1499 intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters]; | 1499 intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters]; |
| 1500 ASSERT(cpu_registers_copy != NULL); | 1500 ASSERT(cpu_registers_copy != NULL); |
| 1501 for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { | 1501 for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { |
| 1502 cpu_registers_copy[i] = | 1502 cpu_registers_copy[i] = |
| 1503 *reinterpret_cast<intptr_t*>(saved_registers_address); | 1503 *reinterpret_cast<intptr_t*>(saved_registers_address); |
| 1504 saved_registers_address += kWordSize; | 1504 saved_registers_address += kWordSize; |
| 1505 } | 1505 } |
| 1506 Isolate::Current()->set_deopt_cpu_registers_copy(cpu_registers_copy); | 1506 Isolate::Current()->set_deopt_cpu_registers_copy(cpu_registers_copy); |
| 1507 } | 1507 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1537 // Copies saved registers and caller's frame into temporary buffers. | 1537 // Copies saved registers and caller's frame into temporary buffers. |
| 1538 // Returns the stack size of unoptimized frame. | 1538 // Returns the stack size of unoptimized frame. |
| 1539 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, | 1539 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
| 1540 uword saved_registers_address) { | 1540 uword saved_registers_address) { |
| 1541 Isolate* isolate = Isolate::Current(); | 1541 Isolate* isolate = Isolate::Current(); |
| 1542 StackZone zone(isolate); | 1542 StackZone zone(isolate); |
| 1543 HANDLESCOPE(isolate); | 1543 HANDLESCOPE(isolate); |
| 1544 | 1544 |
| 1545 // All registers have been saved below last-fp. | 1545 // All registers have been saved below last-fp. |
| 1546 const uword last_fp = saved_registers_address + | 1546 const uword last_fp = saved_registers_address + |
| 1547 kNumberOfCpuRegisters * kWordSize + kNumberOfXmmRegisters * kDoubleSize; | 1547 kNumberOfCpuRegisters * kWordSize + kNumberOfFpuRegisters * kDoubleSize; |
| 1548 CopySavedRegisters(saved_registers_address); | 1548 CopySavedRegisters(saved_registers_address); |
| 1549 | 1549 |
| 1550 // Get optimized code and frame that need to be deoptimized. | 1550 // Get optimized code and frame that need to be deoptimized. |
| 1551 DartFrameIterator iterator(last_fp); | 1551 DartFrameIterator iterator(last_fp); |
| 1552 StackFrame* caller_frame = iterator.NextFrame(); | 1552 StackFrame* caller_frame = iterator.NextFrame(); |
| 1553 ASSERT(caller_frame != NULL); | 1553 ASSERT(caller_frame != NULL); |
| 1554 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); | 1554 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); |
| 1555 ASSERT(optimized_code.is_optimized()); | 1555 ASSERT(optimized_code.is_optimized()); |
| 1556 | 1556 |
| 1557 | 1557 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 ASSERT(caller_frame != NULL); | 1639 ASSERT(caller_frame != NULL); |
| 1640 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); | 1640 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); |
| 1641 const Function& function = Function::Handle(optimized_code.function()); | 1641 const Function& function = Function::Handle(optimized_code.function()); |
| 1642 ASSERT(!function.IsNull()); | 1642 ASSERT(!function.IsNull()); |
| 1643 const Code& unoptimized_code = Code::Handle(function.unoptimized_code()); | 1643 const Code& unoptimized_code = Code::Handle(function.unoptimized_code()); |
| 1644 ASSERT(!optimized_code.IsNull() && optimized_code.is_optimized()); | 1644 ASSERT(!optimized_code.IsNull() && optimized_code.is_optimized()); |
| 1645 ASSERT(!unoptimized_code.IsNull() && !unoptimized_code.is_optimized()); | 1645 ASSERT(!unoptimized_code.IsNull() && !unoptimized_code.is_optimized()); |
| 1646 | 1646 |
| 1647 intptr_t* frame_copy = isolate->deopt_frame_copy(); | 1647 intptr_t* frame_copy = isolate->deopt_frame_copy(); |
| 1648 intptr_t* cpu_registers_copy = isolate->deopt_cpu_registers_copy(); | 1648 intptr_t* cpu_registers_copy = isolate->deopt_cpu_registers_copy(); |
| 1649 double* xmm_registers_copy = isolate->deopt_xmm_registers_copy(); | 1649 double* fpu_registers_copy = isolate->deopt_fpu_registers_copy(); |
| 1650 | 1650 |
| 1651 intptr_t deopt_reason = kDeoptUnknown; | 1651 intptr_t deopt_reason = kDeoptUnknown; |
| 1652 const DeoptInfo& deopt_info = DeoptInfo::Handle( | 1652 const DeoptInfo& deopt_info = DeoptInfo::Handle( |
| 1653 optimized_code.GetDeoptInfoAtPc(caller_frame->pc(), &deopt_reason)); | 1653 optimized_code.GetDeoptInfoAtPc(caller_frame->pc(), &deopt_reason)); |
| 1654 ASSERT(!deopt_info.IsNull()); | 1654 ASSERT(!deopt_info.IsNull()); |
| 1655 | 1655 |
| 1656 const intptr_t caller_fp = DeoptimizeWithDeoptInfo(optimized_code, | 1656 const intptr_t caller_fp = DeoptimizeWithDeoptInfo(optimized_code, |
| 1657 deopt_info, | 1657 deopt_info, |
| 1658 *caller_frame, | 1658 *caller_frame, |
| 1659 deopt_reason); | 1659 deopt_reason); |
| 1660 | 1660 |
| 1661 isolate->SetDeoptFrameCopy(NULL, 0); | 1661 isolate->SetDeoptFrameCopy(NULL, 0); |
| 1662 isolate->set_deopt_cpu_registers_copy(NULL); | 1662 isolate->set_deopt_cpu_registers_copy(NULL); |
| 1663 isolate->set_deopt_xmm_registers_copy(NULL); | 1663 isolate->set_deopt_fpu_registers_copy(NULL); |
| 1664 delete[] frame_copy; | 1664 delete[] frame_copy; |
| 1665 delete[] cpu_registers_copy; | 1665 delete[] cpu_registers_copy; |
| 1666 delete[] xmm_registers_copy; | 1666 delete[] fpu_registers_copy; |
| 1667 | 1667 |
| 1668 return caller_fp; | 1668 return caller_fp; |
| 1669 } | 1669 } |
| 1670 END_LEAF_RUNTIME_ENTRY | 1670 END_LEAF_RUNTIME_ENTRY |
| 1671 | 1671 |
| 1672 | 1672 |
| 1673 // This is the last step in the deoptimization, GC can occur. | 1673 // This is the last step in the deoptimization, GC can occur. |
| 1674 DEFINE_RUNTIME_ENTRY(DeoptimizeMaterializeDoubles, 0) { | 1674 DEFINE_RUNTIME_ENTRY(DeoptimizeMaterializeDoubles, 0) { |
| 1675 DeferredDouble* deferred_double = Isolate::Current()->DetachDeferredDoubles(); | 1675 DeferredDouble* deferred_double = Isolate::Current()->DetachDeferredDoubles(); |
| 1676 | 1676 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1750 return; | 1750 return; |
| 1751 } | 1751 } |
| 1752 HeapTrace* heap_trace = Isolate::Current()->heap()->trace(); | 1752 HeapTrace* heap_trace = Isolate::Current()->heap()->trace(); |
| 1753 heap_trace->TraceStoreIntoObject(RawObject::ToAddr(object), | 1753 heap_trace->TraceStoreIntoObject(RawObject::ToAddr(object), |
| 1754 field_addr, | 1754 field_addr, |
| 1755 RawObject::ToAddr(value)); | 1755 RawObject::ToAddr(value)); |
| 1756 } | 1756 } |
| 1757 END_LEAF_RUNTIME_ENTRY | 1757 END_LEAF_RUNTIME_ENTRY |
| 1758 | 1758 |
| 1759 } // namespace dart | 1759 } // namespace dart |
| OLD | NEW |