summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/common-operator.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/common-operator.h')
-rw-r--r--deps/v8/src/compiler/common-operator.h100
1 files changed, 83 insertions, 17 deletions
diff --git a/deps/v8/src/compiler/common-operator.h b/deps/v8/src/compiler/common-operator.h
index 7c59f47c34..9e4d259bc9 100644
--- a/deps/v8/src/compiler/common-operator.h
+++ b/deps/v8/src/compiler/common-operator.h
@@ -5,17 +5,14 @@
#ifndef V8_COMPILER_COMMON_OPERATOR_H_
#define V8_COMPILER_COMMON_OPERATOR_H_
+#include "src/assembler.h"
#include "src/compiler/frame-states.h"
+#include "src/deoptimize-reason.h"
#include "src/machine-type.h"
#include "src/zone-containers.h"
namespace v8 {
namespace internal {
-
-// Forward declarations.
-class ExternalReference;
-class Type;
-
namespace compiler {
// Forward declarations.
@@ -46,6 +43,8 @@ std::ostream& operator<<(std::ostream&, BranchHint);
BranchHint BranchHintOf(const Operator* const);
+// Deoptimize reason for Deoptimize, DeoptimizeIf and DeoptimizeUnless.
+DeoptimizeReason DeoptimizeReasonOf(Operator const* const);
// Deoptimize bailout kind.
enum class DeoptimizeKind : uint8_t { kEager, kSoft };
@@ -54,15 +53,28 @@ size_t hash_value(DeoptimizeKind kind);
std::ostream& operator<<(std::ostream&, DeoptimizeKind);
-DeoptimizeKind DeoptimizeKindOf(const Operator* const);
+// Parameters for the {Deoptimize} operator.
+class DeoptimizeParameters final {
+ public:
+ DeoptimizeParameters(DeoptimizeKind kind, DeoptimizeReason reason)
+ : kind_(kind), reason_(reason) {}
+
+ DeoptimizeKind kind() const { return kind_; }
+ DeoptimizeReason reason() const { return reason_; }
+
+ private:
+ DeoptimizeKind const kind_;
+ DeoptimizeReason const reason_;
+};
+bool operator==(DeoptimizeParameters, DeoptimizeParameters);
+bool operator!=(DeoptimizeParameters, DeoptimizeParameters);
-// Prediction whether throw-site is surrounded by any local catch-scope.
-enum class IfExceptionHint { kLocallyUncaught, kLocallyCaught };
+size_t hast_value(DeoptimizeParameters p);
-size_t hash_value(IfExceptionHint hint);
+std::ostream& operator<<(std::ostream&, DeoptimizeParameters p);
-std::ostream& operator<<(std::ostream&, IfExceptionHint);
+DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const);
class SelectParameters final {
@@ -88,6 +100,7 @@ std::ostream& operator<<(std::ostream&, SelectParameters const& p);
SelectParameters const& SelectParametersOf(const Operator* const);
+CallDescriptor const* CallDescriptorOf(const Operator* const);
size_t ProjectionIndexOf(const Operator* const);
@@ -114,6 +127,49 @@ std::ostream& operator<<(std::ostream&, ParameterInfo const&);
int ParameterIndexOf(const Operator* const);
const ParameterInfo& ParameterInfoOf(const Operator* const);
+class RelocatablePtrConstantInfo final {
+ public:
+ enum Type { kInt32, kInt64 };
+
+ RelocatablePtrConstantInfo(int32_t value, RelocInfo::Mode rmode)
+ : value_(value), rmode_(rmode), type_(kInt32) {}
+ RelocatablePtrConstantInfo(int64_t value, RelocInfo::Mode rmode)
+ : value_(value), rmode_(rmode), type_(kInt64) {}
+
+ intptr_t value() const { return value_; }
+ RelocInfo::Mode rmode() const { return rmode_; }
+ Type type() const { return type_; }
+
+ private:
+ intptr_t value_;
+ RelocInfo::Mode rmode_;
+ Type type_;
+};
+
+bool operator==(RelocatablePtrConstantInfo const& lhs,
+ RelocatablePtrConstantInfo const& rhs);
+bool operator!=(RelocatablePtrConstantInfo const& lhs,
+ RelocatablePtrConstantInfo const& rhs);
+
+std::ostream& operator<<(std::ostream&, RelocatablePtrConstantInfo const&);
+
+size_t hash_value(RelocatablePtrConstantInfo const& p);
+
+// Used to mark a region (as identified by BeginRegion/FinishRegion) as either
+// JavaScript-observable or not (i.e. allocations are not JavaScript observable
+// themselves, but transitioning stores are).
+enum class RegionObservability : uint8_t { kObservable, kNotObservable };
+
+size_t hash_value(RegionObservability);
+
+std::ostream& operator<<(std::ostream&, RegionObservability);
+
+RegionObservability RegionObservabilityOf(Operator const*) WARN_UNUSED_RESULT;
+
+std::ostream& operator<<(std::ostream& os,
+ const ZoneVector<MachineType>* types);
+
+Type* TypeGuardTypeOf(Operator const*) WARN_UNUSED_RESULT;
// Interface for building common operators that can be used at any level of IR,
// including JavaScript, mid-level, and low-level.
@@ -127,14 +183,14 @@ class CommonOperatorBuilder final : public ZoneObject {
const Operator* IfTrue();
const Operator* IfFalse();
const Operator* IfSuccess();
- const Operator* IfException(IfExceptionHint hint);
+ const Operator* IfException();
const Operator* Switch(size_t control_output_count);
const Operator* IfValue(int32_t value);
const Operator* IfDefault();
const Operator* Throw();
- const Operator* Deoptimize(DeoptimizeKind kind);
- const Operator* DeoptimizeIf();
- const Operator* DeoptimizeUnless();
+ const Operator* Deoptimize(DeoptimizeKind kind, DeoptimizeReason reason);
+ const Operator* DeoptimizeIf(DeoptimizeReason reason);
+ const Operator* DeoptimizeUnless(DeoptimizeReason reason);
const Operator* Return(int value_input_count = 1);
const Operator* Terminate();
@@ -155,13 +211,21 @@ class CommonOperatorBuilder final : public ZoneObject {
const Operator* NumberConstant(volatile double);
const Operator* HeapConstant(const Handle<HeapObject>&);
+ const Operator* RelocatableInt32Constant(int32_t value,
+ RelocInfo::Mode rmode);
+ const Operator* RelocatableInt64Constant(int64_t value,
+ RelocInfo::Mode rmode);
+
const Operator* Select(MachineRepresentation, BranchHint = BranchHint::kNone);
const Operator* Phi(MachineRepresentation representation,
int value_input_count);
const Operator* EffectPhi(int effect_input_count);
- const Operator* EffectSet(int arguments);
- const Operator* Guard(Type* type);
- const Operator* BeginRegion();
+ const Operator* InductionVariablePhi(int value_input_count);
+ const Operator* LoopExit();
+ const Operator* LoopExitValue();
+ const Operator* LoopExitEffect();
+ const Operator* Checkpoint();
+ const Operator* BeginRegion(RegionObservability);
const Operator* FinishRegion();
const Operator* StateValues(int arguments);
const Operator* ObjectState(int pointer_slots, int id);
@@ -172,6 +236,8 @@ class CommonOperatorBuilder final : public ZoneObject {
const Operator* Call(const CallDescriptor* descriptor);
const Operator* TailCall(const CallDescriptor* descriptor);
const Operator* Projection(size_t index);
+ const Operator* Retain();
+ const Operator* TypeGuard(Type* type);
// Constructs a new merge or phi operator with the same opcode as {op}, but
// with {size} inputs.