17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/cctest.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/common-operator.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph-builder.h" 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator.h" 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/simplified-operator.h" 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/call-tester.h" 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/simplified-graph-builder.h" 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// A class that just passes node creation on to the Graph. 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass DirectGraphBuilder : public GraphBuilder { 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org explicit DirectGraphBuilder(Graph* graph) : GraphBuilder(graph) {} 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org virtual ~DirectGraphBuilder() {} 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org protected: 292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org virtual Node* MakeNode(const Operator* op, int value_input_count, 302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Node** value_inputs) FINAL { 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return graph()->NewNode(op, value_input_count, value_inputs); 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass MachineCallHelper : public CallHelper { 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 389aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org MachineCallHelper(Zone* zone, MachineSignature* machine_sig); 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Node* Parameter(size_t index); 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 42f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org void GenerateCode() { Generate(); } 43f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org protected: 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org virtual byte* Generate(); 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void InitParameters(GraphBuilder* builder, CommonOperatorBuilder* common); 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 483e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org protected: 499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org size_t parameter_count() const { return machine_sig_->parameter_count(); } 503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org private: 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node** parameters_; 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(dcarney): shouldn't need graph stored. 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Graph* graph_; 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MaybeHandle<Code> code_; 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass GraphAndBuilders { 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org explicit GraphAndBuilders(Zone* zone) 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : main_graph_(new (zone) Graph(zone)), 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org main_common_(zone), 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org main_simplified_(zone) {} 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org protected: 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Prefixed with main_ to avoid naiming conflicts. 68f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org Graph* main_graph_; 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CommonOperatorBuilder main_common_; 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MachineOperatorBuilder main_machine_; 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SimplifiedOperatorBuilder main_simplified_; 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <typename ReturnType> 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass GraphBuilderTester 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : public HandleAndZoneScope, 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private GraphAndBuilders, 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public MachineCallHelper, 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public SimplifiedGraphBuilder, 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public CallHelper2<ReturnType, GraphBuilderTester<ReturnType> > { 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org explicit GraphBuilderTester(MachineType p0 = kMachNone, 845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org MachineType p1 = kMachNone, 855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org MachineType p2 = kMachNone, 865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org MachineType p3 = kMachNone, 875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org MachineType p4 = kMachNone) 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : GraphAndBuilders(main_zone()), 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MachineCallHelper( 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org main_zone(), 919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org MakeMachineSignature( 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org main_zone(), ReturnValueTraits<ReturnType>::Representation(), 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org p0, p1, p2, p3, p4)), 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SimplifiedGraphBuilder(main_graph_, &main_common_, &main_machine_, 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org &main_simplified_) { 969aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Begin(static_cast<int>(parameter_count())); 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InitParameters(this, &main_common_); 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org virtual ~GraphBuilderTester() {} 1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Factory* factory() const { return isolate()->factory(); } 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace compiler 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace internal 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace v8 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif // V8_CCTEST_COMPILER_GRAPH_BUILDER_TESTER_H_ 108