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_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/common-operator.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-builder.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/call-tester.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/simplified-graph-builder.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A class that just passes node creation on to the Graph. 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DirectGraphBuilder : public GraphBuilder { 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit DirectGraphBuilder(Graph* graph) : GraphBuilder(graph) {} 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~DirectGraphBuilder() {} 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Node* MakeNode(const Operator* op, int value_input_count, 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node** value_inputs) FINAL { 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return graph()->NewNode(op, value_input_count, value_inputs); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MachineCallHelper : public CallHelper { 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineCallHelper(Zone* zone, MachineSignature* machine_sig); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Parameter(size_t index); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void GenerateCode() { Generate(); } 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual byte* Generate(); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InitParameters(GraphBuilder* builder, CommonOperatorBuilder* common); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t parameter_count() const { return machine_sig_->parameter_count(); } 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node** parameters_; 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): shouldn't need graph stored. 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Graph* graph_; 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaybeHandle<Code> code_; 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass GraphAndBuilders { 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit GraphAndBuilders(Zone* zone) 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : main_graph_(new (zone) Graph(zone)), 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch main_common_(zone), 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch main_simplified_(zone) {} 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Prefixed with main_ to avoid naiming conflicts. 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Graph* main_graph_; 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonOperatorBuilder main_common_; 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder main_machine_; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SimplifiedOperatorBuilder main_simplified_; 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename ReturnType> 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass GraphBuilderTester 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public HandleAndZoneScope, 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private GraphAndBuilders, 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public MachineCallHelper, 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public SimplifiedGraphBuilder, 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public CallHelper2<ReturnType, GraphBuilderTester<ReturnType> > { 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit GraphBuilderTester(MachineType p0 = kMachNone, 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineType p1 = kMachNone, 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineType p2 = kMachNone, 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineType p3 = kMachNone, 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineType p4 = kMachNone) 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : GraphAndBuilders(main_zone()), 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineCallHelper( 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch main_zone(), 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MakeMachineSignature( 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch main_zone(), ReturnValueTraits<ReturnType>::Representation(), 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p0, p1, p2, p3, p4)), 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SimplifiedGraphBuilder(main_graph_, &main_common_, &main_machine_, 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &main_simplified_) { 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Begin(static_cast<int>(parameter_count())); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InitParameters(this, &main_common_); 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~GraphBuilderTester() {} 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Factory* factory() const { return isolate()->factory(); } 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 108