< prev index next >

src/share/vm/code/compiledMethod.hpp

Print this page
rev 13183 : 8183299: Improve inlining of CompiledMethod methods into frame::sender
Reviewed-by: TBD

@@ -24,10 +24,11 @@
 
 #ifndef SHARE_VM_CODE_COMPILEDMETHOD_HPP
 #define SHARE_VM_CODE_COMPILEDMETHOD_HPP
 
 #include "code/codeBlob.hpp"
+#include "code/nativeInst.hpp"
 #include "code/pcDesc.hpp"
 #include "oops/metadata.hpp"
 
 class Dependencies;
 class ExceptionHandlerTable;

@@ -303,11 +304,18 @@
   virtual address get_original_pc(const frame* fr) = 0;
   // Deopt
   // Return true is the PC is one would expect if the frame is being deopted.
   bool is_deopt_pc      (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
   bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
-  bool is_deopt_entry(address pc);
+  bool is_deopt_entry(address pc) {
+    return pc == deopt_handler_begin()
+#if INCLUDE_JVMCI
+      // When using JVMCI the address might be off by the size of a call instruction.
+      || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::instruction_size))
+#endif
+      ;
+  }
 
   virtual bool can_convert_to_zombie() = 0;
   virtual const char* compile_kind() const = 0;
   virtual int get_state() const = 0;
 

@@ -322,11 +330,19 @@
   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f);
 
   // implicit exceptions support
   virtual address continuation_for_implicit_exception(address pc) { return NULL; }
 
-  static address get_deopt_original_pc(const frame* fr);
+  static address get_deopt_original_pc(const frame* fr) {
+    if (fr->cb() == NULL)  return NULL;
+
+    CompiledMethod* cm = fr->cb()->as_compiled_method_or_null();
+    if (cm != NULL && cm->is_deopt_pc(fr->pc()))
+      return cm->get_original_pc(fr);
+
+    return NULL;
+  }
 
   // Inline cache support
   void cleanup_inline_caches(bool clean_all = false);
   virtual void clear_inline_caches();
   void clear_ic_stubs();
< prev index next >