hotspot/agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java
changeset 10517 f92c9ff3a15f
parent 6418 6671edbd230e
child 10547 ea4a2ec31ae2
equal deleted inserted replaced
10516:2797e487c09f 10517:f92c9ff3a15f
    44   private static JByteField    scavengeRootStateField;
    44   private static JByteField    scavengeRootStateField;
    45 
    45 
    46   /** Offsets for different nmethod parts */
    46   /** Offsets for different nmethod parts */
    47   private static CIntegerField exceptionOffsetField;
    47   private static CIntegerField exceptionOffsetField;
    48   private static CIntegerField deoptOffsetField;
    48   private static CIntegerField deoptOffsetField;
       
    49   private static CIntegerField deoptMhOffsetField;
    49   private static CIntegerField origPCOffsetField;
    50   private static CIntegerField origPCOffsetField;
    50   private static CIntegerField stubOffsetField;
    51   private static CIntegerField stubOffsetField;
    51   private static CIntegerField oopsOffsetField;
    52   private static CIntegerField oopsOffsetField;
    52   private static CIntegerField scopesDataOffsetField;
    53   private static CIntegerField scopesDataOffsetField;
    53   private static CIntegerField scopesPCsOffsetField;
    54   private static CIntegerField scopesPCsOffsetField;
    93     scavengeRootLinkField       = type.getAddressField("_scavenge_root_link");
    94     scavengeRootLinkField       = type.getAddressField("_scavenge_root_link");
    94     scavengeRootStateField      = type.getJByteField("_scavenge_root_state");
    95     scavengeRootStateField      = type.getJByteField("_scavenge_root_state");
    95 
    96 
    96     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
    97     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
    97     deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
    98     deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
       
    99     deoptMhOffsetField          = type.getCIntegerField("_deoptimize_mh_offset");
    98     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
   100     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
    99     stubOffsetField             = type.getCIntegerField("_stub_offset");
   101     stubOffsetField             = type.getCIntegerField("_stub_offset");
   100     oopsOffsetField             = type.getCIntegerField("_oops_offset");
   102     oopsOffsetField             = type.getCIntegerField("_oops_offset");
   101     scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
   103     scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
   102     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
   104     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
   134   public boolean isOSRMethod()    { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); }
   136   public boolean isOSRMethod()    { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); }
   135 
   137 
   136   /** Boundaries for different parts */
   138   /** Boundaries for different parts */
   137   public Address constantsBegin()       { return contentBegin();                                     }
   139   public Address constantsBegin()       { return contentBegin();                                     }
   138   public Address constantsEnd()         { return getEntryPoint();                                    }
   140   public Address constantsEnd()         { return getEntryPoint();                                    }
   139   public Address instsBegin()           { return codeBegin();                                       }
   141   public Address instsBegin()           { return codeBegin();                                        }
   140   public Address instsEnd()             { return headerBegin().addOffsetTo(getStubOffset());         }
   142   public Address instsEnd()             { return headerBegin().addOffsetTo(getStubOffset());         }
   141   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   143   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   142   public Address deoptBegin()           { return headerBegin().addOffsetTo(getDeoptOffset());        }
   144   public Address deoptHandlerBegin()    { return headerBegin().addOffsetTo(getDeoptOffset());        }
       
   145   public Address deoptMhHandlerBegin()  { return headerBegin().addOffsetTo(getDeoptMhOffset());      }
   143   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   146   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   144   public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
   147   public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
   145   public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
   148   public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
   146   public Address oopsEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   149   public Address oopsEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   147   public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   150   public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   248 
   251 
   249   public int getScavengeRootState() {
   252   public int getScavengeRootState() {
   250     return (int) scavengeRootStateField.getValue(addr);
   253     return (int) scavengeRootStateField.getValue(addr);
   251   }
   254   }
   252 
   255 
       
   256   // MethodHandle
       
   257   public boolean isMethodHandleReturn(Address returnPc) {
       
   258     // Hard to read a bit fields from Java and it's only there for performance
       
   259     // so just go directly to the PCDesc
       
   260     // if (!hasMethodHandleInvokes())  return false;
       
   261     PCDesc pd = getPCDescAt(returnPc);
       
   262     if (pd == null)
       
   263       return false;
       
   264     return pd.isMethodHandleInvoke();
       
   265   }
       
   266 
       
   267   // Deopt
       
   268   // Return true is the PC is one would expect if the frame is being deopted.
       
   269   public boolean isDeoptPc      (Address pc) { return isDeoptEntry(pc) || isDeoptMhEntry(pc); }
       
   270   public boolean isDeoptEntry   (Address pc) { return pc == deoptHandlerBegin(); }
       
   271   public boolean isDeoptMhEntry (Address pc) { return pc == deoptMhHandlerBegin(); }
   253 
   272 
   254   /** Tells whether frames described by this nmethod can be
   273   /** Tells whether frames described by this nmethod can be
   255       deoptimized. Note: native wrappers cannot be deoptimized. */
   274       deoptimized. Note: native wrappers cannot be deoptimized. */
   256   public boolean canBeDeoptimized() { return isJavaMethod(); }
   275   public boolean canBeDeoptimized() { return isJavaMethod(); }
   257 
   276 
   386   //
   405   //
   387 
   406 
   388   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   407   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   389   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   408   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   390   private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
   409   private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
       
   410   private int getDeoptMhOffset()      { return (int) deoptMhOffsetField     .getValue(addr); }
   391   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
   411   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
   392   private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
   412   private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
   393   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
   413   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
   394   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   414   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   395   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
   415   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }