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 class BailoutId; 15 class OptimizedCompilationInfo; 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,OptimizedCompilationInfo * info,JSGraph * jsgraph,JSHeapBroker * broker,SourcePositionTable * source_positions)26 JSInliner(Editor* editor, Zone* local_zone, OptimizedCompilationInfo* info, 27 JSGraph* jsgraph, JSHeapBroker* broker, 28 SourcePositionTable* source_positions) 29 : AdvancedReducer(editor), 30 local_zone_(local_zone), 31 info_(info), 32 jsgraph_(jsgraph), 33 broker_(broker), 34 source_positions_(source_positions) {} 35 reducer_name()36 const char* reducer_name() const override { return "JSInliner"; } 37 Reduce(Node * node)38 Reduction Reduce(Node* node) final { UNREACHABLE(); } 39 40 // Can be used by inlining heuristics or by testing code directly, without 41 // using the above generic reducer interface of the inlining machinery. 42 Reduction ReduceJSCall(Node* node); 43 44 private: zone()45 Zone* zone() const { return local_zone_; } 46 CommonOperatorBuilder* common() const; 47 JSOperatorBuilder* javascript() const; 48 SimplifiedOperatorBuilder* simplified() const; 49 Graph* graph() const; jsgraph()50 JSGraph* jsgraph() const { return jsgraph_; } 51 // TODO(neis): Make heap broker a component of JSGraph? broker()52 JSHeapBroker* broker() const { return broker_; } isolate()53 Isolate* isolate() const { return jsgraph_->isolate(); } 54 55 Zone* const local_zone_; 56 OptimizedCompilationInfo* info_; 57 JSGraph* const jsgraph_; 58 JSHeapBroker* const broker_; 59 SourcePositionTable* const source_positions_; 60 61 base::Optional<SharedFunctionInfoRef> DetermineCallTarget(Node* node); 62 FeedbackCellRef DetermineCallContext(Node* node, Node** context_out); 63 64 Node* CreateArtificialFrameState(Node* node, Node* outer_frame_state, 65 int parameter_count, BailoutId bailout_id, 66 FrameStateType frame_state_type, 67 SharedFunctionInfoRef shared, 68 Node* context = nullptr); 69 70 Reduction InlineCall(Node* call, Node* new_target, Node* context, 71 Node* frame_state, Node* start, Node* end, 72 Node* exception_target, 73 const NodeVector& uncaught_subcalls); 74 }; 75 76 } // namespace compiler 77 } // namespace internal 78 } // namespace v8 79 80 #endif // V8_COMPILER_JS_INLINING_H_ 81