Path: blob/master/src/hotspot/share/c1/c1_CFGPrinter.cpp
40930 views
/*1* Copyright (c) 2005, 2017, 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 "jvm.h"26#include "c1/c1_CFGPrinter.hpp"27#include "c1/c1_IR.hpp"28#include "c1/c1_InstructionPrinter.hpp"29#include "c1/c1_LIR.hpp"30#include "c1/c1_LinearScan.hpp"31#include "c1/c1_ValueStack.hpp"3233#ifndef PRODUCT3435void CFGPrinter::print_compilation(Compilation* compilation) {36CFGPrinterOutput* output = compilation->cfg_printer_output();37output->print_compilation();38}3940void CFGPrinter::print_cfg(BlockList* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {41CFGPrinterOutput* output = Compilation::current()->cfg_printer_output();42output->set_print_flags(do_print_HIR, do_print_LIR);43output->print_cfg(blocks, name);44}4546void CFGPrinter::print_cfg(IR* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {47CFGPrinterOutput* output = Compilation::current()->cfg_printer_output();48output->set_print_flags(do_print_HIR, do_print_LIR);49output->print_cfg(blocks, name);50}5152void CFGPrinter::print_intervals(IntervalList* intervals, const char* name) {53CFGPrinterOutput* output = Compilation::current()->cfg_printer_output();54output->print_intervals(intervals, name);55}565758CFGPrinterOutput::CFGPrinterOutput(Compilation* compilation)59: _output(NULL),60_compilation(compilation),61_do_print_HIR(false),62_do_print_LIR(false)63{64char file_name[O_BUFLEN];65jio_snprintf(file_name, sizeof(file_name), "output_tid" UINTX_FORMAT "_pid%u.cfg",66os::current_thread_id(), os::current_process_id());67_output = new(ResourceObj::C_HEAP, mtCompiler) fileStream(file_name, "at");68}6970void CFGPrinterOutput::inc_indent() {71output()->inc();72output()->inc();73}7475void CFGPrinterOutput::dec_indent() {76output()->dec();77output()->dec();78}7980void CFGPrinterOutput::print(const char* format, ...) {81output()->indent();8283va_list ap;84va_start(ap, format);85output()->vprint_cr(format, ap);86va_end(ap);87}8889void CFGPrinterOutput::print_begin(const char* tag) {90output()->indent();91output()->print_cr("begin_%s", tag);92inc_indent();93}9495void CFGPrinterOutput::print_end(const char* tag) {96dec_indent();97output()->indent();98output()->print_cr("end_%s", tag);99}100101102char* CFGPrinterOutput::method_name(ciMethod* method, bool short_name) {103stringStream name;104if (short_name) {105method->print_short_name(&name);106} else {107method->print_name(&name);108}109return name.as_string();110111}112113114void CFGPrinterOutput::print_compilation() {115print_begin("compilation");116117print("name \"%s\"", method_name(_compilation->method(), true));118print("method \"%s\"", method_name(_compilation->method()));119print("date " INT64_FORMAT, (int64_t) os::javaTimeMillis());120121print_end("compilation");122}123124125126127128void CFGPrinterOutput::print_state(BlockBegin* block) {129print_begin("states");130131InstructionPrinter ip(true, output());132133ValueStack* state = block->state();134int index;135Value value;136137for_each_state(state) {138print_begin("locals");139print("size %d", state->locals_size());140print("method \"%s\"", method_name(state->scope()->method()));141142for_each_local_value(state, index, value) {143ip.print_phi(index, value, block);144print_operand(value);145output()->cr();146}147print_end("locals");148149if (state->stack_size() > 0) {150print_begin("stack");151print("size %d", state->stack_size());152print("method \"%s\"", method_name(state->scope()->method()));153154for_each_stack_value(state, index, value) {155ip.print_phi(index, value, block);156print_operand(value);157output()->cr();158}159160print_end("stack");161}162163if (state->locks_size() > 0) {164print_begin("locks");165print("size %d", state->locks_size());166print("method \"%s\"", method_name(state->scope()->method()));167168for_each_lock_value(state, index, value) {169ip.print_phi(index, value, block);170print_operand(value);171output()->cr();172}173print_end("locks");174}175}176177print_end("states");178}179180181void CFGPrinterOutput::print_operand(Value instr) {182if (instr->operand()->is_virtual()) {183output()->print(" \"");184instr->operand()->print(output());185output()->print("\" ");186}187}188189void CFGPrinterOutput::print_HIR(Value instr) {190InstructionPrinter ip(true, output());191192if (instr->is_pinned()) {193output()->put('.');194}195196output()->print("%d %d ", instr->printable_bci(), instr->use_count());197198print_operand(instr);199200ip.print_temp(instr);201output()->print(" ");202ip.print_instr(instr);203204output()->print_cr(" <|@");205}206207void CFGPrinterOutput::print_HIR(BlockBegin* block) {208print_begin("HIR");209210Value cur = block->next();211while (cur != NULL) {212print_HIR(cur);213cur = cur->next();214}215216print_end("HIR");217}218219void CFGPrinterOutput::print_LIR(BlockBegin* block) {220print_begin("LIR");221222for (int i = 0; i < block->lir()->length(); i++) {223block->lir()->at(i)->print_on(output());224output()->print_cr(" <|@ ");225}226227print_end("LIR");228}229230231void CFGPrinterOutput::print_block(BlockBegin* block) {232print_begin("block");233234print("name \"B%d\"", block->block_id());235236print("from_bci %d", block->bci());237print("to_bci %d", (block->end() == NULL ? -1 : block->end()->printable_bci()));238239output()->indent();240output()->print("predecessors ");241int i;242for (i = 0; i < block->number_of_preds(); i++) {243output()->print("\"B%d\" ", block->pred_at(i)->block_id());244}245output()->cr();246247output()->indent();248output()->print("successors ");249for (i = 0; i < block->number_of_sux(); i++) {250output()->print("\"B%d\" ", block->sux_at(i)->block_id());251}252output()->cr();253254output()->indent();255output()->print("xhandlers");256for (i = 0; i < block->number_of_exception_handlers(); i++) {257output()->print("\"B%d\" ", block->exception_handler_at(i)->block_id());258}259output()->cr();260261output()->indent();262output()->print("flags ");263if (block->is_set(BlockBegin::std_entry_flag)) output()->print("\"std\" ");264if (block->is_set(BlockBegin::osr_entry_flag)) output()->print("\"osr\" ");265if (block->is_set(BlockBegin::exception_entry_flag)) output()->print("\"ex\" ");266if (block->is_set(BlockBegin::subroutine_entry_flag)) output()->print("\"sr\" ");267if (block->is_set(BlockBegin::backward_branch_target_flag)) output()->print("\"bb\" ");268if (block->is_set(BlockBegin::parser_loop_header_flag)) output()->print("\"plh\" ");269if (block->is_set(BlockBegin::critical_edge_split_flag)) output()->print("\"ces\" ");270if (block->is_set(BlockBegin::linear_scan_loop_header_flag)) output()->print("\"llh\" ");271if (block->is_set(BlockBegin::linear_scan_loop_end_flag)) output()->print("\"lle\" ");272output()->cr();273274if (block->dominator() != NULL) {275print("dominator \"B%d\"", block->dominator()->block_id());276}277if (block->loop_index() != -1) {278print("loop_index %d", block->loop_index());279print("loop_depth %d", block->loop_depth());280}281282if (block->first_lir_instruction_id() != -1) {283print("first_lir_id %d", block->first_lir_instruction_id());284print("last_lir_id %d", block->last_lir_instruction_id());285}286287if (_do_print_HIR) {288print_state(block);289print_HIR(block);290}291292if (_do_print_LIR) {293print_LIR(block);294}295296print_end("block");297}298299void CFGPrinterOutput::print_cfg(BlockList* blocks, const char* name) {300print_begin("cfg");301print("name \"%s\"", name);302303PrintBlockClosure print_block;304blocks->iterate_forward(&print_block);305306print_end("cfg");307output()->flush();308}309310void CFGPrinterOutput::print_cfg(IR* blocks, const char* name) {311print_begin("cfg");312print("name \"%s\"", name);313314PrintBlockClosure print_block;315blocks->iterate_preorder(&print_block);316317print_end("cfg");318output()->flush();319}320321void CFGPrinterOutput::print_intervals(IntervalList* intervals, const char* name) {322print_begin("intervals");323print("name \"%s\"", name);324325for (int i = 0; i < intervals->length(); i++) {326if (intervals->at(i) != NULL) {327intervals->at(i)->print_on(output(), true);328}329}330331print_end("intervals");332output()->flush();333}334335#endif // NOT PRODUCT336337338