1 // Copyright 2013 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_COMMON_OPERATOR_H_ 6 #define V8_COMPILER_COMMON_OPERATOR_H_ 7 8 #include "src/compiler/machine-type.h" 9 #include "src/unique.h" 10 11 namespace v8 { 12 namespace internal { 13 14 // Forward declarations. 15 class ExternalReference; 16 class OStream; 17 18 19 namespace compiler { 20 21 // Forward declarations. 22 class CallDescriptor; 23 struct CommonOperatorBuilderImpl; 24 class Operator; 25 26 27 // Flag that describes how to combine the current environment with 28 // the output of a node to obtain a framestate for lazy bailout. 29 enum OutputFrameStateCombine { 30 kPushOutput, // Push the output on the expression stack. 31 kIgnoreOutput // Use the frame state as-is. 32 }; 33 34 35 // The type of stack frame that a FrameState node represents. 36 enum FrameStateType { 37 JS_FRAME, // Represents an unoptimized JavaScriptFrame. 38 ARGUMENTS_ADAPTOR // Represents an ArgumentsAdaptorFrame. 39 }; 40 41 42 class FrameStateCallInfo FINAL { 43 public: 44 FrameStateCallInfo( 45 FrameStateType type, BailoutId bailout_id, 46 OutputFrameStateCombine state_combine, 47 MaybeHandle<JSFunction> jsfunction = MaybeHandle<JSFunction>()) 48 : type_(type), 49 bailout_id_(bailout_id), 50 frame_state_combine_(state_combine), 51 jsfunction_(jsfunction) {} 52 53 FrameStateType type() const { return type_; } 54 BailoutId bailout_id() const { return bailout_id_; } 55 OutputFrameStateCombine state_combine() const { return frame_state_combine_; } 56 MaybeHandle<JSFunction> jsfunction() const { return jsfunction_; } 57 58 private: 59 FrameStateType type_; 60 BailoutId bailout_id_; 61 OutputFrameStateCombine frame_state_combine_; 62 MaybeHandle<JSFunction> jsfunction_; 63 }; 64 65 66 // Interface for building common operators that can be used at any level of IR, 67 // including JavaScript, mid-level, and low-level. 68 class CommonOperatorBuilder FINAL { 69 public: 70 explicit CommonOperatorBuilder(Zone* zone); 71 72 const Operator* Dead(); 73 const Operator* End(); 74 const Operator* Branch(); 75 const Operator* IfTrue(); 76 const Operator* IfFalse(); 77 const Operator* Throw(); 78 const Operator* Return(); 79 80 const Operator* Start(int num_formal_parameters); 81 const Operator* Merge(int controls); 82 const Operator* Loop(int controls); 83 const Operator* Parameter(int index); 84 85 const Operator* Int32Constant(int32_t); 86 const Operator* Int64Constant(int64_t); 87 const Operator* Float32Constant(volatile float); 88 const Operator* Float64Constant(volatile double); 89 const Operator* ExternalConstant(const ExternalReference&); 90 const Operator* NumberConstant(volatile double); 91 const Operator* HeapConstant(const Unique<Object>&); 92 93 const Operator* Phi(MachineType type, int arguments); 94 const Operator* EffectPhi(int arguments); 95 const Operator* ControlEffect(); 96 const Operator* ValueEffect(int arguments); 97 const Operator* Finish(int arguments); 98 const Operator* StateValues(int arguments); 99 const Operator* FrameState( 100 FrameStateType type, BailoutId bailout_id, 101 OutputFrameStateCombine state_combine, 102 MaybeHandle<JSFunction> jsfunction = MaybeHandle<JSFunction>()); 103 const Operator* Call(const CallDescriptor* descriptor); 104 const Operator* Projection(size_t index); 105 106 private: 107 Zone* zone() const { return zone_; } 108 109 const CommonOperatorBuilderImpl& impl_; 110 Zone* const zone_; 111 }; 112 113 } // namespace compiler 114 } // namespace internal 115 } // namespace v8 116 117 #endif // V8_COMPILER_COMMON_OPERATOR_H_ 118