Print this page


Split Close
Expand all
Collapse all
          --- old/agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java
          +++ new/agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java
   1    1  /*
   2      - * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
        2 + * Copyright 2000-2010 Sun Microsystems, Inc.  All Rights Reserved.
   3    3   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4    4   *
   5    5   * This code is free software; you can redistribute it and/or modify it
   6    6   * under the terms of the GNU General Public License version 2 only, as
   7    7   * published by the Free Software Foundation.
   8    8   *
   9    9   * This code is distributed in the hope that it will be useful, but WITHOUT
  10   10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11   11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12   12   * version 2 for more details (a copy is included in the LICENSE file that
↓ open down ↓ 29 lines elided ↑ open up ↑
  42   42    /** To support simple linked-list chaining of nmethods */
  43   43    private static AddressField  osrLinkField;
  44   44    private static AddressField  scavengeRootLinkField;
  45   45    private static JByteField    scavengeRootStateField;
  46   46  
  47   47    /** Offsets for different nmethod parts */
  48   48    private static CIntegerField exceptionOffsetField;
  49   49    private static CIntegerField deoptOffsetField;
  50   50    private static CIntegerField origPCOffsetField;
  51   51    private static CIntegerField stubOffsetField;
       52 +  private static CIntegerField oopsOffsetField;
  52   53    private static CIntegerField scopesDataOffsetField;
  53   54    private static CIntegerField scopesPCsOffsetField;
  54   55    private static CIntegerField dependenciesOffsetField;
  55   56    private static CIntegerField handlerTableOffsetField;
  56   57    private static CIntegerField nulChkTableOffsetField;
  57   58    private static CIntegerField nmethodEndOffsetField;
  58   59  
  59   60    /** Offsets for entry points */
  60   61    /** Entry point with class check */
  61   62    private static AddressField  entryPointField;
↓ open down ↓ 29 lines elided ↑ open up ↑
  91   92      methodField                 = type.getOopField("_method");
  92   93      entryBCIField               = type.getCIntegerField("_entry_bci");
  93   94      osrLinkField                = type.getAddressField("_osr_link");
  94   95      scavengeRootLinkField       = type.getAddressField("_scavenge_root_link");
  95   96      scavengeRootStateField      = type.getJByteField("_scavenge_root_state");
  96   97  
  97   98      exceptionOffsetField        = type.getCIntegerField("_exception_offset");
  98   99      deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
  99  100      origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
 100  101      stubOffsetField             = type.getCIntegerField("_stub_offset");
      102 +    oopsOffsetField             = type.getCIntegerField("_oops_offset");
 101  103      scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
 102  104      scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
 103  105      dependenciesOffsetField     = type.getCIntegerField("_dependencies_offset");
 104  106      handlerTableOffsetField     = type.getCIntegerField("_handler_table_offset");
 105  107      nulChkTableOffsetField      = type.getCIntegerField("_nul_chk_table_offset");
 106  108      nmethodEndOffsetField       = type.getCIntegerField("_nmethod_end_offset");
 107  109      entryPointField             = type.getAddressField("_entry_point");
 108  110      verifiedEntryPointField     = type.getAddressField("_verified_entry_point");
 109  111      osrEntryPointField          = type.getAddressField("_osr_entry_point");
 110  112      lockCountField              = type.getJIntField("_lock_count");
↓ open down ↓ 23 lines elided ↑ open up ↑
 134  136    public boolean isOSRMethod()    { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); }
 135  137  
 136  138    /** Boundaries for different parts */
 137  139    public Address constantsBegin()       { return instructionsBegin();                                }
 138  140    public Address constantsEnd()         { return getEntryPoint();                                    }
 139  141    public Address codeBegin()            { return getEntryPoint();                                    }
 140  142    public Address codeEnd()              { return headerBegin().addOffsetTo(getStubOffset());         }
 141  143    public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
 142  144    public Address deoptBegin()           { return headerBegin().addOffsetTo(getDeoptOffset());        }
 143  145    public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
 144      -  public Address stubEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
      146 +  public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
      147 +  public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
      148 +  public Address oopsEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
 145  149    public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
 146  150    public Address scopesDataEnd()        { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
 147  151    public Address scopesPCsBegin()       { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
 148  152    public Address scopesPCsEnd()         { return headerBegin().addOffsetTo(getDependenciesOffset()); }
 149  153    public Address dependenciesBegin()    { return headerBegin().addOffsetTo(getDependenciesOffset()); }
 150  154    public Address dependenciesEnd()      { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
 151  155    public Address handlerTableBegin()    { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
 152  156    public Address handlerTableEnd()      { return headerBegin().addOffsetTo(getNulChkTableOffset());  }
 153  157    public Address nulChkTableBegin()     { return headerBegin().addOffsetTo(getNulChkTableOffset());  }
 154  158    public Address nulChkTableEnd()       { return headerBegin().addOffsetTo(getNMethodEndOffset());   }
 155  159  
 156  160    public int constantsSize()            { return (int) constantsEnd()   .minus(constantsBegin());    }
 157  161    public int codeSize()                 { return (int) codeEnd()        .minus(codeBegin());         }
 158  162    public int stubSize()                 { return (int) stubEnd()        .minus(stubBegin());         }
      163 +  public int oopsSize()                 { return (int) oopsEnd()        .minus(oopsBegin());         }
 159  164    public int scopesDataSize()           { return (int) scopesDataEnd()  .minus(scopesDataBegin());   }
 160  165    public int scopesPCsSize()            { return (int) scopesPCsEnd()   .minus(scopesPCsBegin());    }
 161  166    public int dependenciesSize()         { return (int) dependenciesEnd().minus(dependenciesBegin()); }
 162  167    public int handlerTableSize()         { return (int) handlerTableEnd().minus(handlerTableBegin()); }
 163  168    public int nulChkTableSize()          { return (int) nulChkTableEnd() .minus(nulChkTableBegin());  }
 164  169    public int origPCOffset()             { return (int) origPCOffsetField.getValue(addr);             }
 165  170  
 166  171    public int totalSize() {
 167  172      return
 168  173        constantsSize()    +
↓ open down ↓ 2 lines elided ↑ open up ↑
 171  176        scopesDataSize()   +
 172  177        scopesPCsSize()    +
 173  178        dependenciesSize() +
 174  179        handlerTableSize() +
 175  180        nulChkTableSize();
 176  181    }
 177  182  
 178  183    public boolean constantsContains   (Address addr) { return constantsBegin()   .lessThanOrEqual(addr) && constantsEnd()   .greaterThan(addr); }
 179  184    public boolean codeContains        (Address addr) { return codeBegin()        .lessThanOrEqual(addr) && codeEnd()        .greaterThan(addr); }
 180  185    public boolean stubContains        (Address addr) { return stubBegin()        .lessThanOrEqual(addr) && stubEnd()        .greaterThan(addr); }
      186 +  public boolean oopsContains        (Address addr) { return oopsBegin()        .lessThanOrEqual(addr) && oopsEnd()        .greaterThan(addr); }
 181  187    public boolean scopesDataContains  (Address addr) { return scopesDataBegin()  .lessThanOrEqual(addr) && scopesDataEnd()  .greaterThan(addr); }
 182  188    public boolean scopesPCsContains   (Address addr) { return scopesPCsBegin()   .lessThanOrEqual(addr) && scopesPCsEnd()   .greaterThan(addr); }
 183  189    public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); }
 184  190    public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); }
 185  191  
 186  192    /** Entry points */
 187  193    public Address getEntryPoint()         { return entryPointField.getValue(addr);         }
 188  194    public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); }
 189  195  
      196 +  /** Support for oops in scopes and relocs. Note: index 0 is reserved for null. */
      197 +  public OopHandle getOopAt(int index) {
      198 +    if (index == 0) return null;
      199 +    if (Assert.ASSERTS_ENABLED) {
      200 +      Assert.that(index > 0 && index <= oopsSize(), "must be a valid non-zero index");
      201 +    }
      202 +    return oopsBegin().getOopHandleAt((index - 1) * VM.getVM().getOopSize());
      203 +  }
      204 +
 190  205    // FIXME: add interpreter_entry_point()
 191  206    // FIXME: add lazy_interpreter_entry_point() for C2
 192  207  
 193  208    // **********
 194  209    // * FIXME: * ADD ACCESS TO FLAGS!!!!
 195  210    // **********
 196  211    // public boolean isInUse();
 197  212    // public boolean isAlive();
 198  213    // public boolean isNotEntrant();
 199  214    // public boolean isZombie();
↓ open down ↓ 131 lines elided ↑ open up ↑
 331  346    public static int getVerifiedEntryPointOffset()    { return (int) verifiedEntryPointField.getOffset();    }
 332  347    public static int getOSREntryPointOffset()         { return (int) osrEntryPointField.getOffset();         }
 333  348    public static int getEntryBCIOffset()              { return (int) entryBCIField.getOffset();              }
 334  349    /** NOTE: renamed from "method_offset_in_bytes" */
 335  350    public static int getMethodOffset()                { return (int) methodField.getOffset();                }
 336  351  
 337  352    public void print() {
 338  353      printOn(System.out);
 339  354    }
 340  355  
      356 +  protected void printComponentsOn(PrintStream tty) {
      357 +    // FIXME: add relocation information
      358 +    tty.println(" instructions: [" + instructionsBegin() + ", " + instructionsEnd() + "), " +
      359 +                " data: [" + dataBegin() + ", " + dataEnd() + "), " +
      360 +                " oops: [" + oopsBegin() + ", " + oopsEnd() + "), " +
      361 +                " frame size: " + getFrameSize());
      362 +  }
      363 +
 341  364    public String toString() {
 342  365      Method method = getMethod();
 343  366      return "NMethod for " +
 344  367              method.getMethodHolder().getName().asString() + "." +
 345  368              method.getName().asString() + method.getSignature().asString() + "==>n" +
 346  369              super.toString();
 347  370    }
 348  371  
 349  372    public String flagsToString() {
 350  373      // FIXME need access to flags...
↓ open down ↓ 9 lines elided ↑ open up ↑
 360  383    }
 361  384  
 362  385    //--------------------------------------------------------------------------------
 363  386    // Internals only below this point
 364  387    //
 365  388  
 366  389    private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
 367  390    private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
 368  391    private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
 369  392    private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
      393 +  private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
 370  394    private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
 371  395    private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
 372  396    private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
 373  397    private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
 374  398    private int getNulChkTableOffset()  { return (int) nulChkTableOffsetField .getValue(addr); }
 375  399    private int getNMethodEndOffset()   { return (int) nmethodEndOffsetField  .getValue(addr); }
 376  400  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX