OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <setjmp.h> | 5 #include <setjmp.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 | 7 |
8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
9 #if defined(TARGET_ARCH_ARM) | 9 #if defined(TARGET_ARCH_ARM) |
10 | 10 |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 return new Redirection(external_function, call_kind, argument_count); | 779 return new Redirection(external_function, call_kind, argument_count); |
780 } | 780 } |
781 | 781 |
782 static Redirection* FromSvcInstruction(Instr* svc_instruction) { | 782 static Redirection* FromSvcInstruction(Instr* svc_instruction) { |
783 char* addr_of_svc = reinterpret_cast<char*>(svc_instruction); | 783 char* addr_of_svc = reinterpret_cast<char*>(svc_instruction); |
784 char* addr_of_redirection = | 784 char* addr_of_redirection = |
785 addr_of_svc - OFFSET_OF(Redirection, svc_instruction_); | 785 addr_of_svc - OFFSET_OF(Redirection, svc_instruction_); |
786 return reinterpret_cast<Redirection*>(addr_of_redirection); | 786 return reinterpret_cast<Redirection*>(addr_of_redirection); |
787 } | 787 } |
788 | 788 |
| 789 static uword FunctionForRedirect(uword address_of_svc) { |
| 790 Redirection* current; |
| 791 for (current = list_; current != NULL; current = current->next_) { |
| 792 if (current->address_of_svc_instruction() == address_of_svc) { |
| 793 return current->external_function_; |
| 794 } |
| 795 } |
| 796 return 0; |
| 797 } |
| 798 |
789 private: | 799 private: |
790 static const int32_t kRedirectSvcInstruction = | 800 static const int32_t kRedirectSvcInstruction = |
791 ((AL << kConditionShift) | (0xf << 24) | kRedirectionSvcCode); | 801 ((AL << kConditionShift) | (0xf << 24) | kRedirectionSvcCode); |
792 Redirection(uword external_function, | 802 Redirection(uword external_function, |
793 Simulator::CallKind call_kind, | 803 Simulator::CallKind call_kind, |
794 int argument_count) | 804 int argument_count) |
795 : external_function_(external_function), | 805 : external_function_(external_function), |
796 call_kind_(call_kind), | 806 call_kind_(call_kind), |
797 argument_count_(argument_count), | 807 argument_count_(argument_count), |
798 svc_instruction_(kRedirectSvcInstruction), | 808 svc_instruction_(kRedirectSvcInstruction), |
(...skipping 15 matching lines...) Expand all Loading... |
814 | 824 |
815 uword Simulator::RedirectExternalReference(uword function, | 825 uword Simulator::RedirectExternalReference(uword function, |
816 CallKind call_kind, | 826 CallKind call_kind, |
817 int argument_count) { | 827 int argument_count) { |
818 Redirection* redirection = | 828 Redirection* redirection = |
819 Redirection::Get(function, call_kind, argument_count); | 829 Redirection::Get(function, call_kind, argument_count); |
820 return redirection->address_of_svc_instruction(); | 830 return redirection->address_of_svc_instruction(); |
821 } | 831 } |
822 | 832 |
823 | 833 |
| 834 uword Simulator::FunctionForRedirect(uword redirect) { |
| 835 return Redirection::FunctionForRedirect(redirect); |
| 836 } |
| 837 |
| 838 |
824 // Get the active Simulator for the current isolate. | 839 // Get the active Simulator for the current isolate. |
825 Simulator* Simulator::Current() { | 840 Simulator* Simulator::Current() { |
826 Simulator* simulator = Isolate::Current()->simulator(); | 841 Simulator* simulator = Isolate::Current()->simulator(); |
827 if (simulator == NULL) { | 842 if (simulator == NULL) { |
828 simulator = new Simulator(); | 843 simulator = new Simulator(); |
829 Isolate::Current()->set_simulator(simulator); | 844 Isolate::Current()->set_simulator(simulator); |
830 } | 845 } |
831 return simulator; | 846 return simulator; |
832 } | 847 } |
833 | 848 |
(...skipping 3036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3870 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 3885 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
3871 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 3886 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
3872 buf->Longjmp(); | 3887 buf->Longjmp(); |
3873 } | 3888 } |
3874 | 3889 |
3875 } // namespace dart | 3890 } // namespace dart |
3876 | 3891 |
3877 #endif // !defined(HOST_ARCH_ARM) | 3892 #endif // !defined(HOST_ARCH_ARM) |
3878 | 3893 |
3879 #endif // defined TARGET_ARCH_ARM | 3894 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |