| 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 #ifndef V8_CRANKSHAFT_HYDROGEN_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_H_ |
| 6 #define V8_CRANKSHAFT_HYDROGEN_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_H_ |
| 7 | 7 |
| 8 #include "src/accessors.h" | 8 #include "src/accessors.h" |
| 9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
| 10 #include "src/ast/ast.h" | 10 #include "src/ast/ast.h" |
| (...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 void BuildBranch(HValue* value); | 842 void BuildBranch(HValue* value); |
| 843 | 843 |
| 844 Expression* condition_; | 844 Expression* condition_; |
| 845 HBasicBlock* if_true_; | 845 HBasicBlock* if_true_; |
| 846 HBasicBlock* if_false_; | 846 HBasicBlock* if_false_; |
| 847 }; | 847 }; |
| 848 | 848 |
| 849 | 849 |
| 850 class FunctionState final { | 850 class FunctionState final { |
| 851 public: | 851 public: |
| 852 FunctionState(HOptimizedGraphBuilder* owner, | 852 FunctionState(HOptimizedGraphBuilder* owner, CompilationInfo* info, |
| 853 CompilationInfo* info, | 853 InliningKind inlining_kind, int inlining_id, |
| 854 InliningKind inlining_kind, | 854 TailCallMode tail_call_mode); |
| 855 int inlining_id); | |
| 856 ~FunctionState(); | 855 ~FunctionState(); |
| 857 | 856 |
| 858 CompilationInfo* compilation_info() { return compilation_info_; } | 857 CompilationInfo* compilation_info() { return compilation_info_; } |
| 859 AstContext* call_context() { return call_context_; } | 858 AstContext* call_context() { return call_context_; } |
| 860 InliningKind inlining_kind() const { return inlining_kind_; } | 859 InliningKind inlining_kind() const { return inlining_kind_; } |
| 861 HBasicBlock* function_return() { return function_return_; } | 860 HBasicBlock* function_return() { return function_return_; } |
| 862 TestContext* test_context() { return test_context_; } | 861 TestContext* test_context() { return test_context_; } |
| 863 void ClearInlinedTestContext() { | 862 void ClearInlinedTestContext() { |
| 864 delete test_context_; | 863 delete test_context_; |
| 865 test_context_ = NULL; | 864 test_context_ = NULL; |
| 866 } | 865 } |
| 867 | 866 |
| 868 FunctionState* outer() { return outer_; } | 867 FunctionState* outer() { return outer_; } |
| 869 | 868 |
| 869 TailCallMode ComputeTailCallMode(TailCallMode tail_call_mode) const { |
| 870 if (tail_call_mode_ == TailCallMode::kDisallow) return tail_call_mode_; |
| 871 return tail_call_mode; |
| 872 } |
| 873 |
| 870 HEnterInlined* entry() { return entry_; } | 874 HEnterInlined* entry() { return entry_; } |
| 871 void set_entry(HEnterInlined* entry) { entry_ = entry; } | 875 void set_entry(HEnterInlined* entry) { entry_ = entry; } |
| 872 | 876 |
| 873 HArgumentsObject* arguments_object() { return arguments_object_; } | 877 HArgumentsObject* arguments_object() { return arguments_object_; } |
| 874 void set_arguments_object(HArgumentsObject* arguments_object) { | 878 void set_arguments_object(HArgumentsObject* arguments_object) { |
| 875 arguments_object_ = arguments_object; | 879 arguments_object_ = arguments_object; |
| 876 } | 880 } |
| 877 | 881 |
| 878 HArgumentsElements* arguments_elements() { return arguments_elements_; } | 882 HArgumentsElements* arguments_elements() { return arguments_elements_; } |
| 879 void set_arguments_elements(HArgumentsElements* arguments_elements) { | 883 void set_arguments_elements(HArgumentsElements* arguments_elements) { |
| 880 arguments_elements_ = arguments_elements; | 884 arguments_elements_ = arguments_elements; |
| 881 } | 885 } |
| 882 | 886 |
| 883 bool arguments_pushed() { return arguments_elements() != NULL; } | 887 bool arguments_pushed() { return arguments_elements() != NULL; } |
| 884 | 888 |
| 885 int inlining_id() const { return inlining_id_; } | 889 int inlining_id() const { return inlining_id_; } |
| 886 | 890 |
| 887 private: | 891 private: |
| 888 HOptimizedGraphBuilder* owner_; | 892 HOptimizedGraphBuilder* owner_; |
| 889 | 893 |
| 890 CompilationInfo* compilation_info_; | 894 CompilationInfo* compilation_info_; |
| 891 | 895 |
| 892 // During function inlining, expression context of the call being | 896 // During function inlining, expression context of the call being |
| 893 // inlined. NULL when not inlining. | 897 // inlined. NULL when not inlining. |
| 894 AstContext* call_context_; | 898 AstContext* call_context_; |
| 895 | 899 |
| 896 // The kind of call which is currently being inlined. | 900 // The kind of call which is currently being inlined. |
| 897 InliningKind inlining_kind_; | 901 InliningKind inlining_kind_; |
| 898 | 902 |
| 903 // Defines whether the calls with TailCallMode::kAllow in the function body |
| 904 // can be generated as tail calls. |
| 905 TailCallMode tail_call_mode_; |
| 906 |
| 899 // When inlining in an effect or value context, this is the return block. | 907 // When inlining in an effect or value context, this is the return block. |
| 900 // It is NULL otherwise. When inlining in a test context, there are a | 908 // It is NULL otherwise. When inlining in a test context, there are a |
| 901 // pair of return blocks in the context. When not inlining, there is no | 909 // pair of return blocks in the context. When not inlining, there is no |
| 902 // local return point. | 910 // local return point. |
| 903 HBasicBlock* function_return_; | 911 HBasicBlock* function_return_; |
| 904 | 912 |
| 905 // When inlining a call in a test context, a context containing a pair of | 913 // When inlining a call in a test context, a context containing a pair of |
| 906 // return blocks. NULL in all other cases. | 914 // return blocks. NULL in all other cases. |
| 907 TestContext* test_context_; | 915 TestContext* test_context_; |
| 908 | 916 |
| (...skipping 1480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2389 HValue* search_element, | 2397 HValue* search_element, |
| 2390 ElementsKind kind, | 2398 ElementsKind kind, |
| 2391 ArrayIndexOfMode mode); | 2399 ArrayIndexOfMode mode); |
| 2392 | 2400 |
| 2393 HValue* ImplicitReceiverFor(HValue* function, | 2401 HValue* ImplicitReceiverFor(HValue* function, |
| 2394 Handle<JSFunction> target); | 2402 Handle<JSFunction> target); |
| 2395 | 2403 |
| 2396 int InliningAstSize(Handle<JSFunction> target); | 2404 int InliningAstSize(Handle<JSFunction> target); |
| 2397 bool TryInline(Handle<JSFunction> target, int arguments_count, | 2405 bool TryInline(Handle<JSFunction> target, int arguments_count, |
| 2398 HValue* implicit_return_value, BailoutId ast_id, | 2406 HValue* implicit_return_value, BailoutId ast_id, |
| 2399 BailoutId return_id, InliningKind inlining_kind); | 2407 BailoutId return_id, InliningKind inlining_kind, |
| 2408 TailCallMode syntactic_tail_call_mode); |
| 2400 | 2409 |
| 2401 bool TryInlineCall(Call* expr); | 2410 bool TryInlineCall(Call* expr); |
| 2402 bool TryInlineConstruct(CallNew* expr, HValue* implicit_return_value); | 2411 bool TryInlineConstruct(CallNew* expr, HValue* implicit_return_value); |
| 2403 bool TryInlineGetter(Handle<Object> getter, Handle<Map> receiver_map, | 2412 bool TryInlineGetter(Handle<Object> getter, Handle<Map> receiver_map, |
| 2404 BailoutId ast_id, BailoutId return_id); | 2413 BailoutId ast_id, BailoutId return_id); |
| 2405 bool TryInlineSetter(Handle<Object> setter, Handle<Map> receiver_map, | 2414 bool TryInlineSetter(Handle<Object> setter, Handle<Map> receiver_map, |
| 2406 BailoutId id, BailoutId assignment_id, | 2415 BailoutId id, BailoutId assignment_id, |
| 2407 HValue* implicit_return_value); | 2416 HValue* implicit_return_value); |
| 2408 bool TryInlineIndirectCall(Handle<JSFunction> function, Call* expr, | 2417 bool TryInlineIndirectCall(Handle<JSFunction> function, Call* expr, |
| 2409 int arguments_count); | 2418 int arguments_count); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2420 bool TryInlineApiMethodCall(Call* expr, | 2429 bool TryInlineApiMethodCall(Call* expr, |
| 2421 HValue* receiver, | 2430 HValue* receiver, |
| 2422 SmallMapList* receiver_types); | 2431 SmallMapList* receiver_types); |
| 2423 bool TryInlineApiFunctionCall(Call* expr, HValue* receiver); | 2432 bool TryInlineApiFunctionCall(Call* expr, HValue* receiver); |
| 2424 bool TryInlineApiGetter(Handle<Object> function, Handle<Map> receiver_map, | 2433 bool TryInlineApiGetter(Handle<Object> function, Handle<Map> receiver_map, |
| 2425 BailoutId ast_id); | 2434 BailoutId ast_id); |
| 2426 bool TryInlineApiSetter(Handle<Object> function, Handle<Map> receiver_map, | 2435 bool TryInlineApiSetter(Handle<Object> function, Handle<Map> receiver_map, |
| 2427 BailoutId ast_id); | 2436 BailoutId ast_id); |
| 2428 bool TryInlineApiCall(Handle<Object> function, HValue* receiver, | 2437 bool TryInlineApiCall(Handle<Object> function, HValue* receiver, |
| 2429 SmallMapList* receiver_maps, int argc, BailoutId ast_id, | 2438 SmallMapList* receiver_maps, int argc, BailoutId ast_id, |
| 2430 ApiCallType call_type); | 2439 ApiCallType call_type, |
| 2440 TailCallMode syntactic_tail_call_mode); |
| 2431 static bool IsReadOnlyLengthDescriptor(Handle<Map> jsarray_map); | 2441 static bool IsReadOnlyLengthDescriptor(Handle<Map> jsarray_map); |
| 2432 static bool CanInlineArrayResizeOperation(Handle<Map> receiver_map); | 2442 static bool CanInlineArrayResizeOperation(Handle<Map> receiver_map); |
| 2433 | 2443 |
| 2434 // If --trace-inlining, print a line of the inlining trace. Inlining | 2444 // If --trace-inlining, print a line of the inlining trace. Inlining |
| 2435 // succeeded if the reason string is NULL and failed if there is a | 2445 // succeeded if the reason string is NULL and failed if there is a |
| 2436 // non-NULL reason string. | 2446 // non-NULL reason string. |
| 2437 void TraceInline(Handle<JSFunction> target, | 2447 void TraceInline(Handle<JSFunction> target, Handle<JSFunction> caller, |
| 2438 Handle<JSFunction> caller, | 2448 const char* failure_reason, |
| 2439 const char* failure_reason); | 2449 TailCallMode tail_call_mode = TailCallMode::kDisallow); |
| 2440 | 2450 |
| 2441 void HandleGlobalVariableAssignment(Variable* var, HValue* value, | 2451 void HandleGlobalVariableAssignment(Variable* var, HValue* value, |
| 2442 FeedbackVectorSlot slot, | 2452 FeedbackVectorSlot slot, |
| 2443 BailoutId ast_id); | 2453 BailoutId ast_id); |
| 2444 | 2454 |
| 2445 void HandlePropertyAssignment(Assignment* expr); | 2455 void HandlePropertyAssignment(Assignment* expr); |
| 2446 void HandleCompoundAssignment(Assignment* expr); | 2456 void HandleCompoundAssignment(Assignment* expr); |
| 2447 void HandlePolymorphicNamedFieldAccess( | 2457 void HandlePolymorphicNamedFieldAccess( |
| 2448 PropertyAccessType access_type, Expression* expr, FeedbackVectorSlot slot, | 2458 PropertyAccessType access_type, Expression* expr, FeedbackVectorSlot slot, |
| 2449 BailoutId ast_id, BailoutId return_id, HValue* object, HValue* value, | 2459 BailoutId ast_id, BailoutId return_id, HValue* object, HValue* value, |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2812 | 2822 |
| 2813 void BuildEmitFixedArray(Handle<FixedArrayBase> elements, | 2823 void BuildEmitFixedArray(Handle<FixedArrayBase> elements, |
| 2814 ElementsKind kind, | 2824 ElementsKind kind, |
| 2815 HValue* object_elements, | 2825 HValue* object_elements, |
| 2816 AllocationSiteUsageContext* site_context); | 2826 AllocationSiteUsageContext* site_context); |
| 2817 | 2827 |
| 2818 void AddCheckPrototypeMaps(Handle<JSObject> holder, | 2828 void AddCheckPrototypeMaps(Handle<JSObject> holder, |
| 2819 Handle<Map> receiver_map); | 2829 Handle<Map> receiver_map); |
| 2820 | 2830 |
| 2821 HInstruction* NewCallFunction(HValue* function, int argument_count, | 2831 HInstruction* NewCallFunction(HValue* function, int argument_count, |
| 2822 ConvertReceiverMode convert_mode); | 2832 ConvertReceiverMode convert_mode, |
| 2833 TailCallMode tail_call_mode); |
| 2823 | 2834 |
| 2824 HInstruction* NewCallFunctionViaIC(HValue* function, int argument_count, | 2835 HInstruction* NewCallFunctionViaIC(HValue* function, int argument_count, |
| 2825 ConvertReceiverMode convert_mode, | 2836 ConvertReceiverMode convert_mode, |
| 2837 TailCallMode tail_call_mode, |
| 2826 FeedbackVectorSlot slot); | 2838 FeedbackVectorSlot slot); |
| 2827 | 2839 |
| 2828 HInstruction* NewCallConstantFunction(Handle<JSFunction> target, | 2840 HInstruction* NewCallConstantFunction(Handle<JSFunction> target, |
| 2829 int argument_count); | 2841 int argument_count, |
| 2842 TailCallMode tail_call_mode); |
| 2830 | 2843 |
| 2831 bool CanBeFunctionApplyArguments(Call* expr); | 2844 bool CanBeFunctionApplyArguments(Call* expr); |
| 2832 | 2845 |
| 2833 // The translation state of the currently-being-translated function. | 2846 // The translation state of the currently-being-translated function. |
| 2834 FunctionState* function_state_; | 2847 FunctionState* function_state_; |
| 2835 | 2848 |
| 2836 // The base of the function state stack. | 2849 // The base of the function state stack. |
| 2837 FunctionState initial_function_state_; | 2850 FunctionState initial_function_state_; |
| 2838 | 2851 |
| 2839 // Expression context of the currently visited subexpression. NULL when | 2852 // Expression context of the currently visited subexpression. NULL when |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3023 | 3036 |
| 3024 private: | 3037 private: |
| 3025 HGraphBuilder* builder_; | 3038 HGraphBuilder* builder_; |
| 3026 }; | 3039 }; |
| 3027 | 3040 |
| 3028 | 3041 |
| 3029 } // namespace internal | 3042 } // namespace internal |
| 3030 } // namespace v8 | 3043 } // namespace v8 |
| 3031 | 3044 |
| 3032 #endif // V8_CRANKSHAFT_HYDROGEN_H_ | 3045 #endif // V8_CRANKSHAFT_HYDROGEN_H_ |
| OLD | NEW |