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_COMPILER_PIPELINE_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_PIPELINE_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Note: TODO(turbofan) implies a performance improvement opportunity,
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org//   and TODO(name) implies an incomplete implementation
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Clients of this interface shouldn't depend on lots of compiler internals.
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass Graph;
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass Schedule;
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass SourcePositionTable;
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass Linkage;
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass Pipeline {
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  explicit Pipeline(CompilationInfo* info) : info_(info) {}
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Run the entire pipeline and generate a handle to a code object.
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Code> GenerateCode();
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Run the pipeline on a machine graph and generate code. If {schedule}
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // is {NULL}, then compute a new schedule for code generation.
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Code> GenerateCodeForMachineGraph(Linkage* linkage, Graph* graph,
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                           Schedule* schedule = NULL);
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static inline bool SupportedBackend() { return V8_TURBOFAN_BACKEND != 0; }
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static inline bool SupportedTarget() { return V8_TURBOFAN_TARGET != 0; }
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static void SetUp();
413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static void TearDown();
423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CompilationInfo* info_;
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CompilationInfo* info() const { return info_; }
475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Isolate* isolate() { return info_->isolate(); }
485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Zone* zone() { return info_->zone(); }
495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule* ComputeSchedule(Graph* graph);
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void VerifyAndPrintGraph(Graph* graph, const char* phase);
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Code> GenerateCode(Linkage* linkage, Graph* graph, Schedule* schedule,
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            SourcePositionTable* source_positions);
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8::internal::compiler
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_COMPILER_PIPELINE_H_
60