Mercurial > hg > graal-compiler
diff src/share/vm/oops/generateOopMap.cpp @ 1910:d1896d1dda3e
6981788: GC map generator sometimes picks up the wrong kind of instruction operand
Summary: Distinguish pool indexes from cache indexes in recently changed code.
Reviewed-by: never
author | jrose |
---|---|
date | Sat, 30 Oct 2010 11:45:35 -0700 |
parents | 126ea7725993 |
children | f95d63e2154a |
line wrap: on
line diff
--- a/src/share/vm/oops/generateOopMap.cpp Thu Oct 28 00:48:18 2010 -0700 +++ b/src/share/vm/oops/generateOopMap.cpp Sat Oct 30 11:45:35 2010 -0700 @@ -1254,7 +1254,7 @@ case Bytecodes::_invokestatic: case Bytecodes::_invokedynamic: case Bytecodes::_invokeinterface: - int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2(); + int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); constantPoolOop cp = method()->constants(); int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); @@ -1286,7 +1286,7 @@ case Bytecodes::_invokestatic: case Bytecodes::_invokedynamic: case Bytecodes::_invokeinterface: - int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2(); + int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache(); constantPoolOop cp = method()->constants(); int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); @@ -1356,8 +1356,8 @@ case Bytecodes::_ldc2_w: ppush(vvCTS); break; - case Bytecodes::_ldc: do_ldc(itr->get_index(), itr->bci()); break; - case Bytecodes::_ldc_w: do_ldc(itr->get_index_u2(), itr->bci()); break; + case Bytecodes::_ldc: // fall through: + case Bytecodes::_ldc_w: do_ldc(itr->bci()); break; case Bytecodes::_iload: case Bytecodes::_fload: ppload(vCTS, itr->get_index()); break; @@ -1829,9 +1829,16 @@ -void GenerateOopMap::do_ldc(int idx, int bci) { +void GenerateOopMap::do_ldc(int bci) { + Bytecode_loadconstant* ldc = Bytecode_loadconstant_at(method(), bci); constantPoolOop cp = method()->constants(); - CellTypeState cts = cp->is_pointer_entry(idx) ? CellTypeState::make_line_ref(bci) : valCTS; + BasicType bt = ldc->result_type(); + CellTypeState cts = (bt == T_OBJECT) ? CellTypeState::make_line_ref(bci) : valCTS; + // Make sure bt==T_OBJECT is the same as old code (is_pointer_entry). + // Note that CONSTANT_MethodHandle entries are u2 index pairs, not pointer-entries, + // and they are processed by _fast_aldc and the CP cache. + assert((ldc->has_cache_index() || cp->is_pointer_entry(ldc->pool_index())) + ? (bt == T_OBJECT) : true, "expected object type"); ppush1(cts); }