// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef VM_FLOW_GRAPH_COMPILER_ARM_H_
#define VM_FLOW_GRAPH_COMPILER_ARM_H_

#ifndef VM_FLOW_GRAPH_COMPILER_H_
#error Include flow_graph_compiler.h instead of flow_graph_compiler_arm.h.
#endif

#include "vm/flow_graph.h"
#include "vm/intermediate_language.h"

namespace dart {

class Assembler;
class Code;
template <typename T> class GrowableArray;
class ParsedFunction;

// Stubbed out implementation of graph compiler, bails out immediately if
// CompileGraph is called. The rest of the public API is UNIMPLEMENTED.
class FlowGraphCompiler : public FlowGraphVisitor {
 public:
  FlowGraphCompiler(Assembler* assembler,
                    const FlowGraph& flow_graph,
                    bool is_optimizing)
      : FlowGraphVisitor(flow_graph.reverse_postorder()),
        parsed_function_(flow_graph.parsed_function()),
        is_optimizing_(is_optimizing) {
  }

  virtual ~FlowGraphCompiler() { }

  static bool CanOptimize();

  void CompileGraph();

  void FinalizePcDescriptors(const Code& code);
  void FinalizeStackmaps(const Code& code);
  void FinalizeVarDescriptors(const Code& code);
  void FinalizeExceptionHandlers(const Code& code);
  void FinalizeComments(const Code& code);

 private:
  // Bail out of the flow graph compiler.  Does not return to the caller.
  void Bailout(const char* reason);

  const ParsedFunction& parsed_function_;
  const bool is_optimizing_;

  DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
};

}  // namespace dart

#endif  // VM_FLOW_GRAPH_COMPILER_ARM_H_
