RFR (M): 8026328: Setting a breakpoint on invokedynamic crashes the JVM

Christian Thalinger christian.thalinger at oracle.com
Thu Oct 24 16:21:24 PDT 2013


I’ve added another small change to make Zero build again:

diff -r 97d400662426 src/cpu/zero/vm/globals_zero.hpp
--- a/src/cpu/zero/vm/globals_zero.hpp	Wed Oct 23 19:22:28 2013 +0000
+++ b/src/cpu/zero/vm/globals_zero.hpp	Thu Oct 24 16:20:54 2013 -0700
@@ -57,6 +57,8 @@ define_pd_global(bool,  UseMembar,      
 // GC Ergo Flags
 define_pd_global(uintx, CMSYoungGenPerWorker, 16*M);  // default max size of CMS young gen, per GC worker thread
 
+define_pd_global(uintx, TypeProfileLevel, 0);
+
 #define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct)
 
 #endif // CPU_ZERO_VM_GLOBALS_ZERO_HPP

On Oct 24, 2013, at 3:02 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:

> 
> On Oct 23, 2013, at 3:46 PM, serguei.spitsyn at oracle.com wrote:
> 
>> Chris,
>> 
>> This fix is nice, thank you for doing it!
>> I don't see any issues except this one:
>> 
>>  566 /**
>>  567  * Returns the return entry address for the given top-of-stack state and bytecode.
>>  568  */
>>  569 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
>>  570   guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
>>  571   const int index = TosState_as_index(state);
>>  572   switch (code) {
>>  573   case Bytecodes::_invokestatic:
>>  574   case Bytecodes::_invokespecial:
>>  575   case Bytecodes::_invokevirtual:
>>  576     return _invoke_return_entry[index];
>>  577   case Bytecodes::_invokeinterface:
>>  578     return _invokeinterface_return_entry[index];
>>  579   case Bytecodes::_invokedynamic:
>>  580     return _invokedynamic_return_entry[index];
>>  581   default:
>>  582     return _return_entry[length].entry(state);
>>  583   }
>>  584 }
>> Should the above switch also include the _invokehandle case?
> 
> Good point.  It should.  I’ve also added an assert to make sure we don’t end up with an invoke instruction in the default case:
> 
> +  default:
> +    assert(!Bytecodes::is_invoke(code), err_msg("invoke instructions should be handled separately: %s", Bytecodes::name(code)));
> +    return _return_entry[length].entry(state);
> 
>> 
>> 
>> How did you test it?
>> It is necessary to run the nsk.jvmti and nsk.jdi testlists.
> 
> It tested various things manually and did a JPRT run.  Since I touched every invoke return entry in the system running some random code automatically tests this code.
> 
>> 
>> Thanks,
>> Serguei
>> 
>> 
>> On 10/23/13 11:06 AM, Christian Thalinger wrote:
>>> https://bugs.openjdk.java.net/browse/JDK-8026328
>>> http://cr.openjdk.java.net/~twisti/8026328/webrev.00/
>>> 
>>> 8026328: Setting a breakpoint on invokedynamic crashes the JVM
>>> Reviewed-by:
>>> 
>>> Well-known invoke instructions have a 2-byte index but invokedynamic has a 4-byte index. In return entries we check the bytecode instruction to decide which size the index has.
>>> 
>>> The problem is that if there is a breakpoint there is no way to know what index size the instruction has because the original instruction byte was replaced with the breakpoint byte.
>>> 
>>> There are a couple of ways to fix this but the proper way (in my opinion) is to have separate return entries for the different classes of invoke instructions.  This on one hand generates more return entries but on the other hand makes them smaller and simpler.
>>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20131024/bdd27d50/attachment-0001.html 


More information about the hotspot-compiler-dev mailing list