Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp
32285 views
/*1* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "c1/c1_CFGPrinter.hpp"26#include "c1/c1_IR.hpp"27#include "c1/c1_InstructionPrinter.hpp"28#include "c1/c1_LIR.hpp"29#include "c1/c1_LinearScan.hpp"30#include "c1/c1_ValueStack.hpp"3132#ifndef PRODUCT333435class CFGPrinterOutput : public CHeapObj<mtCompiler> {36private:37outputStream* _output;3839Compilation* _compilation;40bool _do_print_HIR;41bool _do_print_LIR;4243class PrintBlockClosure: public BlockClosure {44void block_do(BlockBegin* block) { if (block != NULL) CFGPrinter::output()->print_block(block); }45};464748outputStream* output() { assert(_output != NULL, ""); return _output; }4950void inc_indent();51void dec_indent();52void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);53void print_begin(const char* tag);54void print_end(const char* tag);5556char* method_name(ciMethod* method, bool short_name = false);5758public:59CFGPrinterOutput();6061void set_compilation(Compilation* compilation) { _compilation = compilation; }62void set_print_flags(bool do_print_HIR, bool do_print_LIR) { _do_print_HIR = do_print_HIR; _do_print_LIR = do_print_LIR; }6364void print_compilation();65void print_intervals(IntervalList* intervals, const char* name);6667void print_state(BlockBegin* block);68void print_operand(Value instr);69void print_HIR(Value instr);70void print_HIR(BlockBegin* block);71void print_LIR(BlockBegin* block);72void print_block(BlockBegin* block);73void print_cfg(BlockList* blocks, const char* name);74void print_cfg(IR* blocks, const char* name);75};7677CFGPrinterOutput* CFGPrinter::_output = NULL;7879808182void CFGPrinter::print_compilation(Compilation* compilation) {83if (_output == NULL) {84_output = new CFGPrinterOutput();85}86output()->set_compilation(compilation);87output()->print_compilation();88}8990void CFGPrinter::print_cfg(BlockList* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {91output()->set_print_flags(do_print_HIR, do_print_LIR);92output()->print_cfg(blocks, name);93}9495void CFGPrinter::print_cfg(IR* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {96output()->set_print_flags(do_print_HIR, do_print_LIR);97output()->print_cfg(blocks, name);98}99100101void CFGPrinter::print_intervals(IntervalList* intervals, const char* name) {102output()->print_intervals(intervals, name);103}104105106107CFGPrinterOutput::CFGPrinterOutput()108: _output(new(ResourceObj::C_HEAP, mtCompiler) fileStream("output.cfg"))109{110}111112113114void CFGPrinterOutput::inc_indent() {115output()->inc();116output()->inc();117}118119void CFGPrinterOutput::dec_indent() {120output()->dec();121output()->dec();122}123124void CFGPrinterOutput::print(const char* format, ...) {125output()->indent();126127va_list ap;128va_start(ap, format);129output()->vprint_cr(format, ap);130va_end(ap);131}132133void CFGPrinterOutput::print_begin(const char* tag) {134output()->indent();135output()->print_cr("begin_%s", tag);136inc_indent();137}138139void CFGPrinterOutput::print_end(const char* tag) {140dec_indent();141output()->indent();142output()->print_cr("end_%s", tag);143}144145146char* CFGPrinterOutput::method_name(ciMethod* method, bool short_name) {147stringStream name;148if (short_name) {149method->print_short_name(&name);150} else {151method->print_name(&name);152}153return name.as_string();154155}156157158void CFGPrinterOutput::print_compilation() {159print_begin("compilation");160161print("name \"%s\"", method_name(_compilation->method(), true));162print("method \"%s\"", method_name(_compilation->method()));163print("date " INT64_FORMAT, (int64_t) os::javaTimeMillis());164165print_end("compilation");166}167168169170171172void CFGPrinterOutput::print_state(BlockBegin* block) {173print_begin("states");174175InstructionPrinter ip(true, output());176177ValueStack* state = block->state();178int index;179Value value;180181for_each_state(state) {182print_begin("locals");183print("size %d", state->locals_size());184print("method \"%s\"", method_name(state->scope()->method()));185186for_each_local_value(state, index, value) {187ip.print_phi(index, value, block);188print_operand(value);189output()->cr();190}191print_end("locals");192193if (state->stack_size() > 0) {194print_begin("stack");195print("size %d", state->stack_size());196print("method \"%s\"", method_name(state->scope()->method()));197198for_each_stack_value(state, index, value) {199ip.print_phi(index, value, block);200print_operand(value);201output()->cr();202}203204print_end("stack");205}206207if (state->locks_size() > 0) {208print_begin("locks");209print("size %d", state->locks_size());210print("method \"%s\"", method_name(state->scope()->method()));211212for_each_lock_value(state, index, value) {213ip.print_phi(index, value, block);214print_operand(value);215output()->cr();216}217print_end("locks");218}219}220221print_end("states");222}223224225void CFGPrinterOutput::print_operand(Value instr) {226if (instr->operand()->is_virtual()) {227output()->print(" \"");228instr->operand()->print(output());229output()->print("\" ");230}231}232233void CFGPrinterOutput::print_HIR(Value instr) {234InstructionPrinter ip(true, output());235236if (instr->is_pinned()) {237output()->put('.');238}239240output()->print("%d %d ", instr->printable_bci(), instr->use_count());241242print_operand(instr);243244ip.print_temp(instr);245output()->print(" ");246ip.print_instr(instr);247248output()->print_cr(" <|@");249}250251void CFGPrinterOutput::print_HIR(BlockBegin* block) {252print_begin("HIR");253254Value cur = block->next();255while (cur != NULL) {256print_HIR(cur);257cur = cur->next();258}259260print_end("HIR");261}262263void CFGPrinterOutput::print_LIR(BlockBegin* block) {264print_begin("LIR");265266for (int i = 0; i < block->lir()->length(); i++) {267block->lir()->at(i)->print_on(output());268output()->print_cr(" <|@ ");269}270271print_end("LIR");272}273274275void CFGPrinterOutput::print_block(BlockBegin* block) {276print_begin("block");277278print("name \"B%d\"", block->block_id());279280print("from_bci %d", block->bci());281print("to_bci %d", (block->end() == NULL ? -1 : block->end()->printable_bci()));282283output()->indent();284output()->print("predecessors ");285int i;286for (i = 0; i < block->number_of_preds(); i++) {287output()->print("\"B%d\" ", block->pred_at(i)->block_id());288}289output()->cr();290291output()->indent();292output()->print("successors ");293for (i = 0; i < block->number_of_sux(); i++) {294output()->print("\"B%d\" ", block->sux_at(i)->block_id());295}296output()->cr();297298output()->indent();299output()->print("xhandlers");300for (i = 0; i < block->number_of_exception_handlers(); i++) {301output()->print("\"B%d\" ", block->exception_handler_at(i)->block_id());302}303output()->cr();304305output()->indent();306output()->print("flags ");307if (block->is_set(BlockBegin::std_entry_flag)) output()->print("\"std\" ");308if (block->is_set(BlockBegin::osr_entry_flag)) output()->print("\"osr\" ");309if (block->is_set(BlockBegin::exception_entry_flag)) output()->print("\"ex\" ");310if (block->is_set(BlockBegin::subroutine_entry_flag)) output()->print("\"sr\" ");311if (block->is_set(BlockBegin::backward_branch_target_flag)) output()->print("\"bb\" ");312if (block->is_set(BlockBegin::parser_loop_header_flag)) output()->print("\"plh\" ");313if (block->is_set(BlockBegin::critical_edge_split_flag)) output()->print("\"ces\" ");314if (block->is_set(BlockBegin::linear_scan_loop_header_flag)) output()->print("\"llh\" ");315if (block->is_set(BlockBegin::linear_scan_loop_end_flag)) output()->print("\"lle\" ");316output()->cr();317318if (block->dominator() != NULL) {319print("dominator \"B%d\"", block->dominator()->block_id());320}321if (block->loop_index() != -1) {322print("loop_index %d", block->loop_index());323print("loop_depth %d", block->loop_depth());324}325326if (block->first_lir_instruction_id() != -1) {327print("first_lir_id %d", block->first_lir_instruction_id());328print("last_lir_id %d", block->last_lir_instruction_id());329}330331if (_do_print_HIR) {332print_state(block);333print_HIR(block);334}335336if (_do_print_LIR) {337print_LIR(block);338}339340print_end("block");341}342343344345void CFGPrinterOutput::print_cfg(BlockList* blocks, const char* name) {346print_begin("cfg");347print("name \"%s\"", name);348349PrintBlockClosure print_block;350blocks->iterate_forward(&print_block);351352print_end("cfg");353output()->flush();354}355356void CFGPrinterOutput::print_cfg(IR* blocks, const char* name) {357print_begin("cfg");358print("name \"%s\"", name);359360PrintBlockClosure print_block;361blocks->iterate_preorder(&print_block);362363print_end("cfg");364output()->flush();365}366367368369370void CFGPrinterOutput::print_intervals(IntervalList* intervals, const char* name) {371print_begin("intervals");372print("name \"%s\"", name);373374for (int i = 0; i < intervals->length(); i++) {375if (intervals->at(i) != NULL) {376intervals->at(i)->print(output());377}378}379380print_end("intervals");381output()->flush();382}383384385#endif386387388