< prev index next >

src/hotspot/share/opto/output.cpp

Print this page
rev 54763 : 8213084: Rework and enhance Print[Opto]Assembly output
Reviewed-by:

*** 1,7 **** /* ! * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 1104,1119 **** uint* jmp_size = NEW_RESOURCE_ARRAY(uint,nblocks); uint* jmp_rule = NEW_RESOURCE_ARRAY(uint,nblocks); #endif // Create an array of unused labels, one for each basic block, if printing is enabled ! #ifndef PRODUCT int *node_offsets = NULL; uint node_offset_limit = unique(); ! if (print_assembly()) node_offsets = NEW_RESOURCE_ARRAY(int, node_offset_limit); #endif NonSafepointEmitter non_safepoints(this); // emit non-safepoints lazily // Emit the constant table. --- 1104,1124 ---- uint* jmp_size = NEW_RESOURCE_ARRAY(uint,nblocks); uint* jmp_rule = NEW_RESOURCE_ARRAY(uint,nblocks); #endif // Create an array of unused labels, one for each basic block, if printing is enabled ! #if defined(SUPPORT_OPTO_ASSEMBLY) int *node_offsets = NULL; uint node_offset_limit = unique(); ! if (print_assembly()) { node_offsets = NEW_RESOURCE_ARRAY(int, node_offset_limit); + } + if (node_offsets != NULL) { + // We need to initialize. Unused array elements may contain garbage and mess up PrintOptoAssembly. + memset(node_offsets, 0, node_offset_limit*sizeof(int)); + } #endif NonSafepointEmitter non_safepoints(this); // emit non-safepoints lazily // Emit the constant table.
*** 1379,1391 **** C->record_failure("CodeCache is full"); return; } // Save the offset for the listing ! #ifndef PRODUCT ! if (node_offsets && n->_idx < node_offset_limit) node_offsets[n->_idx] = cb->insts_size(); #endif // "Normal" instruction case DEBUG_ONLY( uint instr_offset = cb->insts_size(); ) n->emit(*cb, _regalloc); --- 1384,1397 ---- C->record_failure("CodeCache is full"); return; } // Save the offset for the listing ! #if defined(SUPPORT_OPTO_ASSEMBLY) ! if ((node_offsets != NULL) && (n->_idx < node_offset_limit)) { node_offsets[n->_idx] = cb->insts_size(); + } #endif // "Normal" instruction case DEBUG_ONLY( uint instr_offset = cb->insts_size(); ) n->emit(*cb, _regalloc);
*** 1428,1440 **** // Back up 1 instruction cb->set_insts_end(cb->insts_end() - Pipeline::instr_unit_size()); // Save the offset for the listing ! #ifndef PRODUCT ! if (node_offsets && delay_slot->_idx < node_offset_limit) node_offsets[delay_slot->_idx] = cb->insts_size(); #endif // Support a SafePoint in the delay slot if (delay_slot->is_MachSafePoint()) { MachNode *mach = delay_slot->as_Mach(); --- 1434,1447 ---- // Back up 1 instruction cb->set_insts_end(cb->insts_end() - Pipeline::instr_unit_size()); // Save the offset for the listing ! #if defined(SUPPORT_OPTO_ASSEMBLY) ! if ((node_offsets != NULL) && (delay_slot->_idx < node_offset_limit)) { node_offsets[delay_slot->_idx] = cb->insts_size(); + } #endif // Support a SafePoint in the delay slot if (delay_slot->is_MachSafePoint()) { MachNode *mach = delay_slot->as_Mach();
*** 1539,1549 **** if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) { C->record_failure("CodeCache is full"); return; } ! #ifndef PRODUCT // Dump the assembly code, including basic-block numbers if (print_assembly()) { ttyLocker ttyl; // keep the following output all in one block if (!VMThread::should_terminate()) { // test this under the tty lock // This output goes directly to the tty, not the compiler log. --- 1546,1563 ---- if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) { C->record_failure("CodeCache is full"); return; } ! #if defined(SUPPORT_ABSTRACT_ASSEMBLY) || defined(SUPPORT_ASSEMBLY) || defined(SUPPORT_OPTO_ASSEMBLY) ! if (print_assembly()) { ! tty->cr(); ! tty->print_cr("============================= C2-compiled nmethod =============================="); ! } ! #endif ! ! #if defined(SUPPORT_OPTO_ASSEMBLY) // Dump the assembly code, including basic-block numbers if (print_assembly()) { ttyLocker ttyl; // keep the following output all in one block if (!VMThread::should_terminate()) { // test this under the tty lock // This output goes directly to the tty, not the compiler log.
*** 1553,1578 **** xtty->head("opto_assembly compile_id='%d'%s", compile_id(), is_osr_compilation() ? " compile_kind='osr'" : ""); } if (method() != NULL) { method()->print_metadata(); } else if (stub_name() != NULL) { ! tty->print_cr("Generating RuntimeStub - %s", stub_name()); } dump_asm(node_offsets, node_offset_limit); if (xtty != NULL) { // print_metadata and dump_asm above may safepoint which makes us loose the ttylock. // Retake lock too make sure the end tag is coherent, and that xmlStream->pop_tag is done // thread safe ttyLocker ttyl2; xtty->tail("opto_assembly"); } } } #endif - } void Compile::FillExceptionTables(uint cnt, uint *call_returns, uint *inct_starts, Label *blk_labels) { _inc_table.set_size(cnt); --- 1567,1595 ---- xtty->head("opto_assembly compile_id='%d'%s", compile_id(), is_osr_compilation() ? " compile_kind='osr'" : ""); } if (method() != NULL) { + tty->print_cr("----------------------------------- MetaData -----------------------------------"); method()->print_metadata(); } else if (stub_name() != NULL) { ! tty->print_cr("----------------------------- RuntimeStub %s -------------------------------", stub_name()); } + tty->cr(); + tty->print_cr("--------------------------------- OptoAssembly ---------------------------------"); dump_asm(node_offsets, node_offset_limit); + tty->print_cr("--------------------------------------------------------------------------------"); if (xtty != NULL) { // print_metadata and dump_asm above may safepoint which makes us loose the ttylock. // Retake lock too make sure the end tag is coherent, and that xmlStream->pop_tag is done // thread safe ttyLocker ttyl2; xtty->tail("opto_assembly"); } } } #endif } void Compile::FillExceptionTables(uint cnt, uint *call_returns, uint *inct_starts, Label *blk_labels) { _inc_table.set_size(cnt);
< prev index next >