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

Side by Side Diff: src/arm64/assembler-arm64-inl.h

Issue 1020863003: [arm64] serialize internal references via object visitor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_ARM64_ASSEMBLER_ARM64_INL_H_ 5 #ifndef V8_ARM64_ASSEMBLER_ARM64_INL_H_
6 #define V8_ARM64_ASSEMBLER_ARM64_INL_H_ 6 #define V8_ARM64_ASSEMBLER_ARM64_INL_H_
7 7
8 #include "src/arm64/assembler-arm64.h" 8 #include "src/arm64/assembler-arm64.h"
9 #include "src/assembler.h" 9 #include "src/assembler.h"
10 #include "src/debug.h" 10 #include "src/debug.h"
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 654
655 655
656 void Assembler::deserialization_set_special_target_at( 656 void Assembler::deserialization_set_special_target_at(
657 Address constant_pool_entry, Code* code, Address target) { 657 Address constant_pool_entry, Code* code, Address target) {
658 Memory::Address_at(constant_pool_entry) = target; 658 Memory::Address_at(constant_pool_entry) = target;
659 } 659 }
660 660
661 661
662 void Assembler::deserialization_set_target_internal_reference_at( 662 void Assembler::deserialization_set_target_internal_reference_at(
663 Address pc, Address target) { 663 Address pc, Address target) {
664 UNIMPLEMENTED(); // ARM64 does not use internal references. 664 Memory::Address_at(pc) = target;
665 } 665 }
666 666
667 667
668 void Assembler::set_target_address_at(Address pc, 668 void Assembler::set_target_address_at(Address pc,
669 ConstantPoolArray* constant_pool, 669 ConstantPoolArray* constant_pool,
670 Address target, 670 Address target,
671 ICacheFlushMode icache_flush_mode) { 671 ICacheFlushMode icache_flush_mode) {
672 Memory::Address_at(target_pointer_address_at(pc)) = target; 672 Memory::Address_at(target_pointer_address_at(pc)) = target;
673 // Intuitively, we would think it is necessary to always flush the 673 // Intuitively, we would think it is necessary to always flush the
674 // instruction cache after patching a target address in the code as follows: 674 // instruction cache after patching a target address in the code as follows:
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 745
746 746
747 Address RelocInfo::target_external_reference() { 747 Address RelocInfo::target_external_reference() {
748 DCHECK(rmode_ == EXTERNAL_REFERENCE); 748 DCHECK(rmode_ == EXTERNAL_REFERENCE);
749 return Assembler::target_address_at(pc_, host_); 749 return Assembler::target_address_at(pc_, host_);
750 } 750 }
751 751
752 752
753 Address RelocInfo::target_internal_reference() { 753 Address RelocInfo::target_internal_reference() {
754 DCHECK(rmode_ == INTERNAL_REFERENCE); 754 DCHECK(rmode_ == INTERNAL_REFERENCE);
755 UNIMPLEMENTED(); // ARM64 does not use internal references. 755 return Memory::Address_at(pc_);
756 return NULL;
757 } 756 }
758 757
759 758
760 Address RelocInfo::target_internal_reference_address() { 759 Address RelocInfo::target_internal_reference_address() {
761 DCHECK(rmode_ == INTERNAL_REFERENCE); 760 DCHECK(rmode_ == INTERNAL_REFERENCE);
762 UNIMPLEMENTED(); // ARM64 does not use internal references. 761 return reinterpret_cast<Address>(pc_);
763 return NULL;
764 } 762 }
765 763
766 764
767 Address RelocInfo::target_runtime_entry(Assembler* origin) { 765 Address RelocInfo::target_runtime_entry(Assembler* origin) {
768 DCHECK(IsRuntimeEntry(rmode_)); 766 DCHECK(IsRuntimeEntry(rmode_));
769 return target_address(); 767 return target_address();
770 } 768 }
771 769
772 770
773 void RelocInfo::set_target_runtime_entry(Address target, 771 void RelocInfo::set_target_runtime_entry(Address target,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 host(), this, HeapObject::cast(target_code)); 846 host(), this, HeapObject::cast(target_code));
849 } 847 }
850 } 848 }
851 849
852 850
853 void RelocInfo::WipeOut() { 851 void RelocInfo::WipeOut() {
854 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || 852 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
855 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || 853 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
856 IsInternalReference(rmode_)); 854 IsInternalReference(rmode_));
857 if (IsInternalReference(rmode_)) { 855 if (IsInternalReference(rmode_)) {
858 UNIMPLEMENTED(); // ARM64 does not use internal references. 856 Memory::Address_at(pc_) = NULL;
859 } else { 857 } else {
860 Assembler::set_target_address_at(pc_, host_, NULL); 858 Assembler::set_target_address_at(pc_, host_, NULL);
861 } 859 }
862 } 860 }
863 861
864 862
865 bool RelocInfo::IsPatchedReturnSequence() { 863 bool RelocInfo::IsPatchedReturnSequence() {
866 // The sequence must be: 864 // The sequence must be:
867 // ldr ip0, [pc, #offset] 865 // ldr ip0, [pc, #offset]
868 // blr ip0 866 // blr ip0
(...skipping 15 matching lines...) Expand all
884 RelocInfo::Mode mode = rmode(); 882 RelocInfo::Mode mode = rmode();
885 if (mode == RelocInfo::EMBEDDED_OBJECT) { 883 if (mode == RelocInfo::EMBEDDED_OBJECT) {
886 visitor->VisitEmbeddedPointer(this); 884 visitor->VisitEmbeddedPointer(this);
887 } else if (RelocInfo::IsCodeTarget(mode)) { 885 } else if (RelocInfo::IsCodeTarget(mode)) {
888 visitor->VisitCodeTarget(this); 886 visitor->VisitCodeTarget(this);
889 } else if (mode == RelocInfo::CELL) { 887 } else if (mode == RelocInfo::CELL) {
890 visitor->VisitCell(this); 888 visitor->VisitCell(this);
891 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 889 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
892 visitor->VisitExternalReference(this); 890 visitor->VisitExternalReference(this);
893 } else if (mode == RelocInfo::INTERNAL_REFERENCE) { 891 } else if (mode == RelocInfo::INTERNAL_REFERENCE) {
894 UNIMPLEMENTED(); // ARM64 does not use internal references. 892 visitor->VisitInternalReference(this);
895 } else if (((RelocInfo::IsJSReturn(mode) && 893 } else if (((RelocInfo::IsJSReturn(mode) &&
896 IsPatchedReturnSequence()) || 894 IsPatchedReturnSequence()) ||
897 (RelocInfo::IsDebugBreakSlot(mode) && 895 (RelocInfo::IsDebugBreakSlot(mode) &&
898 IsPatchedDebugBreakSlotSequence())) && 896 IsPatchedDebugBreakSlotSequence())) &&
899 isolate->debug()->has_break_points()) { 897 isolate->debug()->has_break_points()) {
900 visitor->VisitDebugTarget(this); 898 visitor->VisitDebugTarget(this);
901 } else if (RelocInfo::IsRuntimeEntry(mode)) { 899 } else if (RelocInfo::IsRuntimeEntry(mode)) {
902 visitor->VisitRuntimeEntry(this); 900 visitor->VisitRuntimeEntry(this);
903 } 901 }
904 } 902 }
905 903
906 904
907 template<typename StaticVisitor> 905 template<typename StaticVisitor>
908 void RelocInfo::Visit(Heap* heap) { 906 void RelocInfo::Visit(Heap* heap) {
909 RelocInfo::Mode mode = rmode(); 907 RelocInfo::Mode mode = rmode();
910 if (mode == RelocInfo::EMBEDDED_OBJECT) { 908 if (mode == RelocInfo::EMBEDDED_OBJECT) {
911 StaticVisitor::VisitEmbeddedPointer(heap, this); 909 StaticVisitor::VisitEmbeddedPointer(heap, this);
912 } else if (RelocInfo::IsCodeTarget(mode)) { 910 } else if (RelocInfo::IsCodeTarget(mode)) {
913 StaticVisitor::VisitCodeTarget(heap, this); 911 StaticVisitor::VisitCodeTarget(heap, this);
914 } else if (mode == RelocInfo::CELL) { 912 } else if (mode == RelocInfo::CELL) {
915 StaticVisitor::VisitCell(heap, this); 913 StaticVisitor::VisitCell(heap, this);
916 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 914 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
917 StaticVisitor::VisitExternalReference(this); 915 StaticVisitor::VisitExternalReference(this);
918 } else if (mode == RelocInfo::INTERNAL_REFERENCE) { 916 } else if (mode == RelocInfo::INTERNAL_REFERENCE) {
919 UNIMPLEMENTED(); // ARM64 does not use internal references. 917 StaticVisitor::VisitInternalReference(this);
920 } else if (heap->isolate()->debug()->has_break_points() && 918 } else if (heap->isolate()->debug()->has_break_points() &&
921 ((RelocInfo::IsJSReturn(mode) && 919 ((RelocInfo::IsJSReturn(mode) &&
922 IsPatchedReturnSequence()) || 920 IsPatchedReturnSequence()) ||
923 (RelocInfo::IsDebugBreakSlot(mode) && 921 (RelocInfo::IsDebugBreakSlot(mode) &&
924 IsPatchedDebugBreakSlotSequence()))) { 922 IsPatchedDebugBreakSlotSequence()))) {
925 StaticVisitor::VisitDebugTarget(heap, this); 923 StaticVisitor::VisitDebugTarget(heap, this);
926 } else if (RelocInfo::IsRuntimeEntry(mode)) { 924 } else if (RelocInfo::IsRuntimeEntry(mode)) {
927 StaticVisitor::VisitRuntimeEntry(this); 925 StaticVisitor::VisitRuntimeEntry(this);
928 } 926 }
929 } 927 }
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 1293
1296 1294
1297 void Assembler::ClearRecordedAstId() { 1295 void Assembler::ClearRecordedAstId() {
1298 recorded_ast_id_ = TypeFeedbackId::None(); 1296 recorded_ast_id_ = TypeFeedbackId::None();
1299 } 1297 }
1300 1298
1301 1299
1302 } } // namespace v8::internal 1300 } } // namespace v8::internal
1303 1301
1304 #endif // V8_ARM64_ASSEMBLER_ARM64_INL_H_ 1302 #endif // V8_ARM64_ASSEMBLER_ARM64_INL_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698