StubCodeGenerator::~StubCodeGenerator() { if (PrintStubCode || _print_code) { CodeBuffer* cbuf = _masm->code(); CodeBlob* blob = CodeCache::find_blob_unsafe(cbuf->insts()->start()); if (blob != NULL) { blob->set_strings(cbuf->strings()); } bool saw_first = false; StubCodeDesc* toprint[1000]; int toprint_len = 0; for (StubCodeDesc* cdesc = _last_stub; cdesc != NULL; cdesc = cdesc->_next) { toprint[toprint_len++] = cdesc; if (cdesc == _first_stub) { saw_first = true; break; } } assert(saw_first, "must get both first & last"); // Print in reverse order: qsort(toprint, toprint_len, sizeof(toprint[0]), compare_cdesc); for (int i = 0; i < toprint_len; i++) { StubCodeDesc* cdesc = toprint[i]; cdesc->print(); tty->cr(); Disassembler::decode(cdesc->begin(), cdesc->end()); tty->cr(); } } }
// Inform CodeBuffer that incoming code and relocation will be for stubs address AbstractAssembler::start_a_stub(int required_space) { CodeBuffer* cb = code(); CodeSection* cs = cb->stubs(); assert(_code_section == cb->insts(), "not in insts?"); if (cs->maybe_expand_to_ensure_remaining(required_space) && cb->blob() == NULL) { return NULL; } set_code_section(cs); return pc(); }
// Inform CodeBuffer that incoming code and relocation will be for stubs address AbstractAssembler::start_a_const(int required_space, int required_align) { CodeBuffer* cb = code(); CodeSection* cs = cb->consts(); assert(_code_section == cb->insts() || _code_section == cb->stubs(), "not in insts/stubs?"); address end = cs->end(); int pad = -(intptr_t)end & (required_align-1); if (cs->maybe_expand_to_ensure_remaining(pad + required_space)) { if (cb->blob() == NULL) return NULL; end = cs->end(); // refresh pointer } if (pad > 0) { while (--pad >= 0) { *end++ = 0; } cs->set_end(end); } set_code_section(cs); return end; }