OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 } | 442 } |
443 next_position_candidate_flushed_ = false; | 443 next_position_candidate_flushed_ = false; |
444 } | 444 } |
445 last_position_ = static_cast<int>(rinfo->data()); | 445 last_position_ = static_cast<int>(rinfo->data()); |
446 } else { | 446 } else { |
447 WriteModeAndPC(pc_delta, rmode); | 447 WriteModeAndPC(pc_delta, rmode); |
448 if (RelocInfo::IsComment(rmode)) { | 448 if (RelocInfo::IsComment(rmode)) { |
449 WriteData(rinfo->data()); | 449 WriteData(rinfo->data()); |
450 } else if (RelocInfo::IsConstPool(rmode) || | 450 } else if (RelocInfo::IsConstPool(rmode) || |
451 RelocInfo::IsVeneerPool(rmode) || | 451 RelocInfo::IsVeneerPool(rmode) || |
452 RelocInfo::IsDebugBreakSlot(rmode)) { | 452 RelocInfo::IsDebugBreakSlotAtCall(rmode)) { |
453 WriteIntData(static_cast<int>(rinfo->data())); | 453 WriteIntData(static_cast<int>(rinfo->data())); |
454 } | 454 } |
455 } | 455 } |
456 last_pc_ = rinfo->pc(); | 456 last_pc_ = rinfo->pc(); |
457 last_mode_ = rmode; | 457 last_mode_ = rmode; |
458 #ifdef DEBUG | 458 #ifdef DEBUG |
459 DCHECK(begin_pos - pos_ <= kMaxSize); | 459 DCHECK(begin_pos - pos_ <= kMaxSize); |
460 #endif | 460 #endif |
461 } | 461 } |
462 | 462 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 if (mode_mask_ & RelocInfo::kPositionMask) { | 634 if (mode_mask_ & RelocInfo::kPositionMask) { |
635 // Always update the position if we are interested in either | 635 // Always update the position if we are interested in either |
636 // statement positions or non-statement positions. | 636 // statement positions or non-statement positions. |
637 AdvanceReadPosition(); | 637 AdvanceReadPosition(); |
638 if (SetMode(rmode)) return; | 638 if (SetMode(rmode)) return; |
639 } else { | 639 } else { |
640 Advance(kIntSize); | 640 Advance(kIntSize); |
641 } | 641 } |
642 } else if (RelocInfo::IsConstPool(rmode) || | 642 } else if (RelocInfo::IsConstPool(rmode) || |
643 RelocInfo::IsVeneerPool(rmode) || | 643 RelocInfo::IsVeneerPool(rmode) || |
644 RelocInfo::IsDebugBreakSlot(rmode)) { | 644 RelocInfo::IsDebugBreakSlotAtCall(rmode)) { |
645 if (SetMode(rmode)) { | 645 if (SetMode(rmode)) { |
646 AdvanceReadInt(); | 646 AdvanceReadInt(); |
647 return; | 647 return; |
648 } | 648 } |
649 Advance(kIntSize); | 649 Advance(kIntSize); |
650 } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) { | 650 } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) { |
651 return; | 651 return; |
652 } | 652 } |
653 } | 653 } |
654 } | 654 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { | 730 const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { |
731 switch (rmode) { | 731 switch (rmode) { |
732 case NONE32: | 732 case NONE32: |
733 return "no reloc 32"; | 733 return "no reloc 32"; |
734 case NONE64: | 734 case NONE64: |
735 return "no reloc 64"; | 735 return "no reloc 64"; |
736 case EMBEDDED_OBJECT: | 736 case EMBEDDED_OBJECT: |
737 return "embedded object"; | 737 return "embedded object"; |
738 case CONSTRUCT_CALL: | 738 case CONSTRUCT_CALL: |
739 return "code target (js construct call)"; | 739 return "code target (js construct call)"; |
740 case DEBUG_BREAK: | 740 case DEBUGGER_STATEMENT: |
741 return "debug break"; | 741 return "debugger statement"; |
742 case CODE_TARGET: | 742 case CODE_TARGET: |
743 return "code target"; | 743 return "code target"; |
744 case CODE_TARGET_WITH_ID: | 744 case CODE_TARGET_WITH_ID: |
745 return "code target with id"; | 745 return "code target with id"; |
746 case CELL: | 746 case CELL: |
747 return "property cell"; | 747 return "property cell"; |
748 case RUNTIME_ENTRY: | 748 case RUNTIME_ENTRY: |
749 return "runtime entry"; | 749 return "runtime entry"; |
750 case JS_RETURN: | 750 case JS_RETURN: |
751 return "js return"; | 751 return "js return"; |
752 case COMMENT: | 752 case COMMENT: |
753 return "comment"; | 753 return "comment"; |
754 case POSITION: | 754 case POSITION: |
755 return "position"; | 755 return "position"; |
756 case STATEMENT_POSITION: | 756 case STATEMENT_POSITION: |
757 return "statement position"; | 757 return "statement position"; |
758 case EXTERNAL_REFERENCE: | 758 case EXTERNAL_REFERENCE: |
759 return "external reference"; | 759 return "external reference"; |
760 case INTERNAL_REFERENCE: | 760 case INTERNAL_REFERENCE: |
761 return "internal reference"; | 761 return "internal reference"; |
762 case INTERNAL_REFERENCE_ENCODED: | 762 case INTERNAL_REFERENCE_ENCODED: |
763 return "encoded internal reference"; | 763 return "encoded internal reference"; |
764 case DEOPT_REASON: | 764 case DEOPT_REASON: |
765 return "deopt reason"; | 765 return "deopt reason"; |
766 case CONST_POOL: | 766 case CONST_POOL: |
767 return "constant pool"; | 767 return "constant pool"; |
768 case VENEER_POOL: | 768 case VENEER_POOL: |
769 return "veneer pool"; | 769 return "veneer pool"; |
770 case DEBUG_BREAK_SLOT: | 770 case DEBUG_BREAK_SLOT_AT_POSITION: |
771 return "debug break slot"; | 771 return "debug break slot at position"; |
| 772 case DEBUG_BREAK_SLOT_AT_CALL: |
| 773 return "debug break slot at call"; |
| 774 case DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL: |
| 775 return "debug break slot at construct call"; |
772 case CODE_AGE_SEQUENCE: | 776 case CODE_AGE_SEQUENCE: |
773 return "code_age_sequence"; | 777 return "code_age_sequence"; |
774 case NUMBER_OF_MODES: | 778 case NUMBER_OF_MODES: |
775 case PC_JUMP: | 779 case PC_JUMP: |
776 UNREACHABLE(); | 780 UNREACHABLE(); |
777 return "number_of_modes"; | 781 return "number_of_modes"; |
778 } | 782 } |
779 return "unknown relocation type"; | 783 return "unknown relocation type"; |
780 } | 784 } |
781 | 785 |
(...skipping 25 matching lines...) Expand all Loading... |
807 } else if (IsRuntimeEntry(rmode_) && | 811 } else if (IsRuntimeEntry(rmode_) && |
808 isolate->deoptimizer_data() != NULL) { | 812 isolate->deoptimizer_data() != NULL) { |
809 // Depotimization bailouts are stored as runtime entries. | 813 // Depotimization bailouts are stored as runtime entries. |
810 int id = Deoptimizer::GetDeoptimizationId( | 814 int id = Deoptimizer::GetDeoptimizationId( |
811 isolate, target_address(), Deoptimizer::EAGER); | 815 isolate, target_address(), Deoptimizer::EAGER); |
812 if (id != Deoptimizer::kNotDeoptimizationEntry) { | 816 if (id != Deoptimizer::kNotDeoptimizationEntry) { |
813 os << " (deoptimization bailout " << id << ")"; | 817 os << " (deoptimization bailout " << id << ")"; |
814 } | 818 } |
815 } else if (IsConstPool(rmode_)) { | 819 } else if (IsConstPool(rmode_)) { |
816 os << " (size " << static_cast<int>(data_) << ")"; | 820 os << " (size " << static_cast<int>(data_) << ")"; |
817 } else if (IsDebugBreakSlot(rmode_)) { | |
818 if (DebugBreakIsCall(data_)) { | |
819 os << " (call with " << DebugBreakCallArgumentsCount(data_) << " args)"; | |
820 } else if (DebugBreakIsConstructCall(data_)) { | |
821 os << " (construct call)"; | |
822 } else { | |
823 os << " (slot)"; | |
824 } | |
825 } | 821 } |
826 | 822 |
827 os << "\n"; | 823 os << "\n"; |
828 } | 824 } |
829 #endif // ENABLE_DISASSEMBLER | 825 #endif // ENABLE_DISASSEMBLER |
830 | 826 |
831 | 827 |
832 #ifdef VERIFY_HEAP | 828 #ifdef VERIFY_HEAP |
833 void RelocInfo::Verify(Isolate* isolate) { | 829 void RelocInfo::Verify(Isolate* isolate) { |
834 switch (rmode_) { | 830 switch (rmode_) { |
835 case EMBEDDED_OBJECT: | 831 case EMBEDDED_OBJECT: |
836 Object::VerifyPointer(target_object()); | 832 Object::VerifyPointer(target_object()); |
837 break; | 833 break; |
838 case CELL: | 834 case CELL: |
839 Object::VerifyPointer(target_cell()); | 835 Object::VerifyPointer(target_cell()); |
840 break; | 836 break; |
841 case DEBUG_BREAK: | 837 case DEBUGGER_STATEMENT: |
842 case CONSTRUCT_CALL: | 838 case CONSTRUCT_CALL: |
843 case CODE_TARGET_WITH_ID: | 839 case CODE_TARGET_WITH_ID: |
844 case CODE_TARGET: { | 840 case CODE_TARGET: { |
845 // convert inline target address to code object | 841 // convert inline target address to code object |
846 Address addr = target_address(); | 842 Address addr = target_address(); |
847 CHECK(addr != NULL); | 843 CHECK(addr != NULL); |
848 // Check that we can find the right code object. | 844 // Check that we can find the right code object. |
849 Code* code = Code::GetCodeFromTargetAddress(addr); | 845 Code* code = Code::GetCodeFromTargetAddress(addr); |
850 Object* found = isolate->FindCodeObject(addr); | 846 Object* found = isolate->FindCodeObject(addr); |
851 CHECK(found->IsCode()); | 847 CHECK(found->IsCode()); |
(...skipping 11 matching lines...) Expand all Loading... |
863 } | 859 } |
864 case RUNTIME_ENTRY: | 860 case RUNTIME_ENTRY: |
865 case JS_RETURN: | 861 case JS_RETURN: |
866 case COMMENT: | 862 case COMMENT: |
867 case POSITION: | 863 case POSITION: |
868 case STATEMENT_POSITION: | 864 case STATEMENT_POSITION: |
869 case EXTERNAL_REFERENCE: | 865 case EXTERNAL_REFERENCE: |
870 case DEOPT_REASON: | 866 case DEOPT_REASON: |
871 case CONST_POOL: | 867 case CONST_POOL: |
872 case VENEER_POOL: | 868 case VENEER_POOL: |
873 case DEBUG_BREAK_SLOT: | 869 case DEBUG_BREAK_SLOT_AT_POSITION: |
| 870 case DEBUG_BREAK_SLOT_AT_CALL: |
| 871 case DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL: |
874 case NONE32: | 872 case NONE32: |
875 case NONE64: | 873 case NONE64: |
876 break; | 874 break; |
877 case NUMBER_OF_MODES: | 875 case NUMBER_OF_MODES: |
878 case PC_JUMP: | 876 case PC_JUMP: |
879 UNREACHABLE(); | 877 UNREACHABLE(); |
880 break; | 878 break; |
881 case CODE_AGE_SEQUENCE: | 879 case CODE_AGE_SEQUENCE: |
882 DCHECK(Code::IsYoungSequence(isolate, pc_) || code_age_stub()->IsCode()); | 880 DCHECK(Code::IsYoungSequence(isolate, pc_) || code_age_stub()->IsCode()); |
883 break; | 881 break; |
884 } | 882 } |
885 } | 883 } |
886 #endif // VERIFY_HEAP | 884 #endif // VERIFY_HEAP |
887 | 885 |
888 | 886 |
889 bool RelocInfo::DebugBreakIsConstructCall(intptr_t data) { | |
890 return data == static_cast<intptr_t>(kDebugBreakConstructCallSentinel); | |
891 } | |
892 | |
893 | |
894 bool RelocInfo::DebugBreakIsCall(intptr_t data) { return data >= 0; } | |
895 | |
896 | |
897 int RelocInfo::DebugBreakCallArgumentsCount(intptr_t data) { | 887 int RelocInfo::DebugBreakCallArgumentsCount(intptr_t data) { |
898 DCHECK(DebugBreakIsCall(data)); | |
899 return static_cast<int>(data); | 888 return static_cast<int>(data); |
900 } | 889 } |
901 | 890 |
902 | 891 |
903 // ----------------------------------------------------------------------------- | 892 // ----------------------------------------------------------------------------- |
904 // Implementation of ExternalReference | 893 // Implementation of ExternalReference |
905 | 894 |
906 void ExternalReference::SetUp() { | 895 void ExternalReference::SetUp() { |
907 double_constants.min_int = kMinInt; | 896 double_constants.min_int = kMinInt; |
908 double_constants.one_half = 0.5; | 897 double_constants.one_half = 0.5; |
(...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1816 | 1805 |
1817 void Assembler::RecordJSReturn() { | 1806 void Assembler::RecordJSReturn() { |
1818 positions_recorder()->WriteRecordedPositions(); | 1807 positions_recorder()->WriteRecordedPositions(); |
1819 EnsureSpace ensure_space(this); | 1808 EnsureSpace ensure_space(this); |
1820 RecordRelocInfo(RelocInfo::JS_RETURN); | 1809 RecordRelocInfo(RelocInfo::JS_RETURN); |
1821 } | 1810 } |
1822 | 1811 |
1823 | 1812 |
1824 void Assembler::RecordDebugBreakSlot() { | 1813 void Assembler::RecordDebugBreakSlot() { |
1825 EnsureSpace ensure_space(this); | 1814 EnsureSpace ensure_space(this); |
1826 intptr_t data = static_cast<intptr_t>(RelocInfo::kDebugBreakNonCallSentinel); | 1815 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); |
1827 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data); | |
1828 } | 1816 } |
1829 | 1817 |
1830 | 1818 |
1831 void Assembler::RecordDebugBreakSlotForCall(int argc) { | 1819 void Assembler::RecordDebugBreakSlotForCall(int argc) { |
1832 EnsureSpace ensure_space(this); | 1820 EnsureSpace ensure_space(this); |
1833 intptr_t data = static_cast<intptr_t>(argc); | 1821 intptr_t data = static_cast<intptr_t>(argc); |
1834 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data); | 1822 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL, data); |
1835 } | 1823 } |
1836 | 1824 |
1837 | 1825 |
1838 void Assembler::RecordDebugBreakSlotForConstructCall() { | 1826 void Assembler::RecordDebugBreakSlotForConstructCall() { |
1839 EnsureSpace ensure_space(this); | 1827 EnsureSpace ensure_space(this); |
1840 intptr_t data = | 1828 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL); |
1841 static_cast<intptr_t>(RelocInfo::kDebugBreakConstructCallSentinel); | |
1842 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data); | |
1843 } | 1829 } |
1844 | 1830 |
1845 | 1831 |
1846 void Assembler::DataAlign(int m) { | 1832 void Assembler::DataAlign(int m) { |
1847 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); | 1833 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); |
1848 while ((pc_offset() & (m - 1)) != 0) { | 1834 while ((pc_offset() & (m - 1)) != 0) { |
1849 db(0); | 1835 db(0); |
1850 } | 1836 } |
1851 } | 1837 } |
1852 } // namespace internal | 1838 } // namespace internal |
1853 } // namespace v8 | 1839 } // namespace v8 |
OLD | NEW |