OLD | NEW |
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_H_ | 5 #ifndef V8_ARM64_ASSEMBLER_ARM64_H_ |
6 #define V8_ARM64_ASSEMBLER_ARM64_H_ | 6 #define V8_ARM64_ASSEMBLER_ARM64_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 FLUSH_ICACHE_IF_NEEDED); | 886 FLUSH_ICACHE_IF_NEEDED); |
887 | 887 |
888 // Return the code target address at a call site from the return address of | 888 // Return the code target address at a call site from the return address of |
889 // that call in the instruction stream. | 889 // that call in the instruction stream. |
890 inline static Address target_address_from_return_address(Address pc); | 890 inline static Address target_address_from_return_address(Address pc); |
891 | 891 |
892 // Given the address of the beginning of a call, return the address in the | 892 // Given the address of the beginning of a call, return the address in the |
893 // instruction stream that call will return from. | 893 // instruction stream that call will return from. |
894 inline static Address return_address_from_call_start(Address pc); | 894 inline static Address return_address_from_call_start(Address pc); |
895 | 895 |
896 // Return the code target address of the patch debug break slot | |
897 inline static Address break_address_from_return_address(Address pc); | |
898 | |
899 // This sets the branch destination (which is in the constant pool on ARM). | 896 // This sets the branch destination (which is in the constant pool on ARM). |
900 // This is for calls and branches within generated code. | 897 // This is for calls and branches within generated code. |
901 inline static void deserialization_set_special_target_at( | 898 inline static void deserialization_set_special_target_at( |
902 Address constant_pool_entry, Code* code, Address target); | 899 Address constant_pool_entry, Code* code, Address target); |
903 | 900 |
904 // This sets the internal reference at the pc. | 901 // This sets the internal reference at the pc. |
905 inline static void deserialization_set_target_internal_reference_at( | 902 inline static void deserialization_set_target_internal_reference_at( |
906 Address pc, Address target, | 903 Address pc, Address target, |
907 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); | 904 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); |
908 | 905 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 DCHECK(size >= 0); | 945 DCHECK(size >= 0); |
949 DCHECK(static_cast<uint64_t>(size) == SizeOfCodeGeneratedSince(label)); | 946 DCHECK(static_cast<uint64_t>(size) == SizeOfCodeGeneratedSince(label)); |
950 } | 947 } |
951 | 948 |
952 // Return the number of instructions generated from label to the | 949 // Return the number of instructions generated from label to the |
953 // current position. | 950 // current position. |
954 uint64_t InstructionsGeneratedSince(const Label* label) { | 951 uint64_t InstructionsGeneratedSince(const Label* label) { |
955 return SizeOfCodeGeneratedSince(label) / kInstructionSize; | 952 return SizeOfCodeGeneratedSince(label) / kInstructionSize; |
956 } | 953 } |
957 | 954 |
958 // Number of instructions generated for the return sequence in | |
959 // FullCodeGenerator::EmitReturnSequence. | |
960 static const int kJSReturnSequenceInstructions = 7; | |
961 static const int kJSReturnSequenceLength = | |
962 kJSReturnSequenceInstructions * kInstructionSize; | |
963 // Distance between start of patched return sequence and the emitted address | |
964 // to jump to. | |
965 static const int kPatchReturnSequenceAddressOffset = 0; | |
966 static const int kPatchDebugBreakSlotAddressOffset = 0; | 955 static const int kPatchDebugBreakSlotAddressOffset = 0; |
967 | 956 |
968 // Number of instructions necessary to be able to later patch it to a call. | 957 // Number of instructions necessary to be able to later patch it to a call. |
969 // See DebugCodegen::GenerateSlot() and | 958 static const int kDebugBreakSlotInstructions = 5; |
970 // BreakLocation::SetDebugBreakAtSlot(). | |
971 static const int kDebugBreakSlotInstructions = 4; | |
972 static const int kDebugBreakSlotLength = | 959 static const int kDebugBreakSlotLength = |
973 kDebugBreakSlotInstructions * kInstructionSize; | 960 kDebugBreakSlotInstructions * kInstructionSize; |
974 | 961 |
975 static const int kPatchDebugBreakSlotReturnOffset = 2 * kInstructionSize; | |
976 | |
977 // Prevent contant pool emission until EndBlockConstPool is called. | 962 // Prevent contant pool emission until EndBlockConstPool is called. |
978 // Call to this function can be nested but must be followed by an equal | 963 // Call to this function can be nested but must be followed by an equal |
979 // number of call to EndBlockConstpool. | 964 // number of call to EndBlockConstpool. |
980 void StartBlockConstPool(); | 965 void StartBlockConstPool(); |
981 | 966 |
982 // Resume constant pool emission. Need to be called as many time as | 967 // Resume constant pool emission. Need to be called as many time as |
983 // StartBlockConstPool to have an effect. | 968 // StartBlockConstPool to have an effect. |
984 void EndBlockConstPool(); | 969 void EndBlockConstPool(); |
985 | 970 |
986 bool is_const_pool_blocked() const; | 971 bool is_const_pool_blocked() const; |
(...skipping 28 matching lines...) Expand all Loading... |
1015 // Debugging ---------------------------------------------------------------- | 1000 // Debugging ---------------------------------------------------------------- |
1016 PositionsRecorder* positions_recorder() { return &positions_recorder_; } | 1001 PositionsRecorder* positions_recorder() { return &positions_recorder_; } |
1017 void RecordComment(const char* msg); | 1002 void RecordComment(const char* msg); |
1018 | 1003 |
1019 // Record a deoptimization reason that can be used by a log or cpu profiler. | 1004 // Record a deoptimization reason that can be used by a log or cpu profiler. |
1020 // Use --trace-deopt to enable. | 1005 // Use --trace-deopt to enable. |
1021 void RecordDeoptReason(const int reason, const SourcePosition position); | 1006 void RecordDeoptReason(const int reason, const SourcePosition position); |
1022 | 1007 |
1023 int buffer_space() const; | 1008 int buffer_space() const; |
1024 | 1009 |
1025 // Mark address of the ExitJSFrame code. | |
1026 void RecordJSReturn(); | |
1027 | |
1028 // Mark generator continuation. | 1010 // Mark generator continuation. |
1029 void RecordGeneratorContinuation(); | 1011 void RecordGeneratorContinuation(); |
1030 | 1012 |
1031 // Mark address of a debug break slot. | 1013 // Mark address of a debug break slot. |
1032 void RecordDebugBreakSlot(); | 1014 void RecordDebugBreakSlot(RelocInfo::Mode mode, int argc = 0); |
1033 void RecordDebugBreakSlotForCall(int argc); | |
1034 void RecordDebugBreakSlotForConstructCall(); | |
1035 | 1015 |
1036 // Record the emission of a constant pool. | 1016 // Record the emission of a constant pool. |
1037 // | 1017 // |
1038 // The emission of constant and veneer pools depends on the size of the code | 1018 // The emission of constant and veneer pools depends on the size of the code |
1039 // generated and the number of RelocInfo recorded. | 1019 // generated and the number of RelocInfo recorded. |
1040 // The Debug mechanism needs to map code offsets between two versions of a | 1020 // The Debug mechanism needs to map code offsets between two versions of a |
1041 // function, compiled with and without debugger support (see for example | 1021 // function, compiled with and without debugger support (see for example |
1042 // Debug::PrepareForBreakPoints()). | 1022 // Debug::PrepareForBreakPoints()). |
1043 // Compiling functions with debugger support generates additional code | 1023 // Compiling functions with debugger support generates additional code |
1044 // (DebugCodegen::GenerateSlot()). This may affect the emission of the pools | 1024 // (DebugCodegen::GenerateSlot()). This may affect the emission of the pools |
(...skipping 1283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 class EnsureSpace BASE_EMBEDDED { | 2308 class EnsureSpace BASE_EMBEDDED { |
2329 public: | 2309 public: |
2330 explicit EnsureSpace(Assembler* assembler) { | 2310 explicit EnsureSpace(Assembler* assembler) { |
2331 assembler->CheckBufferSpace(); | 2311 assembler->CheckBufferSpace(); |
2332 } | 2312 } |
2333 }; | 2313 }; |
2334 | 2314 |
2335 } } // namespace v8::internal | 2315 } } // namespace v8::internal |
2336 | 2316 |
2337 #endif // V8_ARM64_ASSEMBLER_ARM64_H_ | 2317 #endif // V8_ARM64_ASSEMBLER_ARM64_H_ |
OLD | NEW |