OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 <limits.h> | 5 #include <limits.h> |
6 #include <stdarg.h> | 6 #include <stdarg.h> |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #if V8_TARGET_ARCH_MIPS64 | 10 #if V8_TARGET_ARCH_MIPS64 |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 words = 10; | 512 words = 10; |
513 } | 513 } |
514 } | 514 } |
515 end = cur + words; | 515 end = cur + words; |
516 | 516 |
517 while (cur < end) { | 517 while (cur < end) { |
518 PrintF(" 0x%012lx: 0x%016lx %14ld", | 518 PrintF(" 0x%012lx: 0x%016lx %14ld", |
519 reinterpret_cast<intptr_t>(cur), *cur, *cur); | 519 reinterpret_cast<intptr_t>(cur), *cur, *cur); |
520 HeapObject* obj = reinterpret_cast<HeapObject*>(*cur); | 520 HeapObject* obj = reinterpret_cast<HeapObject*>(*cur); |
521 int64_t value = *cur; | 521 int64_t value = *cur; |
522 Heap* current_heap = v8::internal::Isolate::Current()->heap(); | 522 Heap* current_heap = sim_->isolate_->heap(); |
523 if (((value & 1) == 0) || current_heap->Contains(obj)) { | 523 if (((value & 1) == 0) || current_heap->Contains(obj)) { |
524 PrintF(" ("); | 524 PrintF(" ("); |
525 if ((value & 1) == 0) { | 525 if ((value & 1) == 0) { |
526 PrintF("smi %d", static_cast<int>(value >> 32)); | 526 PrintF("smi %d", static_cast<int>(value >> 32)); |
527 } else { | 527 } else { |
528 obj->ShortPrint(); | 528 obj->ShortPrint(); |
529 } | 529 } |
530 PrintF(")"); | 530 PrintF(")"); |
531 } | 531 } |
532 PrintF("\n"); | 532 PrintF("\n"); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 | 919 |
920 // When the generated code calls an external reference we need to catch that in | 920 // When the generated code calls an external reference we need to catch that in |
921 // the simulator. The external reference will be a function compiled for the | 921 // the simulator. The external reference will be a function compiled for the |
922 // host architecture. We need to call that function instead of trying to | 922 // host architecture. We need to call that function instead of trying to |
923 // execute it with the simulator. We do that by redirecting the external | 923 // execute it with the simulator. We do that by redirecting the external |
924 // reference to a swi (software-interrupt) instruction that is handled by | 924 // reference to a swi (software-interrupt) instruction that is handled by |
925 // the simulator. We write the original destination of the jump just at a known | 925 // the simulator. We write the original destination of the jump just at a known |
926 // offset from the swi instruction so the simulator knows what to call. | 926 // offset from the swi instruction so the simulator knows what to call. |
927 class Redirection { | 927 class Redirection { |
928 public: | 928 public: |
929 Redirection(void* external_function, ExternalReference::Type type) | 929 Redirection(Isolate* isolate, void* external_function, |
| 930 ExternalReference::Type type) |
930 : external_function_(external_function), | 931 : external_function_(external_function), |
931 swi_instruction_(rtCallRedirInstr), | 932 swi_instruction_(rtCallRedirInstr), |
932 type_(type), | 933 type_(type), |
933 next_(NULL) { | 934 next_(NULL) { |
934 Isolate* isolate = Isolate::Current(); | |
935 next_ = isolate->simulator_redirection(); | 935 next_ = isolate->simulator_redirection(); |
936 Simulator::current(isolate)-> | 936 Simulator::current(isolate)-> |
937 FlushICache(isolate->simulator_i_cache(), | 937 FlushICache(isolate->simulator_i_cache(), |
938 reinterpret_cast<void*>(&swi_instruction_), | 938 reinterpret_cast<void*>(&swi_instruction_), |
939 Instruction::kInstrSize); | 939 Instruction::kInstrSize); |
940 isolate->set_simulator_redirection(this); | 940 isolate->set_simulator_redirection(this); |
941 } | 941 } |
942 | 942 |
943 void* address_of_swi_instruction() { | 943 void* address_of_swi_instruction() { |
944 return reinterpret_cast<void*>(&swi_instruction_); | 944 return reinterpret_cast<void*>(&swi_instruction_); |
945 } | 945 } |
946 | 946 |
947 void* external_function() { return external_function_; } | 947 void* external_function() { return external_function_; } |
948 ExternalReference::Type type() { return type_; } | 948 ExternalReference::Type type() { return type_; } |
949 | 949 |
950 static Redirection* Get(void* external_function, | 950 static Redirection* Get(Isolate* isolate, void* external_function, |
951 ExternalReference::Type type) { | 951 ExternalReference::Type type) { |
952 Isolate* isolate = Isolate::Current(); | |
953 Redirection* current = isolate->simulator_redirection(); | 952 Redirection* current = isolate->simulator_redirection(); |
954 for (; current != NULL; current = current->next_) { | 953 for (; current != NULL; current = current->next_) { |
955 if (current->external_function_ == external_function) return current; | 954 if (current->external_function_ == external_function) return current; |
956 } | 955 } |
957 return new Redirection(external_function, type); | 956 return new Redirection(isolate, external_function, type); |
958 } | 957 } |
959 | 958 |
960 static Redirection* FromSwiInstruction(Instruction* swi_instruction) { | 959 static Redirection* FromSwiInstruction(Instruction* swi_instruction) { |
961 char* addr_of_swi = reinterpret_cast<char*>(swi_instruction); | 960 char* addr_of_swi = reinterpret_cast<char*>(swi_instruction); |
962 char* addr_of_redirection = | 961 char* addr_of_redirection = |
963 addr_of_swi - offsetof(Redirection, swi_instruction_); | 962 addr_of_swi - offsetof(Redirection, swi_instruction_); |
964 return reinterpret_cast<Redirection*>(addr_of_redirection); | 963 return reinterpret_cast<Redirection*>(addr_of_redirection); |
965 } | 964 } |
966 | 965 |
967 static void* ReverseRedirection(int64_t reg) { | 966 static void* ReverseRedirection(int64_t reg) { |
(...skipping 24 matching lines...) Expand all Loading... |
992 if (i_cache != nullptr) { | 991 if (i_cache != nullptr) { |
993 for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr; | 992 for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr; |
994 entry = i_cache->Next(entry)) { | 993 entry = i_cache->Next(entry)) { |
995 delete static_cast<CachePage*>(entry->value); | 994 delete static_cast<CachePage*>(entry->value); |
996 } | 995 } |
997 delete i_cache; | 996 delete i_cache; |
998 } | 997 } |
999 } | 998 } |
1000 | 999 |
1001 | 1000 |
1002 void* Simulator::RedirectExternalReference(void* external_function, | 1001 void* Simulator::RedirectExternalReference(Isolate* isolate, |
| 1002 void* external_function, |
1003 ExternalReference::Type type) { | 1003 ExternalReference::Type type) { |
1004 Redirection* redirection = Redirection::Get(external_function, type); | 1004 Redirection* redirection = Redirection::Get(isolate, external_function, type); |
1005 return redirection->address_of_swi_instruction(); | 1005 return redirection->address_of_swi_instruction(); |
1006 } | 1006 } |
1007 | 1007 |
1008 | 1008 |
1009 // Get the active Simulator for the current thread. | 1009 // Get the active Simulator for the current thread. |
1010 Simulator* Simulator::current(Isolate* isolate) { | 1010 Simulator* Simulator::current(Isolate* isolate) { |
1011 v8::internal::Isolate::PerIsolateThreadData* isolate_data = | 1011 v8::internal::Isolate::PerIsolateThreadData* isolate_data = |
1012 isolate->FindOrAllocatePerThreadDataForThisThread(); | 1012 isolate->FindOrAllocatePerThreadDataForThisThread(); |
1013 DCHECK(isolate_data != NULL); | 1013 DCHECK(isolate_data != NULL); |
1014 DCHECK(isolate_data != NULL); | 1014 DCHECK(isolate_data != NULL); |
(...skipping 3553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4568 } | 4568 } |
4569 | 4569 |
4570 | 4570 |
4571 #undef UNSUPPORTED | 4571 #undef UNSUPPORTED |
4572 } // namespace internal | 4572 } // namespace internal |
4573 } // namespace v8 | 4573 } // namespace v8 |
4574 | 4574 |
4575 #endif // USE_SIMULATOR | 4575 #endif // USE_SIMULATOR |
4576 | 4576 |
4577 #endif // V8_TARGET_ARCH_MIPS64 | 4577 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |