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