1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_COMPILER_JS_GRAPH_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_COMPILER_JS_GRAPH_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/common-node-cache.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/common-operator.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-operator.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-properties.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Typer; 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implements a facade on a Graph, enhancing the graph with JS-specific 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notions, including a builder for for JS* operators, canonicalized global 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// constants, and various helper methods. 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSGraph : public ZoneObject { 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSGraph(Graph* graph, CommonOperatorBuilder* common, 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSOperatorBuilder* javascript, Typer* typer, 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder* machine) 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : graph_(graph), 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch common_(common), 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch javascript_(javascript), 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typer_(typer), 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch machine_(machine), 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cache_(zone()) {} 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Canonicalized global constants. 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* CEntryStubConstant(); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* UndefinedConstant(); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* TheHoleConstant(); 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* TrueConstant(); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* FalseConstant(); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* NullConstant(); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ZeroConstant(); 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* OneConstant(); 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* NaNConstant(); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a HeapConstant node, possibly canonicalized, without inspecting the 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object. 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* HeapConstant(Unique<Object> value); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a HeapConstant node, possibly canonicalized, and may access the 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // heap to inspect the object. 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* HeapConstant(Handle<Object> value); 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a Constant node of the appropriate type for the given object. 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Accesses the heap to inspect the object and determine whether one of the 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // canonicalized globals or a number constant should be returned. 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Constant(Handle<Object> value); 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a NumberConstant node, usually canonicalized. 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Constant(double value); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a NumberConstant node, usually canonicalized. 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Constant(int32_t value); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a Int32Constant node, usually canonicalized. 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Constant(int32_t value); 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Uint32Constant(uint32_t value) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Int32Constant(bit_cast<int32_t>(value)); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a Float64Constant node, usually canonicalized. 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Constant(double value); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates an ExternalConstant node, usually canonicalized. 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ExternalConstant(ExternalReference ref); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* SmiConstant(int32_t immediate) { 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Smi::IsValid(immediate)); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(immediate); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSOperatorBuilder* javascript() { return javascript_; } 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonOperatorBuilder* common() { return common_; } 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder* machine() { return machine_; } 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Graph* graph() { return graph_; } 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone() { return graph()->zone(); } 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate() { return zone()->isolate(); } 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Graph* graph_; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonOperatorBuilder* common_; 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSOperatorBuilder* javascript_; 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Typer* typer_; 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder* machine_; 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> c_entry_stub_constant_; 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> undefined_constant_; 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> the_hole_constant_; 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> true_constant_; 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> false_constant_; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> null_constant_; 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> zero_constant_; 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> one_constant_; 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOncePointer<Node> nan_constant_; 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonNodeCache cache_; 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ImmovableHeapConstant(Handle<Object> value); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* NumberConstant(double value); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* NewNode(const Operator* op); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Factory* factory() { return isolate()->factory(); } 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 121