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 3 // found in the LICENSE file. 4 5 #ifndef V8_COMPILER_JS_INLINING_H_ 6 #define V8_COMPILER_JS_INLINING_H_ 7 8 #include "src/compiler/graph-reducer.h" 9 #include "src/compiler/js-graph.h" 10 11 namespace v8 { 12 namespace internal { 13 14 // Forward declarations. 15 class CompilationInfo; 16 17 namespace compiler { 18 19 class SourcePositionTable; 20 21 // The JSInliner provides the core graph inlining machinery. Note that this 22 // class only deals with the mechanics of how to inline one graph into another, 23 // heuristics that decide what and how much to inline are beyond its scope. 24 class JSInliner final : public AdvancedReducer { 25 public: JSInliner(Editor * editor,Zone * local_zone,CompilationInfo * info,JSGraph * jsgraph,SourcePositionTable * source_positions)26 JSInliner(Editor* editor, Zone* local_zone, CompilationInfo* info, 27 JSGraph* jsgraph, SourcePositionTable* source_positions) 28 : AdvancedReducer(editor), 29 local_zone_(local_zone), 30 info_(info), 31 jsgraph_(jsgraph), 32 source_positions_(source_positions) {} 33 34 // Reducer interface, eagerly inlines everything. 35 Reduction Reduce(Node* node) final; 36 37 // Can be used by inlining heuristics or by testing code directly, without 38 // using the above generic reducer interface of the inlining machinery. 39 Reduction ReduceJSCall(Node* node, Handle<JSFunction> function); 40 41 private: 42 CommonOperatorBuilder* common() const; 43 JSOperatorBuilder* javascript() const; 44 SimplifiedOperatorBuilder* simplified() const; 45 Graph* graph() const; jsgraph()46 JSGraph* jsgraph() const { return jsgraph_; } 47 48 Zone* const local_zone_; 49 CompilationInfo* info_; 50 JSGraph* const jsgraph_; 51 SourcePositionTable* const source_positions_; 52 53 Node* CreateArtificialFrameState(Node* node, Node* outer_frame_state, 54 int parameter_count, 55 FrameStateType frame_state_type, 56 Handle<SharedFunctionInfo> shared); 57 58 Node* CreateTailCallerFrameState(Node* node, Node* outer_frame_state); 59 60 Reduction InlineCall(Node* call, Node* new_target, Node* context, 61 Node* frame_state, Node* start, Node* end, 62 Node* exception_target, 63 const NodeVector& uncaught_subcalls); 64 }; 65 66 } // namespace compiler 67 } // namespace internal 68 } // namespace v8 69 70 #endif // V8_COMPILER_JS_INLINING_H_ 71