int Compilation::emit_code_body() { // emit code if (!setup_code_buffer(code(), allocator()->num_calls())) { BAILOUT_("size requested greater than avail code buffer size", 0); } code()->initialize_oop_recorder(env()->oop_recorder()); _masm = new C1_MacroAssembler(code()); _masm->set_oop_recorder(env()->oop_recorder()); LIR_Assembler lir_asm(this); lir_asm.emit_code(hir()->code()); CHECK_BAILOUT_(0); emit_code_epilog(&lir_asm); CHECK_BAILOUT_(0); generate_exception_handler_table(); #ifndef PRODUCT if (PrintExceptionHandlers && Verbose) { exception_handler_table()->print(); } #endif /* PRODUCT */ return frame_map()->framesize(); }
void Runtime1::generate_blob_for(StubID id) { assert(0 <= id && id < number_of_ids, "illegal stub id"); ResourceMark rm; // create code buffer for code storage CodeBuffer code(get_buffer_blob()->instructions_begin(), get_buffer_blob()->instructions_size()); setup_code_buffer(&code, 0); // create assembler for code generation StubAssembler* sasm = new StubAssembler(&code, name_for(id), id); // generate code for runtime stub OopMapSet* oop_maps; oop_maps = generate_code_for(id, sasm); assert(oop_maps == NULL || sasm->frame_size() != no_frame_size, "if stub has an oop map it must have a valid frame size"); #ifdef ASSERT // Make sure that stubs that need oopmaps have them switch (id) { // These stubs don't need to have an oopmap case dtrace_object_alloc_id: case g1_pre_barrier_slow_id: case g1_post_barrier_slow_id: case slow_subtype_check_id: case fpu2long_stub_id: case unwind_exception_id: #ifndef TIERED case counter_overflow_id: // Not generated outside the tiered world #endif #ifdef SPARC case handle_exception_nofpu_id: // Unused on sparc #endif break; // All other stubs should have oopmaps default: assert(oop_maps != NULL, "must have an oopmap"); } #endif // align so printing shows nop's instead of random code at the end (SimpleStubs are aligned) sasm->align(BytesPerWord); // make sure all code is in code buffer sasm->flush(); // create blob - distinguish a few special cases CodeBlob* blob = RuntimeStub::new_runtime_stub(name_for(id), &code, CodeOffsets::frame_never_safe, sasm->frame_size(), oop_maps, sasm->must_gc_arguments()); // install blob assert(blob != NULL, "blob must exist"); _blobs[id] = blob; }