OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #include <stdarg.h> | 5 #include <stdarg.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 // The lr and pc are initialized to a known bad value that will cause an | 767 // The lr and pc are initialized to a known bad value that will cause an |
768 // access violation if the simulator ever tries to execute it. | 768 // access violation if the simulator ever tries to execute it. |
769 registers_[pc] = bad_lr; | 769 registers_[pc] = bad_lr; |
770 registers_[lr] = bad_lr; | 770 registers_[lr] = bad_lr; |
771 InitializeCoverage(); | 771 InitializeCoverage(); |
772 | 772 |
773 last_debugger_input_ = NULL; | 773 last_debugger_input_ = NULL; |
774 } | 774 } |
775 | 775 |
776 | 776 |
777 Simulator::~Simulator() { | 777 Simulator::~Simulator() { free(stack_); } |
778 } | |
779 | 778 |
780 | 779 |
781 // When the generated code calls an external reference we need to catch that in | 780 // When the generated code calls an external reference we need to catch that in |
782 // the simulator. The external reference will be a function compiled for the | 781 // the simulator. The external reference will be a function compiled for the |
783 // host architecture. We need to call that function instead of trying to | 782 // host architecture. We need to call that function instead of trying to |
784 // execute it with the simulator. We do that by redirecting the external | 783 // execute it with the simulator. We do that by redirecting the external |
785 // reference to a svc (Supervisor Call) instruction that is handled by | 784 // reference to a svc (Supervisor Call) instruction that is handled by |
786 // the simulator. We write the original destination of the jump just at a known | 785 // the simulator. We write the original destination of the jump just at a known |
787 // offset from the svc instruction so the simulator knows what to call. | 786 // offset from the svc instruction so the simulator knows what to call. |
788 class Redirection { | 787 class Redirection { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 addr_of_swi - OFFSET_OF(Redirection, swi_instruction_); | 826 addr_of_swi - OFFSET_OF(Redirection, swi_instruction_); |
828 return reinterpret_cast<Redirection*>(addr_of_redirection); | 827 return reinterpret_cast<Redirection*>(addr_of_redirection); |
829 } | 828 } |
830 | 829 |
831 static void* ReverseRedirection(int32_t reg) { | 830 static void* ReverseRedirection(int32_t reg) { |
832 Redirection* redirection = FromSwiInstruction( | 831 Redirection* redirection = FromSwiInstruction( |
833 reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg))); | 832 reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg))); |
834 return redirection->external_function(); | 833 return redirection->external_function(); |
835 } | 834 } |
836 | 835 |
| 836 static void DeleteChain(Redirection* redirection) { |
| 837 while (redirection != nullptr) { |
| 838 Redirection* next = redirection->next_; |
| 839 delete redirection; |
| 840 redirection = next; |
| 841 } |
| 842 } |
| 843 |
837 private: | 844 private: |
838 void* external_function_; | 845 void* external_function_; |
839 uint32_t swi_instruction_; | 846 uint32_t swi_instruction_; |
840 ExternalReference::Type type_; | 847 ExternalReference::Type type_; |
841 Redirection* next_; | 848 Redirection* next_; |
842 }; | 849 }; |
843 | 850 |
844 | 851 |
| 852 // static |
| 853 void Simulator::TearDown(HashMap* i_cache, Redirection* first) { |
| 854 Redirection::DeleteChain(first); |
| 855 if (i_cache != nullptr) { |
| 856 for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr; |
| 857 entry = i_cache->Next(entry)) { |
| 858 delete static_cast<CachePage*>(entry->value); |
| 859 } |
| 860 delete i_cache; |
| 861 } |
| 862 } |
| 863 |
| 864 |
845 void* Simulator::RedirectExternalReference(void* external_function, | 865 void* Simulator::RedirectExternalReference(void* external_function, |
846 ExternalReference::Type type) { | 866 ExternalReference::Type type) { |
847 Redirection* redirection = Redirection::Get(external_function, type); | 867 Redirection* redirection = Redirection::Get(external_function, type); |
848 return redirection->address_of_swi_instruction(); | 868 return redirection->address_of_swi_instruction(); |
849 } | 869 } |
850 | 870 |
851 | 871 |
852 // Get the active Simulator for the current thread. | 872 // Get the active Simulator for the current thread. |
853 Simulator* Simulator::current(Isolate* isolate) { | 873 Simulator* Simulator::current(Isolate* isolate) { |
854 v8::internal::Isolate::PerIsolateThreadData* isolate_data = | 874 v8::internal::Isolate::PerIsolateThreadData* isolate_data = |
(...skipping 3274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4129 uintptr_t address = *stack_slot; | 4149 uintptr_t address = *stack_slot; |
4130 set_register(sp, current_sp + sizeof(uintptr_t)); | 4150 set_register(sp, current_sp + sizeof(uintptr_t)); |
4131 return address; | 4151 return address; |
4132 } | 4152 } |
4133 | 4153 |
4134 } } // namespace v8::internal | 4154 } } // namespace v8::internal |
4135 | 4155 |
4136 #endif // USE_SIMULATOR | 4156 #endif // USE_SIMULATOR |
4137 | 4157 |
4138 #endif // V8_TARGET_ARCH_ARM | 4158 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |