< prev index next >

src/hotspot/share/code/nmethod.cpp

Print this page

        

@@ -596,10 +596,12 @@
     _nmethod_end_offset      = _nul_chk_table_offset;
     _compile_id              = compile_id;
     _comp_level              = CompLevel_none;
     _entry_point             = code_begin()          + offsets->value(CodeOffsets::Entry);
     _verified_entry_point    = code_begin()          + offsets->value(CodeOffsets::Verified_Entry);
+    _verified_value_entry_point = _verified_entry_point;
+    _verified_value_ro_entry_point = _verified_entry_point;
     _osr_entry_point         = NULL;
     _exception_cache         = NULL;
     _pc_desc_container.reset_to(NULL);
     _hotness_counter         = NMethodSweeper::hotness_counter_reset_val();
 

@@ -756,10 +758,12 @@
     _handler_table_offset    = _dependencies_offset  + align_up((int)dependencies->size_in_bytes (), oopSize);
     _nul_chk_table_offset    = _handler_table_offset + align_up(handler_table->size_in_bytes(), oopSize);
     _nmethod_end_offset      = _nul_chk_table_offset + align_up(nul_chk_table->size_in_bytes(), oopSize);
     _entry_point             = code_begin()          + offsets->value(CodeOffsets::Entry);
     _verified_entry_point    = code_begin()          + offsets->value(CodeOffsets::Verified_Entry);
+    _verified_value_entry_point = code_begin()       + offsets->value(CodeOffsets::Verified_Value_Entry);
+    _verified_value_ro_entry_point = code_begin()    + offsets->value(CodeOffsets::Verified_Value_Entry_RO);
     _osr_entry_point         = code_begin()          + offsets->value(CodeOffsets::OSR_Entry);
     _exception_cache         = NULL;
 
     _scopes_data_begin = (address) this + scopes_data_offset;
 

@@ -2222,11 +2226,11 @@
 
   PcDesc* pd = pc_desc_at(nativeCall_at(call_site)->return_address());
   assert(pd != NULL, "PcDesc must exist");
   for (ScopeDesc* sd = new ScopeDesc(this, pd->scope_decode_offset(),
                                      pd->obj_decode_offset(), pd->should_reexecute(), pd->rethrow_exception(),
-                                     pd->return_oop());
+                                     pd->return_oop(), pd->return_vt());
        !sd->is_top(); sd = sd->sender()) {
     sd->verify();
   }
 }
 

@@ -2567,70 +2571,67 @@
 ScopeDesc* nmethod::scope_desc_in(address begin, address end) {
   PcDesc* p = pc_desc_near(begin+1);
   if (p != NULL && p->real_pc(this) <= end) {
     return new ScopeDesc(this, p->scope_decode_offset(),
                          p->obj_decode_offset(), p->should_reexecute(), p->rethrow_exception(),
-                         p->return_oop());
+                         p->return_oop(), p->return_vt());
   }
   return NULL;
 }
 
 void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) const {
-  if (block_begin == entry_point())             stream->print_cr("[Entry Point]");
-  if (block_begin == verified_entry_point())    stream->print_cr("[Verified Entry Point]");
-  if (JVMCI_ONLY(_exception_offset >= 0 &&) block_begin == exception_begin())         stream->print_cr("[Exception Handler]");
-  if (block_begin == stub_begin())              stream->print_cr("[Stub Code]");
-  if (JVMCI_ONLY(_deopt_handler_begin != NULL &&) block_begin == deopt_handler_begin())     stream->print_cr("[Deopt Handler Code]");
-
-  if (has_method_handle_invokes())
-    if (block_begin == deopt_mh_handler_begin())  stream->print_cr("[Deopt MH Handler Code]");
-
-  if (block_begin == consts_begin())            stream->print_cr("[Constants]");
-
-  if (block_begin == entry_point()) {
+  address low = MIN4(entry_point(), verified_entry_point(), verified_value_entry_point(), verified_value_ro_entry_point());
+  assert(low != 0, "sanity");
+  if (block_begin == low) {
+    // Print method arguments before the method entry
     methodHandle m = method();
     if (m.not_null()) {
       stream->print("  # ");
       m->print_value_on(stream);
       stream->cr();
     }
     if (m.not_null() && !is_osr_method()) {
       ResourceMark rm;
-      int sizeargs = m->size_of_parameters();
-      BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
-      VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
-      {
-        int sig_index = 0;
-        if (!m->is_static())
-          sig_bt[sig_index++] = T_OBJECT; // 'this'
-        for (SignatureStream ss(m->signature()); !ss.at_return_type(); ss.next()) {
+      int sizeargs = 0;
+      BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, 256);
+      VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, 256);
+      Symbol* sig = m->signature();
+      const GrowableArray<SigEntry>* sig_cc = m->adapter()->get_sig_cc();
+      if (m->has_scalarized_args()) {
+        // Use extended signature if value type arguments are passed as fields
+        assert(sig_cc != NULL, "must have scalarized signature");
+        sig = SigEntry::create_symbol(sig_cc);
+      } else if (!m->is_static()) {
+        sig_bt[sizeargs++] = T_OBJECT; // 'this'
+      }
+      for (SignatureStream ss(sig); !ss.at_return_type(); ss.next()) {
           BasicType t = ss.type();
-          sig_bt[sig_index++] = t;
+        sig_bt[sizeargs++] = t;
           if (type2size[t] == 2) {
-            sig_bt[sig_index++] = T_VOID;
+          sig_bt[sizeargs++] = T_VOID;
           } else {
             assert(type2size[t] == 1, "size is 1 or 2");
           }
         }
-        assert(sig_index == sizeargs, "");
-      }
       const char* spname = "sp"; // make arch-specific?
-      intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false);
+      SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false);
       int stack_slot_offset = this->frame_size() * wordSize;
       int tab1 = 14, tab2 = 24;
       int sig_index = 0;
-      int arg_index = (m->is_static() ? 0 : -1);
+      int sig_index_cc = 0;
+      int arg_index = ((m->is_static() || m->has_scalarized_args()) ? 0 : -1);
       bool did_old_sp = false;
-      for (SignatureStream ss(m->signature()); !ss.at_return_type(); ) {
+      for (SignatureStream ss(sig); !ss.at_return_type(); ) {
         bool at_this = (arg_index == -1);
         bool at_old_sp = false;
         BasicType t = (at_this ? T_OBJECT : ss.type());
         assert(t == sig_bt[sig_index], "sigs in sync");
-        if (at_this)
+        if (at_this) {
           stream->print("  # this: ");
-        else
+        } else {
           stream->print("  # parm%d: ", arg_index);
+        }
         stream->move_to(tab1);
         VMReg fst = regs[sig_index].first();
         VMReg snd = regs[sig_index].second();
         if (fst->is_reg()) {
           stream->print("%s", fst->name());

@@ -2659,10 +2660,19 @@
             }
           }
           if (!did_name)
             stream->print("%s", type2name(t));
         }
+        if (m->has_scalarized_args()) {
+          while (!SigEntry::skip_value_delimiters(sig_cc, sig_index_cc)) {
+            sig_index_cc++;
+          }
+          if (SigEntry::is_reserved_entry(sig_cc, sig_index_cc)) {
+            stream->print(" [RESERVED]");
+          }
+          sig_index_cc += type2size[t];
+        }
         if (at_old_sp) {
           stream->print("  (%s of caller)", spname);
           did_old_sp = true;
         }
         stream->cr();

@@ -2677,10 +2687,23 @@
         stream->print("  (%s of caller)", spname);
         stream->cr();
       }
     }
   }
+
+  if (block_begin == entry_point())             stream->print_cr("[Entry Point]");
+  if (block_begin == verified_entry_point())    stream->print_cr("[Verified Entry Point]");
+  if (block_begin == verified_value_entry_point()) stream->print_cr("[Verified Value Entry Point]");
+  if (block_begin == verified_value_ro_entry_point()) stream->print_cr("[Verified Value Entry Point (RO)]");
+  if (JVMCI_ONLY(_exception_offset >= 0 &&) block_begin == exception_begin())         stream->print_cr("[Exception Handler]");
+  if (block_begin == stub_begin())              stream->print_cr("[Stub Code]");
+  if (JVMCI_ONLY(_deopt_handler_begin != NULL &&) block_begin == deopt_handler_begin())     stream->print_cr("[Deopt Handler Code]");
+
+  if (has_method_handle_invokes())
+    if (block_begin == deopt_mh_handler_begin())  stream->print_cr("[Deopt MH Handler Code]");
+
+  if (block_begin == consts_begin() && consts_begin() != low) stream->print_cr("[Constants]");
 }
 
 void nmethod::print_code_comment_on(outputStream* st, int column, u_char* begin, u_char* end) {
   // First, find an oopmap in (begin, end].
   // We use the odd half-closed interval so that oop maps and scope descs

@@ -2755,11 +2778,11 @@
           }
         default:
           break;
         }
       }
-      st->print(" {reexecute=%d rethrow=%d return_oop=%d}", sd->should_reexecute(), sd->rethrow_exception(), sd->return_oop());
+      st->print(" {reexecute=%d rethrow=%d return_oop=%d return_vt=%d}", sd->should_reexecute(), sd->rethrow_exception(), sd->return_oop(), sd->return_vt());
     }
 
     // Print all scopes
     for (;sd != NULL; sd = sd->sender()) {
       st->move_to(column);
< prev index next >