1// Copyright 2016 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_CREATE_LOWERING_H_
6#define V8_COMPILER_JS_CREATE_LOWERING_H_
7
8#include "src/compiler/graph-reducer.h"
9
10namespace v8 {
11namespace internal {
12
13// Forward declarations.
14class AllocationSiteUsageContext;
15class CompilationDependencies;
16class Factory;
17
18
19namespace compiler {
20
21// Forward declarations.
22class CommonOperatorBuilder;
23class JSGraph;
24class JSOperatorBuilder;
25class MachineOperatorBuilder;
26class SimplifiedOperatorBuilder;
27
28
29// Lowers JSCreate-level operators to fast (inline) allocations.
30class JSCreateLowering final : public AdvancedReducer {
31 public:
32  JSCreateLowering(Editor* editor, CompilationDependencies* dependencies,
33                   JSGraph* jsgraph, MaybeHandle<LiteralsArray> literals_array,
34                   Zone* zone)
35      : AdvancedReducer(editor),
36        dependencies_(dependencies),
37        jsgraph_(jsgraph),
38        literals_array_(literals_array),
39        zone_(zone) {}
40  ~JSCreateLowering() final {}
41
42  Reduction Reduce(Node* node) final;
43
44 private:
45  Reduction ReduceJSCreate(Node* node);
46  Reduction ReduceJSCreateArguments(Node* node);
47  Reduction ReduceJSCreateArray(Node* node);
48  Reduction ReduceJSCreateClosure(Node* node);
49  Reduction ReduceJSCreateIterResultObject(Node* node);
50  Reduction ReduceJSCreateLiteral(Node* node);
51  Reduction ReduceJSCreateFunctionContext(Node* node);
52  Reduction ReduceJSCreateWithContext(Node* node);
53  Reduction ReduceJSCreateCatchContext(Node* node);
54  Reduction ReduceJSCreateBlockContext(Node* node);
55  Reduction ReduceNewArray(Node* node, Node* length, int capacity,
56                           Handle<AllocationSite> site);
57
58  Node* AllocateArguments(Node* effect, Node* control, Node* frame_state);
59  Node* AllocateRestArguments(Node* effect, Node* control, Node* frame_state,
60                              int start_index);
61  Node* AllocateAliasedArguments(Node* effect, Node* control, Node* frame_state,
62                                 Node* context, Handle<SharedFunctionInfo>,
63                                 bool* has_aliased_arguments);
64  Node* AllocateElements(Node* effect, Node* control,
65                         ElementsKind elements_kind, int capacity,
66                         PretenureFlag pretenure);
67  Node* AllocateFastLiteral(Node* effect, Node* control,
68                            Handle<JSObject> boilerplate,
69                            AllocationSiteUsageContext* site_context);
70  Node* AllocateFastLiteralElements(Node* effect, Node* control,
71                                    Handle<JSObject> boilerplate,
72                                    PretenureFlag pretenure,
73                                    AllocationSiteUsageContext* site_context);
74
75  // Infers the LiteralsArray to use for a given {node}.
76  MaybeHandle<LiteralsArray> GetSpecializationLiterals(Node* node);
77
78  Factory* factory() const;
79  Graph* graph() const;
80  JSGraph* jsgraph() const { return jsgraph_; }
81  Isolate* isolate() const;
82  JSOperatorBuilder* javascript() const;
83  CommonOperatorBuilder* common() const;
84  SimplifiedOperatorBuilder* simplified() const;
85  MachineOperatorBuilder* machine() const;
86  CompilationDependencies* dependencies() const { return dependencies_; }
87  Zone* zone() const { return zone_; }
88
89  CompilationDependencies* const dependencies_;
90  JSGraph* const jsgraph_;
91  MaybeHandle<LiteralsArray> const literals_array_;
92  Zone* const zone_;
93};
94
95}  // namespace compiler
96}  // namespace internal
97}  // namespace v8
98
99#endif  // V8_COMPILER_JS_CREATE_LOWERING_H_
100