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 #ifndef V8_CALL_INTERFACE_DESCRIPTOR_H_ | 5 #ifndef V8_CALL_INTERFACE_DESCRIPTOR_H_ |
6 #define V8_CALL_INTERFACE_DESCRIPTOR_H_ | 6 #define V8_CALL_INTERFACE_DESCRIPTOR_H_ |
7 | 7 |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 V(Compare) \ | 60 V(Compare) \ |
61 V(ToBoolean) \ | 61 V(ToBoolean) \ |
62 V(BinaryOp) \ | 62 V(BinaryOp) \ |
63 V(BinaryOpWithAllocationSite) \ | 63 V(BinaryOpWithAllocationSite) \ |
64 V(StringAdd) \ | 64 V(StringAdd) \ |
65 V(StringCompare) \ | 65 V(StringCompare) \ |
66 V(Keyed) \ | 66 V(Keyed) \ |
67 V(Named) \ | 67 V(Named) \ |
68 V(CallHandler) \ | 68 V(CallHandler) \ |
69 V(ArgumentAdaptor) \ | 69 V(ArgumentAdaptor) \ |
70 V(ApiFunction) \ | 70 V(ApiCallbackWith0Args) \ |
71 V(ApiAccessor) \ | 71 V(ApiCallbackWith1Args) \ |
| 72 V(ApiCallbackWith2Args) \ |
| 73 V(ApiCallbackWith3Args) \ |
| 74 V(ApiCallbackWith4Args) \ |
| 75 V(ApiCallbackWith5Args) \ |
| 76 V(ApiCallbackWith6Args) \ |
| 77 V(ApiCallbackWith7Args) \ |
72 V(ApiGetter) \ | 78 V(ApiGetter) \ |
73 V(LoadGlobalViaContext) \ | 79 V(LoadGlobalViaContext) \ |
74 V(StoreGlobalViaContext) \ | 80 V(StoreGlobalViaContext) \ |
75 V(MathPowTagged) \ | 81 V(MathPowTagged) \ |
76 V(MathPowInteger) \ | 82 V(MathPowInteger) \ |
77 V(ContextOnly) \ | 83 V(ContextOnly) \ |
78 V(GrowArrayElements) \ | 84 V(GrowArrayElements) \ |
79 V(InterpreterDispatch) \ | 85 V(InterpreterDispatch) \ |
80 V(InterpreterPushArgsAndCall) \ | 86 V(InterpreterPushArgsAndCall) \ |
81 V(InterpreterPushArgsAndConstruct) \ | 87 V(InterpreterPushArgsAndConstruct) \ |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 return BuildDefaultFunctionType(isolate, register_param_count); | 198 return BuildDefaultFunctionType(isolate, register_param_count); |
193 } | 199 } |
194 | 200 |
195 virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) { | 201 virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) { |
196 UNREACHABLE(); | 202 UNREACHABLE(); |
197 } | 203 } |
198 | 204 |
199 void Initialize(Isolate* isolate, CallDescriptors::Key key) { | 205 void Initialize(Isolate* isolate, CallDescriptors::Key key) { |
200 if (!data()->IsInitialized()) { | 206 if (!data()->IsInitialized()) { |
201 CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key); | 207 CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key); |
| 208 DCHECK(d == data()); // d should be a modifiable pointer to data(). |
202 InitializePlatformSpecific(d); | 209 InitializePlatformSpecific(d); |
203 FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType( | 210 FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType( |
204 isolate, d->register_param_count()); | 211 isolate, d->register_param_count()); |
205 d->InitializePlatformIndependent(function_type); | 212 d->InitializePlatformIndependent(function_type); |
206 } | 213 } |
207 } | 214 } |
208 | 215 |
209 private: | 216 private: |
210 const CallInterfaceDescriptorData* data_; | 217 const CallInterfaceDescriptorData* data_; |
211 }; | 218 }; |
212 | 219 |
| 220 #define DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ |
| 221 public: \ |
| 222 explicit name(Isolate* isolate) : base(isolate, key()) { \ |
| 223 Initialize(isolate, key()); \ |
| 224 } \ |
| 225 static inline CallDescriptors::Key key(); |
213 | 226 |
214 #define DECLARE_DESCRIPTOR(name, base) \ | 227 #define DECLARE_DESCRIPTOR(name, base) \ |
215 explicit name(Isolate* isolate) : base(isolate, key()) { \ | 228 DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ |
216 Initialize(isolate, key()); \ | |
217 } \ | |
218 \ | |
219 protected: \ | 229 protected: \ |
220 void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \ | 230 void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \ |
221 name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \ | 231 name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \ |
222 \ | 232 \ |
223 public: \ | 233 public: |
224 static inline CallDescriptors::Key key(); | |
225 | 234 |
226 #define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \ | 235 #define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \ |
227 DECLARE_DESCRIPTOR(name, base) \ | 236 DECLARE_DESCRIPTOR(name, base) \ |
228 protected: \ | 237 protected: \ |
229 FunctionType* BuildCallInterfaceDescriptorFunctionType( \ | 238 FunctionType* BuildCallInterfaceDescriptorFunctionType( \ |
230 Isolate* isolate, int register_param_count) override; \ | 239 Isolate* isolate, int register_param_count) override; \ |
231 \ | 240 \ |
232 public: | 241 public: |
233 | 242 |
| 243 #define DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(name, base, arg) \ |
| 244 DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ |
| 245 protected: \ |
| 246 FunctionType* BuildCallInterfaceDescriptorFunctionType( \ |
| 247 Isolate* isolate, int register_param_count) override { \ |
| 248 return BuildCallInterfaceDescriptorFunctionTypeWithArg( \ |
| 249 isolate, register_param_count, arg); \ |
| 250 } \ |
| 251 \ |
| 252 public: |
| 253 |
234 class VoidDescriptor : public CallInterfaceDescriptor { | 254 class VoidDescriptor : public CallInterfaceDescriptor { |
235 public: | 255 public: |
236 DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor) | 256 DECLARE_DESCRIPTOR(VoidDescriptor, CallInterfaceDescriptor) |
237 }; | 257 }; |
238 | 258 |
239 | 259 |
240 // LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs. | 260 // LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs. |
241 class LoadDescriptor : public CallInterfaceDescriptor { | 261 class LoadDescriptor : public CallInterfaceDescriptor { |
242 public: | 262 public: |
243 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor, | 263 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(LoadDescriptor, |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 DECLARE_DESCRIPTOR(CallHandlerDescriptor, CallInterfaceDescriptor) | 702 DECLARE_DESCRIPTOR(CallHandlerDescriptor, CallInterfaceDescriptor) |
683 }; | 703 }; |
684 | 704 |
685 | 705 |
686 class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor { | 706 class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor { |
687 public: | 707 public: |
688 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor, | 708 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ArgumentAdaptorDescriptor, |
689 CallInterfaceDescriptor) | 709 CallInterfaceDescriptor) |
690 }; | 710 }; |
691 | 711 |
| 712 // The ApiCallback*Descriptors have a lot of boilerplate. The superclass |
| 713 // ApiCallbackDescriptorBase contains all the logic, and the |
| 714 // ApiCallbackWith*ArgsDescriptor merely instantiate these with a |
| 715 // parameter for the number of args. |
| 716 // |
| 717 // The base class is not meant to be instantiated directly and has no |
| 718 // public constructors to ensure this is so. |
| 719 // |
| 720 // The simplest usage for all the ApiCallback*Descriptors is probably |
| 721 // ApiCallbackDescriptorBase::ForArgs(isolate, argc) |
| 722 // |
| 723 class ApiCallbackDescriptorBase : public CallInterfaceDescriptor { |
| 724 public: |
| 725 static CallInterfaceDescriptor ForArgs(Isolate* isolate, int argc); |
692 | 726 |
693 class ApiFunctionDescriptor : public CallInterfaceDescriptor { | 727 protected: |
| 728 ApiCallbackDescriptorBase(Isolate* isolate, CallDescriptors::Key key) |
| 729 : CallInterfaceDescriptor(isolate, key) {} |
| 730 void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; |
| 731 FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg( |
| 732 Isolate* isolate, int parameter_count, int argc); |
| 733 }; |
| 734 |
| 735 class ApiCallbackWith0ArgsDescriptor : public ApiCallbackDescriptorBase { |
694 public: | 736 public: |
695 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiFunctionDescriptor, | 737 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
696 CallInterfaceDescriptor) | 738 ApiCallbackWith0ArgsDescriptor, ApiCallbackDescriptorBase, 0) |
| 739 }; |
| 740 |
| 741 class ApiCallbackWith1ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 742 public: |
| 743 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 744 ApiCallbackWith1ArgsDescriptor, ApiCallbackDescriptorBase, 1) |
| 745 }; |
| 746 |
| 747 class ApiCallbackWith2ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 748 public: |
| 749 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 750 ApiCallbackWith2ArgsDescriptor, ApiCallbackDescriptorBase, 2) |
| 751 }; |
| 752 |
| 753 class ApiCallbackWith3ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 754 public: |
| 755 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 756 ApiCallbackWith3ArgsDescriptor, ApiCallbackDescriptorBase, 3) |
| 757 }; |
| 758 |
| 759 class ApiCallbackWith4ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 760 public: |
| 761 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 762 ApiCallbackWith4ArgsDescriptor, ApiCallbackDescriptorBase, 4) |
| 763 }; |
| 764 |
| 765 class ApiCallbackWith5ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 766 public: |
| 767 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 768 ApiCallbackWith5ArgsDescriptor, ApiCallbackDescriptorBase, 5) |
| 769 }; |
| 770 |
| 771 class ApiCallbackWith6ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 772 public: |
| 773 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 774 ApiCallbackWith6ArgsDescriptor, ApiCallbackDescriptorBase, 6) |
| 775 }; |
| 776 |
| 777 class ApiCallbackWith7ArgsDescriptor : public ApiCallbackDescriptorBase { |
| 778 public: |
| 779 DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( |
| 780 ApiCallbackWith7ArgsDescriptor, ApiCallbackDescriptorBase, 7) |
697 }; | 781 }; |
698 | 782 |
699 | 783 |
700 class ApiAccessorDescriptor : public CallInterfaceDescriptor { | |
701 public: | |
702 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiAccessorDescriptor, | |
703 CallInterfaceDescriptor) | |
704 }; | |
705 | |
706 | |
707 class ApiGetterDescriptor : public CallInterfaceDescriptor { | 784 class ApiGetterDescriptor : public CallInterfaceDescriptor { |
708 public: | 785 public: |
709 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiGetterDescriptor, | 786 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiGetterDescriptor, |
710 CallInterfaceDescriptor) | 787 CallInterfaceDescriptor) |
711 | 788 |
712 static const Register function_address(); | 789 static const Register function_address(); |
713 }; | 790 }; |
714 | 791 |
715 | 792 |
716 class MathPowTaggedDescriptor : public CallInterfaceDescriptor { | 793 class MathPowTaggedDescriptor : public CallInterfaceDescriptor { |
(...skipping 20 matching lines...) Expand all Loading... |
737 | 814 |
738 class GrowArrayElementsDescriptor : public CallInterfaceDescriptor { | 815 class GrowArrayElementsDescriptor : public CallInterfaceDescriptor { |
739 public: | 816 public: |
740 DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor) | 817 DECLARE_DESCRIPTOR(GrowArrayElementsDescriptor, CallInterfaceDescriptor) |
741 | 818 |
742 enum RegisterInfo { kObjectIndex, kKeyIndex }; | 819 enum RegisterInfo { kObjectIndex, kKeyIndex }; |
743 static const Register ObjectRegister(); | 820 static const Register ObjectRegister(); |
744 static const Register KeyRegister(); | 821 static const Register KeyRegister(); |
745 }; | 822 }; |
746 | 823 |
747 class InterpreterDispatchDescriptor : public CallInterfaceDescriptor { | 824 class InterpreterDispatchDescriptor : public CallInterfaceDescriptor { |
748 public: | 825 public: |
749 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor, | 826 DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor, |
750 CallInterfaceDescriptor) | 827 CallInterfaceDescriptor) |
751 | 828 |
752 static const int kAccumulatorParameter = 0; | 829 static const int kAccumulatorParameter = 0; |
753 static const int kRegisterFileParameter = 1; | 830 static const int kRegisterFileParameter = 1; |
754 static const int kBytecodeOffsetParameter = 2; | 831 static const int kBytecodeOffsetParameter = 2; |
755 static const int kBytecodeArrayParameter = 3; | 832 static const int kBytecodeArrayParameter = 3; |
756 static const int kDispatchTableParameter = 4; | 833 static const int kDispatchTableParameter = 4; |
757 static const int kContextParameter = 5; | 834 static const int kContextParameter = 5; |
(...skipping 12 matching lines...) Expand all Loading... |
770 DECLARE_DESCRIPTOR(InterpreterPushArgsAndConstructDescriptor, | 847 DECLARE_DESCRIPTOR(InterpreterPushArgsAndConstructDescriptor, |
771 CallInterfaceDescriptor) | 848 CallInterfaceDescriptor) |
772 }; | 849 }; |
773 | 850 |
774 | 851 |
775 class InterpreterCEntryDescriptor : public CallInterfaceDescriptor { | 852 class InterpreterCEntryDescriptor : public CallInterfaceDescriptor { |
776 public: | 853 public: |
777 DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor) | 854 DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor) |
778 }; | 855 }; |
779 | 856 |
| 857 #undef DECLARE_DESCRIPTOR_WITH_BASE |
780 #undef DECLARE_DESCRIPTOR | 858 #undef DECLARE_DESCRIPTOR |
781 | 859 #undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE |
| 860 #undef DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG |
782 | 861 |
783 // We define the association between CallDescriptors::Key and the specialized | 862 // We define the association between CallDescriptors::Key and the specialized |
784 // descriptor here to reduce boilerplate and mistakes. | 863 // descriptor here to reduce boilerplate and mistakes. |
785 #define DEF_KEY(name) \ | 864 #define DEF_KEY(name) \ |
786 CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; } | 865 CallDescriptors::Key name##Descriptor::key() { return CallDescriptors::name; } |
787 INTERFACE_DESCRIPTOR_LIST(DEF_KEY) | 866 INTERFACE_DESCRIPTOR_LIST(DEF_KEY) |
788 #undef DEF_KEY | 867 #undef DEF_KEY |
789 } // namespace internal | 868 } // namespace internal |
790 } // namespace v8 | 869 } // namespace v8 |
791 | 870 |
792 | 871 |
793 #if V8_TARGET_ARCH_ARM64 | 872 #if V8_TARGET_ARCH_ARM64 |
794 #include "src/arm64/interface-descriptors-arm64.h" | 873 #include "src/arm64/interface-descriptors-arm64.h" |
795 #elif V8_TARGET_ARCH_ARM | 874 #elif V8_TARGET_ARCH_ARM |
796 #include "src/arm/interface-descriptors-arm.h" | 875 #include "src/arm/interface-descriptors-arm.h" |
797 #endif | 876 #endif |
798 | 877 |
799 #endif // V8_CALL_INTERFACE_DESCRIPTOR_H_ | 878 #endif // V8_CALL_INTERFACE_DESCRIPTOR_H_ |
OLD | NEW |