// 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 RUNTIME_VM_COMPILER_BACKEND_IL_PRINTER_H_ #define RUNTIME_VM_COMPILER_BACKEND_IL_PRINTER_H_ #if defined(DART_PRECOMPILED_RUNTIME) #error "AOT runtime should not use compiler sources (including header files)" #endif // defined(DART_PRECOMPILED_RUNTIME) #include "platform/text_buffer.h" #include "vm/compiler/backend/flow_graph.h" #include "vm/compiler/backend/il.h" namespace dart { class ParsedFunction; const char* RepresentationToCString(Representation rep); // Graph printing. class FlowGraphPrinter : public ValueObject { public: static const intptr_t kPrintAll = -1; explicit FlowGraphPrinter(const FlowGraph& flow_graph, bool print_locations = false) : function_(flow_graph.function()), block_order_(flow_graph.reverse_postorder()), print_locations_(print_locations) {} // Print the instructions in a block terminated by newlines. Add "goto N" // to the end of the block if it ends with an unconditional jump to // another block and that block is not next in reverse postorder. void PrintBlocks(); void PrintInstruction(Instruction* instr); static void PrintOneInstruction(Instruction* instr, bool print_locations); static void PrintTypeCheck(const ParsedFunction& parsed_function, TokenPosition token_pos, Value* value, const AbstractType& dst_type, const String& dst_name, bool eliminated); static void PrintBlock(BlockEntryInstr* block, bool print_locations); static void PrintGraph(const char* phase, FlowGraph* flow_graph); // Debugging helper function. If 'num_checks_to_print' is not specified // all checks will be printed. static void PrintICData(const ICData& ic_data, intptr_t num_checks_to_print = kPrintAll); // Debugging helper function. If 'num_checks_to_print' is not specified // all checks will be printed. static void PrintCidRangeData(const CallTargets& ic_data, intptr_t num_checks_to_print = kPrintAll); static bool ShouldPrint(const Function& function); private: const Function& function_; const GrowableArray& block_order_; const bool print_locations_; }; } // namespace dart #endif // RUNTIME_VM_COMPILER_BACKEND_IL_PRINTER_H_