OLD | NEW |
1 // Copyright (c) 2013, 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.h" | 7 #include "vm/assembler.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" |
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1508 for (intptr_t i = 0; i < frame_copy_size; i++) { | 1508 for (intptr_t i = 0; i < frame_copy_size; i++) { |
1509 frame_copy[i] = *(start + i); | 1509 frame_copy[i] = *(start + i); |
1510 } | 1510 } |
1511 Isolate::Current()->SetDeoptFrameCopy(frame_copy, frame_copy_size); | 1511 Isolate::Current()->SetDeoptFrameCopy(frame_copy, frame_copy_size); |
1512 } | 1512 } |
1513 | 1513 |
1514 | 1514 |
1515 // Copies saved registers and caller's frame into temporary buffers. | 1515 // Copies saved registers and caller's frame into temporary buffers. |
1516 // Returns the stack size of unoptimized frame. | 1516 // Returns the stack size of unoptimized frame. |
1517 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, | 1517 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
1518 uword saved_registers_address) { | 1518 1, uword saved_registers_address) { |
1519 Isolate* isolate = Isolate::Current(); | 1519 Isolate* isolate = Isolate::Current(); |
1520 StackZone zone(isolate); | 1520 StackZone zone(isolate); |
1521 HANDLESCOPE(isolate); | 1521 HANDLESCOPE(isolate); |
1522 | 1522 |
1523 // All registers have been saved below last-fp as if they were locals. | 1523 // All registers have been saved below last-fp as if they were locals. |
1524 const uword last_fp = saved_registers_address | 1524 const uword last_fp = saved_registers_address |
1525 + (kNumberOfCpuRegisters * kWordSize) | 1525 + (kNumberOfCpuRegisters * kWordSize) |
1526 + (kNumberOfFpuRegisters * kFpuRegisterSize) | 1526 + (kNumberOfFpuRegisters * kFpuRegisterSize) |
1527 - ((kFirstLocalSlotFromFp + 1) * kWordSize); | 1527 - ((kFirstLocalSlotFromFp + 1) * kWordSize); |
1528 CopySavedRegisters(saved_registers_address); | 1528 CopySavedRegisters(saved_registers_address); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 reinterpret_cast<uword>(&start[i]), | 1632 reinterpret_cast<uword>(&start[i]), |
1633 start[i], | 1633 start[i], |
1634 deopt_instructions[i + (len - frame_size)]->ToCString()); | 1634 deopt_instructions[i + (len - frame_size)]->ToCString()); |
1635 } | 1635 } |
1636 } | 1636 } |
1637 } | 1637 } |
1638 | 1638 |
1639 | 1639 |
1640 // The stack has been adjusted to fit all values for unoptimized frame. | 1640 // The stack has been adjusted to fit all values for unoptimized frame. |
1641 // Fill the unoptimized frame. | 1641 // Fill the unoptimized frame. |
1642 DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) { | 1642 DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, 1, uword last_fp) { |
1643 Isolate* isolate = Isolate::Current(); | 1643 Isolate* isolate = Isolate::Current(); |
1644 StackZone zone(isolate); | 1644 StackZone zone(isolate); |
1645 HANDLESCOPE(isolate); | 1645 HANDLESCOPE(isolate); |
1646 | 1646 |
1647 DartFrameIterator iterator(last_fp); | 1647 DartFrameIterator iterator(last_fp); |
1648 StackFrame* caller_frame = iterator.NextFrame(); | 1648 StackFrame* caller_frame = iterator.NextFrame(); |
1649 ASSERT(caller_frame != NULL); | 1649 ASSERT(caller_frame != NULL); |
1650 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); | 1650 const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); |
1651 const Function& function = Function::Handle(optimized_code.function()); | 1651 const Function& function = Function::Handle(optimized_code.function()); |
1652 ASSERT(!function.IsNull()); | 1652 ASSERT(!function.IsNull()); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 String& line_string = String::Handle(script.GetLine(line)); | 1719 String& line_string = String::Handle(script.GetLine(line)); |
1720 OS::PrintErr(" Function: %s\n", top_function.ToFullyQualifiedCString()); | 1720 OS::PrintErr(" Function: %s\n", top_function.ToFullyQualifiedCString()); |
1721 OS::PrintErr(" Line %"Pd": '%s'\n", line, line_string.ToCString()); | 1721 OS::PrintErr(" Line %"Pd": '%s'\n", line, line_string.ToCString()); |
1722 OS::PrintErr(" Deopt args: %"Pd"\n", deopt_arguments); | 1722 OS::PrintErr(" Deopt args: %"Pd"\n", deopt_arguments); |
1723 } | 1723 } |
1724 } | 1724 } |
1725 | 1725 |
1726 | 1726 |
1727 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, | 1727 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, |
1728 BigintCompare, | 1728 BigintCompare, |
| 1729 2, |
1729 RawBigint* left, | 1730 RawBigint* left, |
1730 RawBigint* right) { | 1731 RawBigint* right) { |
1731 Isolate* isolate = Isolate::Current(); | 1732 Isolate* isolate = Isolate::Current(); |
1732 StackZone zone(isolate); | 1733 StackZone zone(isolate); |
1733 HANDLESCOPE(isolate); | 1734 HANDLESCOPE(isolate); |
1734 const Bigint& big_left = Bigint::Handle(left); | 1735 const Bigint& big_left = Bigint::Handle(left); |
1735 const Bigint& big_right = Bigint::Handle(right); | 1736 const Bigint& big_right = Bigint::Handle(right); |
1736 return BigintOperations::Compare(big_left, big_right); | 1737 return BigintOperations::Compare(big_left, big_right); |
1737 } | 1738 } |
1738 END_LEAF_RUNTIME_ENTRY | 1739 END_LEAF_RUNTIME_ENTRY |
(...skipping 21 matching lines...) Expand all Loading... |
1760 // Arg1: Value that is being stored. | 1761 // Arg1: Value that is being stored. |
1761 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) { | 1762 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) { |
1762 ASSERT(arguments.ArgCount() == kUpdateFieldCidRuntimeEntry.argument_count()); | 1763 ASSERT(arguments.ArgCount() == kUpdateFieldCidRuntimeEntry.argument_count()); |
1763 const Field& field = Field::CheckedHandle(arguments.ArgAt(0)); | 1764 const Field& field = Field::CheckedHandle(arguments.ArgAt(0)); |
1764 const Object& value = Object::Handle(arguments.ArgAt(1)); | 1765 const Object& value = Object::Handle(arguments.ArgAt(1)); |
1765 | 1766 |
1766 field.UpdateCid(value.GetClassId()); | 1767 field.UpdateCid(value.GetClassId()); |
1767 } | 1768 } |
1768 | 1769 |
1769 } // namespace dart | 1770 } // namespace dart |
OLD | NEW |