1149 if (StressCodeBuffers)
1150 code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion
1151
1152 int total_req =
1153 const_req +
1154 code_req +
1155 pad_req +
1156 stub_req +
1157 exception_handler_req +
1158 deopt_handler_req; // deopt handler
1159
1160 if (has_method_handle_invokes())
1161 total_req += deopt_handler_req; // deopt MH handler
1162
1163 CodeBuffer* cb = code_buffer();
1164 cb->initialize(total_req, locs_req);
1165
1166 // Have we run out of code space?
1167 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1168 C->record_failure("CodeCache is full");
1169 CompileBroker::handle_full_code_cache();
1170 return NULL;
1171 }
1172 // Configure the code buffer.
1173 cb->initialize_consts_size(const_req);
1174 cb->initialize_stubs_size(stub_req);
1175 cb->initialize_oop_recorder(env()->oop_recorder());
1176
1177 // fill in the nop array for bundling computations
1178 MachNode *_nop_list[Bundle::_nop_count];
1179 Bundle::initialize_nops(_nop_list);
1180
1181 return cb;
1182 }
1183
1184 //------------------------------fill_buffer------------------------------------
1185 void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
1186 // blk_starts[] contains offsets calculated during short branches processing,
1187 // offsets should not be increased during following steps.
1188
1189 // Compute the size of first NumberOfLoopInstrToAlign instructions at head
1474 }
1475 #endif
1476 else if (!n->is_Proj()) {
1477 // Remember the beginning of the previous instruction, in case
1478 // it's followed by a flag-kill and a null-check. Happens on
1479 // Intel all the time, with add-to-memory kind of opcodes.
1480 previous_offset = current_offset;
1481 }
1482
1483 // Not an else-if!
1484 // If this is a trap based cmp then add its offset to the list.
1485 if (mach->is_TrapBasedCheckNode()) {
1486 inct_starts[inct_cnt++] = current_offset;
1487 }
1488 }
1489
1490 // Verify that there is sufficient space remaining
1491 cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
1492 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1493 C->record_failure("CodeCache is full");
1494 CompileBroker::handle_full_code_cache();
1495 return;
1496 }
1497
1498 // Save the offset for the listing
1499 #ifndef PRODUCT
1500 if (node_offsets && n->_idx < node_offset_limit)
1501 node_offsets[n->_idx] = cb->insts_size();
1502 #endif
1503
1504 // "Normal" instruction case
1505 DEBUG_ONLY( uint instr_offset = cb->insts_size(); )
1506 n->emit(*cb, _regalloc);
1507 current_offset = cb->insts_size();
1508
1509 #ifdef ASSERT
1510 if (n->size(_regalloc) < (current_offset-instr_offset)) {
1511 n->dump();
1512 assert(false, "wrong size of mach node");
1513 }
1514 #endif
1631
1632 // Only java methods have exception handlers and deopt handlers
1633 // class HandlerImpl is platform-specific and defined in the *.ad files.
1634 if (_method) {
1635 // Emit the exception handler code.
1636 _code_offsets.set_value(CodeOffsets::Exceptions, HandlerImpl::emit_exception_handler(*cb));
1637 // Emit the deopt handler code.
1638 _code_offsets.set_value(CodeOffsets::Deopt, HandlerImpl::emit_deopt_handler(*cb));
1639
1640 // Emit the MethodHandle deopt handler code (if required).
1641 if (has_method_handle_invokes()) {
1642 // We can use the same code as for the normal deopt handler, we
1643 // just need a different entry point address.
1644 _code_offsets.set_value(CodeOffsets::DeoptMH, HandlerImpl::emit_deopt_handler(*cb));
1645 }
1646 }
1647
1648 // One last check for failed CodeBuffer::expand:
1649 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1650 C->record_failure("CodeCache is full");
1651 CompileBroker::handle_full_code_cache();
1652 return;
1653 }
1654
1655 #ifndef PRODUCT
1656 // Dump the assembly code, including basic-block numbers
1657 if (print_assembly()) {
1658 ttyLocker ttyl; // keep the following output all in one block
1659 if (!VMThread::should_terminate()) { // test this under the tty lock
1660 // This output goes directly to the tty, not the compiler log.
1661 // To enable tools to match it up with the compilation activity,
1662 // be sure to tag this tty output with the compile ID.
1663 if (xtty != NULL) {
1664 xtty->head("opto_assembly compile_id='%d'%s", compile_id(),
1665 is_osr_compilation() ? " compile_kind='osr'" :
1666 "");
1667 }
1668 if (method() != NULL) {
1669 method()->print_metadata();
1670 }
1671 dump_asm(node_offsets, node_offset_limit);
|
1149 if (StressCodeBuffers)
1150 code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion
1151
1152 int total_req =
1153 const_req +
1154 code_req +
1155 pad_req +
1156 stub_req +
1157 exception_handler_req +
1158 deopt_handler_req; // deopt handler
1159
1160 if (has_method_handle_invokes())
1161 total_req += deopt_handler_req; // deopt MH handler
1162
1163 CodeBuffer* cb = code_buffer();
1164 cb->initialize(total_req, locs_req);
1165
1166 // Have we run out of code space?
1167 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1168 C->record_failure("CodeCache is full");
1169 CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
1170 return NULL;
1171 }
1172 // Configure the code buffer.
1173 cb->initialize_consts_size(const_req);
1174 cb->initialize_stubs_size(stub_req);
1175 cb->initialize_oop_recorder(env()->oop_recorder());
1176
1177 // fill in the nop array for bundling computations
1178 MachNode *_nop_list[Bundle::_nop_count];
1179 Bundle::initialize_nops(_nop_list);
1180
1181 return cb;
1182 }
1183
1184 //------------------------------fill_buffer------------------------------------
1185 void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
1186 // blk_starts[] contains offsets calculated during short branches processing,
1187 // offsets should not be increased during following steps.
1188
1189 // Compute the size of first NumberOfLoopInstrToAlign instructions at head
1474 }
1475 #endif
1476 else if (!n->is_Proj()) {
1477 // Remember the beginning of the previous instruction, in case
1478 // it's followed by a flag-kill and a null-check. Happens on
1479 // Intel all the time, with add-to-memory kind of opcodes.
1480 previous_offset = current_offset;
1481 }
1482
1483 // Not an else-if!
1484 // If this is a trap based cmp then add its offset to the list.
1485 if (mach->is_TrapBasedCheckNode()) {
1486 inct_starts[inct_cnt++] = current_offset;
1487 }
1488 }
1489
1490 // Verify that there is sufficient space remaining
1491 cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
1492 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1493 C->record_failure("CodeCache is full");
1494 CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
1495 return;
1496 }
1497
1498 // Save the offset for the listing
1499 #ifndef PRODUCT
1500 if (node_offsets && n->_idx < node_offset_limit)
1501 node_offsets[n->_idx] = cb->insts_size();
1502 #endif
1503
1504 // "Normal" instruction case
1505 DEBUG_ONLY( uint instr_offset = cb->insts_size(); )
1506 n->emit(*cb, _regalloc);
1507 current_offset = cb->insts_size();
1508
1509 #ifdef ASSERT
1510 if (n->size(_regalloc) < (current_offset-instr_offset)) {
1511 n->dump();
1512 assert(false, "wrong size of mach node");
1513 }
1514 #endif
1631
1632 // Only java methods have exception handlers and deopt handlers
1633 // class HandlerImpl is platform-specific and defined in the *.ad files.
1634 if (_method) {
1635 // Emit the exception handler code.
1636 _code_offsets.set_value(CodeOffsets::Exceptions, HandlerImpl::emit_exception_handler(*cb));
1637 // Emit the deopt handler code.
1638 _code_offsets.set_value(CodeOffsets::Deopt, HandlerImpl::emit_deopt_handler(*cb));
1639
1640 // Emit the MethodHandle deopt handler code (if required).
1641 if (has_method_handle_invokes()) {
1642 // We can use the same code as for the normal deopt handler, we
1643 // just need a different entry point address.
1644 _code_offsets.set_value(CodeOffsets::DeoptMH, HandlerImpl::emit_deopt_handler(*cb));
1645 }
1646 }
1647
1648 // One last check for failed CodeBuffer::expand:
1649 if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
1650 C->record_failure("CodeCache is full");
1651 CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
1652 return;
1653 }
1654
1655 #ifndef PRODUCT
1656 // Dump the assembly code, including basic-block numbers
1657 if (print_assembly()) {
1658 ttyLocker ttyl; // keep the following output all in one block
1659 if (!VMThread::should_terminate()) { // test this under the tty lock
1660 // This output goes directly to the tty, not the compiler log.
1661 // To enable tools to match it up with the compilation activity,
1662 // be sure to tag this tty output with the compile ID.
1663 if (xtty != NULL) {
1664 xtty->head("opto_assembly compile_id='%d'%s", compile_id(),
1665 is_osr_compilation() ? " compile_kind='osr'" :
1666 "");
1667 }
1668 if (method() != NULL) {
1669 method()->print_metadata();
1670 }
1671 dump_asm(node_offsets, node_offset_limit);
|