# HG changeset patch # User roland # Date 1397823921 -7200 # Node ID ce9fd31ffd148128f059ca87693cb46e86d36ec4 # Parent 9eddc467297f1928dff4f4e13b1b34bdeb808d23 8039975: SIGSEGV in MethodData::next_data(ProfileData*) Summary: profiling code in interpreter broken when argument profiling is off. Reviewed-by: iveresov, kvn diff -r 9eddc467297f -r ce9fd31ffd14 src/cpu/sparc/vm/interp_masm_sparc.cpp --- a/src/cpu/sparc/vm/interp_masm_sparc.cpp Fri Feb 21 09:48:52 2014 +0100 +++ b/src/cpu/sparc/vm/interp_masm_sparc.cpp Fri Apr 18 14:25:21 2014 +0200 @@ -2003,7 +2003,7 @@ } } else { assert(MethodData::profile_return(), "either profile call args or call ret"); - update_mdp_by_constant(in_bytes(ReturnTypeEntry::size())); + update_mdp_by_constant(in_bytes(TypeEntriesAtCall::return_only_size())); } // mdp points right after the end of the diff -r 9eddc467297f -r ce9fd31ffd14 src/cpu/x86/vm/interp_masm_x86.cpp --- a/src/cpu/x86/vm/interp_masm_x86.cpp Fri Feb 21 09:48:52 2014 +0100 +++ b/src/cpu/x86/vm/interp_masm_x86.cpp Fri Apr 18 14:25:21 2014 +0200 @@ -137,7 +137,7 @@ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), mdp); } else { assert(MethodData::profile_return(), "either profile call args or call ret"); - update_mdp_by_constant(mdp, in_bytes(ReturnTypeEntry::size())); + update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size())); } // mdp points right after the end of the diff -r 9eddc467297f -r ce9fd31ffd14 src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Fri Feb 21 09:48:52 2014 +0100 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Fri Apr 18 14:25:21 2014 +0200 @@ -3186,8 +3186,8 @@ #ifdef ASSERT Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); int n = x->nb_profiled_args(); - assert(MethodData::profile_parameters() && x->inlined() && - ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)), + assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || + (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), "only at JSR292 bytecodes"); #endif } diff -r 9eddc467297f -r ce9fd31ffd14 src/share/vm/oops/methodData.hpp --- a/src/share/vm/oops/methodData.hpp Fri Feb 21 09:48:52 2014 +0100 +++ b/src/share/vm/oops/methodData.hpp Fri Apr 18 14:25:21 2014 +0200 @@ -1022,6 +1022,11 @@ static ByteSize argument_type_offset(int i) { return in_ByteSize(argument_type_local_offset(i) * DataLayout::cell_size); } + + static ByteSize return_only_size() { + return ReturnTypeEntry::size() + in_ByteSize(header_cell_count() * DataLayout::cell_size); + } + }; // CallTypeData @@ -2172,7 +2177,6 @@ static bool profile_jsr292(methodHandle m, int bci); static int profile_arguments_flag(); - static bool profile_arguments_jsr292_only(); static bool profile_all_arguments(); static bool profile_arguments_for_invoke(methodHandle m, int bci); static int profile_return_flag(); @@ -2475,6 +2479,7 @@ static bool profile_parameters_for_method(methodHandle m); static bool profile_arguments(); + static bool profile_arguments_jsr292_only(); static bool profile_return(); static bool profile_parameters(); static bool profile_return_jsr292_only();