| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 // The sp is initialized to point to the bottom (high address) of the | 823 // The sp is initialized to point to the bottom (high address) of the |
| 824 // allocated stack area. To be safe in potential stack underflows we leave | 824 // allocated stack area. To be safe in potential stack underflows we leave |
| 825 // some buffer below. | 825 // some buffer below. |
| 826 registers_[sp] = reinterpret_cast<intptr_t>(stack_) + stack_size - 64; | 826 registers_[sp] = reinterpret_cast<intptr_t>(stack_) + stack_size - 64; |
| 827 InitializeCoverage(); | 827 InitializeCoverage(); |
| 828 | 828 |
| 829 last_debugger_input_ = NULL; | 829 last_debugger_input_ = NULL; |
| 830 } | 830 } |
| 831 | 831 |
| 832 | 832 |
| 833 Simulator::~Simulator() {} | 833 Simulator::~Simulator() { free(stack_); } |
| 834 | 834 |
| 835 | 835 |
| 836 // When the generated code calls an external reference we need to catch that in | 836 // When the generated code calls an external reference we need to catch that in |
| 837 // the simulator. The external reference will be a function compiled for the | 837 // the simulator. The external reference will be a function compiled for the |
| 838 // host architecture. We need to call that function instead of trying to | 838 // host architecture. We need to call that function instead of trying to |
| 839 // execute it with the simulator. We do that by redirecting the external | 839 // execute it with the simulator. We do that by redirecting the external |
| 840 // reference to a svc (Supervisor Call) instruction that is handled by | 840 // reference to a svc (Supervisor Call) instruction that is handled by |
| 841 // the simulator. We write the original destination of the jump just at a known | 841 // the simulator. We write the original destination of the jump just at a known |
| 842 // offset from the svc instruction so the simulator knows what to call. | 842 // offset from the svc instruction so the simulator knows what to call. |
| 843 class Redirection { | 843 class Redirection { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 addr_of_swi - OFFSET_OF(Redirection, swi_instruction_); | 881 addr_of_swi - OFFSET_OF(Redirection, swi_instruction_); |
| 882 return reinterpret_cast<Redirection*>(addr_of_redirection); | 882 return reinterpret_cast<Redirection*>(addr_of_redirection); |
| 883 } | 883 } |
| 884 | 884 |
| 885 static void* ReverseRedirection(intptr_t reg) { | 885 static void* ReverseRedirection(intptr_t reg) { |
| 886 Redirection* redirection = FromSwiInstruction( | 886 Redirection* redirection = FromSwiInstruction( |
| 887 reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg))); | 887 reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg))); |
| 888 return redirection->external_function(); | 888 return redirection->external_function(); |
| 889 } | 889 } |
| 890 | 890 |
| 891 static void DeleteChain(Redirection* redirection) { |
| 892 while (redirection != nullptr) { |
| 893 Redirection* next = redirection->next_; |
| 894 delete redirection; |
| 895 redirection = next; |
| 896 } |
| 897 } |
| 898 |
| 891 private: | 899 private: |
| 892 void* external_function_; | 900 void* external_function_; |
| 893 uint32_t swi_instruction_; | 901 uint32_t swi_instruction_; |
| 894 ExternalReference::Type type_; | 902 ExternalReference::Type type_; |
| 895 Redirection* next_; | 903 Redirection* next_; |
| 896 }; | 904 }; |
| 897 | 905 |
| 898 | 906 |
| 907 // static |
| 908 void Simulator::TearDown(HashMap* i_cache, Redirection* first) { |
| 909 Redirection::DeleteChain(first); |
| 910 if (i_cache != nullptr) { |
| 911 for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr; |
| 912 entry = i_cache->Next(entry)) { |
| 913 delete static_cast<CachePage*>(entry->value); |
| 914 } |
| 915 delete i_cache; |
| 916 } |
| 917 } |
| 918 |
| 919 |
| 899 void* Simulator::RedirectExternalReference(void* external_function, | 920 void* Simulator::RedirectExternalReference(void* external_function, |
| 900 ExternalReference::Type type) { | 921 ExternalReference::Type type) { |
| 901 Redirection* redirection = Redirection::Get(external_function, type); | 922 Redirection* redirection = Redirection::Get(external_function, type); |
| 902 return redirection->address_of_swi_instruction(); | 923 return redirection->address_of_swi_instruction(); |
| 903 } | 924 } |
| 904 | 925 |
| 905 | 926 |
| 906 // Get the active Simulator for the current thread. | 927 // Get the active Simulator for the current thread. |
| 907 Simulator* Simulator::current(Isolate* isolate) { | 928 Simulator* Simulator::current(Isolate* isolate) { |
| 908 v8::internal::Isolate::PerIsolateThreadData* isolate_data = | 929 v8::internal::Isolate::PerIsolateThreadData* isolate_data = |
| (...skipping 2966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3875 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); | 3896 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); |
| 3876 uintptr_t address = *stack_slot; | 3897 uintptr_t address = *stack_slot; |
| 3877 set_register(sp, current_sp + sizeof(uintptr_t)); | 3898 set_register(sp, current_sp + sizeof(uintptr_t)); |
| 3878 return address; | 3899 return address; |
| 3879 } | 3900 } |
| 3880 } | 3901 } |
| 3881 } // namespace v8::internal | 3902 } // namespace v8::internal |
| 3882 | 3903 |
| 3883 #endif // USE_SIMULATOR | 3904 #endif // USE_SIMULATOR |
| 3884 #endif // V8_TARGET_ARCH_PPC | 3905 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |