changeset 7121:ce9fd31ffd14

8039975: SIGSEGV in MethodData::next_data(ProfileData*) Summary: profiling code in interpreter broken when argument profiling is off. Reviewed-by: iveresov, kvn
author roland
date Fri, 18 Apr 2014 14:25:21 +0200
parents 9eddc467297f
children 3c291bc2aa7c
files src/cpu/sparc/vm/interp_masm_sparc.cpp src/cpu/x86/vm/interp_masm_x86.cpp src/share/vm/c1/c1_LIRGenerator.cpp src/share/vm/oops/methodData.hpp
diffstat 4 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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
     }
--- 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();